diff --git a/_maps/deathmatch/train.dmm b/_maps/deathmatch/train.dmm new file mode 100644 index 00000000000..3f0619d1ab4 --- /dev/null +++ b/_maps/deathmatch/train.dmm @@ -0,0 +1,2421 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ai" = ( +/obj/structure/table_frame/wood, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/tile, +/area/deathmatch) +"as" = ( +/obj/effect/particle_effect/ion_trails/flight{ + icon_state = "shieldwall" + }, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"at" = ( +/turf/open/floor/wood/tile, +/area/deathmatch) +"be" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/plating, +/area/deathmatch) +"bR" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"bY" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/closet/crate/secure/weapon{ + locked = 0 + }, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/item/ammo_box/c38, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"ca" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/girder/displaced, +/turf/open/indestructible/plating, +/area/deathmatch) +"ci" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"cr" = ( +/obj/item/chair/wood, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/tile, +/area/deathmatch) +"cv" = ( +/obj/structure/safe, +/obj/item/gun/energy/laser/instakill, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"cy" = ( +/obj/effect/spawner/structure/window/hollow/middle{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"cU" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/grenade/syndieminibomb/concussion, +/turf/open/indestructible/plating, +/area/deathmatch) +"dB" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"dU" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"ec" = ( +/obj/item/ammo_casing/shotgun/breacher, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"eA" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/girder/displaced, +/turf/open/indestructible/plating, +/area/deathmatch) +"fa" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/deathmatch) +"fJ" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"gL" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"gN" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"hR" = ( +/obj/structure/chair/wood, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/tile, +/area/deathmatch) +"hZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/tile, +/area/deathmatch) +"ii" = ( +/obj/structure/closet/crate/critter{ + mob_storage_capacity = 33 + }, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"il" = ( +/obj/effect/light_emitter/fake_outdoors, +/obj/effect/particle_effect/ion_trails/flight{ + icon_state = "shieldwall" + }, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"jj" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/spawner/directional/north, +/turf/open/indestructible/plating, +/area/deathmatch) +"jq" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/mechanical, +/turf/open/indestructible/plating, +/area/deathmatch) +"kd" = ( +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"ke" = ( +/obj/effect/spawner/structure/window/hollow/middle, +/turf/open/indestructible/plating, +/area/deathmatch) +"kt" = ( +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/automatic/pistol/m1911, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/deathmatch) +"kR" = ( +/obj/effect/decal/fakelattice{ + density = 0 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/deathmatch) +"lJ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"mi" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/floor/wood, +/area/deathmatch) +"mr" = ( +/obj/structure/chair/wood, +/turf/open/floor/wood/tile, +/area/deathmatch) +"mS" = ( +/obj/structure/barricade/wooden, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"mW" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/closet/crate/secure/weapon{ + locked = 0 + }, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/item/ammo_box/c38, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"nj" = ( +/obj/effect/decal/fakelattice{ + density = 0 + }, +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"oo" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/deathmatch) +"pm" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"pO" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/structure/closet/crate, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/item/storage/medkit/brute, +/obj/item/reagent_containers/hypospray/medipen, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"qJ" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/extinguisher, +/obj/item/extinguisher/anti, +/turf/open/indestructible/plating, +/area/deathmatch) +"qY" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"rd" = ( +/obj/structure/chair/comfy/shuttle/tactical{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"ru" = ( +/obj/structure/table/wood, +/obj/item/food/spaghetti/pastatomato, +/obj/item/knife/kitchen, +/turf/open/floor/wood/tile, +/area/deathmatch) +"ry" = ( +/obj/item/stack/rods/ten, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"rM" = ( +/obj/structure/shipping_container/deforest, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"rZ" = ( +/obj/structure/girder, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"sp" = ( +/obj/structure/girder/displaced, +/turf/open/indestructible/plating, +/area/deathmatch) +"ty" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/floor/wood, +/area/deathmatch) +"tQ" = ( +/obj/machinery/oven/range, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"uM" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/item/spear, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"vl" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"vV" = ( +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/bag/money, +/turf/open/indestructible/plating, +/area/deathmatch) +"vW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/door_assembly/door_assembly_wood, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"wf" = ( +/turf/open/floor/wood, +/area/deathmatch) +"wm" = ( +/obj/structure/door_assembly/door_assembly_wood, +/obj/effect/decal/fakelattice{ + density = 0 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/deathmatch) +"wv" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/cup/bucket/wooden, +/obj/item/flashlight/flare/torch, +/turf/open/indestructible/plating, +/area/deathmatch) +"wy" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"wE" = ( +/obj/effect/spawner/structure/window, +/turf/open/indestructible/plating, +/area/deathmatch) +"wR" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fermenting_barrel/gunpowder, +/obj/item/stack/cannonball/the_big_one, +/turf/open/indestructible/plating, +/area/deathmatch) +"xd" = ( +/obj/machinery/computer/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/deathmatch) +"xn" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/deathmatch) +"xp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/floor/wood, +/area/deathmatch) +"xN" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/structure/reagent_dispensers/fueltank/large, +/obj/effect/turf_decal/stripes/asteroid/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"xV" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"yi" = ( +/obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"yr" = ( +/obj/effect/light_emitter/fake_outdoors, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"yR" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"ze" = ( +/obj/machinery/door/airlock/wood/glass, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/deathmatch) +"zg" = ( +/obj/machinery/power/shuttle_engine/propulsion, +/turf/open/indestructible/plating, +/area/deathmatch) +"zP" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"An" = ( +/obj/structure/grille/broken, +/obj/item/shard, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"AR" = ( +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"Bx" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cannon{ + anchorable_cannon = 0; + anchored = 0 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"BC" = ( +/obj/item/ammo_casing/shotgun/scatterlaser, +/obj/structure/kitchenspike, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"BN" = ( +/obj/structure/table_frame/wood, +/turf/open/floor/wood/tile, +/area/deathmatch) +"CN" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/tile, +/area/deathmatch) +"CO" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/tile, +/area/deathmatch) +"CX" = ( +/obj/structure/girder, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"Da" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/wood, +/area/deathmatch) +"Du" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/tile, +/area/deathmatch) +"Dy" = ( +/obj/machinery/door/airlock/wood/glass, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/deathmatch) +"Ej" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/turf/open/indestructible/plating, +/area/deathmatch) +"ED" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"EH" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/mechanical, +/turf/open/indestructible/plating, +/area/deathmatch) +"EU" = ( +/obj/item/stack/rods/ten, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"EX" = ( +/obj/structure/lattice/catwalk, +/obj/item/ammo_box/c38/match, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"Fa" = ( +/obj/structure/girder, +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"Fh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/bag/money, +/turf/open/indestructible/plating, +/area/deathmatch) +"Fs" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"FB" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ge" = ( +/obj/structure/lattice/catwalk, +/obj/item/storage/medkit/ancient, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"Gl" = ( +/obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"Gx" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/door/airlock/wood/glass, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"GQ" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ht" = ( +/obj/structure/girder, +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"Hx" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/deathmatch) +"HH" = ( +/obj/machinery/door/airlock/wood/glass, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/deathmatch) +"HV" = ( +/obj/item/stack/rods/ten, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"HZ" = ( +/obj/structure/girder, +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"ID" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/wood, +/area/deathmatch) +"IJ" = ( +/obj/structure/kitchenspike, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"IR" = ( +/obj/structure/lattice/catwalk, +/obj/item/shield/improvised, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"Je" = ( +/obj/structure/lattice/catwalk, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"Js" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/turf_decal/stripes/asteroid/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"Kv" = ( +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/shotgun/doublebarrel, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"KT" = ( +/turf/closed/wall/r_wall, +/area/deathmatch) +"LX" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/girder/displaced, +/turf/open/indestructible/plating, +/area/deathmatch) +"Mq" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"Mt" = ( +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"Mz" = ( +/obj/machinery/door/airlock/wood/glass, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"MV" = ( +/obj/effect/decal/fakelattice{ + density = 0 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ow" = ( +/obj/item/ammo_casing/shotgun/pulverizer, +/obj/structure/kitchenspike, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"Pa" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"Pc" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/cigarettes/cigars/cohiba, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/deathmatch) +"PD" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"QL" = ( +/obj/machinery/computer/old, +/obj/effect/mapping_helpers/broken_machine, +/turf/open/indestructible/plating, +/area/deathmatch) +"Rg" = ( +/obj/item/chair/wood, +/turf/open/floor/wood/tile, +/area/deathmatch) +"Rn" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"Se" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/deathmatch) +"Sm" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"Sy" = ( +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"Tg" = ( +/obj/structure/table/reinforced, +/obj/item/food/meat/slab/pig, +/obj/item/food/meat/slab/pig, +/obj/item/food/meat/slab/pig, +/obj/item/food/meat/slab/pig, +/obj/item/food/meat/slab/pig, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"TA" = ( +/obj/machinery/griddle, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"Uq" = ( +/obj/structure/lattice/catwalk, +/obj/item/ammo_casing/shotgun/executioner, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"Vc" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"Vu" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/girder, +/turf/open/indestructible/plating, +/area/deathmatch) +"VS" = ( +/obj/structure/closet/secure_closet/freezer/kitchen{ + req_access = null + }, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"VT" = ( +/obj/structure/table/reinforced, +/obj/item/knife/kitchen, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"Wa" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/deathmatch) +"Ww" = ( +/obj/machinery/computer/old, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"Xr" = ( +/obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"Xw" = ( +/obj/structure/chair/wood, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/tile, +/area/deathmatch) +"XD" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/egg_box, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"Yg" = ( +/obj/item/stack/rods/ten, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/fakelattice{ + density = 0 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"Yi" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/clothing/suit/armor/bulletproof, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ys" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/closet/crate/secure/weapon{ + locked = 0 + }, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/item/ammo_box/c38, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/item/gun/energy/laser, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"Yt" = ( +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/structure/closet/crate/secure/freezer{ + locked = 0 + }, +/obj/item/food/pizza/flatbread/zmorgast, +/obj/item/food/pizza/flatbread/stinging, +/obj/item/food/pizza/flatbread/rustic, +/obj/item/food/pizza/flatbread/nutty, +/obj/item/food/pizza/flatbread/mushroom, +/obj/item/food/pizza/flatbread/italic, +/obj/item/food/pizza/flatbread/imperial, +/obj/item/food/pizza/flatbread/fish, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"YP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/wood/glass, +/turf/open/floor/iron/kitchen, +/area/deathmatch) +"YR" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/plating, +/area/deathmatch) +"Zc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/girder/displaced, +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast, +/area/deathmatch) +"ZR" = ( +/turf/open/floor/iron/kitchen, +/area/deathmatch) + +(1,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(2,1,1) = {" +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +"} +(3,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(4,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(5,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(6,1,1) = {" +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +"} +(7,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Je +Je +Je +Ge +Mt +Mt +Mt +Mt +Mt +Je +Je +Je +Je +Je +EX +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(8,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Wa +cy +cy +Wa +HH +HH +Wa +Wa +Sy +Sy +Sy +Wa +Wa +An +Wa +Wa +wE +Wa +Wa +Sy +Sy +Sy +Wa +Wa +zg +as +as +as +as +as +as +as +"} +(9,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +ke +kt +xn +xn +xn +Hx +Da +Wa +Mt +Mt +Mt +Wa +hR +BN +Rg +mr +ru +CO +Wa +Mt +Mt +Mt +Yi +jj +zg +as +as +as +as +as +as +as +"} +(10,1,1) = {" +Mt +Mt +Mt +yr +Mt +Mt +Mt +ke +xd +fa +Fs +ID +Hx +xn +ze +Se +oo +oo +Dy +at +at +CN +at +Du +hZ +ze +Se +xp +oo +be +jj +zg +as +as +as +as +il +as +as +"} +(11,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +ke +Pc +Fs +Fs +wf +xn +mi +Wa +Mt +Mt +Mt +Wa +Xw +ai +CN +at +BN +cr +Wa +Mt +Je +Mt +jq +jj +zg +as +as +as +as +as +as +as +"} +(12,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Wa +cy +cy +Wa +wm +kR +yi +Wa +Sy +Sy +Sy +Wa +Wa +dB +gL +dB +Xr +Wa +Wa +Sy +Je +Sy +Wa +Wa +zg +as +as +as +as +as +as +as +"} +(13,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Je +Je +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Je +Mt +Mt +Mt +Mt +Mt +Je +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(14,1,1) = {" +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Je +Je +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Je +Mt +Mt +yr +Mt +Mt +Je +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +"} +(15,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Zc +Je +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Je +Mt +Mt +Mt +Mt +Mt +Je +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(16,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Fs +cU +ca +eA +MV +MV +xV +KT +Sy +Sy +Sy +Fa +rM +EH +ry +gN +pO +CX +Ht +Sy +Je +Sy +KT +KT +zg +as +as +as +as +as +as +as +"} +(17,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +zP +ca +xV +xV +Fs +LX +Rn +Fs +Se +Se +Se +yR +Sm +HV +Sm +EU +vV +Mq +Js +Se +ty +Se +wR +jj +zg +as +as +as +as +as +as +as +"} +(18,1,1) = {" +Mt +Mt +Mt +yr +Mt +Mt +Mt +Fs +xV +rd +xV +Pa +zP +xV +Vu +Mt +Mt +Mt +YR +Sm +ii +Sm +Mq +Yt +AR +xN +Mt +Je +Mt +wv +jj +zg +as +as +as +as +il +as +as +"} +(19,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Fs +QL +Fs +Fs +eA +sp +xV +zP +Se +Se +Se +yR +Fh +zP +Fh +Sm +AR +Mq +Js +Se +ty +Se +Bx +jj +zg +as +as +as +as +as +as +as +"} +(20,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +eA +Fs +KT +Ej +nj +nj +FB +KT +Sy +Sy +Sy +HZ +rZ +uM +Yg +ci +Ys +mW +bY +Sy +Je +Sy +KT +KT +zg +as +as +as +as +as +as +as +"} +(21,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Je +Je +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Je +Mt +Mt +Mt +Mt +Mt +Je +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(22,1,1) = {" +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Je +Je +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Je +Mt +Mt +yr +Mt +Mt +Je +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +"} +(23,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Je +vW +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Je +Mt +Mt +Mt +Mt +Mt +Je +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(24,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Wa +cy +dU +mS +MV +MV +Wa +Wa +Sy +Sy +Sy +Wa +Gl +lJ +vl +lJ +lJ +Wa +Wa +Sy +Je +Sy +Wa +Wa +zg +as +as +as +as +as +as +as +"} +(25,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +ke +cv +Vc +Vc +Vc +ec +Ow +Wa +Mt +Mt +Mt +Wa +tQ +ED +ED +ED +ED +PD +Wa +Mt +Je +Mt +fJ +jj +zg +as +as +as +as +as +as +as +"} +(26,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +ke +Ww +wy +Vc +qY +GQ +GQ +ze +Se +Se +Se +YP +ZR +ZR +bR +ZR +pm +ZR +Gx +Se +ty +Se +be +jj +zg +as +as +as +as +il +as +as +"} +(27,1,1) = {" +Mt +Mt +Mt +yr +Mt +Mt +Mt +ke +Kv +GQ +BC +GQ +GQ +IJ +Wa +Mt +Mt +Mt +Wa +TA +VT +Tg +XD +VS +kd +Wa +Mt +Mt +Mt +qJ +jj +zg +as +as +as +as +as +as +as +"} +(28,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Wa +cy +cy +Wa +Mz +Mz +Wa +Wa +Sy +Sy +Sy +Wa +Wa +wE +Wa +Wa +wE +Wa +Wa +Sy +Sy +Sy +Wa +Wa +zg +as +as +as +as +as +as +as +"} +(29,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Je +Je +Je +Uq +Mt +Mt +Mt +Mt +Mt +Je +Je +Je +IR +Je +Je +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(30,1,1) = {" +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +"} +(31,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(32,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(33,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} +(34,1,1) = {" +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +Mt +Mt +Mt +yr +Mt +Mt +"} +(35,1,1) = {" +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +Mt +"} diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 5c83910411f..e692824965c 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -616,14 +616,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) -"apd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) "api" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -633,19 +625,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/white/small, /area/station/science/server) -"apj" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "apk" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/dark_red{ @@ -1703,13 +1682,6 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) -"aOb" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "aOx" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, @@ -2408,6 +2380,14 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"bgN" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/helium_output{ + dir = 4; + chamber_id = "helium" + }, +/turf/open/floor/engine/helium, +/area/station/ai_monitored/turret_protected/ai) "bgQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -2553,13 +2533,6 @@ /obj/structure/cable, /turf/open/floor/iron/small, /area/station/security/office) -"bkI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 5 - }, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "bkO" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -2786,6 +2759,13 @@ }, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) +"boT" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "N2 to Pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "boW" = ( /obj/structure/table/glass, /obj/machinery/status_display/ai/directional/south, @@ -2973,19 +2953,6 @@ /obj/vehicle/ridden/scooter/skateboard/hoverboard, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"brC" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "brD" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile/neutral{ @@ -3128,6 +3095,16 @@ dir = 8 }, /area/station/science/xenobiology) +"buD" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "buO" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -3237,6 +3214,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"bym" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "byq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3501,12 +3487,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"bDO" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "bDQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -3717,10 +3697,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"bJN" = ( +"bJY" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/item/radio/intercom/directional/west, -/obj/machinery/status_display/evac/directional/south, +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ + dir = 4; + name = "Air to Pure" + }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "bJZ" = ( @@ -3950,6 +3932,13 @@ dir = 1 }, /area/station/hallway/secondary/dock) +"bPv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "bPU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, /turf/open/floor/iron, @@ -4297,6 +4286,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"bWP" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer1{ + dir = 4; + name = "Plasma to Pure"; + color = "#BF40BF"; + piping_layer = 3; + icon_state = "pump_map-3" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "bXb" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt/dust, @@ -4831,13 +4830,6 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"chb" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "chf" = ( /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, @@ -5287,6 +5279,16 @@ }, /turf/open/floor/plating, /area/station/service/janitor) +"cry" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/head/cone{ + pixel_x = -7; + pixel_y = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "crE" = ( /obj/structure/window/spawner/directional/north, /turf/open/space/basic, @@ -5801,6 +5803,19 @@ }, /turf/open/misc/asteroid/airless, /area/space/nearstation) +"cCM" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) "cCP" = ( /obj/structure/window/spawner/directional/south, /obj/structure/flora/bush/flowers_pp/style_random, @@ -5959,6 +5974,15 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) +"cEU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/light_switch/directional/east, +/obj/item/clothing/head/cone{ + pixel_x = -7; + pixel_y = 11 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "cEX" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 1 @@ -6013,6 +6037,14 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) +"cFI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) "cFR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6869,6 +6901,13 @@ }, /turf/open/floor/iron/dark/small, /area/station/command/heads_quarters/ce) +"daL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white/small, +/area/station/medical/virology) "dba" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -7516,13 +7555,6 @@ "dqO" = ( /turf/open/floor/iron/dark/small, /area/station/security/checkpoint/customs/auxiliary) -"dqV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron, -/area/station/engineering/atmos) "dqX" = ( /obj/structure/reagent_dispensers/wall/peppertank/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -7686,6 +7718,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/genetics) +"dtH" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "dua" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -8289,6 +8328,13 @@ }, /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) +"dIK" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "dIN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -8955,6 +9001,14 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white/small, /area/station/security/warden) +"dXL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/atmos) "dXO" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /obj/structure/disposalpipe/segment{ @@ -9074,10 +9128,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"dYY" = ( -/obj/machinery/light/cold/dim/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "dZa" = ( /obj/structure/table/reinforced, /obj/machinery/camera/directional/west, @@ -9145,10 +9195,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) -"dZX" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "dZZ" = ( /obj/structure/cable/layer3, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -10214,6 +10260,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"ewl" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/obj/structure/cable, +/obj/machinery/firealarm/directional/north, +/obj/machinery/space_heater, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "ewo" = ( /obj/effect/turf_decal/box/corners{ dir = 4 @@ -10247,12 +10302,6 @@ /obj/machinery/air_sensor/oxygen_tank, /turf/open/floor/engine/o2, /area/station/engineering/atmos/space_catwalk) -"exA" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "exE" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -12071,6 +12120,13 @@ dir = 1 }, /area/station/hallway/secondary/dock) +"fjt" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "fju" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/bot, @@ -13316,6 +13372,19 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/grimy, /area/station/science/cubicle) +"fIi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"fJe" = ( +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/virology) "fJl" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -13337,12 +13406,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat/teleporter) -"fJt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "fJK" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -14203,6 +14266,14 @@ /obj/structure/tram, /turf/open/floor/tram, /area/station/security/tram) +"fXI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/tank_holder/extinguisher/advanced, +/turf/open/floor/iron, +/area/station/engineering/atmos) "fXJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -15527,17 +15598,16 @@ dir = 4 }, /area/station/science/lobby) -"gyf" = ( -/obj/structure/cable, -/obj/machinery/power/smes/super/full, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/smooth, -/area/station/ai_monitored/turret_protected/aisat/equipment) "gyi" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"gyo" = ( +/obj/machinery/light/cold/dim/directional/north, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "gyr" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/iron/smooth, @@ -15793,13 +15863,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"gCP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/engineering/atmos) "gCR" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/effect/decal/cleanable/dirt, @@ -17014,6 +17077,13 @@ }, /turf/open/floor/catwalk_floor, /area/station/engineering/break_room) +"gWx" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "N2O to Pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "gWB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18452,19 +18522,6 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/plating, /area/station/cargo/miningoffice) -"hsL" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ - dir = 6 - }, -/turf/open/space/basic, -/area/station/engineering/atmos/space_catwalk) "hsO" = ( /obj/structure/cable, /obj/effect/spawner/structure/window, @@ -19241,6 +19298,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"hEW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "hFb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -20188,16 +20254,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/station/engineering/gravity_generator) -"hYA" = ( -/obj/structure/cable, -/obj/machinery/power/smes/super/full, -/obj/machinery/camera/directional/north{ - c_tag = "AI Chamber - SMES"; - network = list("aicore") - }, -/obj/machinery/flasher/directional/north, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "hYC" = ( /turf/closed/wall, /area/station/engineering/atmos) @@ -20271,15 +20327,6 @@ /obj/machinery/brm, /turf/open/floor/iron, /area/station/cargo/miningfoundry) -"hZf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "hZP" = ( /obj/structure/cable, /obj/structure/sign/poster/official/random/directional/north, @@ -20380,6 +20427,13 @@ /obj/effect/decal/cleanable/glass/plasma, /turf/open/floor/engine, /area/station/engineering/atmos) +"iba" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/engineering/atmos) "ibe" = ( /obj/effect/turf_decal/bot_white, /obj/structure/closet/crate/freezer, @@ -20843,15 +20897,6 @@ /obj/machinery/photobooth, /turf/open/floor/iron/textured_large, /area/station/hallway/primary/central/fore) -"ijP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "ijV" = ( /turf/open/misc/asteroid, /area/station/maintenance/department/engine) @@ -21654,15 +21699,6 @@ /obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"ivT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "ivX" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -22297,6 +22333,13 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/command/heads_quarters/hop) +"iIC" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "iIN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24480,19 +24523,6 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/catwalk_floor/iron_dark, /area/station/commons/storage/tools) -"jul" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) "juF" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable, @@ -24945,6 +24975,16 @@ }, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) +"jBA" = ( +/obj/structure/cable, +/obj/machinery/power/smes/super/full, +/obj/machinery/camera/directional/north{ + c_tag = "AI Chamber - SMES"; + network = list("aicore") + }, +/obj/machinery/flasher/directional/north, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "jBD" = ( /obj/structure/table/wood, /obj/effect/mapping_helpers/broken_floor, @@ -25265,6 +25305,19 @@ /obj/machinery/light/floor, /turf/open/floor/iron/smooth, /area/station/service/library) +"jGb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "South Ports to Wastes" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "jGc" = ( /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/showroomfloor, @@ -25884,6 +25937,13 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/misc/sandy_dirt, /area/station/hallway/primary/central/fore) +"jOy" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 8; + initialize_directions = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "jOF" = ( /obj/item/kirbyplants/random, /obj/machinery/light_switch/directional/west, @@ -26491,18 +26551,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/chapel_office, /turf/open/floor/iron/textured_half, /area/station/service/chapel/office) -"kas" = ( -/obj/effect/gibspawner/human, -/obj/structure/table/optable{ - desc = "A cold, hard place for your final rest."; - name = "Morgue Slab" - }, -/mob/living/carbon/human/species/monkey/humand_legged{ - name = "Charles"; - real_name = "Charles" - }, -/turf/open/floor/iron/white/diagonal, -/area/station/maintenance/department/science/xenobiology) "kat" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -26589,6 +26637,13 @@ /obj/structure/bookcase/random, /turf/open/misc/asteroid, /area/station/service/library/abandoned) +"kcf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) "kci" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26727,6 +26782,19 @@ "kev" = ( /turf/closed/wall, /area/station/hallway/secondary/spacebridge) +"keK" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white, +/area/station/medical/virology) "keS" = ( /obj/effect/turf_decal/siding/white{ dir = 5 @@ -27012,6 +27080,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"kiQ" = ( +/obj/structure/cable, +/obj/machinery/power/smes/super/full, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/smooth, +/area/station/ai_monitored/turret_protected/aisat/equipment) "kjg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -27387,28 +27461,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"kpe" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 6 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ - dir = 9 - }, -/turf/open/space/basic, -/area/station/engineering/atmos/space_catwalk) "kph" = ( /obj/structure/railing, /obj/machinery/light/cold/directional/north, @@ -27922,13 +27974,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/science/robotics/augments) -"kwH" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "kwW" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth, @@ -28358,6 +28403,14 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"kED" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 8; + initialize_directions = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "kEF" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/white{ @@ -29126,6 +29179,15 @@ "kQt" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) +"kQy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "kQA" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -29469,13 +29531,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/small, /area/station/engineering/engine_smes) -"kXf" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "kXj" = ( /obj/machinery/suit_storage_unit/engine, /turf/open/floor/plating/rust, @@ -31839,13 +31894,6 @@ }, /turf/open/misc/sandy_dirt, /area/station/hallway/primary/central/fore) -"lGq" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/structure/fluff/broken_canister_frame, -/turf/open/floor/iron, -/area/station/engineering/atmos) "lGr" = ( /obj/effect/turf_decal/siding/brown{ dir = 6 @@ -32212,19 +32260,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"lLE" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "lLH" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -32545,6 +32580,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/dorms) +"lOI" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "lOM" = ( /obj/structure/table, /obj/item/folder, @@ -33002,6 +33044,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"lVM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "lVN" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/spawner/random/maintenance, @@ -33657,18 +33708,18 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/electrical) -"mfV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/space_heater, -/turf/open/floor/iron, -/area/station/engineering/atmos) "mgt" = ( /obj/machinery/vending/boozeomat, /obj/machinery/firealarm/directional/south, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) +"mgw" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space) "mgz" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -34198,6 +34249,9 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) +"moM" = ( +/turf/open/floor/iron, +/area/station/engineering/atmos) "mpk" = ( /obj/machinery/airalarm/directional/south, /turf/open/floor/circuit/green, @@ -34865,6 +34919,13 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"mCe" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/radio/intercom/directional/west, +/obj/machinery/status_display/evac/directional/south, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "mCf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external/glass{ @@ -35106,21 +35167,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"mFD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/clothing/head/cone{ - pixel_x = -7; - pixel_y = 9 - }, -/obj/item/clothing/head/cone{ - pixel_x = -7; - pixel_y = 11 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "mFG" = ( /obj/machinery/telecomms/processor/preset_four, /obj/effect/decal/cleanable/dirt, @@ -35438,19 +35484,6 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) -"mKK" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "mKV" = ( /obj/effect/turf_decal/siding/blue{ dir = 5 @@ -36139,37 +36172,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"mXm" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "N2O to Pure" - }, -/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer1{ - dir = 4; - name = "Plasma to Pure"; - color = "#BF40BF" - }, -/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer5{ - dir = 4; - name = "CO2 to Pure" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "mXt" = ( /obj/machinery/rnd/production/techfab/department/medical, /obj/effect/turf_decal/stripes/box, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark/small, /area/station/medical/storage) -"mXx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "mXD" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -36731,6 +36739,13 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron/smooth, /area/station/engineering/atmos) +"nhh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) "nhs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -38537,10 +38552,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/small, /area/station/engineering/atmos) -"nIO" = ( -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/showroomfloor, -/area/station/medical/virology) "nIS" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock{ @@ -39594,14 +39605,6 @@ dir = 1 }, /area/station/hallway/primary/central/fore) -"obd" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 10 - }, -/obj/structure/cable, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "obe" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/disposalpipe/segment{ @@ -40571,6 +40574,14 @@ "orb" = ( /turf/closed/wall, /area/station/engineering/main) +"orq" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/bot, +/obj/machinery/microwave{ + pixel_y = 5 + }, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "orC" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -42289,11 +42300,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"oTY" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/tank_holder/extinguisher/advanced, -/turf/open/floor/iron, -/area/station/engineering/atmos) "oTZ" = ( /obj/structure/table, /turf/open/floor/plating, @@ -45213,13 +45219,6 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"pJT" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) "pKg" = ( /obj/effect/turf_decal/siding/dark{ dir = 10 @@ -46274,6 +46273,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"pXD" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ + dir = 4; + name = "O2 to pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "pXL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -47578,22 +47584,6 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) -"qqr" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer5{ - dir = 4; - name = "Air to Pure" - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "N2 to Pure" - }, -/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer1{ - dir = 4; - name = "O2 to Pure" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "qqx" = ( /obj/structure/bed/maint, /turf/open/floor/eighties/red, @@ -48359,13 +48349,6 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"qAQ" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/helium_output{ - dir = 8 - }, -/turf/open/floor/engine/n2o, -/area/station/ai_monitored/turret_protected/ai) "qAR" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -48512,6 +48495,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/large, /area/station/service/chapel) +"qCk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "qCq" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/north, @@ -50055,6 +50043,13 @@ }, /turf/open/floor/plating, /area/station/security/brig/entrance) +"qYL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "qZe" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 1 @@ -50150,6 +50145,12 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/ordnance/storage) +"rab" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "raf" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/effect/turf_decal/tile/dark_red/opposingcorners, @@ -50785,6 +50786,13 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) +"ric" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rie" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/cargo_technician, @@ -50933,16 +50941,6 @@ }, /turf/open/floor/wood, /area/station/service/theater) -"rkk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/item/kirbyplants/random, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "rkr" = ( /obj/structure/table_frame, /obj/effect/decal/cleanable/molten_object, @@ -51337,19 +51335,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"rqV" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) "rrb" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_dark, @@ -51802,16 +51787,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"rxs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ - dir = 8; - initialize_directions = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "rxu" = ( /obj/structure/table, /obj/machinery/airalarm/directional/south, @@ -52619,13 +52594,6 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron, /area/station/commons/dorms) -"rHW" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "rIb" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/closet/secure_closet/security/sec, @@ -53290,6 +53258,13 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) +"rRc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) "rRf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53612,15 +53587,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) -"rVA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "rVH" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/table/glass, @@ -54060,6 +54026,28 @@ /obj/effect/landmark/start/research_director, /turf/open/floor/iron/grimy, /area/station/science/cubicle) +"sch" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "scj" = ( /turf/closed/wall/r_wall, /area/station/science/lower) @@ -54209,6 +54197,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/space/basic, /area/space/nearstation) +"seW" = ( +/obj/structure/fluff/broken_canister_frame, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "sfd" = ( /obj/effect/turf_decal/siding/blue{ dir = 10 @@ -54784,6 +54779,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"snf" = ( +/obj/effect/gibspawner/human, +/obj/structure/table/optable{ + desc = "A cold, hard place for your final rest."; + name = "Morgue Slab" + }, +/mob/living/carbon/human/species/monkey/humand_legged{ + name = "Charles"; + real_name = "Charles" + }, +/turf/open/floor/iron/white/diagonal, +/area/station/maintenance/department/science/xenobiology) "snj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment{ @@ -55074,13 +55081,6 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) -"sqB" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "sqV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/sofa/bench/left{ @@ -56040,6 +56040,14 @@ }, /turf/open/floor/engine, /area/station/science/cytology) +"sEt" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/helium_output{ + dir = 8; + name = "N2O tank output inlet" + }, +/turf/open/floor/engine/n2o, +/area/station/ai_monitored/turret_protected/ai) "sEz" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -58253,10 +58261,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) -"tnH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "tnO" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -58611,6 +58615,14 @@ /obj/machinery/electrolyzer, /turf/open/floor/catwalk_floor, /area/station/maintenance/disposal/incinerator) +"ttf" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/light/cold/directional/north, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "ttg" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -60258,11 +60270,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"tSg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "tSh" = ( /obj/item/kirbyplants/random, /turf/open/floor/wood, @@ -61393,6 +61400,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"ugN" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "ugX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61719,19 +61734,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"umn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "South Ports to Wastes" - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "umr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -63771,6 +63773,16 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) +"uQe" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "uQf" = ( /obj/structure/bed/medical/emergency, /obj/structure/extinguisher_cabinet/directional/west, @@ -65737,6 +65749,13 @@ }, /turf/open/space/basic, /area/space/nearstation) +"vrU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "vrW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66278,13 +66297,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/wood/parquet, /area/station/service/library) -"vzK" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/helium_output{ - dir = 4 - }, -/turf/open/floor/engine/helium, -/area/station/ai_monitored/turret_protected/ai) "vzM" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/brown/full, @@ -67423,11 +67435,6 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"vPY" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) "vQk" = ( /obj/effect/spawner/random/structure/crate, /obj/machinery/computer/security/telescreen/entertainment/directional/east, @@ -67699,13 +67706,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison) -"vUh" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron, -/area/station/engineering/atmos) "vUq" = ( /obj/machinery/restaurant_portal/bar, /obj/machinery/firealarm/directional/west, @@ -68405,6 +68405,13 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark/small, /area/station/engineering/lobby) +"weJ" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "weT" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -68730,6 +68737,13 @@ /obj/effect/landmark/start/librarian, /turf/open/floor/wood/parquet, /area/station/service/library) +"wiZ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "wja" = ( /turf/closed/wall/r_wall, /area/station/commons/toilet/auxiliary) @@ -68871,11 +68885,6 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/service/chapel) -"wlS" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) "wlU" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -69615,13 +69624,6 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/iron/cafeteria, /area/station/maintenance/starboard/fore) -"wxm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white/small, -/area/station/medical/virology) "wxp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -70063,19 +70065,6 @@ "wCY" = ( /turf/closed/wall, /area/station/command/heads_quarters/cmo) -"wDg" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white, -/area/station/medical/virology) "wDo" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -70553,6 +70542,17 @@ /obj/structure/bookcase/random, /turf/open/floor/wood/parquet, /area/station/service/library) +"wKw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wKy" = ( /obj/structure/railing{ dir = 1 @@ -70729,17 +70729,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) -"wNi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ - dir = 1 - }, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) "wNv" = ( /obj/effect/landmark/navigate_destination/bridge, /turf/open/floor/iron/smooth_half, @@ -71443,15 +71432,6 @@ dir = 1 }, /area/station/hallway/secondary/construction) -"wWP" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron, -/area/station/engineering/atmos) "wWR" = ( /obj/structure/table, /obj/item/clothing/gloves/color/orange, @@ -72383,6 +72363,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/chapel/office) +"xhy" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "xhA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -75112,6 +75099,13 @@ /obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, /area/station/service/chapel) +"xPU" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ + dir = 4; + name = "CO2 to Pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "xPW" = ( /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/wood/parquet, @@ -75508,6 +75502,22 @@ }, /turf/open/floor/engine, /area/station/science/cytology) +"xTS" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "xTT" = ( /obj/machinery/door/airlock/research/glass{ name = "Cubicle" @@ -75791,14 +75801,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"xXl" = ( -/obj/structure/table/reinforced, -/obj/structure/showcase/machinery/microwave{ - pixel_y = 7 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/small, -/area/station/engineering/break_room) "xXr" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -85580,8 +85582,8 @@ dDB dDB dDB jhz -hsL -kpe +xQZ +sch dDB dDB dDB @@ -85816,9 +85818,9 @@ tYT tYT dDB dDB -jul -blb -blb +cCM +buD +wiZ dDB dDB tYT @@ -85836,9 +85838,9 @@ tYT tYT dDB dDB -blb -pJT -rqV +lOI +ugN +xTS dDB dDB dDB @@ -86073,9 +86075,9 @@ wBo giq wBo vmL -apj -vmL -vmL +mgw +xhy +dIK vmL ybO tYT @@ -86093,10 +86095,10 @@ aJq tYT ybO vmL -vmL -kwH -lLE -vmL +dtH +xhy +uQe +weJ ybO aJq aJq @@ -86330,9 +86332,9 @@ drw gvB wBo ybO -mKK -cwf -cwf +rRc +rRc +rRc ybO ybO aJq @@ -86350,10 +86352,10 @@ aJq aJq ybO ybO -cwf +rRc +rRc +rRc pfx -brC -ybO ybO akZ akZ @@ -86587,10 +86589,10 @@ ylK qBD gKs hXt -mXm -hXt -hXt -bJN +xPU +gWx +bWP +mCe hYC pwv pwv @@ -86607,10 +86609,10 @@ pwv pwv hYC jrb -dZX -bDO -qqr -bkI +bJY +boT +pXD +iIC ybO gBh gBh @@ -86844,9 +86846,9 @@ jwC vDD gKs ydI -ijP -ivT -gCP +fIi +kQy +nhh sWE hYC gjP @@ -86863,10 +86865,10 @@ lMg tSi vnz hYC -dYY -dqV -ivT -hZf +gyo +fIi +kcf +nhh nkp kvb gBh @@ -87101,9 +87103,9 @@ fYo jVI bBd sUk -apd -fJt -chb +cFI +jOy +fjt hqm uhh gCR @@ -87121,9 +87123,9 @@ bSm qxz mRA hvZ -mXx -fJt -vPY +xHT +jOy +ric wPt bNq cmf @@ -87359,8 +87361,8 @@ vtw gKs mFZ exE -tFB -wWP +moM +dXL dlk qUN paW @@ -87615,10 +87617,10 @@ jdU ihj gKs pIB -wNi -bPU -yii -tnH +wKw +tFB +rab +vrU vcR fxV wJn @@ -87635,9 +87637,9 @@ eOP qNN fFu oDa -umn +jGb bPU -wlS +bPv akU bNq vlC @@ -87872,10 +87874,10 @@ jNL fEr pUK vjK -rVA -vUh -oTY -kXf +hEW +bPU +yii +qCk hvo kQr bNg @@ -87893,8 +87895,8 @@ kQr etX wXV xHT -lGq -sqB +seW +kED fJP eDe viw @@ -88128,10 +88130,10 @@ gKs fpF gKs gKs -aOb +ttf utf -mfV -mFD +lVM +fXI mrW hYC wVh @@ -88149,9 +88151,9 @@ nIL lNC hYC wyU -rkk +bym blZ -rxs +iba upf bNq gBh @@ -88385,10 +88387,10 @@ dwP jNr tsR gKs -obd -exA +ewl +cry vAb -tSg +cEU nYP xae qol @@ -94821,7 +94823,7 @@ thb oxc rwJ wnR -xXl +orq gKL gdA xuv @@ -102021,7 +102023,7 @@ fpY oRm uTA apZ -vzK +bgN oCF uTA fpY @@ -103045,7 +103047,7 @@ aJq yjV fpY uTA -hYA +jBA xTV dua gnA @@ -104077,7 +104079,7 @@ fpY fpY uTA bat -qAQ +sEt bat uTA fpY @@ -104086,7 +104088,7 @@ wct hJp wct gOm -gyf +kiQ eFe eYk xvT @@ -106247,7 +106249,7 @@ tRc tRc tRc tRc -rHW +qYL dHT sSQ sSQ @@ -107022,7 +107024,7 @@ bUv cSk gLb nlS -wxm +daL gpM sSQ hrF @@ -108560,12 +108562,12 @@ jrk gIF wYA bpS -nIO +fJe nYk vVP xAA hgf -wDg +keK uGj wgL oiA @@ -113421,7 +113423,7 @@ dDB blb dDB ldq -kas +snf vXn ldq ldq diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index ba6a7fc1758..dde4d751e1f 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -3381,6 +3381,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"aSz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "cmoshutter"; + name = "CMO Privacy Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "aSB" = ( /obj/effect/spawner/random/trash/cigbutt, /turf/open/floor/iron/dark, @@ -8541,16 +8551,6 @@ /mob/living/basic/rabbit, /turf/open/floor/grass, /area/station/hallway/secondary/entry) -"ceF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - id = "cmo_privacy"; - name = "CMO Privacy Shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/medical/storage) "ceH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/line{ @@ -8989,31 +8989,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/construction) -"cjz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/button/door/directional/west{ - id = "viro-inner"; - name = "Inner Virology Lockdown"; - pixel_y = -8 - }, -/obj/machinery/button/door/directional/west{ - id = "viro-outer"; - name = "Outer Virology Lockdown"; - pixel_y = 8 - }, -/obj/machinery/button/door/directional/west{ - id = "viro-iso"; - name = "Isolation Bolts"; - normaldoorcontrol = 1; - pixel_x = -36; - specialfunctions = 4 - }, -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white, -/area/station/medical/virology) "cjB" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, @@ -11222,6 +11197,31 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/bronze/filled, /area/station/maintenance/floor1/starboard) +"cNC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/button/door/directional/west{ + id = "viro-inner"; + name = "Inner Virology Lockdown"; + pixel_y = -8 + }, +/obj/machinery/button/door/directional/west{ + id = "viro-outer"; + name = "Outer Virology Lockdown"; + pixel_y = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "viro-iso"; + name = "Isolation Bolts"; + normaldoorcontrol = 1; + pixel_x = -36; + specialfunctions = 4 + }, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white, +/area/station/medical/virology) "cNE" = ( /obj/structure/mineral_door/paperframe, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14128,6 +14128,16 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/aft) +"dCm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "cmoshutter"; + name = "CMO Privacy Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "dCt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19532,6 +19542,15 @@ }, /turf/open/openspace, /area/station/science/xenobiology/hallway) +"fbl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/obj/machinery/power/smes/full, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) "fbo" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -29807,6 +29826,16 @@ dir = 8 }, /area/station/commons/dorms/room1) +"hLa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "cmoshutter"; + name = "CMO Privacy Shutters" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "hLd" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -36853,15 +36882,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) -"jCk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/small/directional/west, -/obj/machinery/power/smes/full, -/turf/open/floor/plating, -/area/station/engineering/gravity_generator) "jCz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40353,14 +40373,6 @@ }, /turf/open/floor/iron/chapel, /area/station/service/chapel) -"kvW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white, -/area/station/medical/virology) "kwc" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -41350,6 +41362,19 @@ /obj/effect/turf_decal/trimline/dark_blue/end, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) +"kIx" = ( +/obj/machinery/keycard_auth/directional/north{ + pixel_x = 9 + }, +/obj/machinery/button/door/directional/north{ + name = "CMO Privacy Shutters"; + id = "cmoshutter"; + req_access = list("cmo"); + pixel_y = 25; + pixel_x = -5 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "kIG" = ( /obj/machinery/button/door/directional/north{ id = "Secure Storage"; @@ -42593,6 +42618,16 @@ /obj/structure/rack, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"kYr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "cmoshutter"; + name = "CMO Privacy Shutters" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "kYt" = ( /obj/structure/chair/comfy/carp, /turf/open/floor/carpet/neon/simple/pink/nodots, @@ -46268,16 +46303,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) -"lTO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "cmo_privacy"; - name = "CMO Privacy Shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/heads_quarters/cmo) "lTV" = ( /obj/machinery/door/firedoor, /obj/machinery/mineral/ore_redemption, @@ -57402,16 +57427,6 @@ /obj/structure/sign/poster/official/terragov/directional/north, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"oJs" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "cmo_privacy"; - name = "CMO Privacy Shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/heads_quarters/cmo) "oJO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/pod/dark, @@ -59385,6 +59400,14 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/aft) +"pmI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white, +/area/station/medical/virology) "pmO" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -87820,6 +87843,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, /area/station/service/theater) +"wBe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "CMO Privacy Shutters"; + dir = 4; + id = "cmoshutter" + }, +/turf/open/floor/plating, +/area/station/medical/storage) "wBg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/robot_debris/up, @@ -92007,19 +92040,6 @@ /obj/effect/turf_decal/siding/thinplating_new/corner, /turf/open/floor/iron/smooth, /area/station/cargo/sorting) -"xEv" = ( -/obj/machinery/keycard_auth/directional/north{ - pixel_x = 9 - }, -/obj/machinery/button/door/directional/north{ - id = "cmo_privacy"; - name = "Robotics Privacy Control"; - pixel_x = -6; - pixel_y = 25; - req_access = list("cmo") - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) "xEw" = ( /obj/machinery/computer/camera_advanced/base_construction/aux{ dir = 4 @@ -143683,7 +143703,7 @@ lEI aVc dEc dFq -jCk +fbl oHx dEc vYD @@ -190447,9 +190467,9 @@ syV wPX xKq nCG -oJs +dCm goX -oJs +kYr nCG mrG mrG @@ -190703,7 +190723,7 @@ jRO ihm wyE xKq -lTO +hLa rac srK keJ @@ -190960,7 +190980,7 @@ jRO eCO wyE xKq -lTO +aSz dZz bPP xhJ @@ -191732,7 +191752,7 @@ tam oKR xKq nCG -xEv +kIx rBt aDp xug @@ -192247,10 +192267,10 @@ eBo vOn nfv nfv -ceF -ceF -ceF -ceF +wBe +wBe +wBe +wBe nfv nfv mHh @@ -195562,7 +195582,7 @@ mqc mRQ dVV xNy -cjz +cNC mcI rPC sJn @@ -196076,7 +196096,7 @@ iOA utl doh gJz -kvW +pmI hwQ piz aWO @@ -196590,7 +196610,7 @@ iOA dfU pZm wJy -kvW +pmI dVV bLm yhv diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 82a1cda8daf..3087d0745cd 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -3326,13 +3326,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"atX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/turbine_computer{ - mapping_id = "main_turbine" - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "auc" = ( /obj/effect/turf_decal/siding/thinplating/corner, /obj/structure/cable, @@ -3373,24 +3366,12 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"aum" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "auo" = ( /obj/machinery/power/turbine/inlet_compressor{ dir = 4 }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"aup" = ( -/obj/machinery/power/turbine/core_rotor{ - dir = 4; - mapping_id = "main_turbine" - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "auq" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Utilities Access Hatch" @@ -7418,6 +7399,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"bzP" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "bAj" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Tram Mechanical Room" @@ -8073,6 +8061,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/sorting) +"bLI" = ( +/obj/machinery/computer/security/telescreen{ + name = "turbine vent monitor"; + desc = "Used for watching the turbine vent."; + dir = 8; + pixel_x = 29; + network = list("turbine") + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "bLN" = ( /obj/machinery/door/airlock/security{ name = "Interrogation" @@ -9871,14 +9871,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) -"crm" = ( -/obj/machinery/airalarm/directional/east, -/obj/structure/table, -/obj/item/storage/toolbox/electrical{ - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "crz" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -15925,6 +15917,12 @@ /obj/structure/cable, /turf/open/floor/iron/freezer, /area/station/medical/coldroom) +"eyl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "eyy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -19590,12 +19588,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"fTF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "fTI" = ( /obj/structure/railing{ dir = 1 @@ -23542,6 +23534,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/fitness) +"hqY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "hrh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23969,17 +23968,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) -"hBY" = ( -/obj/machinery/computer/security/telescreen{ - name = "turbine vent monitor"; - desc = "Used for watching the turbine vent."; - dir = 8; - pixel_x = 29; - network = list("turbine") - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "hCp" = ( /obj/structure/chair/stool/bar/directional/north, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -24034,6 +24022,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) +"hDs" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 10 + }, +/obj/machinery/light/directional/west, +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "hDE" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/cable, @@ -28810,6 +28807,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"joq" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 6 + }, +/obj/machinery/firealarm/directional/east, +/obj/machinery/light/directional/east, +/obj/structure/table, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_x = -2 + }, +/obj/item/radio/off, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "jos" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 9 @@ -32491,11 +32502,6 @@ }, /turf/open/space/openspace, /area/space) -"kzf" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "kzg" = ( /obj/structure/table, /obj/machinery/recharger, @@ -33877,6 +33883,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"kWp" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "kWq" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -35189,6 +35203,16 @@ "ltw" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) +"ltH" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "ltZ" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 5 @@ -35740,6 +35764,14 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"lDG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/machinery/light/small/directional/west, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "lDM" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/item/radio/intercom/directional/south, @@ -36773,6 +36805,12 @@ /obj/machinery/light/dim/directional/south, /turf/open/floor/iron, /area/station/cargo/warehouse) +"lUD" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "lUE" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -37292,20 +37330,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) -"mds" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 6 - }, -/obj/machinery/firealarm/directional/east, -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/item/book/manual/wiki/engineering_guide{ - pixel_x = -2 - }, -/obj/item/radio/off, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "mdD" = ( /obj/effect/turf_decal/siding/thinplating, /obj/effect/turf_decal/siding/thinplating{ @@ -41940,14 +41964,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"nNa" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "nNh" = ( /obj/structure/flora/bush/sunny/style_random, /turf/open/misc/grass/jungle, @@ -42612,12 +42628,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/bar/backroom) -"nXQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "nYq" = ( /obj/structure/sign/directions/supply{ dir = 4; @@ -42900,14 +42910,6 @@ /obj/machinery/reagentgrinder, /turf/open/floor/wood, /area/station/service/bar/backroom) -"ocw" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 10 - }, -/obj/machinery/light/directional/west, -/obj/machinery/power/smes/engineering, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "ocK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/structure/sign/warning/secure_area{ @@ -46399,14 +46401,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"pwj" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/chair/stool/directional/east, -/obj/effect/landmark/start/virologist, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) "pwm" = ( /obj/structure/railing{ dir = 10 @@ -47146,13 +47140,6 @@ }, /turf/open/floor/circuit/green, /area/station/science/server) -"pIA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "pIF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50504,6 +50491,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"qTs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/turbine_computer{ + mapping_id = "main_turbine" + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "qTt" = ( /obj/machinery/light_switch/directional/south, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -51815,11 +51810,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/commons/dorms) -"rnA" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "rnK" = ( /obj/structure/bookcase{ name = "Forbidden Knowledge" @@ -53477,6 +53467,14 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"rTU" = ( +/obj/machinery/power/turbine/core_rotor{ + dir = 4; + mapping_id = "main_turbine" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) "rTZ" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, @@ -54339,6 +54337,14 @@ "ski" = ( /turf/open/floor/carpet, /area/station/hallway/secondary/entry) +"skk" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/chair/stool/directional/east, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) "sko" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -54745,16 +54751,6 @@ /obj/structure/sign/calendar/directional/north, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) -"srx" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 - }, -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "srz" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -62223,6 +62219,11 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"uPi" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "uPo" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -64137,6 +64138,14 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lobby) +"vyD" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "vyG" = ( /obj/machinery/door/airlock/command{ name = "Head of Security" @@ -66601,6 +66610,12 @@ /obj/structure/flora/coconuts, /turf/open/misc/grass/jungle, /area/station/science/explab) +"wtS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "wuc" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 1 @@ -67320,13 +67335,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"wGQ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "wGU" = ( /obj/machinery/door/window/brigdoor/right/directional/east{ name = "Medical Cell"; @@ -70812,6 +70820,12 @@ }, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) +"ybb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "ybc" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery/white{ @@ -102975,7 +102989,7 @@ bVW xdC uKK nFu -ocw +hDs fal akJ tbc @@ -103231,8 +103245,8 @@ pcO iKr ofZ uKK -fTF -nNa +wtS +kWp fal akK rvY @@ -103746,7 +103760,7 @@ mIU hmI uKK ajF -kzf +uPi fal akK ixT @@ -104003,7 +104017,7 @@ bVW swg uKK ajF -wGQ +bzP fal aks lJv @@ -104259,8 +104273,8 @@ fal fal eSU wSh -crm -mds +vyD +joq fal akI pib @@ -110977,10 +110991,10 @@ vde atC gqV atP -atP -pIA -aum -aup +ybb +lDG +eyl +rTU hVG aac aac @@ -111231,10 +111245,10 @@ gjj rCd pts gEs -nXQ -rnA -hBY -atX +hqY +lUD +bLI +qTs wAQ qWU uue @@ -172642,7 +172656,7 @@ bWk svF xrG kow -pwj +skk jqY jqY jqY @@ -173150,7 +173164,7 @@ whz aaa aaa ugt -srx +ltH vrJ aPS tMb diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 1da090f2957..31b85a89f2c 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -587,7 +587,7 @@ /area/shuttle/syndicate/medical) "fB" = ( /obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/turf/closed/wall/r_wall/syndicate/nodiagonal, /area/shuttle/syndicate/airlock) "gt" = ( /obj/item/storage/box/handcuffs{ @@ -1096,7 +1096,7 @@ }, /area/shuttle/syndicate/eva) "Xy" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/turf/closed/wall/r_wall/syndicate/nodiagonal, /area/shuttle/syndicate/airlock) "YN" = ( /turf/open/floor/iron/dark/smooth_corner{ diff --git a/code/__DEFINES/construction/structures.dm b/code/__DEFINES/construction/structures.dm index 1b4ea8aa112..e48dc078ca4 100644 --- a/code/__DEFINES/construction/structures.dm +++ b/code/__DEFINES/construction/structures.dm @@ -48,9 +48,11 @@ #define AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS 1 #define AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER 2 -//blast door (de)construction states +///The blast door is missing wires, first step of construction. #define BLASTDOOR_NEEDS_WIRES 0 +///The blast door needs electronics, second step of construction. #define BLASTDOOR_NEEDS_ELECTRONICS 1 +///The blast door is fully constructed. #define BLASTDOOR_FINISHED 2 //floodlights because apparently we use defines now diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index cc9e4d2e966..5a328a62ef7 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -146,6 +146,8 @@ #define COMPONENT_LIVING_BLOCK_PRE_MOB_BUMP (1<<0) ///From base of mob/living/MobBump() (mob/living) #define COMSIG_LIVING_MOB_BUMP "living_mob_bump" +///From base of mob/living/MobBump() (mob/living) +#define COMSIG_LIVING_MOB_BUMPED "living_mob_bumped" ///From base of mob/living/Bump() (turf/closed) #define COMSIG_LIVING_WALL_BUMP "living_wall_bump" ///From base of turf/closed/Exited() (turf/closed) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 43e3a09a028..f628df0e964 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -448,7 +448,10 @@ /// Prevents click from happening. #define COMPONENT_CANCEL_EQUIPMENT_CLICK (1<<0) +///from base of /obj/item/attack(): (mob/living, mob/living, params) #define COMSIG_ITEM_ATTACK "item_attack" +///from base of /obj/item/attack(): (mob/living, mob/living, params) +#define COMSIG_ITEM_POST_ATTACK "item_post_attack" // called only if the attack was executed ///from base of obj/item/attack_self(): (/mob) #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self_secondary(): (/mob) diff --git a/code/__DEFINES/power.dm b/code/__DEFINES/power.dm index b9752eac351..f22d756d375 100644 --- a/code/__DEFINES/power.dm +++ b/code/__DEFINES/power.dm @@ -26,8 +26,6 @@ ///The amount of power, in watts, a standard powercell can give. #define STANDARD_CELL_RATE (STANDARD_CELL_VALUE WATTS) // 1 MW. -GLOBAL_VAR_INIT(CHARGELEVEL, 0.01) // Cap for how fast cells charge, as a percentage per second (.01 means cellcharge is capped to 1% per second) - // Converts cable layer to its human readable name GLOBAL_LIST_INIT(cable_layer_to_name, list( "[CABLE_LAYER_1]" = CABLE_LAYER_1_NAME, diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 4281fba00cb..402b104cabf 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -353,3 +353,6 @@ #define VOTE_WINNER_METHOD_WEIGHTED_RANDOM "Weighted Random" /// There is no winner for this vote. #define VOTE_WINNER_METHOD_NONE "None" + +/// Returned by [/datum/vote/proc/can_be_initiated] to denote the vote is valid and can be initiated. +#define VOTE_AVAILABLE "Vote Available" diff --git a/code/__DEFINES/~skyrat_defines/maths.dm b/code/__DEFINES/~skyrat_defines/maths.dm new file mode 100644 index 00000000000..756d5983d4d --- /dev/null +++ b/code/__DEFINES/~skyrat_defines/maths.dm @@ -0,0 +1,3 @@ +/// A function that exponentially approaches a maximum value of L +/// k is the rate at which it 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))))) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 7af30c8d972..6811a31284a 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -417,7 +417,7 @@ **/ /proc/list_clear_nulls(list/list_to_clear) return (list_to_clear.RemoveAll(null) > 0) - + /** * Removes any empty weakrefs from the list @@ -473,17 +473,23 @@ * You should only pass integers in. */ /proc/pick_weight(list/list_to_pick) + if(length(list_to_pick) == 0) + return null + var/total = 0 - var/item - for(item in list_to_pick) + for(var/item in list_to_pick) if(!list_to_pick[item]) list_to_pick[item] = 0 total += list_to_pick[item] total = rand(1, total) - for(item in list_to_pick) - total -= list_to_pick[item] - if(total <= 0 && list_to_pick[item]) + for(var/item in list_to_pick) + var/item_weight = list_to_pick[item] + if(item_weight == 0) + continue + + total -= item_weight + if(total <= 0) return item return null diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index d5ba848fc8d..1d05ccc16c0 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -236,6 +236,8 @@ user.do_attack_animation(target_mob) target_mob.attacked_by(src, user) + SEND_SIGNAL(src, COMSIG_ITEM_POST_ATTACK, target_mob, user, params) + log_combat(user, target_mob, "attacked", src.name, "(COMBAT MODE: [uppertext(user.combat_mode)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 368ae3a3840..068f857c8cb 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -347,6 +347,16 @@ min_val = 0 integer = FALSE +/datum/config_entry/number/events_frequency_lower + default = 2.5 MINUTES + min_val = 0 + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/number/events_frequency_upper + default = 7 MINUTES + min_val = 0 + protection = CONFIG_ENTRY_LOCKED + /datum/config_entry/number/mice_roundstart default = 10 min_val = 0 diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 09e4dec760c..b3ff39ef1fe 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -188,13 +188,13 @@ /// minimum time between voting sessions (deciseconds, 10 minute default) /datum/config_entry/number/vote_delay - default = 6000 + default = 10 MINUTES integer = FALSE min_val = 0 /// length of voting period (deciseconds, default 1 minute) /datum/config_entry/number/vote_period - default = 600 + default = 1 MINUTES integer = FALSE min_val = 0 diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 241622509af..23b36eb994e 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -25,6 +25,10 @@ SUBSYSTEM_DEF(events) if(!event.typepath || !event.valid_for_map()) continue //don't want this one! leave it for the garbage collector control += event //add it to the list of all events (controls) + + frequency_lower = CONFIG_GET(number/events_frequency_lower) + frequency_upper = CONFIG_GET(number/events_frequency_upper) + reschedule() // Instantiate our holidays list if it hasn't been already if(isnull(GLOB.holidays)) @@ -91,7 +95,8 @@ SUBSYSTEM_DEF(events) event_roster[event_to_check] = event_to_check.weight var/datum/round_event_control/event_to_run = pick_weight(event_roster) - TriggerEvent(event_to_run) + if(event_to_run) + TriggerEvent(event_to_run) ///Does the last pre-flight checks for the passed event, and runs it if the event is ready. /datum/controller/subsystem/events/proc/TriggerEvent(datum/round_event_control/event_to_trigger) @@ -109,8 +114,8 @@ SUBSYSTEM_DEF(events) ///Sets the event frequency bounds back to their initial value. /datum/controller/subsystem/events/proc/resetFrequency() - frequency_lower = initial(frequency_lower) - frequency_upper = initial(frequency_upper) + frequency_lower = CONFIG_GET(number/events_frequency_lower) + frequency_upper = CONFIG_GET(number/events_frequency_upper) /** * HOLIDAYS diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 410db36988d..b7c26acf375 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -18,6 +18,8 @@ SUBSYSTEM_DEF(vote) var/list/voted = list() /// A list of all ckeys currently voting for the current vote. var/list/voting = list() + /// World.time we started our last vote + var/last_vote_time = -INFINITY /datum/controller/subsystem/vote/Initialize() for(var/vote_type in subtypesof(/datum/vote)) @@ -30,16 +32,20 @@ SUBSYSTEM_DEF(vote) return SS_INIT_SUCCESS - // Called by master_controller /datum/controller/subsystem/vote/fire() if(!current_vote) return current_vote.time_remaining = round((current_vote.started_time + CONFIG_GET(number/vote_period) - world.time) / 10) if(current_vote.time_remaining < 0) - process_vote_result() - SStgui.close_uis(src) - reset() + end_vote() + +/// Ends the current vote. +/datum/controller/subsystem/vote/proc/end_vote() + ASSERT(current_vote) + process_vote_result() + SStgui.close_uis(src) + reset() /// Resets all of our vars after votes conclude / are cancelled. /datum/controller/subsystem/vote/proc/reset() @@ -168,24 +174,10 @@ SUBSYSTEM_DEF(vote) * * vote_type - The type of vote to initiate. Can be a [/datum/vote] typepath, a [/datum/vote] instance, or the name of a vote datum. * * vote_initiator_name - The ckey (if player initiated) or name that initiated a vote. Ex: "UristMcAdmin", "the server" * * vote_initiator - If a person / mob initiated the vote, this is the mob that did it - * * forced - Whether we're forcing the vote to go through regardless of existing votes or other circumstances. Note: If the vote is admin created, forced becomes true regardless. + * * forced - Whether we're forcing the vote to go through regardless of existing votes or other circumstances. */ /datum/controller/subsystem/vote/proc/initiate_vote(vote_type, vote_initiator_name, mob/vote_initiator, forced = FALSE) - - // Even if it's forced we can't vote before we're set up - if(!MC_RUNNING(init_stage)) - if(vote_initiator) - to_chat(vote_initiator, span_warning("You cannot start vote now, the server is not done initializing.")) - return FALSE - - // Check if we have unlimited voting power. - // Admin started (or forced) voted will go through even if there's an ongoing vote, - // if voting is on cooldown, or regardless if a vote is config disabled (in some cases) - var/unlimited_vote_power = forced || !!GLOB.admin_datums[vote_initiator?.ckey] - - if(current_vote && !unlimited_vote_power) - if(vote_initiator) - to_chat(vote_initiator, span_warning("There is already a vote in progress! Please wait for it to finish.")) + if(!can_vote_start(vote_initiator, forced)) return FALSE // Get our actual datum @@ -212,7 +204,7 @@ SUBSYSTEM_DEF(vote) return FALSE // Vote can't be initiated in our circumstances? No vote - if(!to_vote.can_be_initiated(vote_initiator, unlimited_vote_power)) + if(to_vote.can_be_initiated(forced) != VOTE_AVAILABLE) return FALSE // Okay, we're ready to actually create a vote - @@ -223,8 +215,12 @@ SUBSYSTEM_DEF(vote) if(!to_vote.create_vote(vote_initiator)) return FALSE + if(!vote_initiator_name && vote_initiator) + vote_initiator_name = vote_initiator.key + // Okay, the vote's happening now, for real. Set it up. current_vote = to_vote + last_vote_time = world.time var/duration = CONFIG_GET(number/vote_period) var/to_display = current_vote.initiate_vote(vote_initiator_name, duration) @@ -248,6 +244,36 @@ SUBSYSTEM_DEF(vote) return TRUE +/** + * Checks if we can start a vote. + * + * * vote_initiator - The mob that initiated the vote. + * * forced - Whether we're forcing the vote to go through regardless of existing votes or other circumstances. + * + * Returns TRUE if we can start a vote, FALSE if we can't. + */ +/datum/controller/subsystem/vote/proc/can_vote_start(mob/vote_initiator, forced) + // Even if it's forced we can't vote before we're set up + if(!MC_RUNNING(init_stage)) + if(vote_initiator) + to_chat(vote_initiator, span_warning("You cannot start a vote now, the server is not done initializing.")) + return FALSE + + if(forced) + return TRUE + + var/next_allowed_time = last_vote_time + CONFIG_GET(number/vote_delay) + if(next_allowed_time > world.time) + if(vote_initiator) + to_chat(vote_initiator, span_warning("A vote was initiated recently. You must wait [DisplayTimeText(next_allowed_time - world.time)] before a new vote can be started!")) + return FALSE + + if(current_vote) + if(vote_initiator) + to_chat(vote_initiator, span_warning("There is already a vote in progress! Please wait for it to finish.")) + return FALSE + + return TRUE /datum/controller/subsystem/vote/ui_state() return GLOB.always_state @@ -282,11 +308,12 @@ SUBSYSTEM_DEF(vote) if(!istype(vote)) continue + var/can_vote = vote.can_be_initiated(is_lower_admin) var/list/vote_data = list( "name" = vote_name, - "canBeInitiated" = vote.can_be_initiated(forced = is_lower_admin), + "canBeInitiated" = can_vote == VOTE_AVAILABLE, "config" = vote.is_config_enabled(), - "message" = vote.message, + "message" = can_vote == VOTE_AVAILABLE ? vote.default_message : can_vote, ) if(vote == current_vote) @@ -310,9 +337,15 @@ SUBSYSTEM_DEF(vote) all_vote_data += list(vote_data) data["possibleVotes"] = all_vote_data + data["LastVoteTime"] = last_vote_time - world.time return data +/datum/controller/subsystem/vote/ui_static_data(mob/user) + var/list/data = list() + data["VoteCD"] = CONFIG_GET(number/vote_delay) + return data + /datum/controller/subsystem/vote/ui_act(action, params) . = ..() if(.) @@ -323,19 +356,37 @@ SUBSYSTEM_DEF(vote) switch(action) if("cancel") if(!voter.client?.holder) + message_admins("[key_name(voter)] tried to cancel the current vote while having no admin holder, \ + this is potentially a malicious exploit and worth noting.") return voter.log_message("cancelled a vote.", LOG_ADMIN) message_admins("[key_name_admin(voter)] has cancelled the current vote.") + SStgui.close_uis(src) reset() return TRUE + if("endNow") + if(!voter.client?.holder) + message_admins("[key_name(voter)] tried to end the current vote while having no admin holder, \ + this is potentially a malicious exploit and worth noting.") + return + + voter.log_message("ended the current vote early", LOG_ADMIN) + message_admins("[key_name_admin(voter)] has ended the current vote.") + end_vote() + return TRUE + if("toggleVote") var/datum/vote/selected = possible_votes[params["voteName"]] if(!istype(selected)) return + if(!check_rights_for(voter.client, R_ADMIN)) + message_admins("[key_name(voter)] tried to toggle vote availability while having improper rights, \ + this is potentially a malicious exploit and worth noting.") + return - return selected.toggle_votable(voter) + return selected.toggle_votable() if("callVote") var/datum/vote/selected = possible_votes[params["voteName"]] @@ -344,7 +395,12 @@ SUBSYSTEM_DEF(vote) // Whether the user actually can initiate this vote is checked in initiate_vote, // meaning you can't spoof initiate a vote you're not supposed to be able to - return initiate_vote(selected, voter.key, voter) + return initiate_vote( + vote_type = selected, + vote_initiator_name = voter.key, + vote_initiator = voter, + forced = !!GLOB.admin_datums[voter.ckey], + ) if("voteSingle") return submit_single_vote(voter, params["voteOption"]) @@ -352,6 +408,15 @@ SUBSYSTEM_DEF(vote) if("voteMulti") return submit_multi_vote(voter, params["voteOption"]) + if("resetCooldown") + if(!voter.client.holder) + message_admins("[key_name(voter)] tried to reset the vote cooldown while having no admin holder, \ + this is potentially a malicious exploit and worth noting.") + return + + last_vote_time = -INFINITY + return TRUE + /datum/controller/subsystem/vote/ui_close(mob/user) voting -= user.client?.ckey @@ -360,6 +425,10 @@ SUBSYSTEM_DEF(vote) set category = "OOC" set name = "Vote" + if(!SSvote.initialized) + to_chat(usr, span_notice("Voting is not set up yet!")) + return + SSvote.ui_interact(usr) /// Datum action given to mobs that allows players to vote on the current vote. diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm index 56b65c6f758..9c3dab3c8fb 100644 --- a/code/datums/components/jousting.dm +++ b/code/datums/components/jousting.dm @@ -44,7 +44,7 @@ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(on_attack)) + RegisterSignal(parent, COMSIG_ITEM_POST_ATTACK, PROC_REF(on_successful_attack)) RegisterSignal(parent, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /datum/component/jousting/UnregisterFromParent() @@ -53,7 +53,7 @@ COMSIG_ATOM_EXAMINE, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, - COMSIG_ITEM_ATTACK, + COMSIG_ITEM_POST_ATTACK, COMSIG_TRANSFORMING_ON_TRANSFORM, )) @@ -94,7 +94,7 @@ * We deduct the minimum tile charge from the current tile charge to get what will actually be buffed * So your charge will only get benefits from each extra tile after the minimum (and before the maximum). */ -/datum/component/jousting/proc/on_attack(datum/source, mob/living/target, mob/user) +/datum/component/jousting/proc/on_successful_attack(datum/source, mob/living/target, mob/user) SIGNAL_HANDLER if(user != current_holder || !user.buckled) return diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 163de4867d5..d62414a862b 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -266,7 +266,7 @@ /datum/component/uplink/ui_assets(mob/user) return list( - get_asset_datum(/datum/asset/json/uplink) + get_asset_datum(/datum/asset/json/uplink), ) /datum/component/uplink/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) diff --git a/code/datums/lazy_template.dm b/code/datums/lazy_template.dm index 3b19a17a179..7b18ff7225f 100644 --- a/code/datums/lazy_template.dm +++ b/code/datums/lazy_template.dm @@ -15,6 +15,8 @@ var/map_name /// place_on_top: Whether to use /turf/proc/PlaceOnTop rather than /turf/proc/ChangeTurf var/place_on_top = FALSE + /// type of turf reservation + var/turf_reservation_type = /datum/turf_reservation /datum/lazy_template/New() reservations = list() @@ -62,6 +64,7 @@ width, height, parsed_template.parsed_bounds[MAP_MAXZ], + reservation_type = turf_reservation_type, ) if(!reservation) CRASH("Failed to reserve a block for lazy template: '[key]'") diff --git a/code/datums/votes/_vote_datum.dm b/code/datums/votes/_vote_datum.dm index 3f821a7129a..76833f73ff5 100644 --- a/code/datums/votes/_vote_datum.dm +++ b/code/datums/votes/_vote_datum.dm @@ -15,19 +15,8 @@ var/list/default_choices /// Does the name of this vote contain the word "vote"? var/contains_vote_in_name = FALSE - /// What message do we want to pass to the player-side vote panel as a tooltip? - var/message = "Click to initiate a vote." - - // Internal values used when tracking ongoing votes. - // Don't mess with these, change the above values / override procs for subtypes. - /// An assoc list of [all choices] to [number of votes in the current running vote]. - var/list/choices = list() - /// A assoc list of [ckey] to [what they voted for in the current running vote]. - var/list/choices_by_ckey = list() - /// The world time this vote was started. - var/started_time - /// The time remaining in this vote's run. - var/time_remaining + /// What message do we show as the tooltip of this vote if the vote can be initiated? + var/default_message = "Click to initiate a vote." /// The counting method we use for votes. var/count_method = VOTE_COUNT_METHOD_SINGLE /// The method for selecting a winner. @@ -35,6 +24,17 @@ /// Should we show details about the number of votes submitted for each option? var/display_statistics = TRUE + // Internal values used when tracking ongoing votes. + // Don't mess with these, change the above values / override procs for subtypes. + /// An assoc list of [all choices] to [number of votes in the current running vote]. + VAR_FINAL/list/choices = list() + /// A assoc list of [ckey] to [what they voted for in the current running vote]. + VAR_FINAL/list/choices_by_ckey = list() + /// The world time this vote was started. + VAR_FINAL/started_time = -1 + /// The time remaining in this vote's run. + VAR_FINAL/time_remaining = -1 + /** * Used to determine if this vote is a possible * vote type for the vote subsystem. @@ -55,14 +55,13 @@ choices.Cut() choices_by_ckey.Cut() started_time = null - time_remaining = null + time_remaining = -1 /** * If this vote has a config associated, toggles it between enabled and disabled. - * Returns TRUE on a successful toggle, FALSE otherwise */ -/datum/vote/proc/toggle_votable(mob/toggler) - return FALSE +/datum/vote/proc/toggle_votable() + return /** * If this vote has a config associated, returns its value (True or False, usually). @@ -74,20 +73,18 @@ /** * Checks if the passed mob can initiate this vote. * - * Return TRUE if the mob can begin the vote, allowing anyone to actually vote on it. - * Return FALSE if the mob cannot initiate the vote. + * * forced - if being invoked by someone who is an admin + * + * Return VOTE_AVAILABLE if the mob can initiate the vote. + * Return a string with the reason why the mob can't initiate the vote. */ -/datum/vote/proc/can_be_initiated(mob/by_who, forced = FALSE) +/datum/vote/proc/can_be_initiated(forced = FALSE) SHOULD_CALL_PARENT(TRUE) - if(started_time) - var/next_allowed_time = (started_time + CONFIG_GET(number/vote_delay)) - if(next_allowed_time > world.time && !forced) - message = "A vote was initiated recently. You must wait [DisplayTimeText(next_allowed_time - world.time)] before a new vote can be started!" - return FALSE + if(!forced && !is_config_enabled()) + return "This vote is currently disabled by the server configuration." - message = initial(message) - return TRUE + return VOTE_AVAILABLE /** * Called prior to the vote being initiated. diff --git a/code/datums/votes/custom_vote.dm b/code/datums/votes/custom_vote.dm index d67eb0281c6..78eb6d3b876 100644 --- a/code/datums/votes/custom_vote.dm +++ b/code/datums/votes/custom_vote.dm @@ -1,14 +1,9 @@ /// The max amount of options someone can have in a custom vote. #define MAX_CUSTOM_VOTE_OPTIONS 10 -/datum/vote/custom_vote/single - name = "Custom Standard" - message = "Click here to start a custom vote (one selection per voter)" - -/datum/vote/custom_vote/multi - name = "Custom Multi" - message = "Click here to start a custom multi vote (multiple selections per voter)" - count_method = VOTE_COUNT_METHOD_MULTI +/datum/vote/custom_vote + name = "Custom" + default_message = "Click here to start a custom vote." // Custom votes ares always accessible. /datum/vote/custom_vote/is_accessible_vote() @@ -17,23 +12,45 @@ /datum/vote/custom_vote/reset() default_choices = null override_question = null + count_method = VOTE_COUNT_METHOD_SINGLE return ..() -/datum/vote/custom_vote/can_be_initiated(mob/by_who, forced = FALSE) +/datum/vote/custom_vote/can_be_initiated(forced) . = ..() - if(!.) - return FALSE + if(. != VOTE_AVAILABLE) + return . + if(forced) + return . // Custom votes can only be created if they're forced to be made. // (Either an admin makes it, or otherwise.) - return forced + return "Only admins can create custom votes." /datum/vote/custom_vote/create_vote(mob/vote_creator) + var/custom_count_method = tgui_input_list( + user = vote_creator, + message = "Single or multiple choice?", + title = "Choice Method", + items = list("Single", "Multiple"), + default = "Single", + ) + switch(custom_count_method) + if("Single") + count_method = VOTE_COUNT_METHOD_SINGLE + if("Multiple") + count_method = VOTE_COUNT_METHOD_MULTI + if(null) + return FALSE + else + stack_trace("Got '[custom_count_method]' in create_vote() for custom voting.") + to_chat(vote_creator, span_boldwarning("Unknown choice method. Contact a coder.")) + return FALSE + var/custom_win_method = tgui_input_list( - vote_creator, - "How should the vote winner be determined?", - "Winner Method", - list("Simple", "Weighted Random", "No Winner"), + user = vote_creator, + message = "How should the vote winner be determined?", + title = "Winner Method", + items = list("Simple", "Weighted Random", "No Winner"), default = "Simple", ) switch(custom_win_method) @@ -43,7 +60,10 @@ winner_method = VOTE_WINNER_METHOD_WEIGHTED_RANDOM if("No Winner") winner_method = VOTE_WINNER_METHOD_NONE + if(null) + return FALSE else + stack_trace("Got '[custom_win_method]' in create_vote() for custom voting.") to_chat(vote_creator, span_boldwarning("Unknown winner method. Contact a coder.")) return FALSE @@ -54,7 +74,7 @@ list("Yes", "No"), ) - if(display_stats == null) + if(isnull(display_stats)) return FALSE display_statistics = display_stats == "Yes" @@ -74,6 +94,9 @@ if(!length(default_choices)) return FALSE + // Sanity for all the tgui input stalling we are doing + if(isnull(vote_creator.client?.holder)) + return FALSE return ..() diff --git a/code/datums/votes/map_vote.dm b/code/datums/votes/map_vote.dm index 301af610096..7b1794da93e 100644 --- a/code/datums/votes/map_vote.dm +++ b/code/datums/votes/map_vote.dm @@ -1,6 +1,6 @@ /datum/vote/map_vote name = "Map" - message = "Vote for next round's map!" + default_message = "Vote for next round's map!" count_method = VOTE_COUNT_METHOD_SINGLE winner_method = VOTE_WINNER_METHOD_WEIGHTED_RANDOM display_statistics = FALSE @@ -30,44 +30,26 @@ SSmapping.map_voted = TRUE // voted by not voting, very sad. return FALSE -/datum/vote/map_vote/toggle_votable(mob/toggler) - if(!toggler) - CRASH("[type] wasn't passed a \"toggler\" mob to toggle_votable.") - if(!check_rights_for(toggler.client, R_ADMIN)) - return FALSE - +/datum/vote/map_vote/toggle_votable() CONFIG_SET(flag/allow_vote_map, !CONFIG_GET(flag/allow_vote_map)) - return TRUE /datum/vote/map_vote/is_config_enabled() return CONFIG_GET(flag/allow_vote_map) -/datum/vote/map_vote/can_be_initiated(mob/by_who, forced = FALSE) +/datum/vote/map_vote/can_be_initiated(forced) . = ..() - if(!.) - return FALSE - + if(. != VOTE_AVAILABLE) + return . if(forced) - return TRUE - + return VOTE_AVAILABLE var/number_of_choices = length(check_population()) if(number_of_choices < 2) - message = "There [number_of_choices == 1 ? "is only one map" : "are no maps"] to choose from." - return FALSE - + return "There [number_of_choices == 1 ? "is only one map" : "are no maps"] to choose from." if(SSmapping.map_vote_rocked) - return TRUE - - if(!CONFIG_GET(flag/allow_vote_map)) - message = "Map voting is disabled by server configuration settings." - return FALSE - + return VOTE_AVAILABLE if(SSmapping.map_voted) - message = "The next map has already been selected." - return FALSE - - message = initial(message) - return TRUE + return "The next map has already been selected." + return VOTE_AVAILABLE /// Before we create a vote, remove all maps from our choices that are outside of our population range. /// Note that this can result in zero remaining choices for our vote, which is not ideal (but ultimately okay). diff --git a/code/datums/votes/restart_vote.dm b/code/datums/votes/restart_vote.dm index 987d5b87eb3..3c74d7e518e 100644 --- a/code/datums/votes/restart_vote.dm +++ b/code/datums/votes/restart_vote.dm @@ -7,7 +7,8 @@ CHOICE_RESTART, CHOICE_CONTINUE, ) - message = "Vote to restart the ongoing round." + default_message = "Vote to restart the ongoing round. \ + Only works if there are no non-AFK admins online." /// This proc checks to see if any admins are online for the purposes of this vote to see if it can pass. Returns TRUE if there are valid admins online (Has +SERVER and is not AFK), FALSE otherwise. /datum/vote/restart_vote/proc/admins_present() @@ -19,36 +20,24 @@ return FALSE -/datum/vote/restart_vote/toggle_votable(mob/toggler) - if(!toggler) - CRASH("[type] wasn't passed a \"toggler\" mob to toggle_votable.") - - if(!check_rights_for(toggler.client, R_ADMIN)) - return FALSE - +/datum/vote/restart_vote/toggle_votable() CONFIG_SET(flag/allow_vote_restart, !CONFIG_GET(flag/allow_vote_restart)) - return TRUE /datum/vote/restart_vote/is_config_enabled() return CONFIG_GET(flag/allow_vote_restart) -/datum/vote/restart_vote/can_be_initiated(mob/by_who, forced) +/datum/vote/restart_vote/create_vote(mob/vote_creator) . = ..() if(!.) - return FALSE + return + if(!admins_present()) + return + async_alert_about_admins(vote_creator) - if(!forced && !CONFIG_GET(flag/allow_vote_restart)) - message = "Restart voting is disabled by server configuration settings." - return FALSE - - // We still want players to be able to vote to restart even if valid admins are online. Let's update the message just so that the player is aware of this fact. - // We don't want to lock-out the vote though, so we'll return TRUE. - if(admins_present()) - message = "Regardless of the results of this vote, the round will not automatically restart because an admin is online." - return TRUE - - message = initial(message) - return TRUE +/datum/vote/restart_vote/proc/async_alert_about_admins(mob/vote_creator) + set waitfor = FALSE + tgui_alert(vote_creator, "Note: Regardless of the results of this vote, \ + the round will not automatically restart because an active admin is online.") /datum/vote/restart_vote/get_vote_result(list/non_voters) if(!CONFIG_GET(flag/default_no_vote)) diff --git a/code/datums/votes/rock_the_vote.dm b/code/datums/votes/rock_the_vote.dm index 6cffeb5ad67..6c7ac4ff257 100644 --- a/code/datums/votes/rock_the_vote.dm +++ b/code/datums/votes/rock_the_vote.dm @@ -10,58 +10,40 @@ CHOICE_TO_ROCK, CHOICE_NOT_TO_ROCK, ) - message = "Override the current map vote." + default_message = "Override the current map vote." /// The number of times we have rocked the vote thus far. var/rocking_votes = 0 -/datum/vote/rock_the_vote/toggle_votable(mob/toggler) - if(!toggler) - CRASH("[type] wasn't passed a \"toggler\" mob to toggle_votable.") - if(!check_rights_for(toggler.client, R_ADMIN)) - return FALSE - +/datum/vote/rock_the_vote/toggle_votable() CONFIG_SET(flag/allow_rock_the_vote, !CONFIG_GET(flag/allow_rock_the_vote)) - return TRUE /datum/vote/rock_the_vote/is_config_enabled() return CONFIG_GET(flag/allow_rock_the_vote) -/datum/vote/rock_the_vote/can_be_initiated(mob/by_who, forced) +/datum/vote/rock_the_vote/can_be_initiated(forced) . = ..() - - if(!.) - return FALSE - - if(!forced && !CONFIG_GET(flag/allow_rock_the_vote)) - message = "Rocking the vote is disabled by this server's configuration settings." - return FALSE + if(. != VOTE_AVAILABLE) + return . if(SSticker.current_state == GAME_STATE_FINISHED) - message = "The game is finished, no map votes can be initiated." - return FALSE + return "The game is finished, no map votes can be initiated." if(rocking_votes >= CONFIG_GET(number/max_rocking_votes)) - message = "The maximum number of times to rock the vote has been reached." - return FALSE + return "The maximum number of times to rock the vote has been reached." if(SSmapping.map_vote_rocked) - message = "The vote has already been rocked! Initiate a map vote!" - return FALSE + return "The vote has already been rocked! Initiate a map vote!" if(!SSmapping.map_voted) - message = "Rocking the vote is disabled because no map has been voted on yet!" - return FALSE + return "Rocking the vote is disabled because no map has been voted on yet!" if(SSmapping.map_force_chosen) - message = "Rocking the vote is disabled because an admin has forcibly set the map!" - return FALSE + return "Rocking the vote is disabled because an admin has forcibly set the map!" if(EMERGENCY_ESCAPED_OR_ENDGAMED && SSmapping.map_voted) - message = "The emergency shuttle has already left the station and the next map has already been chosen!" - return FALSE + return "The emergency shuttle has already left the station and the next map has already been chosen!" - message = initial(message) - return TRUE + return VOTE_AVAILABLE /datum/vote/rock_the_vote/finalize_vote(winning_option) rocking_votes++ diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index cb7c3972993..4b7bfd2d08f 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -258,8 +258,13 @@ return TRUE // Station blueprints do that too, but only if the wires are not randomized. - if(user.is_holding_item_of_type(/obj/item/blueprints) && !randomize) - return TRUE + if(!randomize) + if(user.is_holding_item_of_type(/obj/item/blueprints)) + return TRUE + for(var/obj/item/photo/photo in user.held_items) + if(!photo.picture || !photo.picture.has_blueprints) + continue + return TRUE return FALSE diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index c88fa7f11b1..5396655e28c 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -236,7 +236,8 @@ JOB_HEAD_OF_SECURITY, JOB_HEAD_OF_PERSONNEL, JOB_CHIEF_ENGINEER, - JOB_CHIEF_MEDICAL_OFFICER + JOB_CHIEF_MEDICAL_OFFICER, + JOB_QUARTERMASTER, ) exists_on_map = TRUE difficulty = 3 @@ -279,7 +280,8 @@ JOB_HEAD_OF_SECURITY, JOB_HEAD_OF_PERSONNEL, JOB_CHIEF_ENGINEER, - JOB_CHIEF_MEDICAL_OFFICER + JOB_CHIEF_MEDICAL_OFFICER, + JOB_QUARTERMASTER, ) exists_on_map = TRUE difficulty = 4 @@ -633,7 +635,15 @@ /datum/objective_item/steal/traitor/rpd name = "rapid pipe dispenser" targetitem = /obj/item/pipe_dispenser - excludefromjob = list(JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_SCIENTIST, JOB_RESEARCH_DIRECTOR, JOB_GENETICIST, JOB_ROBOTICIST) + excludefromjob = list( + JOB_ATMOSPHERIC_TECHNICIAN, + JOB_STATION_ENGINEER, + JOB_CHIEF_ENGINEER, + JOB_SCIENTIST, + JOB_RESEARCH_DIRECTOR, + JOB_GENETICIST, + JOB_ROBOTICIST, + ) item_owner = list(JOB_CHIEF_ENGINEER) exists_on_map = TRUE difficulty = 1 @@ -645,7 +655,19 @@ /datum/objective_item/steal/traitor/donut_box name = "a box of prized donuts" targetitem = /obj/item/storage/fancy/donut_box - excludefromjob = list(JOB_CAPTAIN, JOB_CHIEF_ENGINEER, JOB_HEAD_OF_PERSONNEL, JOB_HEAD_OF_SECURITY, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_RESEARCH_DIRECTOR, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_LAWYER, JOB_DETECTIVE) + excludefromjob = list( + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_QUARTERMASTER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + JOB_LAWYER, + JOB_DETECTIVE, + ) exists_on_map = TRUE difficulty = 1 steal_hint = "Everyone has a box of donuts - you may most commonly find them on the Bridge, within Security, or in any department's break room." diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm index 1cb7ee1477e..792c1ba22eb 100644 --- a/code/game/machinery/civilian_bounties.dm +++ b/code/game/machinery/civilian_bounties.dm @@ -184,6 +184,9 @@ data["id_bounty_names"] = list(inserted_scan_id.registered_account.bounties[1].name, inserted_scan_id.registered_account.bounties[2].name, inserted_scan_id.registered_account.bounties[3].name) + data["id_bounty_infos"] = list(inserted_scan_id.registered_account.bounties[1].description, + inserted_scan_id.registered_account.bounties[2].description, + inserted_scan_id.registered_account.bounties[3].description) data["id_bounty_values"] = list(inserted_scan_id.registered_account.bounties[1].reward * (CIV_BOUNTY_SPLIT/100), inserted_scan_id.registered_account.bounties[2].reward * (CIV_BOUNTY_SPLIT/100), inserted_scan_id.registered_account.bounties[3].reward * (CIV_BOUNTY_SPLIT/100)) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 3ab4fef3fdb..72c339aa519 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -117,7 +117,9 @@ new_frame.set_anchored(TRUE) new_frame.circuit = circuit // Circuit removal code is handled in /obj/machinery/Exited() + component_parts -= circuit circuit.forceMove(new_frame) + if((machine_stat & BROKEN) || !disassembled) var/atom/drop_loc = drop_location() playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE) @@ -128,7 +130,6 @@ new_frame.state = FRAME_COMPUTER_STATE_GLASSED new_frame.update_appearance(UPDATE_ICON_STATE) - /obj/machinery/computer/ui_interact(mob/user, datum/tgui/ui) SHOULD_CALL_PARENT(TRUE) //SKYRAT EDIT ADDITON BEGIN - AESTHETICS diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm index 63d2808c773..b97dac9e15d 100644 --- a/code/game/machinery/computer/arcade/battle.dm +++ b/code/game/machinery/computer/arcade/battle.dm @@ -531,7 +531,8 @@ return player_turn = TRUE ui_panel = UI_PANEL_WORLD_MAP - player_gold /= 2 + if(player_gold) + player_gold = max(round(player_gold /= 2, 1), 0) return TRUE //they pressed something but it wasn't in the menu, we'll be nice and give them back their turn anyway. player_turn = TRUE diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index f5695dd6284..45bfeb9fcef 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -339,3 +339,12 @@ to_chat(owner, span_notice("You move downwards.")) else to_chat(owner, span_notice("You couldn't move downwards!")) + +/obj/machinery/computer/camera_advanced/human_ai/screwdriver_act(mob/living/user, obj/item/tool) + balloon_alert(user, "repackaging...") + if(!do_after(user, 5 SECONDS, src)) + return ITEM_INTERACT_BLOCKING + tool.play_tool_sound(src, 40) + new /obj/item/secure_camera_console_pod(get_turf(src)) + qdel(src) + return ITEM_INTERACT_SUCCESS diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index d2a432688c1..deb8341b0ba 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -35,6 +35,72 @@ /obj/machinery/door/poddoor/get_save_vars() return ..() + NAMEOF(src, id) +/obj/machinery/door/poddoor/examine(mob/user) + . = ..() + if(panel_open) + if(deconstruction == BLASTDOOR_FINISHED) + . += span_notice("The maintenance panel is opened and the electronics could be pried out.") + . += span_notice("\The [src] could be calibrated to a blast door controller ID with a multitool.") + else if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS) + . += span_notice("The electronics are missing and there are some wires sticking out.") + else if(deconstruction == BLASTDOOR_NEEDS_WIRES) + . += span_notice("The wires have been removed and it's ready to be sliced apart.") + +/obj/machinery/door/poddoor/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(isnull(held_item)) + return NONE + if(deconstruction == BLASTDOOR_NEEDS_WIRES && istype(held_item, /obj/item/stack/cable_coil)) + context[SCREENTIP_CONTEXT_LMB] = "Wire assembly" + return CONTEXTUAL_SCREENTIP_SET + if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS && istype(held_item, /obj/item/electronics/airlock)) + context[SCREENTIP_CONTEXT_LMB] = "Add electronics" + return CONTEXTUAL_SCREENTIP_SET + //we do not check for special effects like if they can actually perform the action because they will be told they can't do it when they try, + //with feedback on what they have to do in order to do so. + switch(held_item.tool_behaviour) + if(TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "Open panel" + return CONTEXTUAL_SCREENTIP_SET + if(TOOL_MULTITOOL) + context[SCREENTIP_CONTEXT_LMB] = "Calibrate ID" + return CONTEXTUAL_SCREENTIP_SET + if(TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Remove electronics" + return CONTEXTUAL_SCREENTIP_SET + if(TOOL_WIRECUTTER) + context[SCREENTIP_CONTEXT_LMB] = "Remove wires" + return CONTEXTUAL_SCREENTIP_SET + if(TOOL_WELDER) + context[SCREENTIP_CONTEXT_LMB] = "Disassemble" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/door/poddoor/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(deconstruction == BLASTDOOR_NEEDS_WIRES && istype(tool, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = tool + var/datum/crafting_recipe/recipe = locate(recipe_type) in GLOB.crafting_recipes + var/amount_needed = recipe.reqs[/obj/item/stack/cable_coil] + if(coil.get_amount() < amount_needed) + balloon_alert(user, "not enough cable!") + return ITEM_INTERACT_SUCCESS + balloon_alert(user, "adding cables...") + if(!do_after(user, 5 SECONDS, src)) + return ITEM_INTERACT_SUCCESS + coil.use(amount_needed) + deconstruction = BLASTDOOR_NEEDS_ELECTRONICS + balloon_alert(user, "cables added") + return ITEM_INTERACT_SUCCESS + + if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS && istype(tool, /obj/item/electronics/airlock)) + balloon_alert(user, "adding electronics...") + if(!do_after(user, 10 SECONDS, src)) + return ITEM_INTERACT_SUCCESS + qdel(tool) + balloon_alert(user, "electronics added") + deconstruction = BLASTDOOR_FINISHED + return ITEM_INTERACT_SUCCESS + return NONE + /obj/machinery/door/poddoor/screwdriver_act(mob/living/user, obj/item/tool) . = ..() if (density) @@ -49,7 +115,8 @@ balloon_alert(user, "open the door first!") return ITEM_INTERACT_SUCCESS if (!panel_open) - return + balloon_alert(user, "open the panel first!") + return ITEM_INTERACT_SUCCESS if (deconstruction != BLASTDOOR_FINISHED) return var/change_id = tgui_input_number(user, "Set the door controllers ID (Current: [id])", "Door Controller ID", isnum(id) ? id : null, 100) @@ -69,7 +136,8 @@ balloon_alert(user, "open the door first!") return ITEM_INTERACT_SUCCESS if (!panel_open) - return + balloon_alert(user, "open the panel first!") + return ITEM_INTERACT_SUCCESS if (deconstruction != BLASTDOOR_FINISHED) return balloon_alert(user, "removing airlock electronics...") @@ -86,7 +154,8 @@ balloon_alert(user, "open the door first!") return ITEM_INTERACT_SUCCESS if (!panel_open) - return + balloon_alert(user, "open the panel first!") + return ITEM_INTERACT_SUCCESS if (deconstruction != BLASTDOOR_NEEDS_ELECTRONICS) return balloon_alert(user, "removing internal cables...") @@ -104,7 +173,8 @@ balloon_alert(user, "open the door first!") return ITEM_INTERACT_SUCCESS if (!panel_open) - return + balloon_alert(user, "open the panel first!") + return ITEM_INTERACT_SUCCESS if (deconstruction != BLASTDOOR_NEEDS_WIRES) return balloon_alert(user, "tearing apart...") //You're tearing me apart, Lisa! @@ -116,17 +186,6 @@ qdel(src) return ITEM_INTERACT_SUCCESS -/obj/machinery/door/poddoor/examine(mob/user) - . = ..() - if(panel_open) - if(deconstruction == BLASTDOOR_FINISHED) - . += span_notice("The maintenance panel is opened and the electronics could be pried out.") - . += span_notice("\The [src] could be calibrated to a blast door controller ID with a multitool.") - else if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS) - . += span_notice("The electronics are missing and there are some wires sticking out.") - else if(deconstruction == BLASTDOOR_NEEDS_WIRES) - . += span_notice("The wires have been removed and it's ready to be sliced apart.") - /obj/machinery/door/poddoor/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) id = "[port.shuttle_id]_[id]" diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index eca8d88da4b..0df6024ca82 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -16,6 +16,9 @@ density = FALSE opacity = FALSE +/obj/machinery/door/poddoor/shutters/preopen/deconstructed + deconstruction = BLASTDOOR_NEEDS_WIRES + /obj/machinery/door/poddoor/shutters/indestructible name = "hardened shutters" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 7e67b23c3b7..19d3d273337 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -14,12 +14,11 @@ else deploy_bodybag(user, get_turf(src)) -/obj/item/bodybag/afterattack(atom/target, mob/user, proximity) - . = ..() - if(proximity) - if(isopenturf(target)) - deploy_bodybag(user, target) - +/obj/item/bodybag/interact_with_atom(atom/interacting_with, mob/living/user, flags) + if(isopenturf(interacting_with)) + deploy_bodybag(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE /obj/item/bodybag/attempt_pickup(mob/user) // can't pick ourselves up if we are inside of the bodybag, else very weird things may happen if(contains(user)) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 225e914fbf6..1e6152f9bdf 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -70,7 +70,7 @@ /obj/item/laser_pointer/infinite_range/Initialize(mapload) . = ..() - diode = new /obj/item/stock_parts/servo/femto + diode = new /obj/item/stock_parts/micro_laser/quadultra /obj/item/laser_pointer/screwdriver_act(mob/living/user, obj/item/tool) if(diode) diff --git a/code/game/objects/items/devices/scanners/sequence_scanner.dm b/code/game/objects/items/devices/scanners/sequence_scanner.dm index 3a45dae813b..4c4c202f26f 100644 --- a/code/game/objects/items/devices/scanners/sequence_scanner.dm +++ b/code/game/objects/items/devices/scanners/sequence_scanner.dm @@ -19,7 +19,7 @@ var/list/discovered = list() //hit a dna console to update the scanners database var/list/buffer var/ready = TRUE - var/cooldown = 200 + var/cooldown = (20 SECONDS) /// genetic makeup data that's scanned var/list/genetic_makeup_buffer = list() @@ -104,7 +104,7 @@ buffer = LAZYLISTDUPLICATE(target.dna.mutation_index) var/list/active_mutations = list() for(var/datum/mutation/human/mutation in target.dna.mutations) - LAZYOR(buffer, mutation.type) + LAZYSET(buffer, mutation.type, GET_SEQUENCE(mutation.type)) active_mutations.Add(mutation.type) to_chat(user, span_notice("Subject [target.name]'s DNA sequence has been saved to buffer.")) diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index 9151c85ed03..7dac16aa51a 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -290,27 +290,39 @@ var/upgrade /obj/item/rcd_upgrade/frames + name = "RCD advanced upgrade: frames" desc = "It contains the design for machine frames and computer frames." + icon_state = "datadisk6" upgrade = RCD_UPGRADE_FRAMES /obj/item/rcd_upgrade/simple_circuits + name = "RCD advanced upgrade: simple circuits" desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells." + icon_state = "datadisk4" upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS /obj/item/rcd_upgrade/anti_interrupt + name = "RCD advanced upgrade: anti disruption" desc = "It contains the upgrades necessary to prevent interruption of RCD construction and deconstruction." + icon_state = "datadisk2" upgrade = RCD_UPGRADE_ANTI_INTERRUPT /obj/item/rcd_upgrade/cooling + name = "RCD advanced upgrade: enhanced cooling" desc = "It contains the upgrades necessary to allow more frequent use of the RCD." + icon_state = "datadisk7" upgrade = RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN /obj/item/rcd_upgrade/silo_link + name = "RCD advanced upgrade: silo link" desc = "It contains direct silo connection RCD upgrade." + icon_state = "datadisk8" upgrade = RCD_UPGRADE_SILO_LINK /obj/item/rcd_upgrade/furnishing + name = "RCD advanced upgrade: furnishings" desc = "It contains the design for chairs, stools, tables, and glass tables." + icon_state = "datadisk5" upgrade = RCD_UPGRADE_FURNISHING /datum/action/item_action/rcd_scan diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm index e4777977605..41a962ed7e7 100644 --- a/code/game/objects/items/rcd/RPD.dm +++ b/code/game/objects/items/rcd/RPD.dm @@ -705,7 +705,9 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/upgrade_flags /obj/item/rpd_upgrade/unwrench + name = "RPD advanced upgrade: wrench mode" desc = "Adds reverse wrench mode to the RPD. Attention, due to budget cuts, the mode is hard linked to the destroy mode control button." + icon_state = "datadisk1" upgrade_flags = RPD_UPGRADE_UNWRENCH #undef ATMOS_CATEGORY diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 280e009210c..9e3e4a502c3 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -256,6 +256,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ new/datum/stack_recipe("AI core", /obj/structure/ai_core, 4, time = 5 SECONDS, one_per_turf = TRUE, check_density = FALSE, category = CAT_ROBOT), new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 5 SECONDS, check_density = FALSE, category = CAT_CHEMISTRY), new/datum/stack_recipe("Large Gas Tank", /obj/structure/tank_frame, 4, time=1 SECONDS, one_per_turf=TRUE, check_density = FALSE, category = CAT_ATMOSPHERIC), + new/datum/stack_recipe("shutter assembly", /obj/machinery/door/poddoor/shutters/preopen/deconstructed, 5, time = 5 SECONDS, one_per_turf = TRUE, check_density = FALSE, category = CAT_DOORS), null, new /datum/stack_recipe_list("airlock assemblies", list( \ new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 0e3845d2efa..e037043cc91 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -218,13 +218,12 @@ /obj/item/emergency_bed/attack_self(mob/user) deploy_bed(user, user.loc) -/obj/item/emergency_bed/afterattack(obj/target, mob/user, proximity) - . = ..() - if(!proximity) - return +/obj/item/emergency_bed/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isopenturf(interacting_with)) + deploy_bed(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE - if(isopenturf(target)) - deploy_bed(user, target) /obj/item/emergency_bed/proc/deploy_bed(mob/user, atom/location) var/obj/structure/bed/medical/emergency/deployed = new /obj/structure/bed/medical/emergency(location) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index a6ab8a58d70..c8961a5769c 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -261,6 +261,8 @@ * Also gives xp and mining points to all nearby miners in equal measure. */ /obj/structure/ore_vent/proc/handle_wave_conclusion() + SIGNAL_HANDLER + SEND_SIGNAL(src, COMSIG_VENT_WAVE_CONCLUDED) COOLDOWN_RESET(src, wave_cooldown) particles = null @@ -275,7 +277,8 @@ visible_message(span_danger("\the [src] creaks and groans as the mining attempt fails, and the vent closes back up.")) icon_state = initial(icon_state) update_appearance(UPDATE_ICON_STATE) - return FALSE //Bad end, try again. + node = null + return //Bad end, try again. for(var/mob/living/miner in range(7, src)) //Give the miners who are near the vent points and xp. var/obj/item/card/id/user_id_card = miner.get_idcard(TRUE) @@ -284,9 +287,11 @@ if(!user_id_card) continue var/point_reward_val = (MINER_POINT_MULTIPLIER * boulder_size) - MINER_POINT_MULTIPLIER // We remove the base value of discovering the vent - user_id_card.registered_account.mining_points += point_reward_val - user_id_card.registered_account.bank_card_talk("You have been awarded [point_reward_val] mining points for your efforts.") + if(user_id_card.registered_account) + user_id_card.registered_account.mining_points += point_reward_val + user_id_card.registered_account.bank_card_talk("You have been awarded [point_reward_val] mining points for your efforts.") node.pre_escape() //Visually show the drone is done and flies away. + node = null add_overlay(mutable_appearance('icons/obj/mining_zones/terrain.dmi', "well", ABOVE_MOB_LAYER)) /** @@ -327,8 +332,9 @@ var/obj/item/card/id/user_id_card = user.get_idcard(TRUE) if(isnull(user_id_card)) return - user_id_card.registered_account.mining_points += (MINER_POINT_MULTIPLIER) - user_id_card.registered_account.bank_card_talk("You've been awarded [MINER_POINT_MULTIPLIER] mining points for discovery of an ore vent.") + if(user_id_card.registered_account) + user_id_card.registered_account.mining_points += (MINER_POINT_MULTIPLIER) + user_id_card.registered_account.bank_card_talk("You've been awarded [MINER_POINT_MULTIPLIER] mining points for discovery of an ore vent.") return if(scan_only) return diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 3a2ac3298bd..91766db08b0 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -19,6 +19,9 @@ return . = ..() +/obj/item/clothing/glasses/changeling/attack_paw(mob/user, list/modifiers) + attack_hand(user, modifiers) + /obj/item/clothing/under/changeling name = "flesh" item_flags = DROPDEL @@ -31,6 +34,9 @@ return . = ..() +/obj/item/clothing/under/changeling/attack_paw(mob/user, list/modifiers) + attack_hand(user, modifiers) + /obj/item/clothing/suit/changeling name = "flesh" allowed = list(/obj/item/changeling) @@ -44,6 +50,9 @@ return . = ..() +/obj/item/clothing/suit/changeling/attack_paw(mob/user, list/modifiers) + attack_hand(user, modifiers) + /obj/item/clothing/head/changeling name = "flesh" icon_state = null @@ -57,6 +66,9 @@ return . = ..() +/obj/item/clothing/head/changeling/attack_paw(mob/user, list/modifiers) + attack_hand(user, modifiers) + /obj/item/clothing/shoes/changeling name = "flesh" item_flags = DROPDEL @@ -69,6 +81,9 @@ return . = ..() +/obj/item/clothing/shoes/changeling/attack_paw(mob/user, list/modifiers) + attack_hand(user, modifiers) + /obj/item/clothing/gloves/changeling name = "flesh" item_flags = DROPDEL @@ -81,6 +96,9 @@ return . = ..() +/obj/item/clothing/gloves/changeling/attack_paw(mob/user, list/modifiers) + attack_hand(user, modifiers) + /obj/item/clothing/mask/changeling name = "flesh" item_flags = DROPDEL @@ -93,6 +111,9 @@ return . = ..() +/obj/item/clothing/mask/changeling/attack_paw(mob/user, list/modifiers) + attack_hand(user, modifiers) + /obj/item/changeling name = "flesh" slot_flags = ALL @@ -106,6 +127,9 @@ return . = ..() +/obj/item/changeling/attack_paw(mob/user, list/modifiers) + attack_hand(user, modifiers) + /obj/item/changeling/id slot_flags = ITEM_SLOT_ID /// Cached flat icon of the ID diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index edb2d9c8136..2358022378d 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -202,7 +202,7 @@ if(give_objectives) forge_primary_objectives() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ecult_op.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE)//subject to change + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/heretic/heretic_gain.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) for(var/starting_knowledge in GLOB.heretic_start_knowledge) gain_knowledge(starting_knowledge) diff --git a/code/modules/antagonists/heretic/heretic_monsters.dm b/code/modules/antagonists/heretic/heretic_monsters.dm index 3f3dd320357..1f95ed62ea9 100644 --- a/code/modules/antagonists/heretic/heretic_monsters.dm +++ b/code/modules/antagonists/heretic/heretic_monsters.dm @@ -13,7 +13,7 @@ /datum/antagonist/heretic_monster/on_gain() . = ..() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ecult_op.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE)//subject to change + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/heretic/heretic_gain.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) /datum/antagonist/heretic_monster/on_removal() if(!silent) diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index 1124d9a4440..3979e06313c 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -214,7 +214,7 @@ priority_announce( text = "[generate_heretic_text()] Fear the blaze, for the Ashlord, [user.real_name] has ascended! The flames shall consume all! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = ANNOUNCER_SPANOMALIES, + sound = 'sound/ambience/antag/heretic/ascend_ash.ogg', color_override = "pink", ) diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 93983c41e0d..65533537455 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -406,7 +406,7 @@ priority_announce( text = "[generate_heretic_text()] Master of blades, the Torn Champion's disciple, [user.real_name] has ascended! Their steel is that which will cut reality in a maelstom of silver! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = ANNOUNCER_SPANOMALIES, + sound = 'sound/ambience/antag/heretic/ascend_blade.ogg', color_override = "pink", ) user.client?.give_award(/datum/award/achievement/misc/blade_ascension, user) diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index 09efb5c2eb8..b048b7fbb4c 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -271,7 +271,7 @@ priority_announce( text = "[generate_heretic_text()] A Star Gazer has arrived into the station, [user.real_name] has ascended! This station is the domain of the Cosmos! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = ANNOUNCER_SPANOMALIES, + sound = 'sound/ambience/antag/heretic/ascend_cosmic.ogg', color_override = "pink", ) var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = new /mob/living/basic/heretic_summon/star_gazer(loc) diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index 97f84782c59..f7b3e6003e8 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -314,7 +314,7 @@ priority_announce( text = "[generate_heretic_text()] Ever coiling vortex. Reality unfolded. ARMS OUTREACHED, THE LORD OF THE NIGHT, [user.real_name] has ascended! Fear the ever twisting hand! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = ANNOUNCER_SPANOMALIES, + sound = 'sound/ambience/antag/heretic/ascend_flesh.ogg', color_override = "pink", ) diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index 0727b86bb66..2807167d819 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -224,7 +224,7 @@ priority_announce( text = "Delta-class dimensional anomaly detec[generate_heretic_text()] Reality rended, torn. Gates open, doors open, [user.real_name] has ascended! Fear the tide! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = ANNOUNCER_SPANOMALIES, + sound = 'sound/ambience/antag/heretic/ascend_knock.ogg', color_override = "pink", ) user.client?.give_award(/datum/award/achievement/misc/lock_ascension, user) diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index 723599ad262..b708bf6584e 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -189,8 +189,13 @@ /datum/heretic_knowledge/ultimate/moon_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) - priority_announce("[generate_heretic_text()] Laugh, for the ringleader [user.real_name] has ascended! \ - The truth shall finally devour the lie! [generate_heretic_text()]","[generate_heretic_text()]", ANNOUNCER_SPANOMALIES) + priority_announce( + text = "[generate_heretic_text()] Laugh, for the ringleader [user.real_name] has ascended! \ + The truth shall finally devour the lie! [generate_heretic_text()]", + title = "[generate_heretic_text()]", + sound = 'sound/ambience/antag/heretic/ascend_moon.ogg', + color_override = "pink", + ) user.client?.give_award(/datum/award/achievement/misc/moon_ascension, user) ADD_TRAIT(user, TRAIT_MADNESS_IMMUNE, REF(src)) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 8d577b1992a..d8702a98bf9 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -262,7 +262,7 @@ priority_announce( text = "[generate_heretic_text()] Fear the decay, for the Rustbringer, [user.real_name] has ascended! None shall escape the corrosion! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = ANNOUNCER_SPANOMALIES, + sound = 'sound/ambience/antag/heretic/ascend_rust.ogg', color_override = "pink", ) new /datum/rust_spread(loc) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index 6c39bd9ca00..60991890cfc 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -202,7 +202,7 @@ priority_announce( text = "[generate_heretic_text()] The nobleman of void [user.real_name] has arrived, stepping along the Waltz that ends worlds! [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = ANNOUNCER_SPANOMALIES, + sound = 'sound/ambience/antag/heretic/ascend_void.ogg', color_override = "pink", ) user.client?.give_award(/datum/award/achievement/misc/void_ascension, user) diff --git a/code/modules/antagonists/heretic/moon_lunatic.dm b/code/modules/antagonists/heretic/moon_lunatic.dm index 21177f1a623..dbc07a6b505 100644 --- a/code/modules/antagonists/heretic/moon_lunatic.dm +++ b/code/modules/antagonists/heretic/moon_lunatic.dm @@ -26,10 +26,6 @@ to_chat(owner, span_boldnotice("Ruin the lie, save the truth through obeying [heretic_master] the ringleader!")) -/datum/antagonist/lunatic/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/effects/moon_parade.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) - return ..() - /datum/antagonist/lunatic/apply_innate_effects(mob/living/mob_override) var/mob/living/our_mob = mob_override || owner.current handle_clown_mutation(our_mob, "Ancient knowledge from the moon has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 1816ca19637..bac6400951b 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -1,3 +1,7 @@ +/* + +Skyrat removal START, moved to modular file + //node2, air2, network2 correspond to input //node1, air1, network1 correspond to output @@ -173,3 +177,6 @@ ..() pixel_x = 0 pixel_y = 0 + +Skyrat removal END +*/ diff --git a/code/modules/deathmatch/deathmatch_lobby.dm b/code/modules/deathmatch/deathmatch_lobby.dm index 2afb3ff3a9a..1f4678ba168 100644 --- a/code/modules/deathmatch/deathmatch_lobby.dm +++ b/code/modules/deathmatch/deathmatch_lobby.dm @@ -341,70 +341,54 @@ /datum/deathmatch_lobby/ui_data(mob/user) - . = list() + var/list/data = list() + var/is_player = !isnull(players[user.ckey]) var/is_host = (user.ckey == host) var/is_admin = check_rights_for(user.client, R_ADMIN) - .["self"] = user.ckey - .["host"] = is_host - .["admin"] = is_admin - .["playing"] = playing - .["loadouts"] = list("Randomize") - for (var/datum/outfit/deathmatch_loadout/loadout as anything in loadouts) - .["loadouts"] += initial(loadout.display_name) - .["map"] = list() - .["map"]["name"] = map.name - .["map"]["desc"] = map.desc - .["map"]["time"] = map.automatic_gameend_time - .["map"]["min_players"] = map.min_players - .["map"]["max_players"] = map.max_players + var/has_auth = is_host || is_admin + + data["active_mods"] = "No modifiers selected" + data["admin"] = is_admin + data["host"] = is_host + data["loadouts"] = list("Randomize") + + for (var/datum/outfit/deathmatch_loadout/loadout as anything in loadouts) + data["loadouts"] += loadout::display_name + + data["map"] = list() + data["map"]["name"] = map.name + data["map"]["desc"] = map.desc + data["map"]["time"] = map.automatic_gameend_time + data["map"]["min_players"] = map.min_players + data["map"]["max_players"] = map.max_players + + data["mod_menu_open"] = FALSE + data["modifiers"] = has_auth ? list() : get_modifier_list(is_host, mod_menu_open) + data["observers"] = get_observer_list() + data["players"] = get_player_list() + data["playing"] = playing + data["self"] = user.ckey - .["mod_menu_open"] = FALSE - if((is_host || is_admin) && mod_menu_open) - .["mod_menu_open"] = TRUE - for(var/modpath in GLOB.deathmatch_game.modifiers) - var/datum/deathmatch_modifier/mod = GLOB.deathmatch_game.modifiers[modpath] - .["modifiers"] += list(list( - "name" = mod.name, - "desc" = mod.description, - "modpath" = "[modpath]", - "selected" = (modpath in modifiers), - "selectable" = is_host && mod.selectable(src), - )) - .["active_mods"] = "No modifiers selected" if(length(modifiers)) var/list/mod_names = list() for(var/datum/deathmatch_modifier/modpath as anything in modifiers) - mod_names += initial(modpath.name) - .["active_mods"] = "Selected modifiers: [english_list(mod_names)]" + mod_names += modpath::name + data["active_mods"] = "Selected modifiers: [english_list(mod_names)]" if(is_player && !isnull(players[user.ckey]["loadout"])) var/datum/outfit/deathmatch_loadout/loadout = players[user.ckey]["loadout"] - .["loadoutdesc"] = initial(loadout.desc) + data["loadoutdesc"] = loadout::desc else - .["loadoutdesc"] = "You are an observer! As an observer, you can hear lobby announcements." - .["players"] = list() - for (var/player_key in players) - var/list/player_info = players[player_key] - var/mob/player_mob = player_info["mob"] - if (isnull(player_mob) || !player_mob.client) - leave(player_key) - continue - .["players"][player_key] = player_info.Copy() - var/datum/outfit/deathmatch_loadout/dm_loadout = player_info["loadout"] - .["players"][player_key]["loadout"] = initial(dm_loadout.display_name) - .["observers"] = list() - for (var/observer_key in observers) - var/mob/observer = observers[observer_key]["mob"] - if (isnull(observer) || !observer.client) - leave(observer_key) - continue - .["observers"][observer_key] = observers[observer_key] + data["loadoutdesc"] = "You are an observer! As an observer, you can hear lobby announcements." + + return data /datum/deathmatch_lobby/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(. || !isobserver(usr)) return + switch(action) if ("start_game") if (usr.ckey != host) @@ -414,6 +398,7 @@ return FALSE start_game() return TRUE + if ("leave_game") if (playing) return FALSE @@ -421,6 +406,7 @@ ui.close() GLOB.deathmatch_game.ui_interact(usr) return TRUE + if ("change_loadout") if (playing) return FALSE @@ -435,6 +421,7 @@ players[params["player"]]["loadout"] = possible_loadout break return TRUE + if ("observe") if (playing) return FALSE @@ -446,16 +433,19 @@ remove_ckey_from_play(usr.ckey) add_player(usr, loadouts[1], host == usr.ckey) return TRUE + if ("ready") players[usr.ckey]["ready"] ^= 1 // Toggle. ready_count += (players[usr.ckey]["ready"] * 2) - 1 // scared? if (ready_count >= players.len && players.len >= map.min_players) start_game() return TRUE + if ("host") // Host functions if (playing || (usr.ckey != host && !check_rights(R_ADMIN))) return FALSE var/uckey = params["id"] + switch (params["func"]) if ("Kick") leave(uckey) @@ -484,12 +474,15 @@ return FALSE change_map(params["map"]) return TRUE + if("open_mod_menu") mod_menu_open = TRUE return TRUE + if("exit_mod_menu") mod_menu_open = FALSE return TRUE + if("toggle_modifier") var/datum/deathmatch_modifier/modpath = text2path(params["modpath"]) if(!ispath(modpath)) @@ -505,6 +498,7 @@ chosen_modifier.on_select(src) modifiers += modpath return TRUE + if ("admin") // Admin functions if (!check_rights(R_ADMIN)) message_admins("[usr.key] has attempted to use admin functions in a deathmatch lobby!") @@ -515,7 +509,73 @@ log_admin("[key_name(usr)] force started deathmatch lobby [host].") start_game() + return FALSE + + /datum/deathmatch_lobby/ui_close(mob/user) . = ..() if(user.ckey == host) mod_menu_open = FALSE + +/// Helper proc to get modifier data +/datum/deathmatch_lobby/proc/get_modifier_list(is_host, mod_menu_open) + var/list/modifier_list = list() + + if(!mod_menu_open) + return modifier_list + + for(var/modpath in GLOB.deathmatch_game.modifiers) + var/datum/deathmatch_modifier/mod = GLOB.deathmatch_game.modifiers[modpath] + + UNTYPED_LIST_ADD(modifier_list, list( + "name" = mod.name, + "desc" = mod.description, + "modpath" = "[modpath]", + "selected" = (modpath in modifiers), + "selectable" = is_host && mod.selectable(src), + )) + + return modifier_list + + +/// Helper proc for getting observer data +/datum/deathmatch_lobby/proc/get_observer_list() + var/list/observer_list = list() + + for (var/observer_key in observers) + var/list/observer_info = observers[observer_key] + var/mob/observer_mob = observer_info["mob"] + + if (isnull(observer_mob) || !observer_mob.client) + leave(observer_key) + continue + + var/list/observer = observer_info.Copy() + observer["key"] = observer_key + + UNTYPED_LIST_ADD(observer_list, observer) + + return observer_list + + +/// Helper proc for getting player data +/datum/deathmatch_lobby/proc/get_player_list() + var/list/player_list = list() + + for (var/player_key in players) + var/list/player_info = players[player_key] + var/mob/player_mob = player_info["mob"] + + if (isnull(player_mob) || !player_mob.client) + leave(player_key) + continue + + var/list/player = player_info.Copy() + + var/datum/outfit/deathmatch_loadout/dm_loadout = player_info["loadout"] + player["loadout"] = dm_loadout::display_name + player["key"] = player_key + + UNTYPED_LIST_ADD(player_list, player) + + return player_list diff --git a/code/modules/deathmatch/deathmatch_mapping.dm b/code/modules/deathmatch/deathmatch_mapping.dm index 95b9f5cf278..5fa04d6c5fb 100644 --- a/code/modules/deathmatch/deathmatch_mapping.dm +++ b/code/modules/deathmatch/deathmatch_mapping.dm @@ -13,3 +13,15 @@ /area/deathmatch/teleport //Prevent access to cross-z teleportation in the map itself (no wands of safety/teleportation scrolls). Cordons should prevent same-z teleportations outside of the arena. area_flags = UNIQUE_AREA | ABDUCTOR_PROOF | EVENT_PROTECTED | QUIET_LOGS + +// for the illusion of a moving train +/turf/open/chasm/true/no_smooth/fake_motion_sand + name = "air" + desc = "Dont jump off, unless you want to fall a really long distance." + icon_state = "sandmoving" + base_icon_state = "sandmoving" + icon = 'icons/turf/floors.dmi' + +/turf/open/chasm/true/no_smooth/fake_motion_sand/fast + icon_state = "sandmovingfast" + base_icon_state = "sandmovingfast" diff --git a/code/modules/deathmatch/deathmatch_maps.dm b/code/modules/deathmatch/deathmatch_maps.dm index 1abe92e7053..b2396915473 100644 --- a/code/modules/deathmatch/deathmatch_maps.dm +++ b/code/modules/deathmatch/deathmatch_maps.dm @@ -15,7 +15,7 @@ var/list/allowed_loadouts = list() /// whether we are currently being loaded by a lobby var/template_in_use = FALSE - + /datum/lazy_template/deathmatch/ragecage name = "Ragecage" @@ -175,3 +175,15 @@ ) map_name = "ragin_mages" key = "ragin_mages" + +/datum/lazy_template/deathmatch/train + name = "Trainship Hijack" + desc = "Trouble stirs in Tizira..." + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/battler/cowboy) + map_name = "train" + key = "train" + turf_reservation_type = /datum/turf_reservation/indestructible_plating + +/datum/turf_reservation/indestructible_plating + turf_type = /turf/open/indestructible/plating //a little hacky but i guess it has to be done diff --git a/code/modules/events/immovable_rod/immovable_rod.dm b/code/modules/events/immovable_rod/immovable_rod.dm index 285a99cd31d..e9d2995218d 100644 --- a/code/modules/events/immovable_rod/immovable_rod.dm +++ b/code/modules/events/immovable_rod/immovable_rod.dm @@ -76,11 +76,6 @@ if(istype(ghost)) ghost.ManualFollow(src) -/obj/effect/immovablerod/proc/on_entered_over_movable(datum/source, atom/movable/atom_crossed_over) - SIGNAL_HANDLER - if((atom_crossed_over.density || isliving(atom_crossed_over)) && !QDELETED(atom_crossed_over)) - Bump(atom_crossed_over) - /obj/effect/immovablerod/proc/on_entering_atom(datum/source, atom/destination, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER if(destination.density && isturf(destination)) diff --git a/code/modules/hallucination/fake_sound.dm b/code/modules/hallucination/fake_sound.dm index aaf8ef46823..f5d750a1144 100644 --- a/code/modules/hallucination/fake_sound.dm +++ b/code/modules/hallucination/fake_sound.dm @@ -169,7 +169,7 @@ sound_type = list( 'sound/ambience/antag/bloodcult/bloodcult_gain.ogg', 'sound/ambience/antag/clockcultalr.ogg', - 'sound/ambience/antag/ecult_op.ogg', + 'sound/ambience/antag/heretic/heretic_gain.ogg', 'sound/ambience/antag/ling_alert.ogg', 'sound/ambience/antag/malf.ogg', 'sound/ambience/antag/ops.ogg', diff --git a/code/modules/hallucination/station_message.dm b/code/modules/hallucination/station_message.dm index 97b37e77cd9..976b88f6620 100644 --- a/code/modules/hallucination/station_message.dm +++ b/code/modules/hallucination/station_message.dm @@ -40,11 +40,26 @@ /// This is gross and will probably easily be outdated in some time but c'est la vie. /// Maybe if someone datumizes heretic paths or something this can be improved var/static/list/ascension_bodies = list( - "Fear the blaze, for the Ashlord, %FAKENAME% has ascended! The flames shall consume all!", - "Master of blades, the Torn Champion's disciple, %FAKENAME% has ascended! Their steel is that which will cut reality in a maelstom of silver!", - "Ever coiling vortex. Reality unfolded. ARMS OUTREACHED, THE LORD OF THE NIGHT, %FAKENAME% has ascended! Fear the ever twisting hand!", - "Fear the decay, for the Rustbringer, %FAKENAME% has ascended! None shall escape the corrosion!", - "The nobleman of void %FAKENAME% has arrived, stepping along the Waltz that ends worlds!", + list( + "text" = "Fear the blaze, for the Ashlord, %FAKENAME% has ascended! The flames shall consume all!", + "sound" = 'sound/ambience/antag/heretic/ascend_blade.ogg', + ), + list( + "text" = "Master of blades, the Torn Champion's disciple, %FAKENAME% has ascended! Their steel is that which will cut reality in a maelstom of silver!", + "sound" = 'sound/ambience/antag/heretic/ascend_blade.ogg', + ), + list( + "text" = "Ever coiling vortex. Reality unfolded. ARMS OUTREACHED, THE LORD OF THE NIGHT, %FAKENAME% has ascended! Fear the ever twisting hand!", + "sound" = 'sound/ambience/antag/heretic/ascend_flesh.ogg', + ), + list( + "text" = "Fear the decay, for the Rustbringer, %FAKENAME% has ascended! None shall escape the corrosion!", + "sound" = 'sound/ambience/antag/heretic/ascend_rust.ogg', + ), + list( + "text" = "The nobleman of void %FAKENAME% has arrived, stepping along the Waltz that ends worlds!", + "sound" = 'sound/ambience/antag/heretic/ascend_void.ogg', + ) ) /datum/hallucination/station_message/heretic/start() @@ -53,12 +68,12 @@ if(!totally_real_heretic) return FALSE - var/message_with_name = pick(ascension_bodies) - message_with_name = replacetext(message_with_name, "%FAKENAME%", totally_real_heretic.real_name) + var/list/fake_ascension = pick(ascension_bodies) + var/announcement_text = replacetext(fake_ascension["text"], "%FAKENAME%", totally_real_heretic.real_name) priority_announce( - text = "[generate_heretic_text()] [message_with_name] [generate_heretic_text()]", + text = "[generate_heretic_text()] [announcement_text] [generate_heretic_text()]", title = "[generate_heretic_text()]", - sound = ANNOUNCER_SPANOMALIES, + sound = fake_ascension["sound"], players = list(hallucinator), color_override = "pink", ) diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm index 285479a6912..af80df69fe8 100644 --- a/code/modules/jobs/job_types/station_trait/human_ai.dm +++ b/code/modules/jobs/job_types/station_trait/human_ai.dm @@ -148,8 +148,8 @@ return ..() /obj/item/secure_camera_console_pod - name = "advanced camera control pod" - desc = "Calls down a secure camera console to use for all your AI stuff, may only be activated in the SAT." + name = "pre-packaged advanced camera control" + desc = "A pre-packaged camera console used for all your AI stuff, programmed to only active in the SAT." icon = 'icons/obj/devices/remote.dmi' icon_state = "botpad_controller" inhand_icon_state = "radio" @@ -163,9 +163,9 @@ if(!is_type_in_typecache(current_area, allowed_areas)) user.balloon_alert(user, "not in the sat!") return - podspawn(list( - "target" = get_turf(src), - "style" = STYLE_BLUESPACE, - "spawn" = /obj/machinery/computer/camera_advanced, - )) + user.balloon_alert(user, "unpacking...") + if(!do_after(user, 5 SECONDS, src)) + return + playsound(src, 'sound/items/drill_use.ogg', 40, TRUE) + new /obj/machinery/computer/camera_advanced/human_ai(get_turf(src)) qdel(src) diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm index 1f371d575ac..9d8d8855c67 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -168,24 +168,17 @@ /obj/item/organ/internal/brain/primate/on_mob_insert(mob/living/carbon/primate) . = ..() - RegisterSignal(primate, COMSIG_MOVABLE_CROSS, PROC_REF(on_crossed)) + RegisterSignal(primate, COMSIG_LIVING_MOB_BUMPED, PROC_REF(on_mob_bump)) /obj/item/organ/internal/brain/primate/on_mob_remove(mob/living/carbon/primate) . = ..() - UnregisterSignal(primate, COMSIG_MOVABLE_CROSS) + UnregisterSignal(primate, COMSIG_LIVING_MOB_BUMPED) -/obj/item/organ/internal/brain/primate/proc/on_crossed(datum/source, atom/movable/crossed) +/obj/item/organ/internal/brain/primate/proc/on_mob_bump(mob/source, mob/living/crossing_mob) SIGNAL_HANDLER - if(!tripping) + if(!tripping || !crossing_mob.combat_mode) return - if(IS_DEAD_OR_INCAP(owner) || !isliving(crossed)) - return - var/mob/living/in_the_way_mob = crossed - if(iscarbon(in_the_way_mob) && !in_the_way_mob.combat_mode) - return - if(in_the_way_mob.pass_flags & PASSMOB) - return - in_the_way_mob.knockOver(owner) + crossing_mob.knockOver(owner) /obj/item/organ/internal/brain/primate/get_attacking_limb(mob/living/carbon/human/target) if(!HAS_TRAIT(owner, TRAIT_ADVANCEDTOOLUSER)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5c3c311d3da..fb8ae1999e8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -73,11 +73,19 @@ if(levels <= 1 && can_help_themselves) var/obj/item/organ/external/wings/gliders = get_organ_by_type(/obj/item/organ/external/wings) if(HAS_TRAIT(src, TRAIT_FREERUNNING) || gliders?.can_soften_fall()) // the power of parkour or wings allows falling short distances unscathed + var/graceful_landing = HAS_TRAIT(src, TRAIT_CATLIKE_GRACE) + + if(graceful_landing) + add_movespeed_modifier(/datum/movespeed_modifier/landed_on_feet) + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/landed_on_feet), levels * 3 SECONDS) + else + Knockdown(levels * 4 SECONDS) + emote("spin") + visible_message( - span_notice("[src] makes a hard landing on [impacted_turf] but remains unharmed from the fall."), - span_notice("You brace for the fall. You make a hard landing on [impacted_turf], but remain unharmed."), + span_notice("[src] makes a hard landing on [impacted_turf] but remains unharmed from the fall[graceful_landing ? " and stays on [p_their()] feet" : " by tucking in rolling into the landing"]."), + span_notice("You brace for the fall. You make a hard landing on [impacted_turf], but remain unharmed[graceful_landing ? " while landing on your feet" : " by tucking in and rolling into the landing"]."), ) - Knockdown(levels * 4 SECONDS) return . | ZIMPACT_NO_MESSAGE var/incoming_damage = (levels * 5) ** 1.5 @@ -153,6 +161,7 @@ return TRUE SEND_SIGNAL(src, COMSIG_LIVING_MOB_BUMP, M) + SEND_SIGNAL(M, COMSIG_LIVING_MOB_BUMPED, src) //Even if we don't push/swap places, we "touched" them, so spread fire spreadFire(M) @@ -1359,9 +1368,9 @@ return FALSE if(invisibility || alpha <= 50)//cloaked return FALSE - if(!isturf(src.loc)) //The reason why we don't just use get_turf is because they could be in a closet, disposals, or a vehicle. + if(!isturf(loc)) //The reason why we don't just use get_turf is because they could be in a closet, disposals, or a vehicle. return FALSE - var/turf/T = src.loc + var/turf/T = loc if(is_centcom_level(T.z)) //dont detect mobs on centcom return FALSE if(is_away_level(T.z)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 4fbd1b55234..95623e3c538 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -480,3 +480,11 @@ stack_trace("Silicon [src] ( [type] ) was somehow missing their integrated tablet. Please make a bug report.") create_modularInterface() modularInterface.imprint_id(name = newname) + +/mob/living/silicon/can_track(mob/living/user) + //if their camera is online, it's safe to assume they are in cameranets + //since it takes a while for camera vis to update, this lets us bypass that so AIs can always see their borgs, + //without making cameras constantly update every time a borg moves. + if(builtInCamera && builtInCamera.can_use()) + return TRUE + return ..() diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index c7369724ee4..54d6abe51cc 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -397,6 +397,9 @@ . += "Its identification card slot is currently occupied." . += span_info("Alt-click [src] to eject the identification card.") + if(internal_cell) + . += span_info("Right-click it with a screwdriver to eject the [internal_cell]") + /obj/item/modular_computer/examine_more(mob/user) . = ..() . += "Storage capacity: [used_capacity]/[max_capacity]GQ" diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 605e88f1e48..5dd5515c47c 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -441,8 +441,8 @@ // Handle stamping items. if(writing_stats["interaction_mode"] == MODE_STAMPING) if(!user.can_read(src) || user.is_blind()) - //The paper's stampable window area is assumed approx 400x500 - add_stamp(writing_stats["stamp_class"], rand(0, 400), rand(0, 500), rand(0, 360), writing_stats["stamp_icon_state"]) + //The paper's stampable window area is assumed approx 300x400 + add_stamp(writing_stats["stamp_class"], rand(0, 300), rand(0, 400), rand(0, 360), writing_stats["stamp_icon_state"]) user.visible_message(span_notice("[user] blindly stamps [src] with \the [attacking_item]!")) to_chat(user, span_notice("You stamp [src] with \the [attacking_item] the best you can!")) playsound(src, 'sound/items/handling/standard_stamp.ogg', 50, vary = TRUE) @@ -454,6 +454,25 @@ ui_interact(user) return ..() +/// Secondary right click interaction to quickly stamp things +/obj/item/paper/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers) + var/list/writing_stats = tool.get_writing_implement_details() + + if(!length(writing_stats)) + return NONE + if(writing_stats["interaction_mode"] != MODE_STAMPING) + return NONE + if(!user.can_read(src) || user.is_blind()) // Just leftclick instead + return NONE + + add_stamp(writing_stats["stamp_class"], rand(1, 300), rand(1, 400), stamp_icon_state = writing_stats["stamp_icon_state"]) + user.visible_message( + span_notice("[user] quickly stamps [src] with [tool] without looking."), + span_notice("You quickly stamp [src] with [tool] without looking."), + ) + playsound(src, 'sound/items/handling/standard_stamp.ogg', 50, vary = TRUE) + + return ITEM_INTERACT_BLOCKING // Stop the UI from opening. /** * Attempts to ui_interact the paper to the given user, with some sanity checking * to make sure the camera still exists via the weakref and that this paper is still diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index ae30a350496..73e48f1f82c 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -5,6 +5,9 @@ // may be opened to change power cell // three different channels (lighting/equipment/environ) - may each be set to on, off, or auto +///Cap for how fast cells charge, as a percentage per second (.01 means cellcharge is capped to 1% per second) +#define CHARGELEVEL 0.01 + /obj/machinery/power/apc name = "area power controller" desc = "A control terminal for the area's electrical systems." @@ -586,7 +589,7 @@ // now trickle-charge the cell if(chargemode && operating && excess && cell.used_charge()) // Max charge is capped to % per second constant. - lastused_total += charge_cell(min(cell.chargerate, cell.maxcharge * GLOB.CHARGELEVEL) * seconds_per_tick, cell = cell, grid_only = TRUE, channel = AREA_USAGE_APC_CHARGE) + lastused_total += charge_cell(min(cell.chargerate, cell.maxcharge * CHARGELEVEL) * seconds_per_tick, cell = cell, grid_only = TRUE, channel = AREA_USAGE_APC_CHARGE) charging = APC_CHARGING // show cell as fully charged if so @@ -734,3 +737,5 @@ return round(energy_to_power(required_joules / trickle_charge_power) * SSmachines.wait + SSmachines.wait, SSmachines.wait) return null + +#undef CHARGELEVEL diff --git a/code/modules/power/thermoelectric_generator.dm b/code/modules/power/thermoelectric_generator.dm index bded1482825..e8e866a4443 100644 --- a/code/modules/power/thermoelectric_generator.dm +++ b/code/modules/power/thermoelectric_generator.dm @@ -1,3 +1,7 @@ +/* + +Skyrat removal START, moved to modular file + #define TEG_EFFICIENCY 0.65 /obj/machinery/power/thermoelectric_generator @@ -220,3 +224,6 @@ cold_circ = null #undef TEG_EFFICIENCY + +Skyrat removal END +*/ diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 8271298a0e6..36d73552159 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -590,12 +590,18 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) desc = "Allows to control connected conveyor belts." circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL + /// Direction input ports. + var/datum/port/input/stop + var/datum/port/input/active + var/datum/port/input/reverse /// The current direction of the conveyor attached to the component. var/datum/port/output/direction /// The switch this conveyor switch component is attached to. var/obj/machinery/conveyor_switch/attached_switch /obj/item/circuit_component/conveyor_switch/populate_ports() + active = add_input_port("Activate", PORT_TYPE_SIGNAL, trigger = PROC_REF(activate)) + stop = add_input_port("Stop", PORT_TYPE_SIGNAL, trigger = PROC_REF(stop)) direction = add_output_port("Conveyor Direction", PORT_TYPE_NUMBER) /obj/item/circuit_component/conveyor_switch/get_ui_notices() @@ -606,6 +612,8 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) . = ..() if(istype(shell, /obj/machinery/conveyor_switch)) attached_switch = shell + if(!attached_switch.oneway) + reverse = add_input_port("Reverse", PORT_TYPE_SIGNAL, trigger = PROC_REF(reverse)) /obj/item/circuit_component/conveyor_switch/unregister_usb_parent(atom/movable/shell) attached_switch = null @@ -617,16 +625,34 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) INVOKE_ASYNC(src, PROC_REF(update_conveyors), port) -/obj/item/circuit_component/conveyor_switch/proc/update_conveyors(datum/port/input/port) - if(!attached_switch) - return - - attached_switch.update_position() +/obj/item/circuit_component/conveyor_switch/proc/on_switch_changed() attached_switch.update_appearance() attached_switch.update_linked_conveyors() attached_switch.update_linked_switches() direction.set_output(attached_switch.position) +/obj/item/circuit_component/conveyor_switch/proc/activate() + SIGNAL_HANDLER + attached_switch.position = CONVEYOR_FORWARD + INVOKE_ASYNC(src, PROC_REF(on_switch_changed)) + +/obj/item/circuit_component/conveyor_switch/proc/stop() + SIGNAL_HANDLER + attached_switch.position = CONVEYOR_OFF + INVOKE_ASYNC(src, PROC_REF(on_switch_changed)) + +/obj/item/circuit_component/conveyor_switch/proc/reverse() + SIGNAL_HANDLER + attached_switch.position = CONVEYOR_BACKWARDS + INVOKE_ASYNC(src, PROC_REF(on_switch_changed)) + +/obj/item/circuit_component/conveyor_switch/proc/update_conveyors(datum/port/input/port) + if(!attached_switch) + return + + attached_switch.update_position() + INVOKE_ASYNC(src, PROC_REF(on_switch_changed)) + #undef CONVEYOR_BACKWARDS #undef CONVEYOR_OFF #undef CONVEYOR_FORWARD diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 7b85a878ec3..0e6a37ce3d0 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -93,8 +93,8 @@ Slimecrossing Items icon_state = "yellow slime extract" rating = 7 custom_materials = null - maxcharge = 50000 - chargerate = 2500 + maxcharge = 50 * STANDARD_CELL_CHARGE + chargerate = 2.5 * STANDARD_CELL_RATE charge_light_type = null connector_type = "slimecore" diff --git a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm index 6607dbc5933..20e4b586607 100644 --- a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm @@ -36,7 +36,7 @@ limb_id = SPECIES_ETHEREAL dmg_overlay_type = null attack_type = BURN //burn bish - unarmed_attack_verbs = list("burn", "singe") + unarmed_attack_verbs = list("burn", "sear") grappled_attack_verb = "scorch" unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' @@ -54,7 +54,7 @@ limb_id = SPECIES_ETHEREAL dmg_overlay_type = null attack_type = BURN // bish buzz - unarmed_attack_verbs = list("burn") + unarmed_attack_verbs = list("burn", "sear") grappled_attack_verb = "scorch" unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index f0f7b0accaf..e17488bc96a 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -71,7 +71,7 @@ /// If this uplink item is only available to certain roles. Roles are dependent on the frequency chip or stored ID. var/list/restricted_roles = list() /// The species able to purchase this uplink item. - var/restricted_species = list() + var/list/restricted_species = list() /// The minimum amount of progression needed for this item to be added to uplinks. var/progression_minimum = 0 /// Whether this purchase is visible in the purchase log. diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 92fcb995f76..d40b57276c0 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -126,7 +126,7 @@ . = ..() if(over_object != usr || !Adjacent(usr) || !foldabletype) return FALSE - if(!ishuman(usr) || !usr.can_perform_action(src)) + if(!ishuman(usr) || !usr.can_perform_action(src, ALLOW_RESTING)) return FALSE if(has_buckled_mobs()) return FALSE @@ -138,6 +138,12 @@ /obj/item/wheelchair/attack_self(mob/user) //Deploys wheelchair on in-hand use deploy_wheelchair(user, user.loc) +/obj/item/wheelchair/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isopenturf(interacting_with)) + deploy_wheelchair(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE + /obj/item/wheelchair/proc/deploy_wheelchair(mob/user, atom/location) var/obj/vehicle/ridden/wheelchair/wheelchair_unfolded = new unfolded_type(location) wheelchair_unfolded.add_fingerprint(user) diff --git a/code/modules/wiremod/shell/gun.dm b/code/modules/wiremod/shell/gun.dm index 9f196e6c1fc..283815fb334 100644 --- a/code/modules/wiremod/shell/gun.dm +++ b/code/modules/wiremod/shell/gun.dm @@ -30,7 +30,7 @@ range = 7 /obj/item/stock_parts/cell/emproof/wiremod_gun - maxcharge = 100 + maxcharge = 0.1 * STANDARD_CELL_CHARGE /obj/item/gun/energy/wiremod_gun/Initialize(mapload) . = ..() diff --git a/config/game_options.txt b/config/game_options.txt index 3cd2f34cc09..d6cb02f9a1b 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -147,6 +147,13 @@ EVENTS_MIN_TIME_MUL 1 ## Set to 0 to make dangerous events avaliable for all populations. EVENTS_MIN_PLAYERS_MUL 1 +## The lower bound, in deciseconds, for how soon another random event can be scheduled. +## Defaults to 1500 deciseconds or 2.5 minutes +EVENTS_FREQUENCY_LOWER 1500 + +## The upper bound, in deciseconds, for how soon another random event can be scheduled. +## Defaults to 4200 deciseconds or 7 minutes +EVENTS_FREQUENCY_UPPER 4200 ## AI ### diff --git a/cutter_templates/bitmask/restore.toml b/cutter_templates/bitmask/restore.toml new file mode 100644 index 00000000000..066354eedc6 --- /dev/null +++ b/cutter_templates/bitmask/restore.toml @@ -0,0 +1,20 @@ +# Bitmask restoration! +# Allows for easy mass extraction of template pngs and their configs from a dmi +# Use this if you have a dmi and you want a cutter config you can edit easily +# Of note, while it tries its best it is nowhere near perfect. We don't parity check against the existing dmi +# And we also do not account for overrided states very well +# Always double check (and be aware that dmi is weird so you may get diffs of 1 rgb value when doin this) +mode = "BitmaskSliceReconstruct" +# List of icon states to pull out (by default) +extract = ["0", "3", "12", "15", "255"] + +# Map of name -> state that will be encoded into a positions list later +# Lets you extract particular states and use them to fill in for states later +# Useful to carry over odd snowflake states +#[bespoke] + +# Map of key -> value to set on the created config +# Lets you set arbitrary values on the created config, mostly useful for batch processing +# IMPORTANT NOTE: We sort of assume you'll setup a default template here (since this is for batch processing), +# so if things work odd that's likely why +#[set] diff --git a/dependencies.sh b/dependencies.sh index e10d7ec4b47..781f77bb9c8 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -31,4 +31,4 @@ export AUXLUA_VERSION=1.4.4 export CUTTER_REPO=spacestation13/hypnagogic #hypnagogic git tag -export CUTTER_VERSION=v3.0.1 +export CUTTER_VERSION=v3.1.0 diff --git a/html/changelogs/AutoChangeLog-pr-27165.yml b/html/changelogs/AutoChangeLog-pr-27165.yml deleted file mode 100644 index 6a1262bbb81..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27165.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Erol509" -delete-after: True -changes: - - balance: "Nerfs powerator cash generation" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27275.yml b/html/changelogs/AutoChangeLog-pr-27275.yml deleted file mode 100644 index d6e601d22ec..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27275.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - qol: "Debloated the service borg module count" - - balance: "Moved service borg art and music supplies to the new artistic module" - - bugfix: "Fixed the dual cooking tools on service borgs, opting to keep tg ones." - - spellcheck: "Fixed lowercase on a few borg module recipes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27479.yml b/html/changelogs/AutoChangeLog-pr-27479.yml deleted file mode 100644 index 8a9a52b615e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27479.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "aKromatopzia" -delete-after: True -changes: - - rscadd: "teshari move speed change applies to raptor cybernetics" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27512.yml b/html/changelogs/AutoChangeLog-pr-27512.yml deleted file mode 100644 index 4fde53b2a2d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27512.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "tmyqlfpir" -delete-after: True -changes: - - bugfix: "Automatically link machines to closest research server for off-station z levels (fixes Tarkon/DS-2 machines linking to wrong R&D server)" - - qol: "Wrench down research console on DS-2" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27558.yml b/html/changelogs/AutoChangeLog-pr-27558.yml new file mode 100644 index 00000000000..eecba8d4baf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27558.yml @@ -0,0 +1,4 @@ +author: "nikothedude" +delete-after: True +changes: + - bugfix: "Jousting no longer bypasses pacifism" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27559.yml b/html/changelogs/AutoChangeLog-pr-27559.yml new file mode 100644 index 00000000000..c6f0f76fc6a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27559.yml @@ -0,0 +1,5 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "the civilian bounty control terminal displays the payout of new bounty options again" + - qol: "the civilian bounty control terminal displays the description of new bounty options" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27560.yml b/html/changelogs/AutoChangeLog-pr-27560.yml new file mode 100644 index 00000000000..b19efb8134b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27560.yml @@ -0,0 +1,7 @@ +author: "Melbert" +delete-after: True +changes: + - admin: "Custom Single and Custom Multi votes are now combined into one vote" + - admin: "Admins can now end votes instantly, rather than cancelling them" + - admin: "Admins can now reset the vote cooldown" + - bugfix: "Vote cooldown actually applies now" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27562.yml b/html/changelogs/AutoChangeLog-pr-27562.yml new file mode 100644 index 00000000000..0e020a01f71 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27562.yml @@ -0,0 +1,5 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "fix runtime when no events were drafted to be picked from" + - config: "make events frequency configurable" \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml new file mode 100644 index 00000000000..bec139f50a5 --- /dev/null +++ b/html/changelogs/archive/2024-05.yml @@ -0,0 +1,79 @@ +2024-05-01: + Erol509: + - rscadd: Added back TEG to techwebs and engineering protolathe + - image: Changed TEG sprites from YogStation. Credits to original author. + - balance: Nerfs powerator cash generation + Flleeppyy, Absolucy: + - sound: Added unique announcement jingles to each heretic path's ascension, replacing + the old "space-time anomalies detected" announcement. + LT3: + - qol: The various RCD upgrade disks no longer look identical + Majkl-J: + - qol: Debloated the service borg module count + - balance: Moved service borg art and music supplies to the new artistic module + - bugfix: Fixed the dual cooking tools on service borgs, opting to keep tg ones. + - spellcheck: Fixed lowercase on a few borg module recipes + SkyratBot: + - bugfix: Ethereal unarmed attacks "sear" instead of "singe", which was buggy + - bugfix: On examine PDAs will now inform players that the power cell can be removed + for recharging or replacement, and how to do so. + - bugfix: QM is now excluded from getting tasked with stealing telescopic batons + and the captain's spare ID, like all other command personnel are. + - bugfix: computers don't deconstruct themselves twice so machines like slotmachine + don't spawn excess chips upon deconstruction + - bugfix: Fixes a bluescreen in the deathmatch lobby UI. + - bugfix: Genetic sequence scanners now show the sequence to mutated genes from + scanned individuals. + - qol: Made birdshot atmos easier to use. + - bugfix: The Birdshot engineering department is no longer using a second hand broken + microwave. + - bugfix: Infinite-range laser pointer (for "AI" Big Brother) now has a correct + diode. If you accidentaly remove it then you can put it back! + - rscadd: you can use a photo with blueprints on it to read wires + - bugfix: Fixes tramstation gravgen wiring + - bugfix: Fixes tramstation turbine wiring + - bugfix: Fixes northstar cmo button name + aKromatopzia: + - rscadd: teshari move speed change applies to raptor cybernetics + jjpark-kb: + - balance: forged sword, katana, spear, axe, and hammer had their force lowered + (so wielding multiplier can double) + - balance: bokken had its force very slightly increased (so wielding multiplier + can halve) + - bugfix: you can no longer get infinite amounts of experience for hammering forged + items (the hits required check is earlier and with a return) + - rscadd: added perfect hits, which grant a great deal of smithing experience and + can increase the damage of forged weapons (up to 3 additional force) + - rscadd: added mindless killer component to all forged weapons-- deal twice the + damage to any mob that has no mind (no mind means not player controller) + tmyqlfpir: + - bugfix: Automatically link machines to closest research server for off-station + z levels (fixes Tarkon/DS-2 machines linking to wrong R&D server) + - qol: Wrench down research console on DS-2 +2024-05-02: + Fluffles: + - qol: you can pick up wheelchairs while on the ground + - qol: you can place wheelchairs a tile away from you, like roller beds + Majkl-J: + - bugfix: Company imports button is brought back + SkyratBot: + - bugfix: The syndicate infiltrator has no weak spots anymore + - rscadd: trainship hijack deathmatch map + - qol: The Human AI's advanced security console can be repackaged with a screwdriver + if you wish to move it. + - bugfix: You can now re-construct pod doors that had deconstruction started. + - qol: You can now make pod door assemblies using plasteel in-hand. + - bugfix: If you are a freerunner, you don't end up faceplanting despite having + catlike grace. + - admin: Debug uplinks now shows all categories and won't lock upon buying items + like his grace and the syndicate balloon. + - qol: conveyor switches now have direction-specific input signals + - bugfix: AIs can now track Silicon as long as their built-in camera is online. + - bugfix: Constantly fleeing in Battle Arcade will no longer give you a very large + amount of decimals due to halving your gold every time. + - bugfix: Monkey changelings that are disguised as someone can now take off their + flesh clothes. + - bugfix: Fixes hypercharged slime core cells and circuit guns having 1,000 times + less energy than intended. + - bugfix: Monkeys can no longer be knocked over by walking into a windoor on combat + mode while they're behind it. diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 03dd1bcbfc3..de3287c1636 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/modular_skyrat/master_files/code/modules/power/circulator.dm b/modular_skyrat/master_files/code/modules/power/circulator.dm new file mode 100644 index 00000000000..9b0e14a4dd3 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/power/circulator.dm @@ -0,0 +1,280 @@ +//node2, air2, network2 correspond to input +//node1, air1, network1 correspond to output + +/obj/machinery/atmospherics/components/binary/circulator + name = "circulator" + desc = "A gas circulating turbine and heat exchanger." + icon = 'modular_skyrat/master_files/icons/obj/machines/thermoelectric.dmi' + icon_state = "circ-unassembled-0" + density = TRUE + integrity_failure = 0.375 + move_resist = MOVE_RESIST_DEFAULT //can be pushed around like a regular machine + + var/active = FALSE + + var/last_pressure_delta = 0 + pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY + + var/flipped = 0 + var/mode = CIRCULATOR_HOT + var/obj/machinery/power/thermoelectric_generator/generator + +//for mappers +/obj/machinery/atmospherics/components/binary/circulator/cold + mode = CIRCULATOR_COLD + + +/obj/machinery/atmospherics/components/binary/circulator/flipped + flipped = 1 + icon_state = "circ-unassembled-1" + +/obj/machinery/atmospherics/components/binary/circulator/cold/flipped + mode = CIRCULATOR_COLD + flipped = 1 + icon_state = "circ-unassembled-1" + +/obj/machinery/atmospherics/components/binary/circulator/Initialize(mapload) + .=..() + component_parts = list(new /obj/item/circuitboard/machine/circulator) + update_appearance() + + +/obj/machinery/atmospherics/components/binary/circulator/Destroy() + if(generator) + disconnectFromGenerator() + return ..() + +/obj/machinery/atmospherics/components/binary/circulator/proc/return_transfer_air() + + var/datum/gas_mixture/air1 = airs[1] + var/datum/gas_mixture/air2 = airs[2] + + var/output_starting_pressure = air1.return_pressure() + var/input_starting_pressure = air2.return_pressure() + + if(output_starting_pressure >= input_starting_pressure-10) + //Need at least 10 KPa difference to overcome friction in the mechanism + last_pressure_delta = 0 + return null + + //Calculate necessary moles to transfer using PV = nRT + if(air2.temperature <= 0) + last_pressure_delta = 0 + return + var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2 + var/transfer_moles = (pressure_delta*air1.volume)/(air2.temperature * R_IDEAL_GAS_EQUATION) + last_pressure_delta = pressure_delta + //Actually transfer the gas + var/datum/gas_mixture/removed = air2.remove(transfer_moles) + update_parents() + return removed + +/obj/machinery/atmospherics/components/binary/circulator/process_atmos() + ..() + update_icon_nopipes() + +/obj/machinery/atmospherics/components/binary/circulator/update_appearance() + cut_overlays() + + if(anchored) + for(var/direction in GLOB.cardinals) + if(!(direction & initialize_directions)) + continue + var/obj/machinery/atmospherics/node = find_connecting(direction) + + var/image/cap + if(node) + cap = get_pipe_image(icon, "cap", direction, node.pipe_color, piping_layer = piping_layer) + + add_overlay(cap) + + return ..() + +/obj/machinery/atmospherics/components/binary/circulator/update_icon_nopipes() + cut_overlays() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + + if(machine_stat & (BROKEN)) + icon_state = "circ-broken" + set_light(0) + return + + if(!generator) + icon_state = "circ-unassembled-[flipped]" + if(panel_open) + add_overlay("circ-panel") + set_light(0) + return + if(!generator.anchored) + icon_state = "circ-unassembled-[flipped]" + if(panel_open) + add_overlay("circ-panel") + set_light(0) + return + + icon_state = "circ-assembled-[flipped]" + + if(!is_operational) + set_light(0) + return + else + if(!last_pressure_delta) + set_light(1) + SSvis_overlays.add_vis_overlay(src, icon, "circ-off", LIGHTING_ABOVE_ALL, ABOVE_LIGHTING_PLANE, dir) + return + else + if(last_pressure_delta > ONE_ATMOSPHERE) //fast + if(mode) + set_light(3,2,"#4F82FF") + else + set_light(3,2,"#FF3232") + SSvis_overlays.add_vis_overlay(src, icon, "circ-ex[mode?"cold":"hot"]", LIGHTING_ABOVE_ALL, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "circ-run", ABOVE_LIGHTING_PLANE, ABOVE_LIGHTING_PLANE, dir) + else //slow + if(mode) + set_light(2,1,"#4F82FF") + else + set_light(2,1,"#FF3232") + SSvis_overlays.add_vis_overlay(src, icon, "circ-[mode?"cold":"hot"]", LIGHTING_ABOVE_ALL, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "circ-slow", LIGHTING_ABOVE_ALL, ABOVE_LIGHTING_PLANE, dir) + +/obj/machinery/atmospherics/components/binary/circulator/wrench_act(mob/living/user, obj/item/I) + + if(!panel_open) + balloon_alert(user, span_warning("Open the panel first!")) + return TRUE + + if(generator) + balloon_alert(user, span_warning("Disconnect [generator] first!")) + return TRUE + + set_anchored(!anchored) + I.play_tool_sound(src) + balloon_alert(user, span_notice("You [anchored?"secure":"unsecure"] [src].")) + + var/obj/machinery/atmospherics/node1 = nodes[1] + var/obj/machinery/atmospherics/node2 = nodes[2] + + if(node1) + node1.disconnect(src) + nodes[1] = null + if(parents[1]) + nullify_pipenet(parents[1]) + + if(node2) + node2.disconnect(src) + nodes[2] = null + if(parents[2]) + nullify_pipenet(parents[2]) + + if(anchored) + set_init_directions() + atmos_init() + node1 = nodes[1] + if(node1) + node1.atmos_init() + node1.add_member(src) + node2 = nodes[2] + if(node2) + node2.atmos_init() + node2.add_member(src) + SSair.add_to_rebuild_queue(src) + + update_appearance() + return TRUE + + +/obj/machinery/atmospherics/components/binary/circulator/set_init_directions() + switch(dir) + if(NORTH, SOUTH) + initialize_directions = EAST|WEST + if(EAST, WEST) + initialize_directions = NORTH|SOUTH + +/obj/machinery/atmospherics/components/binary/circulator/get_node_connects() + if(flipped) + return list(turn(dir, 270), turn(dir, 90)) + return list(turn(dir, 90), turn(dir, 270)) + +/obj/machinery/atmospherics/components/binary/circulator/can_be_node(obj/machinery/atmospherics/target) + if(anchored) + return ..(target) + return FALSE + +/obj/machinery/atmospherics/components/binary/circulator/multitool_act(mob/living/user, obj/item/I) + if(generator) + balloon_alert(user, span_warning("Disconnect [generator] first!")) + return TRUE + + mode = !mode + balloon_alert(user, span_notice("You set [src] to [mode?"cold":"hot"] mode.")) + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/screwdriver_act(mob/user, obj/item/I) + if(..()) + return TRUE + if(generator) + balloon_alert(user, span_warning("Disconnect the generator first!")) + return TRUE + panel_open = !panel_open + I.play_tool_sound(src) + balloon_alert(user, span_notice("You [panel_open?"open":"close"] the panel on [src].")) + update_icon_nopipes() + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/wrench_act_secondary(mob/living/user, obj/item/tool) + return default_change_direction_wrench(user, tool) + +/obj/machinery/atmospherics/components/binary/circulator/default_change_direction_wrench(mob/user, obj/item/I) + if(!..()) + return FALSE + set_init_directions() + update_appearance() + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/crowbar_act(mob/user, obj/item/I) + if(anchored) + balloon_alert(user, span_warning("[src] is anchored!")) + return TRUE + if(!panel_open) + circulator_flip() + return TRUE + else + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/on_deconstruction() + if(generator) + disconnectFromGenerator() + +/obj/machinery/atmospherics/components/binary/circulator/proc/disconnectFromGenerator() + if(mode) + generator.cold_circ = null + else + generator.hot_circ = null + generator.update_appearance() + generator = null + +/obj/machinery/atmospherics/components/binary/circulator/set_piping_layer(new_layer) + ..() + pixel_x = 0 + pixel_y = 0 + +/obj/machinery/atmospherics/components/binary/circulator/verb/circulator_flip() + set name = "Flip" + set category = "Object" + set src in oview(1) + + if(!ishuman(usr)) + return + flipped = !flipped + balloon_alert(usr, span_notice("You flip [src].")) + playsound(src, 'sound/items/change_drill.ogg', 50) + update_icon_nopipes() + +/obj/machinery/atmospherics/components/binary/circulator/atom_break(damage_flag) + if(generator) + generator.null_circulators() + generator.update_appearance() + ..() + diff --git a/modular_skyrat/master_files/code/modules/power/thermoelectric_generator.dm b/modular_skyrat/master_files/code/modules/power/thermoelectric_generator.dm new file mode 100644 index 00000000000..0ae8d6aacb5 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/power/thermoelectric_generator.dm @@ -0,0 +1,272 @@ +#define TEG_EFFICIENCY 0.45 + +/obj/machinery/power/thermoelectric_generator + name = "thermoelectric generator" + desc = "It's a high efficiency thermoelectric generator." + icon = 'modular_skyrat/master_files/icons/obj/machines/thermoelectric.dmi' + icon_state = "teg-unassembled" + density = TRUE + use_power = NO_POWER_USE + integrity_failure = 0.375 + + + ///The cold circulator machine, containing cold gas for the mix. + var/obj/machinery/atmospherics/components/binary/circulator/cold_circ + ///The hot circulator machine, containing very hot gas for the mix. + var/obj/machinery/atmospherics/components/binary/circulator/hot_circ + ///The amount of power the generator is currently producing. + var/lastgen = 0 + ///The amount of power the generator has last produced. + var/lastgenlev = -1 + /** + * Used in overlays for the TEG, basically; + * one number is for the cold mix, one is for the hot mix + * If the cold mix has pressure in it, then the first number is 1, else 0 + * If the hot mix has pressure in it, then the second number is 1, else 0 + * Neither has pressure: 00 + * Only cold has pressure: 10 + * Only hot has pressure: 01 + * Both has pressure: 11 + */ + var/last_pressure_overlay = "00" + +/obj/machinery/power/thermoelectric_generator/Initialize(mapload) + . = ..() + find_circulators() + connect_to_network() + SSair.start_processing_machine(src, mapload) + update_appearance() + component_parts = list(new /obj/item/circuitboard/machine/thermoelectric_generator) + + +/obj/machinery/power/thermoelectric_generator/Destroy() + null_circulators() + SSair.stop_processing_machine(src) + return ..() + +/obj/machinery/power/thermoelectric_generator/update_appearance() + cut_overlays() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + + if(machine_stat & (BROKEN)) + icon_state = "teg-broken" + return + if(hot_circ && cold_circ) + icon_state = "teg-assembled" + else + icon_state = "teg-unassembled" + if(panel_open) + add_overlay("teg-panel") + return + + if(machine_stat & (NOPOWER)) + return + else + var/level = min(round(lastgenlev/100000),11) + if(level != 0) + add_overlay("teg-op[level]") + return ..() + + +/obj/machinery/power/thermoelectric_generator/process() + //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** + var/power_output = round(lastgen / 10) + add_avail(power_output) + lastgenlev = power_output + lastgen -= power_output + +/obj/machinery/power/thermoelectric_generator/process_atmos() + if(!cold_circ || !hot_circ) + return + if(!powernet) + return + + var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air() + var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air() + if(cold_air && hot_air) + var/cold_air_heat_capacity = cold_air.heat_capacity() + var/hot_air_heat_capacity = hot_air.heat_capacity() + var/delta_temperature = hot_air.temperature - cold_air.temperature + if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0) + var/efficiency = TEG_EFFICIENCY + var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) + var/heat = energy_transfer*(1-efficiency) + lastgen += (1000000 * (LOGISTIC_FUNCTION(2,0.5,(delta_temperature/10000),0)-1)) + hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity + cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity + + if(hot_air) + var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1] + hot_circ_air1.merge(hot_air) + + if(cold_air) + var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1] + cold_circ_air1.merge(cold_air) + + var/current_pressure = "[cold_circ?.last_pressure_delta > 0 ? "1" : "0"][hot_circ?.last_pressure_delta > 0 ? "1" : "0"]" + if(current_pressure != last_pressure_overlay) + //this requires an update to overlays. + last_pressure_overlay = current_pressure + + update_appearance(UPDATE_ICON) + +/obj/machinery/power/thermoelectric_generator/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ThermoElectricGenerator", name) + ui.open() + +/obj/machinery/power/thermoelectric_generator/ui_data(mob/user) + var/list/data = list() + data["error_message"] = null + if(!powernet) + data["error_message"] = "Unable to connect to the power network!" + return data + if(!cold_circ && !hot_circ) + data["error_message"] = "Unable to locate any parts! Multitool the machine to sync to nearby parts." + return data + if(!cold_circ) + data["error_message"] = "Unable to locate cold circulator!" + return data + if(!hot_circ) + data["error_message"] = "Unable to locate hot circulator!" + return data + + var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1] + var/datum/gas_mixture/cold_circ_air2 = cold_circ.airs[2] + + var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1] + var/datum/gas_mixture/hot_circ_air2 = hot_circ.airs[2] + + data["last_power_output"] = display_power(lastgenlev) + + var/list/cold_data = list() + cold_data["temperature_inlet"] = round(cold_circ_air2.temperature, 0.1) + cold_data["temperature_outlet"] = round(cold_circ_air1.temperature, 0.1) + cold_data["pressure_inlet"] = round(cold_circ_air2.return_pressure(), 0.1) + cold_data["pressure_outlet"] = round(cold_circ_air1.return_pressure(), 0.1) + data["cold_data"] = list(cold_data) + + var/list/hot_data = list() + hot_data["temperature_inlet"] = round(hot_circ_air2.temperature, 0.1) + hot_data["temperature_outlet"] = round(hot_circ_air1.temperature, 0.1) + hot_data["pressure_inlet"] = round(hot_circ_air2.return_pressure(), 0.1) + hot_data["pressure_outlet"] = round(hot_circ_air1.return_pressure(), 0.1) + data["hot_data"] = list(hot_data) + + return data + +///Finds and connects nearby valid circulators to the machine, nulling out previous ones. +/obj/machinery/power/thermoelectric_generator/proc/find_circulators() + null_circulators() + var/list/valid_circulators = list() + + if(dir & (NORTH|SOUTH)) + var/obj/machinery/atmospherics/components/binary/circulator/east_circulator = locate() in get_step(src, EAST) + if(east_circulator && east_circulator.dir == WEST) + valid_circulators += east_circulator + var/obj/machinery/atmospherics/components/binary/circulator/west_circulator = locate() in get_step(src, WEST) + if(west_circulator && west_circulator.dir == EAST) + valid_circulators += west_circulator + else + var/obj/machinery/atmospherics/components/binary/circulator/north_circulator = locate() in get_step(src, NORTH) + if(north_circulator && north_circulator.dir == SOUTH) + valid_circulators += north_circulator + var/obj/machinery/atmospherics/components/binary/circulator/south_circulator = locate() in get_step(src, SOUTH) + if(south_circulator && south_circulator.dir == NORTH) + valid_circulators += south_circulator + + if(!valid_circulators.len) + return + + for(var/obj/machinery/atmospherics/components/binary/circulator/circulators as anything in valid_circulators) + if(circulators.mode == CIRCULATOR_COLD && !cold_circ) + cold_circ = circulators + circulators.generator = src + continue + if(circulators.mode == CIRCULATOR_HOT && !hot_circ) + hot_circ = circulators + circulators.generator = src + +/obj/machinery/power/thermoelectric_generator/wrench_act(mob/living/user, obj/item/I) + . = ..() + + if(!panel_open) //connect/disconnect circulators + if(!anchored) + balloon_alert(user, span_warning("Anchor [src] before trying to connect the circulators!")) + return TRUE + else + if(hot_circ && cold_circ) + balloon_alert(user, span_notice("You start removing the circulators...")) + if(I.use_tool(src, user, 30, volume=50)) + null_circulators() + update_appearance() + balloon_alert(user, span_notice("You disconnect [src]'s circulator links.")) + playsound(src, 'sound/misc/box_deploy.ogg', 50) + return TRUE + + balloon_alert(user, span_notice("You attempt to attach the circulators...")) + if(I.use_tool(src, user, 30, volume=50)) + switch(find_circulators()) + if(0) + balloon_alert(user, span_warning("No circulators found!")) + if(1) + balloon_alert(user, span_warning("Only one circulator found!")) + if(2) + balloon_alert(user, span_notice("You connect [src]'s circulator links.")) + playsound(src, 'sound/misc/box_deploy.ogg', 50) + return TRUE + if(3) + balloon_alert(user, span_warning("Both circulators are the same mode!")) + return TRUE + + set_anchored(!anchored) + I.play_tool_sound(src) + if(!anchored) + null_circulators() + connect_to_network() + balloon_alert(user, span_notice("You [anchored?"secure":"unsecure"] [src].")) + update_appearance() + return TRUE + +/obj/machinery/power/thermoelectric_generator/screwdriver_act(mob/user, obj/item/I) + if(..()) + return TRUE + + if(hot_circ && cold_circ) + balloon_alert(user, span_warning("Disconnect the circulators first!")) + return TRUE + panel_open = !panel_open + I.play_tool_sound(src) + balloon_alert(user, span_notice("You [panel_open?"open":"close"] the panel on [src].")) + update_appearance() + return TRUE + +/obj/machinery/power/thermoelectric_generator/crowbar_act(mob/user, obj/item/I) + + if(anchored) + balloon_alert(user, span_warning("[src] is anchored!")) + return TRUE + else if(!panel_open) + balloon_alert(user, span_warning("Open the panel first!")) + return TRUE + else + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/power/thermoelectric_generator/on_deconstruction() + null_circulators() + +/obj/machinery/power/thermoelectric_generator/proc/null_circulators() + if(hot_circ) + hot_circ.generator = null + hot_circ = null + if(cold_circ) + cold_circ.generator = null + cold_circ = null + +/obj/machinery/power/thermoelectric_generator/atom_break(damage_flag) + null_circulators() + ..() + +#undef TEG_EFFICIENCY diff --git a/modular_skyrat/master_files/icons/obj/machines/thermoelectric.dmi b/modular_skyrat/master_files/icons/obj/machines/thermoelectric.dmi new file mode 100644 index 00000000000..3e0f5d5fdcc Binary files /dev/null and b/modular_skyrat/master_files/icons/obj/machines/thermoelectric.dmi differ diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm index 3833fdb8edb..b24fda213cc 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm @@ -586,7 +586,6 @@ data["current_vagina"] = current_vagina = null data["machine_color"] = machine_color - SStgui.update_uis(src) return data // User action handler in the interface diff --git a/modular_skyrat/modules/reagent_forging/code/anvil.dm b/modular_skyrat/modules/reagent_forging/code/anvil.dm index cb5cf2f875c..ba814112558 100644 --- a/modular_skyrat/modules/reagent_forging/code/anvil.dm +++ b/modular_skyrat/modules/reagent_forging/code/anvil.dm @@ -85,6 +85,10 @@ //do we have an incomplete item to hammer out? if so, here is our block of code var/obj/item/forging/incomplete/locate_incomplete = locate() in contents if(locate_incomplete) + if(locate_incomplete.times_hit >= locate_incomplete.average_hits) //to prevent people from getting perfect perfects + user.balloon_alert(user, "[locate_incomplete] sounds ready") + return ITEM_INTERACT_SUCCESS + if(COOLDOWN_FINISHED(locate_incomplete, heating_remainder)) balloon_alert(user, "metal too cool") locate_incomplete.times_hit -= 3 @@ -94,12 +98,14 @@ var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/smithing, SKILL_SPEED_MODIFIER) * locate_incomplete.average_wait COOLDOWN_START(locate_incomplete, striking_cooldown, skill_modifier) locate_incomplete.times_hit++ + if(prob(user.mind.get_skill_modifier(/datum/skill/smithing, SKILL_PROBS_MODIFIER))) + balloon_alert(user, "perfect hit!") + locate_incomplete.current_perfects++ + user.mind.adjust_experience(/datum/skill/smithing, 10) //A perfect hit gives good experience + return ITEM_INTERACT_SUCCESS + balloon_alert(user, "good hit") user.mind.adjust_experience(/datum/skill/smithing, 1) //A good hit gives minimal experience - - if(locate_incomplete.times_hit >= locate_incomplete.average_hits) - user.balloon_alert(user, "[locate_incomplete] sounds ready") - return ITEM_INTERACT_SUCCESS locate_incomplete.times_hit -= 3 diff --git a/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm b/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm index ce2a1e1576f..4802843ac9f 100644 --- a/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm +++ b/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm @@ -312,9 +312,13 @@ if(completing_a_weapon) var/obj/item/forging/complete/completed_forge_item = contents[1] newly_created_thing = new completed_forge_item.spawning_item(src) + if(newly_created_thing.force > 0) //we don't want the staff to get added damage + newly_created_thing.force += round(completed_forge_item.current_perfects * INVERSE(10)) //adds a maximum of 3 force, and 6 if dual-wielded + if(completed_forge_item.custom_materials) // We need to add the weapon head's materials to the completed item, too for(var/custom_material in completed_forge_item.custom_materials) materials_to_transfer[custom_material] += completed_forge_item.custom_materials[custom_material] + qdel(completed_forge_item) // And then we also need to 'use' the item else diff --git a/modular_skyrat/modules/reagent_forging/code/forge_items.dm b/modular_skyrat/modules/reagent_forging/code/forge_items.dm index 5b9dae85769..e7e8bfa61ce 100644 --- a/modular_skyrat/modules/reagent_forging/code/forge_items.dm +++ b/modular_skyrat/modules/reagent_forging/code/forge_items.dm @@ -71,6 +71,8 @@ var/times_hit = 0 ///the required time before each strike to prevent spamming var/average_wait = 1 SECONDS + ///the number of current perfect hits (really only impacts weapons atm) + var/current_perfects = 0 ///the path of the item that will be spawned upon completion var/spawn_item //because who doesn't want to have a plasma sword? @@ -168,6 +170,8 @@ /obj/item/forging/complete ///the path of the item that will be created var/spawning_item + ///the amount of perfect hits on the item, if it was allowed + var/current_perfects = 0 //because who doesn't want to have a plasma sword? material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_COLOR diff --git a/modular_skyrat/modules/reagent_forging/code/forge_weapons.dm b/modular_skyrat/modules/reagent_forging/code/forge_weapons.dm index 60aab994298..e93141134d8 100644 --- a/modular_skyrat/modules/reagent_forging/code/forge_weapons.dm +++ b/modular_skyrat/modules/reagent_forging/code/forge_weapons.dm @@ -18,7 +18,7 @@ /obj/item/forging/reagent_weapon/sword name = "reagent sword" desc = "A sharp, one-handed sword most adept at blocking opposing melee strikes." - force = 15 + force = 10 armour_penetration = 10 icon_state = "sword" inhand_icon_state = "sword" @@ -37,12 +37,13 @@ /obj/item/forging/reagent_weapon/sword/Initialize(mapload) . = ..() - AddComponent(/datum/component/two_handed, force_unwielded = 15, force_wielded = 20) + AddComponent(/datum/component/two_handed, force_multiplier = 2) + AddComponent(/datum/component/mindless_killer, mindless_force_override = 0, mindless_multiplier_override = 2) /obj/item/forging/reagent_weapon/katana name = "reagent katana" desc = "A katana sharp enough to penetrate body armor, but not quite million-times-folded sharp." - force = 15 + force = 10 armour_penetration = 25 //Slices through armour like butter, but can't quite bisect a knight like the real thing. icon_state = "katana" inhand_icon_state = "katana" @@ -59,7 +60,8 @@ /obj/item/forging/reagent_weapon/katana/Initialize(mapload) . = ..() - AddComponent(/datum/component/two_handed, force_unwielded = 15, force_wielded = 20) + AddComponent(/datum/component/two_handed, force_multiplier = 2) + AddComponent(/datum/component/mindless_killer, mindless_force_override = 0, mindless_multiplier_override = 2) /obj/item/forging/reagent_weapon/dagger name = "reagent dagger" @@ -81,6 +83,7 @@ /obj/item/forging/reagent_weapon/dagger/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, speed = 10 SECONDS, effectiveness = 70) + AddComponent(/datum/component/mindless_killer, mindless_force_override = 0, mindless_multiplier_override = 2) /obj/item/forging/reagent_weapon/dagger/attack(mob/living/M, mob/living/user, params) . = ..() @@ -107,7 +110,7 @@ /obj/item/forging/reagent_weapon/spear name = "reagent spear" desc = "A long spear that can be wielded in two hands to boost damage at the cost of single-handed versatility." - force = 10 + force = 8 armour_penetration = 10 icon_state = "spear" inhand_icon_state = "spear" @@ -127,13 +130,14 @@ . = ..() AddComponent(/datum/component/jousting, max_tile_charge = 9, min_tile_charge = 6) AddComponent(/datum/component/butchering, speed = 10 SECONDS, effectiveness = 70) - AddComponent(/datum/component/two_handed, force_unwielded = 10, force_wielded = 15) + AddComponent(/datum/component/two_handed, force_multiplier = 2) AddComponent(/datum/component/two_hand_reach, unwield_reach = 1, wield_reach = 2) + AddComponent(/datum/component/mindless_killer, mindless_force_override = 0, mindless_multiplier_override = 2) /obj/item/forging/reagent_weapon/axe name = "reagent axe" desc = "An axe especially balanced for throwing and embedding into fleshy targets. Nonetheless useful as a traditional melee tool." - force = 15 + force = 10 armour_penetration = 10 icon_state = "axe" inhand_icon_state = "axe" @@ -151,12 +155,13 @@ /obj/item/forging/reagent_weapon/axe/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, speed = 10 SECONDS, effectiveness = 70) - AddComponent(/datum/component/two_handed, force_unwielded = 15, force_wielded = 20) + AddComponent(/datum/component/two_handed, force_multiplier = 2) + AddComponent(/datum/component/mindless_killer, mindless_force_override = 0, mindless_multiplier_override = 2) /obj/item/forging/reagent_weapon/hammer name = "reagent hammer" desc = "A heavy, weighted hammer that packs an incredible punch but can prove to be unwieldy. Useful for forging!" - force = 19 //strong but boring. + force = 12 //strong when wielded, but boring. armour_penetration = 10 icon_state = "crush_hammer" inhand_icon_state = "crush_hammer" @@ -177,7 +182,8 @@ /obj/item/forging/reagent_weapon/hammer/Initialize(mapload) . = ..() AddElement(/datum/element/kneejerk) - AddComponent(/datum/component/two_handed, force_unwielded = 19, force_wielded = 24) + AddComponent(/datum/component/two_handed, force_multiplier = 2) + AddComponent(/datum/component/mindless_killer, mindless_force_override = 0, mindless_multiplier_override = 2) /obj/item/forging/reagent_weapon/hammer/attack_atom(atom/attacked_atom, mob/living/user, params) . = ..() @@ -209,6 +215,7 @@ /obj/item/shield/buckler/reagent_weapon/Initialize(mapload) . = ..() AddComponent(/datum/component/reagent_weapon) + AddComponent(/datum/component/mindless_killer, mindless_force_override = 0, mindless_multiplier_override = 2) /obj/item/shield/buckler/reagent_weapon/examine(mob/user) . = ..() @@ -244,7 +251,8 @@ /obj/item/shield/buckler/reagent_weapon/pavise/Initialize(mapload) . = ..() - AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_wielded = 15) + AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_multiplier = 2) + AddComponent(/datum/component/mindless_killer, mindless_force_override = 0, mindless_multiplier_override = 2) /obj/item/pickaxe/reagent_weapon name = "reagent pickaxe" @@ -289,7 +297,7 @@ /obj/item/forging/reagent_weapon/bokken name = "reagent bokken" desc = "A bokken that is capable of blocking attacks when wielding in two hands, possibly including bullets should the user be brave enough." - force = 15 + force = 16 icon_state = "bokken" inhand_icon_state = "bokken" worn_icon_state = "bokken_back" @@ -324,7 +332,7 @@ . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) - AddComponent(/datum/component/two_handed, force_unwielded=15, force_wielded=7) + AddComponent(/datum/component/two_handed, force_multiplier = 0.5) /obj/item/forging/reagent_weapon/bokken/proc/on_wield() SIGNAL_HANDLER diff --git a/modular_skyrat/modules/reagent_forging/code/mindless_killer.dm b/modular_skyrat/modules/reagent_forging/code/mindless_killer.dm new file mode 100644 index 00000000000..16986d2db9f --- /dev/null +++ b/modular_skyrat/modules/reagent_forging/code/mindless_killer.dm @@ -0,0 +1,47 @@ +/datum/component/mindless_killer + ///how much force is added to items before hitting a mindless mob + var/mindless_force = 10 + ///how much force is multiplied to items before hitting a mindless mob (applied after mindless force) + var/mindless_multiplier = 1 + ///the obj parent this component is attached to + var/obj/obj_parent + +/datum/component/mindless_killer/Initialize(mindless_force_override = 10, mindless_multiplier_override = 1) + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + + obj_parent = parent + + mindless_force = mindless_force_override + mindless_multiplier = mindless_multiplier_override + + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(do_force)) + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(undo_force)) + +/datum/component/mindless_killer/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + examine_list += span_danger("It has an awful gleam against those who cannot think.") + +/datum/component/mindless_killer/proc/do_force(datum/source, atom/target, mob/user, params) + SIGNAL_HANDLER + + var/mob/target_mob = target + if(!istype(target_mob)) + return + if(target_mob.mind) + return + obj_parent.force += mindless_force + obj_parent.force *= mindless_multiplier + +/datum/component/mindless_killer/proc/undo_force(datum/source, atom/target, mob/user, params) + SIGNAL_HANDLER + + var/mob/target_mob = target + if(!istype(target_mob)) + return + if(target_mob.mind) + return + obj_parent.force /= mindless_multiplier + obj_parent.force -= mindless_force diff --git a/modular_skyrat/modules/reagent_forging/code/smith_skill.dm b/modular_skyrat/modules/reagent_forging/code/smith_skill.dm index 1170f957fc0..5deb7374755 100644 --- a/modular_skyrat/modules/reagent_forging/code/smith_skill.dm +++ b/modular_skyrat/modules/reagent_forging/code/smith_skill.dm @@ -4,7 +4,7 @@ desc = "The desperate artist who strives after the flames of the forge." modifiers = list( SKILL_SPEED_MODIFIER = list(1, 0.95, 0.9, 0.85, 0.75, 0.6, 0.5), - SKILL_PROBS_MODIFIER = list(10, 15, 20, 25, 30, 35, 40) + SKILL_PROBS_MODIFIER = list(0, 5, 10, 20, 40, 80, 100) ) skill_item_path = /obj/item/clothing/neck/cloak/skill_reward/smithing diff --git a/modular_skyrat/modules/reagent_forging/code/water_basin.dm b/modular_skyrat/modules/reagent_forging/code/water_basin.dm index ebae1336cf5..0cd8caeb12c 100644 --- a/modular_skyrat/modules/reagent_forging/code/water_basin.dm +++ b/modular_skyrat/modules/reagent_forging/code/water_basin.dm @@ -93,6 +93,10 @@ if(search_incomplete.custom_materials) spawned_obj.set_custom_materials(search_incomplete.custom_materials, 1) //lets set its material + if(istype(spawned_obj, /obj/item/forging/complete)) + var/obj/item/forging/complete/complete_spawned = spawned_obj + complete_spawned.current_perfects = search_incomplete.current_perfects + qdel(search_incomplete) tool.icon_state = "tong_empty" return ITEM_INTERACT_SUCCESS diff --git a/sound/ambience/antag/heretic/ascend_ash.ogg b/sound/ambience/antag/heretic/ascend_ash.ogg new file mode 100644 index 00000000000..a85aa0f6a9c Binary files /dev/null and b/sound/ambience/antag/heretic/ascend_ash.ogg differ diff --git a/sound/ambience/antag/heretic/ascend_blade.ogg b/sound/ambience/antag/heretic/ascend_blade.ogg new file mode 100644 index 00000000000..da7c313ad8a Binary files /dev/null and b/sound/ambience/antag/heretic/ascend_blade.ogg differ diff --git a/sound/ambience/antag/heretic/ascend_cosmic.ogg b/sound/ambience/antag/heretic/ascend_cosmic.ogg new file mode 100644 index 00000000000..9ce740fa7e1 Binary files /dev/null and b/sound/ambience/antag/heretic/ascend_cosmic.ogg differ diff --git a/sound/ambience/antag/heretic/ascend_flesh.ogg b/sound/ambience/antag/heretic/ascend_flesh.ogg new file mode 100644 index 00000000000..b488cafd0bf Binary files /dev/null and b/sound/ambience/antag/heretic/ascend_flesh.ogg differ diff --git a/sound/ambience/antag/heretic/ascend_knock.ogg b/sound/ambience/antag/heretic/ascend_knock.ogg new file mode 100644 index 00000000000..73f0a7f0b3b Binary files /dev/null and b/sound/ambience/antag/heretic/ascend_knock.ogg differ diff --git a/sound/ambience/antag/heretic/ascend_moon.ogg b/sound/ambience/antag/heretic/ascend_moon.ogg new file mode 100644 index 00000000000..b0d515686b2 Binary files /dev/null and b/sound/ambience/antag/heretic/ascend_moon.ogg differ diff --git a/sound/ambience/antag/heretic/ascend_rust.ogg b/sound/ambience/antag/heretic/ascend_rust.ogg new file mode 100644 index 00000000000..5cfc73b2cf5 Binary files /dev/null and b/sound/ambience/antag/heretic/ascend_rust.ogg differ diff --git a/sound/ambience/antag/heretic/ascend_void.ogg b/sound/ambience/antag/heretic/ascend_void.ogg new file mode 100644 index 00000000000..797784952d1 Binary files /dev/null and b/sound/ambience/antag/heretic/ascend_void.ogg differ diff --git a/sound/ambience/antag/ecult_op.ogg b/sound/ambience/antag/heretic/heretic_gain.ogg similarity index 100% rename from sound/ambience/antag/ecult_op.ogg rename to sound/ambience/antag/heretic/heretic_gain.ogg diff --git a/tgstation.dme b/tgstation.dme index 116faf416df..38f4813a69c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -440,6 +440,7 @@ #include "code\__DEFINES\~skyrat_defines\logging.dm" #include "code\__DEFINES\~skyrat_defines\manufacturer_strings.dm" #include "code\__DEFINES\~skyrat_defines\mapping.dm" +#include "code\__DEFINES\~skyrat_defines\maths.dm" #include "code\__DEFINES\~skyrat_defines\medical_defines.dm" #include "code\__DEFINES\~skyrat_defines\mobs.dm" #include "code\__DEFINES\~skyrat_defines\nifsofts.dm" @@ -6614,7 +6615,9 @@ #include "modular_skyrat\master_files\code\modules\paperwork\paperplane.dm" #include "modular_skyrat\master_files\code\modules\paperwork\stamps.dm" #include "modular_skyrat\master_files\code\modules\power\cable.dm" +#include "modular_skyrat\master_files\code\modules\power\circulator.dm" #include "modular_skyrat\master_files\code\modules\power\powernet.dm" +#include "modular_skyrat\master_files\code\modules\power\thermoelectric_generator.dm" #include "modular_skyrat\master_files\code\modules\power\lighting\light_mapping_helpers.dm" #include "modular_skyrat\master_files\code\modules\power\singularity\containment_field.dm" #include "modular_skyrat\master_files\code\modules\power\tesla\coil.dm" @@ -8097,6 +8100,7 @@ #include "modular_skyrat\modules\reagent_forging\code\forge_items.dm" #include "modular_skyrat\modules\reagent_forging\code\forge_recipes.dm" #include "modular_skyrat\modules\reagent_forging\code\forge_weapons.dm" +#include "modular_skyrat\modules\reagent_forging\code\mindless_killer.dm" #include "modular_skyrat\modules\reagent_forging\code\reagent_component.dm" #include "modular_skyrat\modules\reagent_forging\code\smith_skill.dm" #include "modular_skyrat\modules\reagent_forging\code\tool_override.dm" diff --git a/tgui/packages/tgui/interfaces/Cargo/index.tsx b/tgui/packages/tgui/interfaces/Cargo/index.tsx index d39435f4cd9..b3c169ec94c 100644 --- a/tgui/packages/tgui/interfaces/Cargo/index.tsx +++ b/tgui/packages/tgui/interfaces/Cargo/index.tsx @@ -11,6 +11,9 @@ import { CargoData } from './types'; enum TAB { Catalog = 'catalog', Requests = 'requests', + /* SKYRAT EDIT BELOW - ADDS company imports */ + Imports = 'company_import_window', + /* SKYRAT EDIT END */ Cart = 'cart', Help = 'help', } @@ -26,7 +29,9 @@ export function Cargo(props) { } export function CargoContent(props) { - const { data } = useBackend(); + /* SKYRAT EDIT BELOW - ADDS act */ + const { act, data } = useBackend(); + /* SKYRAT EDIT END */ const { cart = [], requests = [], requestonly } = data; @@ -51,6 +56,15 @@ export function CargoContent(props) { > Catalog + {/* SKYRAT EDIT START - Company imports */} + act(TAB.Imports)} + > + Company Imports + + {/* SKYRAT EDIT END */} 0 && 'yellow'} diff --git a/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.jsx b/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.jsx index 386f3c5721a..438030e3947 100644 --- a/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.jsx +++ b/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.jsx @@ -96,41 +96,66 @@ const BountyTextBox = (props) => { const BountyPickBox = (props) => { const { act, data } = useBackend(); - const { id_bounty_names, id_bounty_values } = data; + const { id_bounty_names, id_bounty_infos, id_bounty_values } = data; return (
- + - + - +
); }; + +const BountyPickButton = (props) => { + return ( + + ); +}; diff --git a/tgui/packages/tgui/interfaces/DeathmatchLobby.tsx b/tgui/packages/tgui/interfaces/DeathmatchLobby.tsx index 12dad26bc71..e7b66093d20 100644 --- a/tgui/packages/tgui/interfaces/DeathmatchLobby.tsx +++ b/tgui/packages/tgui/interfaces/DeathmatchLobby.tsx @@ -18,11 +18,12 @@ import { import { ButtonCheckbox } from '../components/Button'; import { Window } from '../layouts'; -type Player = Record; - -type PlayerInfo = { +type Player = { host: number; + key: string; + loadout: string; ready: BooleanLike; + mob: string; }; type Modifier = { @@ -61,15 +62,25 @@ type Data = { export function DeathmatchLobby(props) { const { act, data } = useBackend(); - const { admin, observers = [], self, players } = data; + const { + admin, + host, + mod_menu_open, + observers = [], + players = [], + self, + } = data; - const allReady = Object.keys(players).every( - (player) => players[player].ready, - ); + const allReady = players.every((player) => player.ready); + + const fullAccess = !!host || !!admin; + const showMenu = fullAccess && !!mod_menu_open; + + const isObserver = observers.find((observer) => observer.key === self); return ( - + {showMenu && } @@ -98,7 +109,7 @@ export function DeathmatchLobby(props) {