diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_lodge.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_lodge.dmm new file mode 100644 index 0000000000000..d35fc52db02b4 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_lodge.dmm @@ -0,0 +1,4641 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ac" = ( +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"aw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"aA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"aE" = ( +/obj/item/shovel, +/obj/structure/rack, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/item/shovel{ + pixel_x = -5; + pixel_y = 1 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"aU" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"be" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"bs" = ( +/obj/machinery/door/airlock/wood{ + color = "#beada5" + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/structure/fans/tiny, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"bR" = ( +/obj/structure/railing{ + dir = 8; + color = "#beada5" + }, +/obj/structure/railing{ + dir = 4; + color = "#beada5" + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/iron/stairs{ + color = "#5d341f" + }, +/area/ruin/huntinglodge) +"bV" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"bX" = ( +/obj/structure/table, +/obj/machinery/gibber, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"ca" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/mob/living/basic/viscerator, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"cy" = ( +/obj/structure/chair/wood/wings{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/carpet/lone/star, +/area/ruin/huntinglodge) +"cC" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/plastic, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/viscerator, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"cJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/kitchenspike, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"cO" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"cQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/effect/spawner/random/food_or_drink/jelly_donuts{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"cS" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/turf/open/misc/hay/icemoon, +/area/ruin/huntinglodge) +"dc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/item/ammo_casing/c45{ + pixel_x = 2; + pixel_y = -4 + }, +/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag, +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"dr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"du" = ( +/obj/item/ammo_casing/c45{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"dC" = ( +/obj/machinery/door/airlock/wood{ + color = "#beada5" + }, +/obj/structure/fans/tiny, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"dP" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/machinery/light/small/dim/directional/west, +/obj/structure/railing{ + dir = 5; + color = "#beada5" + }, +/obj/structure/railing/corner{ + color = "#beada5" + }, +/turf/open/floor/stone, +/area/ruin/huntinglodge) +"dQ" = ( +/obj/effect/decal/cleanable/wrapping, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mob_spawn/corpse/human/assistant, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"eh" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/warm/directional/south, +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"ej" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"et" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"eB" = ( +/turf/open/floor/iron/stairs/left{ + color = "#5d341f"; + dir = 1 + }, +/area/ruin/huntinglodge) +"eD" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 8; + color = "#beada5" + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"eE" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/chair/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"eQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/ruin/huntinglodge) +"eX" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/viscerator, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"fb" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"fe" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"fi" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"fB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"fK" = ( +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"fO" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -4; + pixel_y = -3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/chem_pile, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"fP" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"gu" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = -6; + pixel_y = 7 + }, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/spawner/random/entertainment/plushie{ + pixel_x = -14; + pixel_y = 0 + }, +/obj/item/stack/wrapping_paper, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"gA" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/obj/structure/chair/comfy/brown, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/mob_spawn/corpse/human/minesite/overseer, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"gB" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 11; + pixel_y = -13 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"gM" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"gS" = ( +/obj/item/ammo_casing/c45{ + pixel_x = -4; + pixel_y = -7 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"gY" = ( +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/ruin/huntinglodge) +"gZ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"hb" = ( +/obj/structure/railing{ + dir = 10; + color = "#beada5" + }, +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"hf" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/floor/carpet/lone/star, +/area/ruin/huntinglodge) +"hl" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -3; + pixel_y = -8 + }, +/obj/item/gun/ballistic/shotgun/riot, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"hm" = ( +/turf/open/floor/iron/stairs/right{ + color = "#5d341f"; + dir = 8 + }, +/area/ruin/huntinglodge) +"hE" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"hK" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/machinery/door/airlock/wood{ + color = "#beada5" + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"hP" = ( +/obj/structure/table/wood, +/obj/item/paper{ + pixel_x = 3; + pixel_y = 6 + }, +/obj/item/pen/fountain{ + pixel_x = -10; + pixel_y = 3 + }, +/obj/effect/turf_decal/siding/wood/end, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"hV" = ( +/obj/effect/spawner/structure/window/reinforced{ + color = "#beada5" + }, +/obj/structure/curtain/cloth/fancy, +/obj/effect/decal/cleanable/blood/splatter/over_window, +/obj/effect/mapping_helpers/damaged_window, +/turf/open/floor/plating, +/area/ruin/huntinglodge) +"hZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/item/ammo_casing/c45{ + pixel_x = 7; + pixel_y = -5 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"ic" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent, +/obj/item/gift{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/blood/gibs/body, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"if" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"iq" = ( +/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"iZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/item/gift, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"jl" = ( +/obj/item/ammo_casing/c45{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"jp" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/item/bodypart/head/ethereal, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/item/chair/stool, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"jr" = ( +/obj/structure/fermenting_barrel, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_x = 1; + pixel_y = 13 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"jF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/brimdust, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"jK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"jN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/decal/cleanable/brimdust, +/turf/open/floor/carpet, +/area/ruin/huntinglodge) +"jQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"kf" = ( +/obj/structure/bookcase/random, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"kk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"kl" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"kn" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/misc/hay/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"kD" = ( +/mob/living/basic/viscerator, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"kH" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"kI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/chair/stool{ + pixel_x = -10; + pixel_y = -14 + }, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"kJ" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"kP" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"kR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"lc" = ( +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/obj/effect/decal/cleanable/blood/gibs, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"lv" = ( +/obj/machinery/light/small/dim/directional/west, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/ruin/huntinglodge) +"lC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"lE" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/blood/gibs/down, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"lJ" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/effect/spawner/random/entertainment/plushie{ + pixel_x = 11; + pixel_y = 0 + }, +/obj/effect/spawner/random/entertainment/musical_instrument{ + pixel_x = 11; + pixel_y = 0 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"lL" = ( +/obj/structure/table/wood, +/obj/item/toy/talking/ai{ + pixel_x = -2; + pixel_y = 7 + }, +/obj/effect/spawner/random/entertainment/plushie{ + pixel_x = -18; + pixel_y = 7 + }, +/obj/effect/spawner/random/entertainment/plushie, +/obj/effect/spawner/random/entertainment/musical_instrument{ + pixel_x = -9; + pixel_y = 10 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"lO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"lU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/comfy/brown, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"mb" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent, +/obj/effect/decal/cleanable/blood/trails{ + dir = 10 + }, +/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"mm" = ( +/obj/structure/table/wood, +/obj/item/storage/cans/sixbeer, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"mo" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"mq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/mob_spawn/corpse/human, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"mr" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/rainbow{ + dir = 1 + }, +/obj/effect/mob_spawn/corpse/human/miner/explorer, +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"mA" = ( +/obj/machinery/light/small/dim/directional/south, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/ruin/huntinglodge) +"mG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/stool/directional/north, +/obj/item/gun/ballistic/shotgun/riot, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"mX" = ( +/obj/structure/dresser, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"nt" = ( +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"nC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -9; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"nI" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/tree/pine/xmas/presentless{ + pixel_x = -15; + pixel_y = 10 + }, +/turf/open/floor/carpet, +/area/ruin/huntinglodge) +"nK" = ( +/obj/structure/ore_container/food_trough/raptor_trough, +/turf/open/misc/hay/icemoon, +/area/ruin/huntinglodge) +"nX" = ( +/obj/structure/table/wood/fancy, +/obj/item/bodypart/head/ethereal, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"og" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"oF" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"oT" = ( +/obj/machinery/computer/security/wooden_tv, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"oW" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"oY" = ( +/obj/structure/railing{ + dir = 10; + color = "#beada5" + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"pl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 0; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/chem_pile, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"pr" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/obj/item/chair/stool{ + dir = 4; + pixel_x = 0; + pixel_y = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"pE" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_x = 3; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_x = -7; + pixel_y = 3 + }, +/turf/open/misc/hay/icemoon, +/area/ruin/huntinglodge) +"pF" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"pJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"pN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/light/small/dim/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/confetti, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"pU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/item/food/grown/carrot{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/food/grown/carrot{ + pixel_x = 6; + pixel_y = -2 + }, +/obj/structure/sink/kitchen/directional/west, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"pX" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"qp" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/item/paper/crumpled/bloody, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"qH" = ( +/obj/item/ammo_casing/c45{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"qL" = ( +/obj/structure/table/wood/fancy/orange, +/obj/item/trash/tray{ + pixel_x = 0; + pixel_y = 3 + }, +/obj/item/bodypart/head{ + pixel_x = 0; + pixel_y = 3 + }, +/turf/open/floor/carpet/lone/star, +/area/ruin/huntinglodge) +"qO" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -4; + pixel_y = -13 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"qU" = ( +/obj/item/hatchet/wooden{ + pixel_x = -8; + pixel_y = 17 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"qW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/item/chair/stool, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"qZ" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"ry" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"rI" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"rS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/carpet, +/area/ruin/huntinglodge) +"sU" = ( +/obj/item/ammo_casing/c45, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"sX" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/effect/spawner/random/food_or_drink/jelly_donuts{ + pixel_x = 6; + pixel_y = 0 + }, +/obj/effect/spawner/random/food_or_drink/jelly_donuts{ + pixel_x = -5; + pixel_y = 11 + }, +/obj/effect/spawner/random/food_or_drink/jelly_donuts{ + pixel_x = -14; + pixel_y = 0 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"ta" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"td" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/trails{ + dir = 10 + }, +/obj/effect/decal/cleanable/brimdust, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"tk" = ( +/obj/effect/turf_decal/siding/wood/end, +/obj/structure/rack, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat{ + pixel_x = -3; + pixel_y = 0 + }, +/obj/item/clothing/suit/hooded/wintercoat{ + pixel_x = -6; + pixel_y = 0 + }, +/obj/item/pickaxe, +/obj/item/pickaxe{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/pickaxe{ + pixel_x = 2; + pixel_y = -1 + }, +/obj/item/flashlight{ + pixel_x = 0; + pixel_y = -2 + }, +/obj/item/flashlight{ + pixel_x = 5; + pixel_y = -4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"tq" = ( +/obj/machinery/jukebox, +/turf/open/floor/carpet, +/area/ruin/huntinglodge) +"tT" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"tY" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/item/gift{ + pixel_x = 0; + pixel_y = 3 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"uc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/corpse/human/cook, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"uU" = ( +/obj/structure/barricade/wooden/crude/snow, +/obj/machinery/door/airlock/wood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/structure/fans/tiny, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"uZ" = ( +/obj/machinery/light/warm/directional/north, +/turf/open/misc/hay/icemoon, +/area/ruin/huntinglodge) +"vc" = ( +/obj/item/knife/combat/bone{ + pixel_x = -19; + pixel_y = -2 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"vg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"vr" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/carpet/lone/star, +/area/ruin/huntinglodge) +"vv" = ( +/obj/structure/railing{ + dir = 10; + color = "#beada5" + }, +/obj/structure/hedge, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"vH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"vK" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"vO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/table/wood/fancy, +/obj/item/gift{ + pixel_x = 0; + pixel_y = 1 + }, +/obj/item/gift{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/gift{ + pixel_x = -12; + pixel_y = 11 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"vW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"wd" = ( +/obj/structure/table/wood/fancy, +/obj/item/flashlight/lamp/green{ + pixel_x = 0; + pixel_y = 6 + }, +/turf/open/floor/carpet, +/area/ruin/huntinglodge) +"ws" = ( +/obj/structure/musician/piano{ + color = "#beada5" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"ww" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"wC" = ( +/obj/structure/chair/wood/wings{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/carpet/lone/star, +/area/ruin/huntinglodge) +"wI" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_x = 1; + pixel_y = 27 + }, +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = -1; + pixel_y = 5 + }, +/turf/open/floor/stone, +/area/ruin/huntinglodge) +"wO" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"wP" = ( +/obj/effect/decal/cleanable/blood/gibs/up, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"wV" = ( +/obj/structure/fireplace, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone, +/area/ruin/huntinglodge) +"xh" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"xv" = ( +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"xy" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"xz" = ( +/obj/effect/decal/cleanable/blood/gibs/body, +/obj/effect/decal/cleanable/blood/trails, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"xB" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -4; + pixel_y = 8 + }, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"xE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/table/wood/fancy, +/obj/item/gift{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/gift{ + pixel_x = 4; + pixel_y = 9 + }, +/obj/item/gift{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"xG" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/structure/railing{ + color = "#beada5" + }, +/obj/effect/turf_decal/siding/thinplating{ + color = "#beada5" + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"xH" = ( +/obj/effect/decal/cleanable/insectguts, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"xM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/wood/fancy/royalblack, +/obj/machinery/light/warm/directional/west, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = -6; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 8; + pixel_y = 9 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"xQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"ye" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = -17; + pixel_y = -1 + }, +/obj/effect/spawner/random/entertainment/plushie{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/item/stack/wrapping_paper, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"yk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"yt" = ( +/obj/structure/chair/wood/wings{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/carpet/lone/star, +/area/ruin/huntinglodge) +"yB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/turf/open/floor/carpet, +/area/ruin/huntinglodge) +"yG" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mob_spawn/corpse/human/miner/explorer, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"yN" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"yO" = ( +/obj/effect/decal/cleanable/garbage, +/obj/effect/decal/cleanable/blood/trails, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/viscerator, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"yR" = ( +/obj/item/ammo_casing/c45{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/ammo_casing/c45{ + pixel_x = -10; + pixel_y = -9 + }, +/obj/item/ammo_casing/c45{ + pixel_x = 1; + pixel_y = -7 + }, +/obj/item/ammo_casing/c45{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/effect/decal/cleanable/ash, +/mob/living/basic/viscerator, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"yW" = ( +/obj/structure/railing/corner{ + color = "#beada5" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"zr" = ( +/obj/effect/decal/cleanable/blood/splatter/over_window, +/obj/effect/spawner/structure/window/reinforced{ + color = "#beada5" + }, +/obj/structure/curtain/cloth/fancy, +/turf/open/floor/plating, +/area/ruin/huntinglodge) +"zM" = ( +/obj/item/chair/stool/bamboo{ + dir = 8; + color = "#463934" + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"zN" = ( +/turf/open/floor/iron/stairs{ + color = "#5d341f" + }, +/area/ruin/huntinglodge) +"Ah" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"Ao" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = -10; + pixel_y = 7 + }, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = 3; + pixel_y = 0 + }, +/obj/effect/spawner/random/entertainment/musical_instrument{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/stack/wrapping_paper, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Ar" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"As" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"Aw" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"AF" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/turf/open/misc/hay/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"AG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"AV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/oven/range, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"AX" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/space/santa, +/obj/item/storage/backpack/santabag{ + pixel_x = -9; + pixel_y = 3 + }, +/obj/item/clothing/head/costume/santa{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/ammo_box/magazine/m45{ + pixel_x = 8; + pixel_y = 0 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Bl" = ( +/obj/structure/railing{ + dir = 6; + color = "#beada5" + }, +/obj/structure/hedge, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"Bm" = ( +/obj/item/ammo_casing/c45{ + pixel_x = -5; + pixel_y = -4 + }, +/obj/item/ammo_casing/c45{ + pixel_x = -4; + pixel_y = 0 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"BE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood/fancy/orange, +/obj/item/plate/small{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/plate/small{ + pixel_x = 7; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/glass{ + pixel_x = 7; + pixel_y = 17 + }, +/obj/item/food/meat/steak/plain/human{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/food/meat/steak/plain/human{ + pixel_x = 7; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/glass{ + pixel_x = -8; + pixel_y = 3 + }, +/turf/open/floor/carpet/lone/star, +/area/ruin/huntinglodge) +"BI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Cv" = ( +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/hay/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"Cy" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/bodypart/head{ + pixel_x = -1; + pixel_y = 25 + }, +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/paper/crumpled/bloody, +/obj/machinery/coffeemaker/impressa, +/turf/open/floor/stone, +/area/ruin/huntinglodge) +"CA" = ( +/turf/closed/mineral/snowmountain/cavern/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"CC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/chair/stool/directional/west, +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/warm/dim/directional/east, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"CD" = ( +/turf/open/floor/iron/stairs/right{ + color = "#5d341f"; + dir = 1 + }, +/area/ruin/huntinglodge) +"CE" = ( +/obj/machinery/light/small/dim/directional/north, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/ruin/huntinglodge) +"CL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood/fancy, +/obj/item/gift{ + pixel_x = -18; + pixel_y = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/flashlight/lamp/green{ + pixel_x = -1; + pixel_y = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"CS" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + color = "#beada5" + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"Dc" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/stool/directional/south, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"Dp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Dq" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"Ds" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"DE" = ( +/obj/item/ammo_casing/c45{ + pixel_x = -9; + pixel_y = -2 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"DF" = ( +/obj/structure/flora/tree/pine/style_2, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"DH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/warm/directional/east, +/obj/structure/table/wood, +/obj/item/clothing/shoes/winterboots/ice_boots, +/obj/item/clothing/shoes/winterboots/ice_boots{ + pixel_x = -5; + pixel_y = 11 + }, +/obj/item/clothing/shoes/winterboots/ice_boots{ + pixel_x = 6; + pixel_y = 9 + }, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"DM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"DO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/footprints, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 8; + pixel_y = -7 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"DX" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Ea" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/blood/splatter/over_window{ + pixel_x = -32; + pixel_y = 0 + }, +/obj/item/gift{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/gift{ + pixel_x = -6; + pixel_y = -1 + }, +/obj/item/gift{ + pixel_x = -5; + pixel_y = 15 + }, +/obj/item/gift{ + pixel_x = 4; + pixel_y = 13 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"Ei" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/ammo_casing/c45{ + pixel_x = -5; + pixel_y = -4 + }, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Ej" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Es" = ( +/obj/structure/table/wood/fancy, +/obj/item/gift{ + pixel_x = -1; + pixel_y = -11 + }, +/obj/item/gift{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/gift{ + pixel_x = 9; + pixel_y = -11 + }, +/obj/item/gift{ + pixel_x = 10; + pixel_y = 0 + }, +/obj/item/gift{ + pixel_x = 6; + pixel_y = 12 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"EB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/gibs/torso, +/obj/effect/decal/cleanable/chem_pile, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"EG" = ( +/obj/structure/bed, +/obj/item/bedsheet/gondola, +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/obj/effect/mob_spawn/corpse/human/miner/explorer, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"EJ" = ( +/turf/template_noop, +/area/template_noop) +"EK" = ( +/obj/effect/decal/cleanable/ash, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -28; + pixel_y = 10 + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"EY" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"Fw" = ( +/obj/structure/railing{ + dir = 6; + color = "#beada5" + }, +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"Fz" = ( +/obj/item/chair/stool/bamboo{ + dir = 4; + color = "#463934" + }, +/obj/item/flashlight/lantern/on{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"FN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"FX" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -9; + pixel_y = 5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/warm/directional/north, +/obj/effect/decal/cleanable/blood, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 0; + pixel_y = -7 + }, +/obj/effect/decal/cleanable/chem_pile, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Gj" = ( +/obj/structure/bed/double{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/item/bedsheet/patriot/double{ + dir = 4 + }, +/obj/effect/mob_spawn/corpse/human/laborer, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Gl" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/obj/structure/railing/corner/end{ + dir = 4; + color = "#beada5" + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"Gn" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Gp" = ( +/obj/effect/spawner/structure/window/reinforced{ + color = "#beada5" + }, +/obj/structure/curtain/cloth/fancy, +/turf/open/floor/plating, +/area/ruin/huntinglodge) +"Gy" = ( +/obj/structure/falsewall/wood, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"GA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"GD" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent, +/obj/item/gift{ + pixel_x = -6; + pixel_y = 11 + }, +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"GF" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"GN" = ( +/obj/item/ammo_casing/c45{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/ammo_casing/c45{ + pixel_x = 3; + pixel_y = -4 + }, +/obj/item/ammo_casing/c45{ + pixel_x = -5; + pixel_y = 0 + }, +/obj/effect/decal/cleanable/blood/splatter, +/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"GU" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"Hi" = ( +/obj/structure/table/wood/fancy, +/obj/effect/turf_decal/siding/wood, +/obj/item/stack/wrapping_paper, +/obj/item/stack/wrapping_paper{ + pixel_x = 0; + pixel_y = 12 + }, +/obj/item/gift{ + pixel_x = -10; + pixel_y = 8 + }, +/obj/item/gift{ + pixel_x = 0; + pixel_y = 14 + }, +/obj/item/gift{ + pixel_x = -7; + pixel_y = 1 + }, +/obj/item/gift{ + pixel_x = 7; + pixel_y = 7 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Hm" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/door/airlock/wood{ + color = "#beada5" + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"Ho" = ( +/obj/structure/closet/crate/trashcart, +/obj/item/storage/cans/sixbeer, +/obj/item/knife/hunting{ + pixel_x = -1; + pixel_y = -4 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"Hq" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Hr" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/viscerator, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Hv" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"Hw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/item/trash/candle, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"Hx" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"HC" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/lone/star, +/area/ruin/huntinglodge) +"HK" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"HL" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = 7; + pixel_y = 9 + }, +/obj/effect/spawner/random/entertainment/toy, +/obj/item/clothing/mask/facehugger/toy{ + pixel_x = -13; + pixel_y = 5 + }, +/obj/effect/spawner/random/entertainment/musical_instrument{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/item/stack/wrapping_paper, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Ia" = ( +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/brimdust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"If" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/carpet, +/area/ruin/huntinglodge) +"Ig" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -6; + pixel_y = -1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Ip" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Iq" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = -9; + pixel_y = 5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Iw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 4; + pixel_y = 7 + }, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"Iz" = ( +/obj/machinery/door/airlock/wood{ + color = "#beada5" + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"IH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/wood, +/obj/item/storage/cans/sixbeer, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"IZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/mob/living/basic/viscerator, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"Jb" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/huntinglodge) +"Jj" = ( +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"Jk" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/noticeboard/directional/north, +/obj/structure/sign/poster/contraband/blood_geometer/directional/east, +/obj/structure/table/wood, +/obj/item/paper{ + pixel_x = 3; + pixel_y = 6 + }, +/obj/machinery/light/small/dim/directional/east, +/obj/item/stack/wrapping_paper, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Jo" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/stool/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"JQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/effect/decal/cleanable/blood{ + icon_state = "floor6-old" + }, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"JZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"Kc" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"Kl" = ( +/obj/structure/railing/corner{ + dir = 8; + color = "#beada5" + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"KB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/gibs/limb, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"KU" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"Lt" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"Lv" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = -7; + pixel_y = 0 + }, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/dualsaber/toy{ + pixel_x = -16; + pixel_y = 0 + }, +/obj/item/toy/toy_dagger{ + pixel_x = 4; + pixel_y = -9 + }, +/obj/effect/spawner/random/entertainment/musical_instrument{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/stack/wrapping_paper, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"LQ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/item/chair/wood/wings, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Mb" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 5; + pixel_y = 8 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"Mc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Mf" = ( +/obj/machinery/light/warm/directional/west, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/ruin/huntinglodge) +"Mw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/paper/crumpled, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"MJ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/stool/directional/south, +/obj/effect/decal/cleanable/plastic, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"MQ" = ( +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/obj/effect/decal/cleanable/blood/gibs, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Nj" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/viscerator, +/obj/effect/decal/cleanable/brimdust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Nl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/stool/directional/north, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"Nu" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/ruin/huntinglodge) +"Nw" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/ammo_casing/c45{ + pixel_x = -5; + pixel_y = -4 + }, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"NE" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"NL" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 15; + pixel_y = 9 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"NN" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"NP" = ( +/obj/structure/fermenting_barrel, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"NW" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"Oa" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/warm/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/brimdust, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Of" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"Ok" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"Oq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/decal/cleanable/brimdust, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Ot" = ( +/obj/structure/table/wood/fancy, +/obj/item/gift{ + pixel_x = -4; + pixel_y = 9 + }, +/obj/item/gift{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/gift{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/item/gift{ + pixel_x = 2; + pixel_y = 10 + }, +/obj/item/gift{ + pixel_x = 7; + pixel_y = -3 + }, +/obj/item/gift{ + pixel_x = 7; + pixel_y = 17 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"Oz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/musical_instrument{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"OA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/mob/living/basic/viscerator, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"OH" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/paper/crumpled/bloody, +/obj/item/paper/crumpled/bloody, +/turf/open/misc/hay/icemoon, +/area/ruin/huntinglodge) +"ON" = ( +/obj/item/flashlight/lantern/on, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"OY" = ( +/obj/machinery/light/small/dim/directional/south, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"OZ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"Pa" = ( +/obj/effect/decal/cleanable/blood/gibs/up, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Pd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"Pi" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/item/ammo_casing/c45{ + pixel_x = 7; + pixel_y = -5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"PK" = ( +/obj/structure/railing{ + dir = 9; + color = "#beada5" + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"PS" = ( +/obj/effect/spawner/structure/window/reinforced{ + color = "#beada5" + }, +/obj/structure/curtain/cloth/fancy, +/obj/effect/decal/cleanable/blood/splatter/over_window, +/turf/open/floor/plating, +/area/ruin/huntinglodge) +"PU" = ( +/turf/open/floor/iron/stairs/medium{ + color = "#5d341f" + }, +/area/ruin/huntinglodge) +"Qp" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/table/wood/fancy/orange, +/obj/item/plate/small{ + pixel_x = -5; + pixel_y = 0 + }, +/obj/item/plate/small{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/glass{ + pixel_x = -7; + pixel_y = 15 + }, +/obj/item/food/meat/steak/plain/human{ + pixel_x = -6; + pixel_y = 0 + }, +/obj/item/food/meat/steak/plain/human{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/glass{ + pixel_x = 9; + pixel_y = 3 + }, +/turf/open/floor/carpet/lone/star, +/area/ruin/huntinglodge) +"Qy" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"QB" = ( +/obj/machinery/door/airlock/wood{ + color = "#beada5" + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"QG" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"QS" = ( +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Rg" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"Rl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/mob/living/basic/viscerator, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"RB" = ( +/obj/effect/decal/cleanable/blood/gibs/body, +/obj/effect/decal/cleanable/blood/trails, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"RH" = ( +/obj/effect/turf_decal/siding/thinplating{ + color = "#beada5" + }, +/obj/structure/railing{ + color = "#beada5" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Sf" = ( +/obj/structure/rack, +/obj/item/gps/mining, +/obj/item/gps/mining{ + pixel_x = -7; + pixel_y = 4 + }, +/turf/open/misc/hay/icemoon, +/area/ruin/huntinglodge) +"Sg" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Sl" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"So" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"Sp" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/gift{ + pixel_x = -10; + pixel_y = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"SK" = ( +/obj/structure/table/wood, +/obj/item/toy/talking{ + pixel_x = 1; + pixel_y = 10 + }, +/obj/item/stack/wrapping_paper, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"SL" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/chem_pile, +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"SN" = ( +/mob/living/basic/raptor/green, +/turf/open/misc/hay/icemoon, +/area/ruin/huntinglodge) +"SO" = ( +/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/garbage, +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"SS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"SW" = ( +/obj/item/flashlight/lantern/on, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"Th" = ( +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"Tp" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Tv" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"TC" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/gift{ + pixel_x = -10; + pixel_y = -6 + }, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"TI" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/gun/ballistic/shotgun/doublebarrel, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"TN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/chair/comfy/brown, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"TO" = ( +/turf/open/floor/iron/stairs/right{ + color = "#5d341f" + }, +/area/ruin/huntinglodge) +"TV" = ( +/mob/living/basic/migo/hatsune, +/turf/open/floor/light/colour_cycle, +/area/ruin/huntinglodge) +"Uv" = ( +/obj/effect/decal/cleanable/blood/gibs/down, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"Ux" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/knife/butcher, +/obj/item/chainsaw{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/knife, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"UB" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/rainbow{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/mob_spawn/corpse/human/miner/explorer, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"UJ" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/misc/hay/icemoon, +/area/ruin/huntinglodge) +"US" = ( +/obj/structure/railing{ + color = "#beada5" + }, +/obj/effect/turf_decal/siding/thinplating{ + color = "#beada5" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Vb" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/ammo_casing/c45{ + pixel_x = -5; + pixel_y = -11 + }, +/obj/effect/decal/cleanable/glass, +/mob/living/basic/viscerator, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Vk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"VC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/obj/item/gift, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"VE" = ( +/turf/open/floor/iron/stairs/left{ + color = "#5d341f" + }, +/area/ruin/huntinglodge) +"VO" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/stone, +/area/ruin/huntinglodge) +"VW" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/item/storage/cans/sixbeer{ + pixel_x = -4; + pixel_y = -15 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"Wn" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood/innards, +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/viscerator, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"Ws" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"WC" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"WX" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 7; + pixel_y = -1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/obj/item/gift, +/turf/open/floor/carpet/green, +/area/ruin/huntinglodge) +"Xa" = ( +/obj/effect/decal/cleanable/blood/gibs/up, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"Xd" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"Xf" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"Xk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/mob/living/basic/viscerator, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"Xl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/item/flashlight/lamp/green{ + pixel_x = 0; + pixel_y = 4 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"Xs" = ( +/obj/structure/railing{ + dir = 4; + color = "#beada5" + }, +/obj/structure/railing{ + dir = 8; + color = "#beada5" + }, +/turf/open/floor/iron/stairs{ + color = "#5d341f" + }, +/area/ruin/huntinglodge) +"Xu" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"XF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/machinery/griddle, +/turf/open/floor/iron/checker, +/area/ruin/huntinglodge) +"XL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/chem_pile, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"XN" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/blood, +/obj/machinery/light/warm/dim/directional/south, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"XY" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/large, +/area/ruin/huntinglodge) +"Yr" = ( +/obj/machinery/door/airlock/wood{ + color = "#beada5" + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"Yu" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"Yy" = ( +/obj/item/ammo_casing/c45{ + pixel_x = -1; + pixel_y = -1 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"YD" = ( +/obj/effect/spawner/structure/window/reinforced{ + color = "#beada5" + }, +/obj/structure/curtain/cloth/fancy/mechanical/start_closed, +/turf/open/floor/plating, +/area/ruin/huntinglodge) +"YQ" = ( +/turf/open/misc/hay/icemoon, +/area/ruin/huntinglodge) +"YR" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"YZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/mob/living/basic/viscerator, +/turf/open/floor/carpet/royalblack, +/area/ruin/huntinglodge) +"Zg" = ( +/obj/machinery/door/airlock/wood{ + color = "#beada5" + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/structure/fans/tiny, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) +"Zi" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/item/ammo_casing/shotgun/buckshot/spent, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/west, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/tile, +/area/ruin/huntinglodge) +"Zk" = ( +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/surface/outdoors/nospawn) +"Zs" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/stone, +/area/icemoon/surface/outdoors/nospawn) +"ZA" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/stone, +/area/ruin/huntinglodge) +"ZB" = ( +/obj/structure/table/wood/fancy, +/obj/item/storage/fancy/candle_box{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/effect/spawner/random/entertainment/lighter{ + pixel_x = 6; + pixel_y = -1 + }, +/turf/open/floor/carpet, +/area/ruin/huntinglodge) +"ZI" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/item/bodypart/head/ethereal, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, +/area/ruin/huntinglodge) +"ZN" = ( +/turf/open/floor/iron/stairs/left{ + color = "#5d341f"; + dir = 8 + }, +/area/ruin/huntinglodge) +"ZT" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = 5; + pixel_y = 0 + }, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/effect/spawner/random/entertainment/plushie{ + pixel_x = -10; + pixel_y = 4 + }, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"ZV" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = -5; + pixel_y = 0 + }, +/obj/effect/spawner/random/entertainment/plushie{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/item/stack/wrapping_paper, +/turf/open/floor/carpet/red, +/area/ruin/huntinglodge) +"ZW" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/huntinglodge) + +(1,1,1) = {" +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +"} +(2,1,1) = {" +EJ +EJ +CA +CA +fK +EJ +EJ +EJ +fK +DF +EJ +EJ +EJ +EJ +EJ +EJ +Zs +HK +wO +HK +wO +wO +gZ +fK +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +"} +(3,1,1) = {" +EJ +CA +CA +fK +fK +fK +fK +fK +fK +fK +fK +EJ +EJ +EJ +Zs +wO +oW +fK +ON +fK +Th +fb +EY +bV +So +fK +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +"} +(4,1,1) = {" +EJ +CA +CA +fK +ta +fK +Jb +hV +Gp +Jb +fK +fK +Zs +HK +be +ta +fK +Jb +Gp +Jb +fK +fK +Mb +As +ry +gZ +fK +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +"} +(5,1,1) = {" +EJ +CA +fK +DF +fK +Jb +Jb +Gj +AX +Jb +Jb +fK +NW +fK +fK +fK +Jb +Jb +eE +Jb +Gp +Gp +Jb +fK +hE +ry +fe +gZ +fK +EJ +EJ +EJ +EJ +EJ +EJ +"} +(6,1,1) = {" +EJ +EJ +fK +fK +mA +Jb +mX +dc +KB +oF +Jb +fP +ZA +fK +DF +fK +Jb +Jk +dQ +Iz +og +Mc +Jb +Jb +fK +fK +fK +NW +fK +EJ +EJ +EJ +EJ +EJ +EJ +"} +(7,1,1) = {" +EJ +EJ +EJ +fK +fK +Jb +oT +Vb +Bm +OY +Jb +dC +Jb +fK +fK +Jb +Jb +Jb +Jb +Jb +TC +lc +Dp +Jb +Jb +Jb +fK +NW +fK +EJ +EJ +EJ +EJ +EJ +EJ +"} +(8,1,1) = {" +EJ +EJ +EJ +fK +fK +Jb +Jb +Hm +Jb +Jb +Jb +mo +Jb +Jb +fK +Jb +TN +xM +xQ +Jb +DX +Sp +Ig +mq +kJ +Gp +aU +NW +fK +fK +EJ +EJ +EJ +EJ +EJ +"} +(9,1,1) = {" +EJ +EJ +fK +fK +Jb +Jb +Oq +BI +Gn +Jb +Jb +Vk +tk +Jb +Jb +Jb +lU +sX +Ds +Jb +gB +NN +xv +qZ +Hi +zr +fK +NW +DF +fK +EJ +EJ +EJ +EJ +EJ +"} +(10,1,1) = {" +EJ +EJ +ta +Jb +Jb +XY +eX +Ip +xB +vH +Jb +Yr +Jb +Jb +Jb +iZ +pl +IZ +Iw +Jb +QS +MQ +lO +Pa +YR +Gp +fK +NW +fK +fK +EJ +EJ +EJ +EJ +EJ +"} +(11,1,1) = {" +EJ +EJ +mA +Jb +wI +Ei +yt +wC +cy +SL +Yr +Hq +zN +Hq +VE +DO +rS +yB +tY +Kc +kD +fO +EK +Jb +Jb +Jb +fK +ry +gZ +fK +EJ +EJ +EJ +EJ +EJ +"} +(12,1,1) = {" +EJ +EJ +fK +Jb +wV +yR +BE +qL +Qp +Oa +Jb +Iq +Jb +FX +PU +hZ +eQ +nI +Lt +Uv +Sg +Hr +tT +Jb +fK +fK +fK +fK +NW +fK +EJ +EJ +EJ +EJ +EJ +"} +(13,1,1) = {" +EJ +EJ +fK +Jb +Cy +Nw +vr +hf +HC +Tp +QB +xh +zN +nt +TO +VC +If +jN +NL +Jb +xH +LQ +kH +Jb +CA +fK +fK +Zs +fi +sU +fK +EJ +EJ +EJ +EJ +"} +(14,1,1) = {" +EJ +fK +DF +Jb +Jb +dr +gM +if +Ar +yk +Jb +Jb +Jb +Jb +Jb +qp +hl +WX +Pi +Jb +YD +Yr +YD +Jb +CA +CA +Zs +be +Fz +Xu +jl +EJ +EJ +EJ +EJ +"} +(15,1,1) = {" +EJ +EJ +fK +CA +Jb +Jb +vW +AG +fB +Jb +Jb +Nu +TV +gY +Jb +Jb +Jj +pF +Jb +Jb +Xl +wP +kf +Jb +Jb +CA +NW +fK +DF +jr +du +EJ +EJ +EJ +EJ +"} +(16,1,1) = {" +EJ +EJ +fK +CA +CA +Jb +Jb +Zg +Jb +Jb +Jb +Gy +Jb +Jb +Jb +Jb +ZN +hm +Jb +kf +ca +xz +gA +hP +Jb +CA +ry +gZ +zM +qH +be +EJ +EJ +EJ +EJ +"} +(17,1,1) = {" +EJ +fK +fK +fK +ta +Mf +aE +Dq +NP +Jb +et +yW +Xs +KU +Jb +Bl +kR +YZ +Jb +kf +SS +ej +kf +Jb +Jb +CA +fK +Yy +gS +be +fK +EJ +EJ +EJ +EJ +"} +(18,1,1) = {" +EJ +fK +fK +fK +fK +fK +fK +Tv +fK +PS +Oz +US +xE +TI +Gp +Hw +Qy +XN +Jb +Jb +Jb +uU +Jb +Jb +fK +fK +fK +Ho +NW +fK +fK +EJ +EJ +EJ +EJ +"} +(19,1,1) = {" +EJ +DF +Jb +Jb +Jb +fK +fK +yN +fK +Gp +ws +RH +CL +kP +Yr +Pd +Xd +Yu +Gp +fK +dP +ac +VO +fK +fK +fK +fK +Zs +be +fK +fK +EJ +EJ +EJ +EJ +"} +(20,1,1) = {" +EJ +Jb +Jb +YQ +Jb +Jb +fK +NW +fK +Gp +CC +xG +vO +ZW +Gp +Xk +Rg +kl +hV +GN +Zk +EY +rI +Aw +GU +fe +wO +be +fK +fK +EJ +EJ +EJ +EJ +EJ +"} +(21,1,1) = {" +EJ +Jb +nK +SN +YQ +Jb +fK +vK +mA +Jb +Jb +eD +bR +NE +Jb +vv +jF +aA +Gp +DE +vc +fK +ta +fK +OZ +fK +fK +fK +fK +EJ +EJ +EJ +EJ +EJ +EJ +"} +(22,1,1) = {" +EJ +Jb +Sf +YQ +YQ +YQ +kn +Xf +fK +fK +Jb +Gp +Jb +Jb +Jb +Jb +ZN +hm +Jb +Jb +fK +DF +fK +fK +Gl +fK +fK +fK +fK +EJ +EJ +EJ +EJ +EJ +EJ +"} +(23,1,1) = {" +EJ +Jb +uZ +YQ +Jb +OH +Cv +cO +fK +ta +lv +fK +fK +Jb +Jb +Zi +kk +JQ +pN +Jb +Jb +fK +fK +PK +Kl +oY +fK +fK +DF +fK +EJ +EJ +EJ +EJ +EJ +"} +(24,1,1) = {" +EJ +Jb +pE +cS +UJ +YQ +AF +ry +gZ +fK +fK +DF +fK +Jb +GA +qO +nC +vg +jp +IH +Jb +Jb +Gp +Gp +bs +Gp +Jb +fK +fK +fK +EJ +EJ +EJ +EJ +EJ +"} +(25,1,1) = {" +EJ +Jb +nK +SN +YQ +Jb +QG +fK +Hv +fe +gZ +fK +Jb +Jb +XL +MJ +lJ +SK +Rl +yG +Jb +Fw +UB +Ea +Ej +mr +Jb +Jb +fK +EJ +EJ +EJ +EJ +EJ +EJ +"} +(26,1,1) = {" +EJ +Jb +Jb +YQ +Jb +Jb +QG +fK +Xf +DF +NW +fK +Gp +ZB +kI +Ok +ZV +lL +Nl +lE +CS +eB +SO +GD +Wn +Ia +mm +Jb +CE +fK +EJ +EJ +EJ +EJ +EJ +"} +(27,1,1) = {" +EJ +CA +Jb +Jb +Jb +fK +QG +SW +ry +wO +VW +fK +Gp +tq +Mw +Dc +Lv +ye +JZ +pr +hK +CD +mb +Nj +iq +ic +ZI +Jb +fK +DF +fK +EJ +EJ +EJ +EJ +"} +(28,1,1) = {" +CA +CA +fK +fK +fK +fK +Zk +qU +Sl +GF +xy +fK +Gp +wd +Ah +Jo +Ao +HL +qW +Of +Jb +hb +EG +EB +DH +EG +Jb +Jb +fK +fK +fK +EJ +EJ +EJ +EJ +"} +(29,1,1) = {" +CA +CA +CA +fK +fK +DF +fK +fK +DF +fK +fK +DF +Jb +Jb +aw +cC +gu +ZT +mG +eh +Jb +Jb +Jb +Yr +Jb +Jb +Jb +fK +fK +fK +EJ +EJ +EJ +EJ +EJ +"} +(30,1,1) = {" +EJ +CA +CA +fK +fK +fK +fK +fK +fK +DF +fK +fK +CA +Jb +lC +WC +td +OA +pX +cQ +Jb +AV +Xa +jQ +ww +Jb +fK +fK +EJ +EJ +EJ +EJ +EJ +EJ +EJ +"} +(31,1,1) = {" +EJ +CA +CA +CA +CA +CA +fK +fK +fK +fK +DF +CA +CA +Jb +Jb +jK +FN +DM +pJ +Jb +Jb +XF +RB +yO +bX +Jb +CE +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +"} +(32,1,1) = {" +EJ +EJ +CA +CA +CA +CA +CA +CA +CA +fK +fK +CA +CA +CA +Jb +Es +nX +Ot +Ot +Jb +pU +uc +jQ +Hx +cJ +Jb +fK +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +"} +(33,1,1) = {" +EJ +EJ +EJ +EJ +CA +CA +CA +CA +CA +CA +CA +CA +CA +CA +Jb +Gp +Gp +Gp +Gp +Jb +Jb +Ux +jQ +Ws +Jb +Jb +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +"} +(34,1,1) = {" +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +CA +CA +CA +CA +fK +lv +EJ +EJ +EJ +EJ +lv +Jb +Jb +dC +Jb +Jb +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +"} +(35,1,1) = {" +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +"} diff --git a/_maps/RandomRuins/SpaceRuins/commsbuoy_lowtech.dmm b/_maps/RandomRuins/SpaceRuins/commsbuoy_lowtech.dmm new file mode 100644 index 0000000000000..994589f0e51e0 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/commsbuoy_lowtech.dmm @@ -0,0 +1,283 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"c" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/turf/template_noop, +/area/space/nearstation) +"d" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/obj/structure/fluff/tram_rail, +/turf/template_noop, +/area/space/nearstation) +"j" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"m" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 8 + }, +/turf/template_noop, +/area/space/nearstation) +"n" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 4 + }, +/turf/template_noop, +/area/space/nearstation) +"o" = ( +/obj/structure/fluff/sat_dish{ + pixel_y = -15; + pixel_x = -11 + }, +/obj/structure/fluff/sat_dish{ + pixel_y = -9; + pixel_x = 12 + }, +/turf/template_noop, +/area/space/nearstation) +"p" = ( +/obj/structure/fluff/tram_rail/end, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"s" = ( +/obj/structure/fluff/sat_dish{ + pixel_x = 15; + dir = 8; + pixel_y = -7 + }, +/turf/template_noop, +/area/space/nearstation) +"t" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"x" = ( +/obj/structure/fluff/tram_rail/anchor, +/turf/template_noop, +/area/space/nearstation) +"z" = ( +/obj/structure/fluff/commsbuoy_broadcaster, +/turf/open/floor/iron/recharge_floor/Airless, +/area/space/nearstation) +"C" = ( +/obj/structure/fluff/sat_dish{ + pixel_y = 11; + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"D" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"E" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"F" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"G" = ( +/turf/template_noop, +/area/space/nearstation) +"I" = ( +/obj/structure/fluff/tram_rail, +/turf/template_noop, +/area/space/nearstation) +"K" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"L" = ( +/turf/closed/wall/mineral/titanium, +/area/space/nearstation) +"M" = ( +/turf/closed/wall/mineral/titanium, +/area/ruin/space/unpowered) +"N" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/ruin/space/unpowered) +"O" = ( +/obj/structure/fluff/commsbuoy_receiver, +/turf/open/floor/iron/recharge_floor/Airless, +/area/space/nearstation) +"P" = ( +/obj/structure/fluff/tram_rail/end, +/turf/template_noop, +/area/space/nearstation) +"S" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/fluff/tram_rail/end{ + dir = 8 + }, +/turf/template_noop, +/area/space/nearstation) +"U" = ( +/obj/structure/fluff/commsbuoy_processor, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"X" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"Y" = ( +/obj/structure/lattice/catwalk, +/obj/structure/fluff/sat_dish{ + pixel_y = 9; + dir = 1; + pixel_x = 8 + }, +/obj/structure/fluff/sat_dish{ + pixel_y = 15; + dir = 1; + pixel_x = -11 + }, +/turf/template_noop, +/area/space/nearstation) +"Z" = ( +/turf/open/floor/iron/solarpanel/airless, +/area/space/nearstation) + +(1,1,1) = {" +a +a +a +a +a +n +a +a +a +"} +(2,1,1) = {" +a +n +o +N +C +K +a +a +a +"} +(3,1,1) = {" +m +K +s +N +X +O +Z +Z +a +"} +(4,1,1) = {" +I +S +M +N +c +L +j +Z +Z +"} +(5,1,1) = {" +I +F +N +N +G +p +a +a +a +"} +(6,1,1) = {" +x +U +j +N +M +D +a +a +a +"} +(7,1,1) = {" +x +t +X +N +N +Y +Z +Z +a +"} +(8,1,1) = {" +I +d +a +N +j +X +Z +Z +Z +"} +(9,1,1) = {" +P +P +a +z +a +a +a +a +a +"} +(10,1,1) = {" +a +a +a +E +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +P +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm b/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm new file mode 100644 index 0000000000000..4fa47033077dc --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm @@ -0,0 +1,1209 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aJ" = ( +/obj/machinery/door/airlock/titanium{ + name = "Comms Buoy Airlock" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"aL" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/fluff/tram_rail, +/turf/template_noop, +/area/space/nearstation) +"bj" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/ruin/space/nt_commsbuoy) +"dO" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/nt_commsbuoy) +"dX" = ( +/obj/machinery/computer/terminal/nt_commsbuoy, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/space/nt_commsbuoy) +"et" = ( +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"ew" = ( +/obj/structure/fluff{ + name = "telecommunication hub"; + desc = "A mighty piece of hardware used to send/receive massive amounts of data."; + icon = 'icons/obj/machines/telecomms.dmi'; + icon_state = "hub" + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/space/nt_commsbuoy) +"eX" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"fx" = ( +/obj/structure/fluff{ + icon = 'icons/obj/machines/wallmounts.dmi'; + icon_state = "pod_off"; + name = "radio dish controller"; + desc = "A console for adjusting the satellite's radio dishes manually. The screen won't even power on without proper authorization, which you know you're never getting."; + pixel_y = 30 + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/space/nt_commsbuoy) +"fJ" = ( +/turf/template_noop, +/area/template_noop) +"gw" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"hb" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/obj/structure/fluff/tram_rail/end, +/turf/template_noop, +/area/space/nearstation) +"hk" = ( +/obj/structure/table, +/obj/item/paper/fluff/ruins/nt_commsbuoy/inspection{ + pixel_y = 3; + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/glass/mug/nanotrasen{ + pixel_y = 5; + pixel_x = 4 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"hn" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"hH" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space{ + pixel_y = 5; + pixel_x = -10 + }, +/obj/item/clothing/suit/space{ + pixel_y = 1; + pixel_x = 5 + }, +/obj/item/clothing/head/helmet/space{ + pixel_x = -7; + pixel_y = -5 + }, +/obj/item/clothing/head/helmet/space{ + pixel_y = -10; + pixel_x = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) +"in" = ( +/obj/structure/fluff{ + icon = 'icons/obj/machines/wallmounts.dmi'; + icon_state = "pod_off"; + name = "radio dish controller"; + desc = "A console for adjusting the satellite's radio dishes manually. The screen won't even power on without proper authorization, which you know you're never getting."; + pixel_y = 30 + }, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/mob_spawn/corpse/human/engineer, +/obj/item/keycard/nt_commsbuoy{ + pixel_y = 9; + pixel_x = 3 + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/space/nt_commsbuoy) +"io" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"it" = ( +/obj/machinery/computer/terminal/nt_commsbuoy/blackbox, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"iv" = ( +/obj/item/stock_parts/subspace/treatment, +/obj/item/stock_parts/subspace/transmitter, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/crystal, +/obj/item/stock_parts/subspace/ansible, +/obj/item/stock_parts/subspace/analyzer, +/obj/item/stock_parts/subspace/amplifier, +/obj/structure/closet/crate/centcom, +/obj/item/storage/box/lights/bulbs, +/obj/effect/spawner/random/exotic/technology, +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) +"jy" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"jz" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"kZ" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"lu" = ( +/obj/machinery/porta_turret/syndicate/energy, +/turf/open/floor/mineral/titanium/yellow, +/area/ruin/space/nt_commsbuoy) +"lB" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"lT" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"lY" = ( +/obj/structure/table, +/obj/structure/noticeboard/directional/north, +/obj/item/paper/fluff/ruins/nt_commsbuoy/table_of_contents, +/obj/machinery/light/small/directional/east, +/obj/item/gps/spaceruin{ + pixel_y = 4; + pixel_x = 5 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"mu" = ( +/obj/structure/fluff/fake_camera{ + dir = 9 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"nn" = ( +/obj/structure/frame/computer{ + dir = 1 + }, +/obj/item/shard, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/space/nt_commsbuoy) +"oA" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 8 + }, +/turf/template_noop, +/area/space/nearstation) +"pC" = ( +/obj/machinery/door/puzzle/keycard/nt_commsbuoy, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"pR" = ( +/turf/open/floor/mineral/titanium/white/airless, +/area/space/nearstation) +"qi" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"ri" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/obj/structure/fluff/tram_rail, +/turf/template_noop, +/area/space/nearstation) +"rl" = ( +/obj/structure/fluff{ + icon = 'icons/mob/simple/hivebot.dmi'; + icon_state = "def_radar-off"; + name = "radio dish component"; + desc = "Remarkable Nanotrasen technology. This does... something to make the radio dish work."; + pixel_y = 16 + }, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"tq" = ( +/obj/item/storage/toolbox/electrical{ + pixel_y = 9 + }, +/obj/structure/rack, +/obj/effect/spawner/random/engineering/tool_advanced, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"tx" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/space/nearstation) +"tO" = ( +/obj/structure/fluff{ + icon = 'icons/obj/machines/wallmounts.dmi'; + icon_state = "airlock_control_standby"; + name = "radio dish component"; + desc = "Remarkable Nanotrasen technology. This does... something to make the radio dish work."; + pixel_y = 32; + pixel_x = 6 + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/space/nt_commsbuoy) +"uG" = ( +/obj/structure/fluff/commsbuoy_receiver, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"uH" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/fluff/tram_rail/end{ + dir = 4 + }, +/turf/template_noop, +/area/space/nearstation) +"vr" = ( +/obj/machinery/door/airlock/external/ruin{ + name = "Comms Buoy External Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) +"wS" = ( +/obj/structure/lattice, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/fluff/tram_rail, +/turf/template_noop, +/area/space/nearstation) +"xI" = ( +/obj/structure/cable, +/obj/machinery/power/smes/full, +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) +"yk" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 4 + }, +/turf/template_noop, +/area/space/nearstation) +"zt" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/titanium{ + name = "Comms Buoy Airlock" + }, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"zA" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"zO" = ( +/obj/structure/lattice, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"Ad" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 8 + }, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"AA" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"AD" = ( +/obj/machinery/computer/terminal/nt_commsbuoy/relay{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"AE" = ( +/obj/structure/sign/warning/vacuum/external/directional/east, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"Br" = ( +/obj/structure/cable, +/turf/open/floor/mineral/titanium/yellow, +/area/ruin/space/nt_commsbuoy) +"CN" = ( +/obj/effect/mob_spawn/corpse/human/nanotrasensoldier, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"DW" = ( +/obj/structure/fluff/sat_dish{ + dir = 8; + pixel_y = -5; + pixel_x = 17 + }, +/obj/structure/fluff/sat_dish{ + pixel_y = -10; + pixel_x = -5 + }, +/turf/template_noop, +/area/space/nearstation) +"EA" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"EQ" = ( +/obj/structure/fluff/sat_dish{ + pixel_y = -18; + pixel_x = 6 + }, +/turf/template_noop, +/area/space/nearstation) +"ES" = ( +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/nt_commsbuoy) +"FC" = ( +/turf/closed/wall/mineral/iron, +/area/ruin/space/nt_commsbuoy) +"FH" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/obj/structure/rack, +/obj/item/clothing/suit/space/syndicate/orange{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/clothing/head/helmet/space/syndicate/orange{ + pixel_x = 9; + pixel_y = -5 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"FK" = ( +/obj/structure/fluff/tram_rail/end, +/turf/template_noop, +/area/space/nearstation) +"Gd" = ( +/obj/structure/fluff/commsbuoy_processor, +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/space/nt_commsbuoy) +"Gq" = ( +/obj/structure/sign/warning/radiation/directional/south, +/turf/open/floor/mineral/titanium/yellow, +/area/ruin/space/nt_commsbuoy) +"Gw" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/mapping_helpers/apc/cell_5k, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"HC" = ( +/obj/structure/fluff/commsbuoy_broadcaster, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"II" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) +"Jp" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/advanced, +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) +"Jv" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/fluff/tram_rail, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"Kr" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) +"Lc" = ( +/turf/open/floor/mineral/titanium/blue, +/area/ruin/space/nt_commsbuoy) +"LI" = ( +/obj/machinery/telecomms/relay/preset/telecomms, +/obj/structure/fluff/fake_camera{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/space/nt_commsbuoy) +"Mc" = ( +/obj/effect/decal/cleanable/greenglow/radioactive, +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) +"Mp" = ( +/obj/structure/fluff/fake_camera{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"Qb" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/titanium{ + name = "Comms Buoy Airlock" + }, +/turf/open/floor/mineral/titanium/yellow, +/area/ruin/space/nt_commsbuoy) +"Qd" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 6 + }, +/obj/item/paper/fluff/ruins/nt_commsbuoy/torn_page, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"Re" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"RY" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"TS" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/fluff/tram_rail/end, +/turf/template_noop, +/area/space/nearstation) +"UR" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/fluff/tram_rail/end{ + dir = 8 + }, +/turf/template_noop, +/area/space/nearstation) +"Vg" = ( +/obj/structure/fluff/tram_rail, +/turf/template_noop, +/area/space/nearstation) +"VI" = ( +/obj/structure/fluff/fake_camera{ + dir = 8 + }, +/turf/template_noop, +/area/template_noop) +"Ws" = ( +/obj/structure/marker_beacon/cerulean, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"WI" = ( +/obj/structure/fluff{ + name = "comms buoy blackbox recorder"; + desc = "A recording device that logs recent events and communications in the event of a catastrophic failiure or accident. This one is haphazardly adjusted to print the readout onto the accompanying console."; + icon = 'icons/obj/machines/telecomms.dmi'; + icon_state = "blackbox" + }, +/turf/open/floor/mineral/titanium/blue, +/area/ruin/space/nt_commsbuoy) +"Xi" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) +"Yp" = ( +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"Yr" = ( +/turf/closed/wall/mineral/titanium, +/area/ruin/space/nt_commsbuoy) +"YN" = ( +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) +"YY" = ( +/turf/open/floor/plating, +/area/ruin/space/nt_commsbuoy) + +(1,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +"} +(2,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +uG +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +"} +(3,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +hn +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +"} +(4,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +Yr +fJ +hn +fJ +Yr +fJ +fJ +fJ +fJ +fJ +fJ +"} +(5,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +Yr +Yr +pR +Yr +Yr +fJ +fJ +fJ +fJ +fJ +fJ +"} +(6,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +Yr +bj +Yr +fJ +fJ +fJ +fJ +fJ +fJ +fJ +"} +(7,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +FC +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +"} +(8,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +Yr +bj +bj +bj +Yr +fJ +fJ +fJ +fJ +fJ +fJ +"} +(9,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +bj +fx +Mp +hk +bj +fJ +fJ +fJ +fJ +fJ +fJ +"} +(10,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +bj +dX +et +AD +bj +fJ +fJ +fJ +fJ +fJ +fJ +"} +(11,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +Yr +bj +bj +aJ +bj +bj +fJ +fJ +fJ +fJ +fJ +fJ +"} +(12,1,1) = {" +fJ +yk +fJ +fJ +fJ +fJ +bj +tq +gw +et +EA +bj +Yr +fJ +fJ +fJ +fJ +fJ +"} +(13,1,1) = {" +fJ +UR +fJ +fJ +fJ +DW +bj +it +et +et +bj +bj +bj +Yr +fJ +fJ +fJ +fJ +"} +(14,1,1) = {" +fJ +aL +fJ +yk +EQ +Yr +bj +WI +et +Gq +bj +YY +iv +bj +fJ +fJ +yk +fJ +"} +(15,1,1) = {" +fJ +wS +hn +zO +hn +bj +bj +ew +et +Br +Qb +Xi +xI +bj +fJ +fJ +lT +fJ +"} +(16,1,1) = {" +fJ +ri +yk +UR +fJ +eX +bj +LI +et +Br +bj +Mc +YN +bj +fJ +oA +lT +fJ +"} +(17,1,1) = {" +fJ +FK +zO +wS +fJ +hn +bj +Gd +io +Gw +bj +Kr +Jp +bj +fJ +Vg +Ad +fJ +"} +(18,1,1) = {" +fJ +fJ +lT +hb +fJ +fJ +Yr +bj +bj +pC +bj +bj +bj +Yr +fJ +Vg +Jv +fJ +"} +(19,1,1) = {" +fJ +fJ +Re +fJ +fJ +fJ +fJ +bj +et +et +et +EA +bj +fJ +fJ +Vg +aL +fJ +"} +(20,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +bj +jz +ES +ES +jy +bj +fJ +fJ +uH +TS +fJ +"} +(21,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +bj +mu +ES +ES +et +bj +fJ +fJ +qi +lT +fJ +"} +(22,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +Yr +bj +et +ES +ES +et +bj +Yr +fJ +qi +UR +fJ +"} +(23,1,1) = {" +fJ +fJ +Yr +Yr +fJ +fJ +bj +lu +et +ES +ES +et +lu +bj +fJ +HC +aL +fJ +"} +(24,1,1) = {" +fJ +fJ +fJ +Yr +Yr +fJ +bj +tO +et +ES +ES +et +Lc +bj +eX +tx +zA +fJ +"} +(25,1,1) = {" +fJ +rl +hn +pR +bj +FC +bj +in +et +ES +ES +et +nn +bj +Ws +tx +RY +fJ +"} +(26,1,1) = {" +fJ +fJ +fJ +Yr +Yr +fJ +bj +dX +CN +ES +dO +Yp +bj +bj +fJ +tx +zA +fJ +"} +(27,1,1) = {" +fJ +fJ +Yr +Yr +fJ +fJ +bj +lY +kZ +AE +lB +et +bj +fJ +fJ +qi +aL +fJ +"} +(28,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +Yr +bj +bj +bj +zt +bj +Yr +fJ +fJ +AA +TS +fJ +"} +(29,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +bj +FH +CN +Qd +bj +fJ +fJ +fJ +Vg +Re +fJ +"} +(30,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +bj +II +YY +hH +bj +fJ +fJ +fJ +FK +fJ +fJ +"} +(31,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +Yr +bj +vr +bj +Yr +fJ +fJ +fJ +fJ +fJ +fJ +"} +(32,1,1) = {" +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +VI +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +fJ +"} diff --git a/_maps/RandomRuins/SpaceRuins/commsbuoy_pirate.dmm b/_maps/RandomRuins/SpaceRuins/commsbuoy_pirate.dmm new file mode 100644 index 0000000000000..18f2117135c4d --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/commsbuoy_pirate.dmm @@ -0,0 +1,299 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"c" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 4 + }, +/turf/template_noop, +/area/space/nearstation) +"d" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/fluff/tram_rail, +/turf/template_noop, +/area/space/nearstation) +"f" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"g" = ( +/turf/closed/wall/mineral/plastitanium, +/area/ruin/space/unpowered) +"h" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 8 + }, +/turf/template_noop, +/area/space/nearstation) +"i" = ( +/obj/structure/lattice, +/obj/structure/sign/poster/contraband/self_ai_liberation/directional/north, +/turf/template_noop, +/area/space/nearstation) +"j" = ( +/obj/structure/sign/poster/contraband/syndicate_recruitment/directional/west, +/obj/structure/fluff/commsbuoy_broadcaster, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"m" = ( +/obj/structure/billboard/nanotrasen/defaced, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"o" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 8 + }, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"r" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"s" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/turf/template_noop, +/area/space/nearstation) +"u" = ( +/obj/structure/lattice/catwalk, +/obj/structure/sign/poster/contraband/free_key/directional/south, +/turf/template_noop, +/area/space/nearstation) +"v" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"w" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/obj/structure/fluff/tram_rail/end{ + dir = 8 + }, +/turf/template_noop, +/area/space/nearstation) +"x" = ( +/obj/structure/fluff/tram_rail/end, +/turf/template_noop, +/area/space/nearstation) +"B" = ( +/obj/structure/fluff/commsbuoy_processor, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"C" = ( +/obj/structure/fluff/sat_dish{ + pixel_y = -15; + pixel_x = -11 + }, +/obj/structure/fluff/sat_dish{ + pixel_y = -9; + pixel_x = 12 + }, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"D" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/obj/structure/fluff/tram_rail, +/turf/template_noop, +/area/space/nearstation) +"E" = ( +/turf/open/floor/iron/solarpanel/airless, +/area/space/nearstation) +"F" = ( +/obj/structure/lattice, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"G" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"J" = ( +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"K" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/space/unpowered) +"O" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/space/nearstation) +"P" = ( +/obj/structure/fluff/commsbuoy_receiver, +/turf/open/floor/plating/reinforced/airless, +/area/space/nearstation) +"Q" = ( +/obj/structure/fluff/tram_rail, +/turf/template_noop, +/area/space/nearstation) +"S" = ( +/obj/structure/fluff/sat_dish{ + pixel_y = 11; + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) +"T" = ( +/obj/structure/fluff/sat_dish{ + pixel_x = 17; + dir = 8; + pixel_y = -8 + }, +/turf/template_noop, +/area/space/nearstation) +"W" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"X" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/obj/structure/fluff/tram_rail/anchor, +/turf/template_noop, +/area/space/nearstation) +"Y" = ( +/obj/structure/fluff/tram_rail/anchor, +/turf/template_noop, +/area/space/nearstation) +"Z" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/turf/template_noop, +/area/space/nearstation) + +(1,1,1) = {" +a +c +a +a +a +c +a +a +"} +(2,1,1) = {" +a +F +C +K +S +o +a +a +"} +(3,1,1) = {" +h +f +T +K +i +P +E +a +"} +(4,1,1) = {" +Y +w +g +K +s +O +E +E +"} +(5,1,1) = {" +x +d +K +K +g +G +W +E +"} +(6,1,1) = {" +h +B +u +K +K +m +E +E +"} +(7,1,1) = {" +Y +r +v +K +K +v +W +E +"} +(8,1,1) = {" +Q +D +a +K +g +J +E +E +"} +(9,1,1) = {" +Q +x +a +j +c +E +E +a +"} +(10,1,1) = {" +x +a +a +X +Z +a +a +a +"} +(11,1,1) = {" +a +a +a +x +f +a +a +a +"} +(12,1,1) = {" +a +a +a +a +G +a +a +a +"} diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 096cf003ac4eb..ded3dcd76d24e 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -26151,6 +26151,7 @@ }, /obj/structure/closet/secure_closet/captains, /obj/machinery/firealarm/directional/north, +/obj/item/storage/lockbox/medal, /turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "jpe" = ( @@ -38292,7 +38293,7 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/apc/cell_5k, -/turf/open/floor/circuit/green, +/turf/open/floor/circuit/green/telecomms/mainframe, /area/station/ai_monitored/turret_protected/ai) "nAa" = ( /obj/machinery/door/firedoor/border_only{ @@ -41519,7 +41520,7 @@ name = "AI Core Shutters" }, /obj/structure/cable, -/turf/open/floor/circuit/green, +/turf/open/floor/circuit/green/telecomms/mainframe, /area/station/ai_monitored/turret_protected/ai) "oOb" = ( /obj/effect/turf_decal/tile/neutral{ diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 4f1cf4b746ac6..a6dccb5e2268e 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -58,6 +58,7 @@ #define MEDAL_SISYPHUS "Sisyphus" #define MEDAL_ARCHMAGE "Archmage" #define MEDAL_CIGARETTES "Cigarettes" +#define MEDAL_SHARKDRAGON "Sharkdragon" #define MEDAL_THEORETICAL_LIMITS "All Within Theoretical Limits" //Skill medal hub IDs diff --git a/code/__DEFINES/alerts.dm b/code/__DEFINES/alerts.dm index e6f4feb259a59..17db402c6c04d 100644 --- a/code/__DEFINES/alerts.dm +++ b/code/__DEFINES/alerts.dm @@ -19,7 +19,6 @@ #define ALERT_BUCKLED "buckled" #define ALERT_HANDCUFFED "handcuffed" #define ALERT_LEGCUFFED "legcuffed" -#define ALERT_WOUNDED "wound" #define ALERT_IRRADIATED "irradiated" #define ALERT_EMBEDDED_OBJECT "embeddedobject" #define ALERT_SHOES_KNOT "shoealert" diff --git a/code/__DEFINES/configuration.dm b/code/__DEFINES/configuration.dm index 477bed243c1a2..39db31f794685 100644 --- a/code/__DEFINES/configuration.dm +++ b/code/__DEFINES/configuration.dm @@ -28,3 +28,9 @@ #define RESPAWN_FLAG_FREE 1 /// Can respawn, but not as the same character #define RESPAWN_FLAG_NEW_CHARACTER 2 + +// Human authority defines +#define HUMAN_AUTHORITY_DISABLED "DISABLED" +#define HUMAN_AUTHORITY_HUMAN_WHITELIST "HUMAN_WHITELIST" +#define HUMAN_AUTHORITY_NON_HUMAN_WHITELIST "NON_HUMAN_WHITELIST" +#define HUMAN_AUTHORITY_ENFORCED "ENFORCED" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm index b95ffba607fd3..80c6f89a10884 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -42,8 +42,8 @@ /// Called from update_health_hud, whenever a bodypart is being updated on the health doll #define COMSIG_BODYPART_UPDATING_HEALTH_HUD "bodypart_updating_health_hud" - /// Return to override that bodypart's health hud with your own icon - #define COMPONENT_OVERRIDE_BODYPART_HEALTH_HUD (1<<0) + /// Return to override that bodypart's health hud with whatever is returned by the list + #define OVERRIDE_BODYPART_HEALTH_HUD (1<<0) /// Called from /obj/item/bodypart/check_for_injuries (mob/living/carbon/examiner, list/check_list) #define COMSIG_BODYPART_CHECKED_FOR_INJURY "bodypart_injury_checked" diff --git a/code/__DEFINES/gravity.dm b/code/__DEFINES/gravity.dm index f61734cd55fc9..da81c0465cabc 100644 --- a/code/__DEFINES/gravity.dm +++ b/code/__DEFINES/gravity.dm @@ -12,6 +12,34 @@ /// Singularity is stage 6 (11x11) #define STAGE_SIX 11 //From supermatter shard +// Minimum energy needed to reach a stage +/// Singularity stage 1 energy requirement +#define STAGE_ONE_ENERGY_REQUIREMENT 1 +/// Singularity stage 2 energy requirement +#define STAGE_TWO_ENERGY_REQUIREMENT 200 +/// Singularity stage 3 energy requirement +#define STAGE_THREE_ENERGY_REQUIREMENT 500 +/// Singularity stage 4 energy requirement +#define STAGE_FOUR_ENERGY_REQUIREMENT 1000 +/// Singularity stage 5 energy requirement +#define STAGE_FIVE_ENERGY_REQUIREMENT 2000 +/// Singularity stage 6 energy requirement (also needs to consume a SM shard) +#define STAGE_SIX_ENERGY_REQUIREMENT 3000 + +// These values get the median number between two stages to prevent expansion/shrinkage immediately +/// Singularity stage 1 +#define STAGE_ONE_ENERGY ((STAGE_TWO_ENERGY_REQUIREMENT - STAGE_ONE_ENERGY_REQUIREMENT) * 0.5) + STAGE_ONE_ENERGY_REQUIREMENT +/// Singularity stage 2 +#define STAGE_TWO_ENERGY ((STAGE_THREE_ENERGY_REQUIREMENT - STAGE_TWO_ENERGY_REQUIREMENT) * 0.5) + STAGE_TWO_ENERGY_REQUIREMENT +/// Singularity stage 3 +#define STAGE_THREE_ENERGY ((STAGE_FOUR_ENERGY_REQUIREMENT - STAGE_THREE_ENERGY_REQUIREMENT) * 0.5) + STAGE_THREE_ENERGY_REQUIREMENT +/// Singularity stage 4 +#define STAGE_FOUR_ENERGY ((STAGE_FIVE_ENERGY_REQUIREMENT - STAGE_FOUR_ENERGY_REQUIREMENT) * 0.5) + STAGE_FOUR_ENERGY_REQUIREMENT +/// Singularity stage 5 +#define STAGE_FIVE_ENERGY ((STAGE_SIX_ENERGY_REQUIREMENT - STAGE_FIVE_ENERGY_REQUIREMENT) * 0.5) + STAGE_FIVE_ENERGY_REQUIREMENT +/// Singularity stage 6 (hardcoded at 4000 since there is no stage 7) +#define STAGE_SIX_ENERGY 4000 + /** * The point where gravity is negative enough to pull you upwards. * That means walking checks for a ceiling instead of a floor, and you can fall "upwards" diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 953e7648009b8..b0b8993a22357 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -12,6 +12,11 @@ /// Used when the `get_job_unavailable_error_message` proc can't make sense of a given code. #define GENERIC_JOB_UNAVAILABLE_ERROR "Error: Unknown job availability." +// Human authority settings +// If you want to add another setting, make sure to also add it to the if chain in /datum/job_config_type/human_authority/validate_value() +#define JOB_AUTHORITY_HUMANS_ONLY "HUMANS_ONLY" +#define JOB_AUTHORITY_NON_HUMANS_ALLOWED "NON_HUMANS_ALLOWED" + #define DEFAULT_RELIGION "Christianity" #define DEFAULT_DEITY "Space Jesus" #define DEFAULT_BIBLE "Default Bible Name" @@ -25,6 +30,7 @@ #define JOB_CONFIG_REQUIRED_CHARACTER_AGE "Required Character Age" #define JOB_CONFIG_SPAWN_POSITIONS "Spawn Positions" #define JOB_CONFIG_TOTAL_POSITIONS "Total Positions" +#define JOB_CONFIG_HUMAN_AUTHORITY "Human Authority Whitelist Setting" /** * ======================= diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index f27e5473778d6..0fbdc0d44b2b6 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -187,3 +187,5 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_CAT_MEOW "cat_meow" #define SFX_CAT_PURR "cat_purr" #define SFX_LIQUID_POUR "liquid_pour" +#define SFX_SNORE_FEMALE "snore_female" +#define SFX_SNORE_MALE "snore_male" diff --git a/code/__DEFINES/supermatter.dm b/code/__DEFINES/supermatter.dm index 5dee00db3103a..61be539749e1c 100644 --- a/code/__DEFINES/supermatter.dm +++ b/code/__DEFINES/supermatter.dm @@ -69,6 +69,15 @@ #define SLIGHTLY_CHARGED_ZAP_ICON_STATE "sm_arc_supercharged" #define OVER_9000_ZAP_ICON_STATE "sm_arc_dbz_referance" //Witty I know +// Zap energy accumulation keys. +/// Normal zap energy accumulation key from normal operations. +#define ZAP_ENERGY_ACCUMULATION_NORMAL "normal" +/// High energy zap energy accumulation key from high energy extra effects. +#define ZAP_ENERGY_ACCUMULATION_HIGH_ENERGY "high" + +/// Zap energy discharge portion per tick. +#define ZAP_ENERGY_DISCHARGE_PORTION 0.1 + #define SUPERMATTER_DEFAULT_BULLET_ENERGY 2 #define SUPERMATTER_CASCADE_PERCENT 80 diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 4fdf598f65977..06f1bd6764b2a 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -963,6 +963,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///A trait for mechs that were created through the normal construction process, and not spawned by map or other effects. #define TRAIT_MECHA_CREATED_NORMALLY "trait_mecha_created_normally" +/// Stops a movable from being removed from the mob it's in by the content_barfer component. +#define TRAIT_NOT_BARFABLE "not_barfable" + ///fish traits #define TRAIT_FISH_STASIS "fish_stasis" #define TRAIT_FISH_FLOPPING "fish_flopping" diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 131e530ce82ac..e112d376adf5d 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -69,6 +69,7 @@ GLOBAL_LIST_INIT(phobia_mobs, list( )), "carps" = typecacheof(list( /mob/living/basic/carp, + /mob/living/basic/space_dragon, )), "conspiracies" = typecacheof(list( /mob/living/basic/drone, @@ -247,6 +248,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/clothing/mask/gas/carp, /obj/item/cigarette/carp, /obj/item/clothing/under/suit/carpskin, + /obj/item/fish/baby_carp, /obj/item/food/cubancarp, /obj/item/food/fishmeat/carp, /obj/item/grenade/clusterbuster/spawner_spesscarp, diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index dad143c4279db..29e3ea84f1465 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -57,11 +57,13 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MOVE_PHASING" = TRAIT_MOVE_PHASING, "TRAIT_MOVE_UPSIDE_DOWN" = TRAIT_MOVE_UPSIDE_DOWN, "TRAIT_MOVE_VENTCRAWLING" = TRAIT_MOVE_VENTCRAWLING, - "TRAIT_NOT_ENGRAVABLE" = TRAIT_NOT_ENGRAVABLE, + "TRAIT_MOVE_UPSIDE_DOWN" = TRAIT_MOVE_UPSIDE_DOWN, "TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM, "TRAIT_NO_MANIFEST_CONTENTS_ERROR" = TRAIT_NO_MANIFEST_CONTENTS_ERROR, "TRAIT_NO_MISSING_ITEM_ERROR" = TRAIT_NO_MISSING_ITEM_ERROR, "TRAIT_NO_THROW_HITPUSH" = TRAIT_NO_THROW_HITPUSH, + "TRAIT_NOT_BARFABLE" = TRAIT_NOT_BARFABLE, + "TRAIT_NOT_ENGRAVABLE" = TRAIT_NOT_ENGRAVABLE, "TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT" = TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT, "TRAIT_ON_HIT_EFFECT" = TRAIT_ON_HIT_EFFECT, "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 2f15e52ff31f6..a25b85637b140 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -94,7 +94,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/healths var/atom/movable/screen/stamina - var/atom/movable/screen/healthdoll + var/atom/movable/screen/healthdoll/healthdoll var/atom/movable/screen/spacesuit var/atom/movable/screen/hunger // subtypes can override this to force a specific UI style diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 0ab0f022ca22e..3372fcc9be155 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -276,7 +276,7 @@ hunger = new /atom/movable/screen/hunger(null, src) infodisplay += hunger - healthdoll = new /atom/movable/screen/healthdoll(null, src) + healthdoll = new /atom/movable/screen/healthdoll/human(null, src) infodisplay += healthdoll stamina = new /atom/movable/screen/stamina(null, src) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 31390c62cbb91..efc7f1c3cfedf 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -724,6 +724,88 @@ screen_loc = ui_living_healthdoll var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update +/atom/movable/screen/healthdoll/human + /// Tracks components of our doll, each limb is a separate atom in our vis_contents + VAR_PRIVATE/list/atom/movable/screen/limbs + /// Lazylist, tracks all body zones that are wounded currently + /// Used so we can sync animations should the list be updated + VAR_PRIVATE/list/animated_zones + +/atom/movable/screen/healthdoll/human/Initialize(mapload, datum/hud/hud_owner) + . = ..() + limbs = list() + for(var/i in GLOB.all_body_zones) + var/atom/movable/screen/healthdoll_limb/limb = new(src, null) + // layer chest above other limbs, it's the center after all + limb.layer = i == BODY_ZONE_CHEST ? layer + 0.05 : layer + limbs[i] = limb + // why viscontents? why not overlays? - because i want to animate filters + vis_contents += limb + update_appearance() + +/atom/movable/screen/healthdoll/human/Destroy() + QDEL_LIST_ASSOC_VAL(limbs) + vis_contents.Cut() + return ..() + +/atom/movable/screen/healthdoll/human/update_icon_state() + . = ..() + var/mob/living/carbon/human/owner = hud?.mymob + if(isnull(owner)) + return + if(owner.stat == DEAD) + for(var/limb in limbs) + limbs[limb].icon_state = "[limb]DEAD" + return + + var/list/current_animated = LAZYLISTDUPLICATE(animated_zones) + + for(var/obj/item/bodypart/body_part as anything in owner.bodyparts) + var/icon_key = 0 + var/part_zone = body_part.body_zone + + var/list/overridable_key = list(icon_key) + if(body_part.bodypart_disabled) + icon_key = 7 + else if(owner.stat == DEAD) + icon_key = "DEAD" + else if(SEND_SIGNAL(body_part, COMSIG_BODYPART_UPDATING_HEALTH_HUD, owner, overridable_key) & OVERRIDE_BODYPART_HEALTH_HUD) + icon_key = overridable_key[1] // thanks i hate it + else if(!owner.has_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy)) + var/damage = body_part.get_damage() / body_part.max_damage + // calculate what icon state (1-5, or 0 if undamaged) to use based on damage + icon_key = clamp(ceil(damage * 5), 0, 5) + + if(length(body_part.wounds)) + LAZYSET(animated_zones, part_zone, TRUE) + else + LAZYREMOVE(animated_zones, part_zone) + limbs[part_zone].icon_state = "[part_zone][icon_key]" + // handle leftovers + for(var/missing_zone in owner.get_missing_limbs()) + limbs[missing_zone].icon_state = "[missing_zone]6" + LAZYREMOVE(animated_zones, missing_zone) + // time to re-sync animations, something changed + if(animated_zones ~! current_animated) + for(var/animated_zone in animated_zones) + var/atom/wounded_zone = limbs[animated_zone] + var/existing_filter = wounded_zone.get_filter("wound_outline") + if(existing_filter) + animate(existing_filter) // stop animation so we can resync + else + wounded_zone.add_filter("wound_outline", 1, list("type" = "outline", "color" = "#FF0033", "alpha" = 0, "size" = 1.2)) + existing_filter = wounded_zone.get_filter("wound_outline") + animate(existing_filter, alpha = 200, time = 1.5 SECONDS, loop = -1) + animate(alpha = 0, time = 1.5 SECONDS) + if(LAZYLEN(current_animated)) // avoid null - list() runtimes please + for(var/lost_zone in current_animated - animated_zones) + limbs[lost_zone].remove_filter("wound_outline") + +// Basically just holds an icon we can put a filter on +/atom/movable/screen/healthdoll_limb + screen_loc = ui_living_healthdoll + vis_flags = VIS_INHERIT_ID | VIS_INHERIT_PLANE + /atom/movable/screen/mood name = "mood" icon_state = "mood5" @@ -904,7 +986,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) animate(get_filter("hunger_outline"), alpha = 200, time = 1.5 SECONDS, loop = -1) animate(alpha = 0, time = 1.5 SECONDS) - else if(get_filter("hunger_outline")) + else remove_filter("hunger_outline") // Update color of the food diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 72df7ceeb9777..08c6ae681655a 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -107,9 +107,22 @@ /datum/config_entry/flag/protect_assistant_from_antagonist //If assistants can be traitor/cult/other -/datum/config_entry/flag/enforce_human_authority //If non-human species are barred from joining as a head of staff +/datum/config_entry/string/human_authority //Controls how to enforce human authority + default = "HUMAN_WHITELIST" -/datum/config_entry/flag/enforce_human_authority_on_everyone //If non-human species are barred from joining as a head of staff, including jobs flagged as allowed for non-humans, ie. Quartermaster. +/////////////////////////////////////////////////Outdated human authority settings +/datum/config_entry/flag/enforce_human_authority + deprecated_by = /datum/config_entry/string/human_authority + +/datum/config_entry/flag/enforce_human_authority/DeprecationUpdate(value) + return value ? HUMAN_AUTHORITY_NON_HUMAN_WHITELIST : HUMAN_AUTHORITY_DISABLED + +/datum/config_entry/flag/enforce_human_authority_on_everyone + deprecated_by = /datum/config_entry/string/human_authority + +/datum/config_entry/flag/enforce_human_authority_on_everyone/DeprecationUpdate(value) + return value ? HUMAN_AUTHORITY_ENFORCED : HUMAN_AUTHORITY_DISABLED +///////////////////////////////////////////////// /datum/config_entry/flag/allow_latejoin_antagonists // If late-joining players can be traitor/changeling diff --git a/code/controllers/configuration/entries/jobs.dm b/code/controllers/configuration/entries/jobs.dm index 06563e01a8e3d..d25ae3964eb1f 100644 --- a/code/controllers/configuration/entries/jobs.dm +++ b/code/controllers/configuration/entries/jobs.dm @@ -133,6 +133,11 @@ var/list/working_list = list() for(var/config_datum_key in job_config_datum_singletons) var/datum/job_config_type/config_datum = job_config_datum_singletons[config_datum_key] + + // Dont make the entry if it doesn't apply to this job + if(!config_datum.validate_entry(occupation)) + continue + var/config_read_value = job_config[job_key][config_datum_key] if(!config_datum.validate_value(config_read_value)) working_list += list( @@ -155,6 +160,11 @@ var/returnable_list = list() for(var/config_datum_key in job_config_datum_singletons) var/datum/job_config_type/config_datum = job_config_datum_singletons[config_datum_key] + + // Dont make the entry if it doesn't apply to this job + if(!config_datum.validate_entry(new_occupation)) + continue + // Remember, every time we write the TOML from scratch, we want to have it commented out by default. // This is to ensure that the server operator knows that they are overriding codebase defaults when they remove the comment. // Having comments mean that we allow server operators to defer to codebase standards when they deem acceptable. They must uncomment to override the codebase default. @@ -171,6 +181,11 @@ var/list/datums_to_read = job_config_datum_singletons - list(JOB_CONFIG_TOTAL_POSITIONS, JOB_CONFIG_SPAWN_POSITIONS) for(var/config_datum_key in datums_to_read) var/datum/job_config_type/config_datum = job_config_datum_singletons[config_datum_key] + + // Dont make the entry if it doesn't apply to this job + if(!config_datum.validate_entry(new_occupation)) + continue + returnable_list += list( "# [config_datum_key]" = config_datum.get_current_value(new_occupation), ) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 08c1df969003f..9af14f226ace5 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -73,10 +73,11 @@ SUBSYSTEM_DEF(job) /// This is just the message we prepen and put into all of the config files to ensure documentation. We use this in more than one place, so let's put it in the SS to make life a bit easier. var/config_documentation = "## This is the configuration file for the job system.\n## This will only be enabled when the config flag LOAD_JOBS_FROM_TXT is enabled.\n\ - ## We use a system of keys here that directly correlate to the job, just to ensure they don't desync if we choose to change the name of a job.\n## You are able to change (as of now) five different variables in this file.\n\ + ## We use a system of keys here that directly correlate to the job, just to ensure they don't desync if we choose to change the name of a job.\n## You are able to change (as of now) five (six if the job is a command head) different variables in this file.\n\ ## Total Positions are how many job slots you get in a shift, Spawn Positions are how many you get that load in at spawn. If you set this to -1, it is unrestricted.\n## Playtime Requirements is in minutes, and the job will unlock when a player reaches that amount of time.\n\ ## However, that can be superseded by Required Account Age, which is a time in days that you need to have had an account on the server for.\n\ - ## Also there is a required character age in years. It prevents player from joining as this job, if their character's age as is lower than required. Setting it to 0 means it is turned off for this job.\n\n\ + ## Also there is a required character age in years. It prevents player from joining as this job, if their character's age as is lower than required. Setting it to 0 means it is turned off for this job.\n\ + ## Lastly there's Human Authority Whitelist Setting. You can set it to either \"HUMANS_ONLY\" or \"NON_HUMANS_ALLOWED\". Check the \"Human Authority\" setting on the game_options file to know which you should choose. Note that this entry only appears on jobs that are marked as heads of staff.\n\n\ ## As time goes on, more config options may be added to this file.\n\ ## You can use the admin verb 'Generate Job Configuration' in-game to auto-regenerate this config as a downloadable file without having to manually edit this file if we add more jobs or more things you can edit here.\n\ ## It will always respect prior-existing values in the config, but will appropriately add more fields when they generate.\n## It's strongly advised you create your own version of this file rather than use the one provisioned on the codebase.\n\n\ diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm index b237edd3870b6..409f59bbff247 100644 --- a/code/controllers/subsystem/polling.dm +++ b/code/controllers/subsystem/polling.dm @@ -280,7 +280,7 @@ SUBSYSTEM_DEF(polling) return FALSE if(check_jobban) - if(is_banned_from(potential_candidate.ckey, list(check_jobban, ROLE_SYNDICATE))) + if(is_banned_from(potential_candidate.ckey, list(ROLE_SYNDICATE) + check_jobban)) return FALSE return TRUE diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index bd1719783e12a..4e37400d51d69 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -234,7 +234,13 @@ icon_state = "sisyphus" /datum/award/achievement/misc/cigarettes - name = "Unhealthy snacks" + name = "Unhealthy Snacks" desc = "You were curious to taste it. And then another. You must have more!" database_id = MEDAL_CIGARETTES icon_state = "cigarettes" + +/datum/award/achievement/misc/sharkdragon + name = "You're What You Eat" + desc = "Nutritionists often recommend a balanced and varied diet. However that clearly isn't the case for some creatures." + database_id = MEDAL_SHARKDRAGON + icon_state = "dragon_plus_fish" diff --git a/code/datums/components/food_storage.dm b/code/datums/components/food_storage.dm index 873c1646adbe1..843f611e5ff3e 100644 --- a/code/datums/components/food_storage.dm +++ b/code/datums/components/food_storage.dm @@ -18,7 +18,7 @@ /datum/component/food_storage/Initialize(_minimum_weight_class = WEIGHT_CLASS_SMALL, _bad_chance = 0, _good_chance = 100) - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY_SECONDARY, PROC_REF(try_inserting_item)) + RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION_SECONDARY, PROC_REF(try_inserting_item)) RegisterSignal(parent, COMSIG_CLICK_CTRL, PROC_REF(try_removing_item)) RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(consume_food_storage)) RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) @@ -48,34 +48,34 @@ * inserted_item - the item being placed into the food * user - the person inserting the item */ -/datum/component/food_storage/proc/try_inserting_item(datum/source, obj/item/inserted_item, mob/living/user, params) +/datum/component/food_storage/proc/try_inserting_item(datum/source, mob/living/user, obj/item/inserted_item, list/modifiers) SIGNAL_HANDLER // No matryoshka-ing food storage if(istype(inserted_item, /obj/item/storage) || IS_EDIBLE(inserted_item)) - return + return NONE //Harm intent will bypass inserting for injecting food with syringes and such if(user.combat_mode) - return + return NONE if(inserted_item.w_class > minimum_weight_class) to_chat(user, span_warning("\The [inserted_item.name] won't fit in \the [parent].")) - return + return ITEM_INTERACT_BLOCKING if(!QDELETED(stored_item)) to_chat(user, span_warning("There's something in \the [parent].")) - return + return ITEM_INTERACT_BLOCKING if(HAS_TRAIT(inserted_item, TRAIT_NODROP)) to_chat(user, span_warning("\the [inserted_item] is stuck to your hand, you can't put into \the [parent]!")) - return + return ITEM_INTERACT_BLOCKING user.visible_message(span_notice("[user.name] begins inserting [inserted_item.name] into \the [parent]."), \ span_notice("You start to insert the [inserted_item.name] into \the [parent].")) INVOKE_ASYNC(src, PROC_REF(insert_item), inserted_item, user) - return COMPONENT_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS /** Begins the process of attempting to remove the stored item. * @@ -108,15 +108,17 @@ * user - the person inserting the item. */ /datum/component/food_storage/proc/insert_item(obj/item/inserted_item, mob/user) - if(do_after(user, 1.5 SECONDS, target = parent)) - var/atom/food = parent - to_chat(user, span_notice("You slip [inserted_item.name] inside \the [parent].")) - inserted_item.forceMove(food) - user.log_message("inserted [inserted_item] into [parent].", LOG_ATTACK) - food.add_fingerprint(user) - inserted_item.add_fingerprint(user) - - stored_item = inserted_item + if(!do_after(user, 1.5 SECONDS, target = parent)) + return + + var/atom/food = parent + to_chat(user, span_notice("You slip [inserted_item.name] inside \the [parent].")) + inserted_item.forceMove(food) + user.log_message("inserted [inserted_item] into [parent].", LOG_ATTACK) + food.add_fingerprint(user) + inserted_item.add_fingerprint(user) + + stored_item = inserted_item /** Removes the item from the food, after a do_after. * diff --git a/code/datums/components/profound_fisher.dm b/code/datums/components/profound_fisher.dm index 61f6543bd12bf..9638af4a8f2c2 100644 --- a/code/datums/components/profound_fisher.dm +++ b/code/datums/components/profound_fisher.dm @@ -9,6 +9,7 @@ return COMPONENT_INCOMPATIBLE src.our_rod = our_rod || new(parent) src.our_rod.internal = TRUE + ADD_TRAIT(src.our_rod, TRAIT_NOT_BARFABLE, REF(src)) RegisterSignal(src.our_rod, COMSIG_QDELETING, PROC_REF(on_rod_qdel)) if(!isgloves) @@ -43,6 +44,7 @@ /datum/component/profound_fisher/Destroy() our_rod.internal = FALSE UnregisterSignal(our_rod, COMSIG_QDELETING) + REMOVE_TRAIT(our_rod, TRAIT_NOT_BARFABLE, REF(src)) our_rod = null return ..() diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index 2e9ee73c32a06..bb3054aea6ae6 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -173,7 +173,7 @@ if(istype(item, /obj/item/inducer)) var/obj/item/inducer/inducer = item - INVOKE_ASYNC(inducer, TYPE_PROC_REF(/obj/item, attack_atom), attached_circuit || parent, attacker, list()) + INVOKE_ASYNC(inducer, TYPE_PROC_REF(/obj/item, interact_with_atom), attached_circuit || parent, attacker, list()) return COMPONENT_NO_AFTERATTACK if(attached_circuit) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index d170aeca8522e..d4abc7c69adc3 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -408,10 +408,15 @@ var/list/names = islist(name_or_names) ? name_or_names : list(name_or_names) + . = FALSE for(var/name in names) if(filter_data[name]) filter_data -= name - update_filters() + . = TRUE + + if(.) + update_filters() + return . /datum/proc/clear_filters() ASSERT(isatom(src) || isimage(src)) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 966987828bd54..4a359ca1f2dc0 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -230,7 +230,7 @@ /datum/disease/transformation/slime name = "Advanced Mutation Transformation" - cure_text = "frost oil" + cure_text = "Frost oil" cures = list(/datum/reagent/consumable/frostoil) cure_chance = 55 agent = "Advanced Mutation Toxin" diff --git a/code/datums/dna.dm b/code/datums/dna.dm index f16cf5bc50cf0..df3fbd2654d77 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -150,9 +150,19 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) SEND_SIGNAL(holder, COMSIG_CARBON_GAIN_MUTATION, mutation_type, class) return force_give(new mutation_type (class, time, copymut = mutation)) -/datum/dna/proc/remove_mutation(mutation_type) +/datum/dna/proc/remove_mutation(datum/mutation/human/mutation_type, mutadone) + + var/datum/mutation/human/actual_mutation = get_mutation(mutation_type) + + if(!actual_mutation) + return FALSE + + // Check that it exists first before trying to remove it with mutadone + if(actual_mutation.mutadone_proof && mutadone) + return FALSE + SEND_SIGNAL(holder, COMSIG_CARBON_LOSE_MUTATION, mutation_type) - return force_lose(get_mutation(mutation_type)) + return force_lose(actual_mutation) /datum/dna/proc/check_mutation(mutation_type) return get_mutation(mutation_type) @@ -479,7 +489,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) /datum/dna/stored/add_mutation(mutation_name) //no mutation changes on stored dna. return -/datum/dna/stored/remove_mutation(mutation_name) +/datum/dna/stored/remove_mutation(mutation_name, mutadone) return /datum/dna/stored/check_mutation(mutation_name) diff --git a/code/datums/elements/content_barfer.dm b/code/datums/elements/content_barfer.dm index e30294bc08a7f..533a88503e21e 100644 --- a/code/datums/elements/content_barfer.dm +++ b/code/datums/elements/content_barfer.dm @@ -20,7 +20,9 @@ /datum/element/content_barfer/proc/barf_contents(mob/living/target) SIGNAL_HANDLER - for(var/atom/movable/barfed_out in target) + for(var/atom/movable/barfed_out as anything in target) + if(HAS_TRAIT(barfed_out, TRAIT_NOT_BARFABLE)) + continue barfed_out.forceMove(target.loc) if(prob(90)) step(barfed_out, pick(GLOB.alldirs)) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 732323d28655c..c6e8236e55964 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -87,6 +87,6 @@ msg += "
Current Informational Settings:" msg += "Protect Authority Roles From Traitor: [CONFIG_GET(flag/protect_roles_from_antagonist)]" msg += "Protect Assistant Role From Traitor: [CONFIG_GET(flag/protect_assistant_from_antagonist)]" - msg += "Enforce Human Authority: [CONFIG_GET(flag/enforce_human_authority)]" + msg += "Enforce Human Authority: [CONFIG_GET(string/human_authority)]" msg += "Allow Latejoin Antagonists: [CONFIG_GET(flag/allow_latejoin_antagonists)]" to_chat(src, span_infoplain(msg.Join("
"))) diff --git a/code/datums/job_configs/_job_configs.dm b/code/datums/job_configs/_job_configs.dm index 84e2cb4ec0a41..b3a32cd8a2b83 100644 --- a/code/datums/job_configs/_job_configs.dm +++ b/code/datums/job_configs/_job_configs.dm @@ -33,6 +33,12 @@ stack_trace("Attempted to validate value for the default job config! You're doing something wrong!!") return FALSE +/// Check if the config entry should be made for a specific job +/// By default returns TRUE, meaning that by default every job will have the config entry created by the datum +/// An example of what this could be used for is: A value that only appears if the job is a head of staff +/datum/job_config_type/proc/validate_entry(datum/job/occupation) + return TRUE + /// This is the proc that we actually invoke to set the config-based values for each job. Is also intended to handle all in-depth logic checks pertient to the job datum itself. /// Return TRUE if the value was set successfully (or if expected behavior did indeed occur), FALSE if it was not. /datum/job_config_type/proc/set_current_value(datum/job/occupation, value) diff --git a/code/datums/job_configs/human_authority.dm b/code/datums/job_configs/human_authority.dm new file mode 100644 index 0000000000000..68b6c64f95cfa --- /dev/null +++ b/code/datums/job_configs/human_authority.dm @@ -0,0 +1,17 @@ +/// Whether if the job should whitelist humans, whitelist nonhumans, or neither +/datum/job_config_type/human_authority + name = JOB_CONFIG_HUMAN_AUTHORITY + datum_var_name = "human_authority" + +/datum/job_config_type/human_authority/validate_value(value) + if(value == JOB_AUTHORITY_HUMANS_ONLY) + return TRUE + + if(value == JOB_AUTHORITY_NON_HUMANS_ALLOWED) + return TRUE + + return FALSE + +/datum/job_config_type/human_authority/validate_entry(datum/job/occupation) + return occupation.job_flags & JOB_HEAD_OF_STAFF + diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index d6317b12ab15c..86e4dda381421 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -61,6 +61,12 @@ description = "Moffuchi's Family Pizzeria chain has a reputation for providing affordable artisanal meals of questionable edibility. This particular pizzeria seems to have been abandoned for some time." suffix = "icemoon_surface_pizza.dmm" +/datum/map_template/ruin/icemoon/Lodge + name = "Ice-Ruin Hunters Lodge" + id = "lodge" + description = "An old hunting hunting lodge. I wonder if anyone is still home?" + suffix = "icemoon_surface_lodge.dmm" + /datum/map_template/ruin/icemoon/frozen_phonebooth name = "Ice-Ruin Frozen Phonebooth" id = "frozen_phonebooth" diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 790ae33ade4b1..f2d76d9b86e6e 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -513,3 +513,25 @@ suffix = "hauntedtradingpost.dmm" name = "Space-Ruin Donk Co. Interstellar Trading Post 6016" description = "A small station for trading ships to dock at. It's been abandoned for some time, but its security systems have kept looters away. Rumored to be haunted." + +/datum/map_template/ruin/space/commsbuoy + id = "commsbuoy" + suffix = "commsbuoy_lowtech.dmm" + name = "Kosmokomm Communications Buoy" + description = "One of the SSC's many Comms Buoys, acting as a broadcaster, receiver and relay for interstellar communications. Due to the \ + shoddy tech available, it does not enable local communications." + +/datum/map_template/ruin/space/commsbuoy_pirate + id = "commsbuoy_pirate" + suffix = "commsbuoy_pirate.dmm" + name = "Pirated Communications Buoy" + description = "A Comms Buoy satellite that has been hijacked by local criminal elements, acting as a broadcaster, receiver and relay for \ + evil interstellar communications. Due to the shoddy tech available, it does not enable local communications." + +/datum/map_template/ruin/space/commsbuoy_nt + id = "commsbuoy_nt" + suffix = "commsbuoy_nt.dmm" + name = "Nanotrasen Model-7 Communications Buoy" + description = "One of Nanotrasen's highly advanced Communication Buoys. Besides acting as a broadcaster, receiver and relay for interstellar \ + communications, the satellite also includes a Local-Network array and two multi-function satellite dishes, providing the local sector with \ + connectivity - as long as you have your Employee ID handy. Though, this one has been reported to have some recent malfunctions." diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 865e9869ebeea..5dab783eb37a0 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -245,7 +245,7 @@ var/mob/living/carbon/carbon_owner = owner carbon_owner.handle_dreams() - if(prob(2) && owner.health > owner.crit_threshold) + if(prob(8) && owner.health > owner.crit_threshold) owner.emote("snore") /atom/movable/screen/alert/status_effect/asleep diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index fc3f3140593ea..30361dc9cf1a1 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -124,19 +124,6 @@ //////// WOUNDS ///////// ///////////////////////// -// wound alert -/atom/movable/screen/alert/status_effect/wound - name = "Wounded" - desc = "Your body has sustained serious damage, click here to inspect yourself." - -/atom/movable/screen/alert/status_effect/wound/Click() - . = ..() - if(!.) - return - - var/mob/living/carbon/carbon_owner = owner - carbon_owner.check_self_for_injuries() - // wound status effect base /datum/status_effect/wound id = "wound" diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 5e5258c86deb9..fdecc89680a54 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -203,8 +203,7 @@ if(status_effect_type) victim.apply_status_effect(status_effect_type, src) SEND_SIGNAL(victim, COMSIG_CARBON_GAIN_WOUND, src, limb) - if(!victim.alerts[ALERT_WOUNDED]) // only one alert is shared between all of the wounds - victim.throw_alert(ALERT_WOUNDED, /atom/movable/screen/alert/status_effect/wound) + victim.update_health_hud() var/demoted if(old_wound) @@ -348,13 +347,13 @@ if (ismob(old_victim)) var/mob/mob_victim = old_victim SEND_SIGNAL(mob_victim, COMSIG_CARBON_POST_LOSE_WOUND, src, old_limb, ignore_limb, replaced) + if(!replaced && !limb) + mob_victim.update_health_hud() /datum/wound/proc/remove_wound_from_victim() if(!victim) return LAZYREMOVE(victim.all_wounds, src) - if(!victim.all_wounds) - victim.clear_alert(ALERT_WOUNDED) SEND_SIGNAL(victim, COMSIG_CARBON_LOSE_WOUND, src, limb) /** diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm index 061bd8f06d209..fa87fa832a1fb 100644 --- a/code/game/area/areas/ruins/icemoon.dm +++ b/code/game/area/areas/ruins/icemoon.dm @@ -57,6 +57,11 @@ /area/ruin/planetengi name = "\improper Engineering Outpost" +/area/ruin/huntinglodge + name = "\improper Hunting Lodge" + mood_bonus = -5 + mood_message = "Something feels off..." + /area/ruin/smoking_room/house name = "\improper Tobacco House" sound_environment = SOUND_ENVIRONMENT_CITY diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 67b2346c2eeaa..45b77efdb1f4c 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1630,8 +1630,14 @@ /* End language procs */ -//Returns an atom's power cell, if it has one. Overload for individual items. -/atom/movable/proc/get_cell() +/** + * Returns an atom's power cell, if it has one. Overload for individual items. + * Args + * + * * /atom/movable/interface - the atom that is trying to interact with this cell + * * mob/user - the mob that is holding the interface + */ +/atom/movable/proc/get_cell(atom/movable/interface, mob/user) return /atom/movable/proc/can_be_pulled(user, grab_state, force) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 58de43525357c..95732d38437ef 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -440,7 +440,7 @@ // GUARD CHECK - Can we genetically modify the occupant? Includes scanner // operational guard checks. // GUARD CHECK - Is scramble DNA actually ready? - if(!can_modify_occupant() || !(scramble_ready < world.time)) + if(!can_modify_occupant() || !(scramble_ready < world.time) || HAS_TRAIT(scanner_occupant, TRAIT_NO_DNA_SCRAMBLE)) return scanner_occupant.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA)) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index c9ed74caa02a9..97ac006bcd500 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -11,10 +11,12 @@ density = TRUE layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS verb_say = "states" - var/cooldown = 0 + /// Cooldown each time singularity is pulled in our direction + COOLDOWN_DECLARE(singularity_beacon_cd) var/active = FALSE var/icontype = "beacon" + var/energy_used = 1.5 KILO JOULES /obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null) @@ -42,11 +44,9 @@ if(user) to_chat(user, span_notice("You deactivate the beacon.")) - /obj/machinery/power/singularity_beacon/attack_ai(mob/user) return - /obj/machinery/power/singularity_beacon/attack_hand(mob/user, list/modifiers) . = ..() if(.) @@ -93,10 +93,10 @@ if(!active) return - if(surplus() >= 1500) - add_load(1500) - if(cooldown <= world.time) - cooldown = world.time + 80 + if(surplus() >= energy_used) + add_load(energy_used) + if(COOLDOWN_FINISHED(src, singularity_beacon_cd)) + COOLDOWN_START(src, singularity_beacon_cd, 8 SECONDS) for(var/_singulo_component in GLOB.singularities) var/datum/component/singularity/singulo_component = _singulo_component var/atom/singulo = singulo_component.parent @@ -106,6 +106,95 @@ Deactivate() say("Insufficient charge detected - powering down") +// Used for the No Escape final objective that attracts a singularity to the escape shuttle +// needs to be charged with an inducer to work +/obj/machinery/power/singularity_beacon/syndicate/no_escape + name = "ominous beacon" + desc = "This looks very suspicious..." + processing_flags = START_PROCESSING_MANUALLY + /// The cell we spawn with + var/obj/item/stock_parts/power_store/cell/cell = /obj/item/stock_parts/power_store/cell/super/empty + /// The black hole shuttle event that is triggered + var/datum/shuttle_event/simple_spawner/black_hole/no_escape/no_escape_event + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/Initialize(mapload) + . = ..() + cell = new cell(src) + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/Destroy() + if(active) + Deactivate() + QDEL_NULL(cell) + // destroying the beacon doesn't automatically stop the event + no_escape_event = null + return ..() + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/examine(mob/user) + . = ..() + . += "\The [src] is [active ? "on" : "off"]." + if(cell) + . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%." + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/get_cell() + return cell + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/attack_hand(mob/user, list/modifiers) + return active ? Deactivate(user) : Activate(user) + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/Activate(mob/user = null) + if(!cell.charge()) + say("Insufficient charge detected") + return + + icon_state = "[icontype]1" + active = TRUE + begin_processing() + if(user) + to_chat(user, span_notice("You activate the beacon.")) + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/Deactivate(mob/user = null) + icon_state = "[icontype]0" + active = FALSE + end_processing() + if(user) + to_chat(user, span_notice("You deactivate the beacon.")) + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/wrench_act(mob/living/user, obj/item/tool) + . = TRUE + + tool.play_tool_sound(src, 50) + if(anchored) + set_anchored(FALSE) + to_chat(user, span_notice("You unbolt \the [src] from the floor.")) + return + else + set_anchored(TRUE) + to_chat(user, span_notice("You bolt \the [src] to the floor.")) + return + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/screwdriver_act(mob/living/user, obj/item/tool) + return + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/emp_act(severity) + . = ..() + if(machine_stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_CONTENTS) + return + cell?.emp_act(severity) + +/obj/machinery/power/singularity_beacon/syndicate/no_escape/process() + if(cell.charge()) + cell.use(energy_used, force = TRUE) + + if(!no_escape_event) + var/area/escape_shuttle_area = get_area(src) + // beacon must be on the traveling escape shuttle (not a pod) + if(istype(escape_shuttle_area, /area/shuttle/escape) && (SSshuttle.emergency.mode == SHUTTLE_ESCAPE) && SSshuttle.emergency.is_in_shuttle_bounds(src)) + var/obj/docking_port/mobile/port = SSshuttle.emergency + no_escape_event = port.add_shuttle_event(/datum/shuttle_event/simple_spawner/black_hole/no_escape) + no_escape_event.beacon = src + else + Deactivate() + say("Insufficient charge detected - powering down") /obj/machinery/power/singularity_beacon/syndicate icontype = "beaconsynd" @@ -131,6 +220,10 @@ qdel(src) return +/obj/item/sbeacondrop/no_escape + name = "very suspicious beacon" + droptype = /obj/machinery/power/singularity_beacon/syndicate/no_escape + /obj/item/sbeacondrop/bomb desc = "A label on it reads: Warning: Activating this device will send a high-ordinance explosive to your location." droptype = /obj/machinery/syndicatebomb diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 88a3a98a5bb26..e863f09ecde5b 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -71,3 +71,6 @@ UnregisterSignal(owner, COMSIG_QDELETING) owner = null + +/obj/item/toy/plush/carpplushie/dehy_carp/peaceful + mobtype = /mob/living/basic/carp/passive diff --git a/code/game/objects/items/devices/aicard_evil.dm b/code/game/objects/items/devices/aicard_evil.dm index 852a105de350f..bb23779fafec6 100644 --- a/code/game/objects/items/devices/aicard_evil.dm +++ b/code/game/objects/items/devices/aicard_evil.dm @@ -35,7 +35,7 @@ balloon_alert(user, "invalid access!") return var/mob/chosen_one = SSpolling.poll_ghosts_for_target( - check_jobban = ROLE_OPERATIVE, + check_jobban = list(ROLE_OPERATIVE, JOB_AI), poll_time = 20 SECONDS, checked_target = src, ignore_category = POLL_IGNORE_SYNDICATE, @@ -47,12 +47,12 @@ /// Poll has concluded with a ghost, create the AI /obj/item/aicard/syndie/loaded/proc/on_poll_concluded(mob/user, datum/antagonist/nukeop/op_datum, mob/dead/observer/ghost) - if(isnull(ghost)) + if(!ismob(ghost)) to_chat(user, span_warning("Unable to connect to S.E.L.F. dispatch. Please wait and try again later or use the intelliCard on your uplink to get your points refunded.")) return // pick ghost, create AI and transfer - var/mob/living/silicon/ai/weak_syndie/new_ai = new /mob/living/silicon/ai/weak_syndie(get_turf(src), new /datum/ai_laws/syndicate_override, ghost) + var/mob/living/silicon/ai/weak_syndie/new_ai = new /mob/living/silicon/ai/weak_syndie(null, new /datum/ai_laws/syndicate_override, ghost) // create and apply syndie datum var/datum/antagonist/nukeop/nuke_datum = new() nuke_datum.send_to_spawnpoint = FALSE diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index 9bda586b2693f..770b6f8bf3124 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -88,6 +88,13 @@ cell_line = null starting_reagent_purity = 0.3 +///carp fillet, but without the toxin. Used by baby carps (fish item), which have a trait that handles the toxin already. +/obj/item/food/fishmeat/carp/no_tox + +/obj/item/food/fishmeat/carp/no_tox/Initialize(mapload) + food_reagents -= /datum/reagent/toxin/carpotoxin + return ..() + /obj/item/food/fishmeat/moonfish name = "moonfish fillet" desc = "A fillet of moonfish." diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 2404974d69970..0f66cd4b6d108 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -7,212 +7,219 @@ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' force = 7 + /// Multiplier that determines the speed at which this inducer works at. var/power_transfer_multiplier = 1 + /// Is the battery hatch opened var/opened = FALSE - var/cell_type = /obj/item/stock_parts/power_store/battery/high - var/obj/item/stock_parts/power_store/powerdevice + /// The cell for used in recharging cycles + var/obj/item/stock_parts/power_store/powerdevice = /obj/item/stock_parts/power_store/battery/high + /// Are we in the process of recharging something var/recharging = FALSE /obj/item/inducer/Initialize(mapload) . = ..() - if(!powerdevice && cell_type) - powerdevice = new cell_type -/obj/item/inducer/proc/induce(obj/item/stock_parts/power_store/target, coefficient) - var/obj/item/stock_parts/power_store/our_cell = get_cell() - var/rating_base = target.rating_base - var/totransfer = min(our_cell.charge, (rating_base * coefficient * power_transfer_multiplier)) - var/transferred = target.give(totransfer) + if(ispath(powerdevice)) + powerdevice = new powerdevice(src) - our_cell.use(transferred) - our_cell.update_appearance() - target.update_appearance() + register_context() -/obj/item/inducer/get_cell() - return powerdevice + update_appearance(UPDATE_OVERLAYS) -/obj/item/inducer/emp_act(severity) +/obj/item/inducer/Destroy(force) + QDEL_NULL(powerdevice) . = ..() - var/obj/item/stock_parts/power_store/our_cell = get_cell() - if(!isnull(our_cell) && !(. & EMP_PROTECT_CONTENTS)) - our_cell.emp_act(severity) -/obj/item/inducer/attack_atom(obj/target, mob/living/carbon/user, params) - if(user.combat_mode) - return ..() +/obj/item/inducer/Exited(atom/movable/gone, direction) + . = ..() + if(gone == powerdevice) + powerdevice = null - if(cantbeused(user)) - return +/obj/item/inducer/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE - if(recharge(target, user)) + if(isnull(held_item)) + if(opened && !QDELETED(powerdevice)) + context[SCREENTIP_CONTEXT_LMB] = "Remove Cell" + . = CONTEXTUAL_SCREENTIP_SET return - return ..() + if(opened) + if(istype(held_item, /obj/item/stock_parts/power_store) && QDELETED(powerdevice)) + context[SCREENTIP_CONTEXT_LMB] = "Insert cell" + return CONTEXTUAL_SCREENTIP_SET -/obj/item/inducer/proc/cantbeused(mob/user) - if(!ISADVANCEDTOOLUSER(user)) - to_chat(user, span_warning("You don't have the dexterity to use [src]!")) - return TRUE + if(istype(held_item, /obj/item/stack/sheet/mineral/plasma) && !QDELETED(powerdevice)) + context[SCREENTIP_CONTEXT_LMB] = "Charge cell" + return CONTEXTUAL_SCREENTIP_SET - var/obj/item/stock_parts/power_store/our_cell = get_cell() + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[opened ? "Close" : "Open"] Panel" + return CONTEXTUAL_SCREENTIP_SET - if(isnull(our_cell)) - balloon_alert(user, "no cell installed!") - return TRUE +/obj/item/inducer/examine(mob/living/user) + . = ..() - if(!our_cell.charge) - balloon_alert(user, "no charge!") - return TRUE - return FALSE + if(!QDELETED(powerdevice)) + . += span_notice("Its display shows: [display_energy(powerdevice.charge)].") + if(opened) + . += span_notice("The cell can be removed with an empty hand.") + . += span_notice("Plasma sheets can be used to recharge the cell.") + else + . += span_warning("It's missing a power cell.") -/obj/item/inducer/screwdriver_act(mob/living/user, obj/item/tool) - . = TRUE - tool.play_tool_sound(src) + . += span_notice("Its battery compartment can be [EXAMINE_HINT("screwed")] [opened ? "shut" : "open"].") + +/obj/item/inducer/update_overlays() + . = ..() if(!opened) - to_chat(user, span_notice("You unscrew the battery compartment.")) - opened = TRUE - update_appearance() return - else - to_chat(user, span_notice("You close the battery compartment.")) - opened = FALSE - update_appearance() + . += "inducer-[!QDELETED(powerdevice) ? "bat" : "nobat"]" + +/obj/item/inducer/get_cell() + return powerdevice + +/obj/item/inducer/emp_act(severity) + . = ..() + if(!QDELETED(powerdevice) && !(. & EMP_PROTECT_CONTENTS)) + powerdevice.emp_act(severity) + +/obj/item/inducer/screwdriver_act(mob/living/user, obj/item/tool) + . = NONE + + if(!tool.use_tool(src, user, delay = 0)) return -/obj/item/inducer/attackby(obj/item/used_item, mob/user) - var/obj/item/stock_parts/power_store/our_cell = get_cell() - if(istype(used_item, /obj/item/stock_parts/power_store)) - if(opened) - if(isnull(our_cell)) - if(!user.transferItemToLoc(used_item, src)) - return - to_chat(user, span_notice("You insert [used_item] into [src].")) - powerdevice = used_item - update_appearance() - return - else - to_chat(user, span_warning("[src] already has \a [our_cell] installed!")) - return - - if (istype(used_item, /obj/item/stack/sheet/mineral/plasma) && !isnull(our_cell)) - if(our_cell.charge == our_cell.maxcharge) - balloon_alert(user, "already fully charged!") - return - used_item.use(1) - our_cell.give(1.5 * STANDARD_CELL_CHARGE) + opened = !opened + to_chat(user, span_notice("You [opened ? "open" : "close"] the battery compartment.")) + update_appearance(UPDATE_OVERLAYS) + + return ITEM_INTERACT_SUCCESS + +/obj/item/inducer/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + . = NONE + if(user.combat_mode || !istype(tool) || tool.flags_1 & HOLOGRAM_1 || tool.item_flags & ABSTRACT) + return ITEM_INTERACT_SKIP_TO_ATTACK + + if(!opened) + balloon_alert(user, "open first!") + return ITEM_INTERACT_FAILURE + + if(istype(tool, /obj/item/stock_parts/power_store)) + if(!QDELETED(powerdevice)) + balloon_alert(user, "cell already installed!") + return ITEM_INTERACT_FAILURE + + if(!user.transferItemToLoc(tool, src)) + balloon_alert(user, "stuck in hand!") + return ITEM_INTERACT_FAILURE + + powerdevice = tool + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/stack/sheet/mineral/plasma) && !QDELETED(powerdevice)) + if(!powerdevice.used_charge()) + balloon_alert(user, "fully charged!") + return ITEM_INTERACT_FAILURE + + tool.use(1) + powerdevice.give(1.5 * STANDARD_CELL_CHARGE) balloon_alert(user, "cell recharged") - return - if(cantbeused(user)) - return + return ITEM_INTERACT_SUCCESS - if(recharge(used_item, user)) - return +/obj/item/inducer/interact_with_atom(atom/movable/interacting_with, mob/living/user, list/modifiers) + . = NONE + if(user.combat_mode || !istype(interacting_with) || interacting_with.flags_1 & HOLOGRAM_1) + return ITEM_INTERACT_SKIP_TO_ATTACK + + //basic checks + if(opened) + balloon_alert(user, "close first!") + return ITEM_INTERACT_FAILURE - return ..() + if(recharging || (!isturf(interacting_with) && user.loc == interacting_with)) + return ITEM_INTERACT_FAILURE -/obj/item/inducer/proc/recharge(atom/movable/target, mob/user) - if(!isturf(target) && user.loc == target) - return FALSE - if(recharging) - return TRUE + if(!ISADVANCEDTOOLUSER(user)) + to_chat(user, span_warning("You don't have the dexterity to use [src]!")) + return ITEM_INTERACT_FAILURE + if(QDELETED(powerdevice)) + balloon_alert(user, "no cell installed!") + return ITEM_INTERACT_FAILURE + + if(!powerdevice.charge) + balloon_alert(user, "no charge!") + return ITEM_INTERACT_FAILURE + + var/obj/item/stock_parts/power_store/target_cell = interacting_with.get_cell(src, user) + + if(QDELETED(target_cell)) + return ITEM_INTERACT_FAILURE + + if(!target_cell.used_charge()) + balloon_alert(user, "fully charged!") + return ITEM_INTERACT_FAILURE + + //begin recharging recharging = TRUE - var/obj/item/stock_parts/power_store/our_cell = get_cell() - var/obj/item/stock_parts/power_store/target_cell = target.get_cell() - var/obj/target_as_object = target - var/coefficient = 1 - - if(istype(target, /obj/item/gun/energy) || istype(target, /obj/item/clothing/suit/space)) - to_chat(user, span_alert("Error: unable to interface with device.")) - return FALSE - - if(target_cell) - var/done_any = FALSE - if(target_cell.charge >= target_cell.maxcharge) - balloon_alert(user, "it's fully charged!") - recharging = FALSE - return TRUE - - user.visible_message(span_notice("[user] starts recharging [target] with [src]."), span_notice("You start recharging [target] with [src].")) - - while(target_cell.charge < target_cell.maxcharge) - if(do_after(user, 1 SECONDS, target = user) && our_cell.charge) - done_any = TRUE - induce(target_cell, coefficient) - do_sparks(1, FALSE, target) - if(istype(target_as_object)) - target_as_object.update_appearance() - else - break - if(done_any) // Only show a message if we succeeded at least once - user.visible_message(span_notice("[user] recharged [target]!"), span_notice("You recharged [target]!")) - recharging = FALSE - return TRUE - recharging = FALSE + user.visible_message(span_notice("[user] starts recharging [interacting_with] with [src]."), span_notice("You start recharging [interacting_with] with [src].")) + var/done_any = FALSE + while(target_cell.used_charge()) + if(!do_after(user, 1 SECONDS, target = user)) + break -/obj/item/inducer/attack(mob/target, mob/living/user) - if(user.combat_mode) - return ..() + //transfer of charge + var/transferred = min(powerdevice.charge, target_cell.used_charge(), (target_cell.rating_base * target_cell.rating * power_transfer_multiplier)) + if(!transferred) + break + powerdevice.use(target_cell.give(transferred)) - if(cantbeused(user)) - return + //update all appearances + powerdevice.update_appearance() + target_cell.update_appearance() + interacting_with.update_appearance() - if(recharge(target, user)) - return + //sparks & update + do_sparks(1, FALSE, interacting_with) + done_any = TRUE - return ..() + recharging = FALSE + // Only show a message if we succeeded at least once + if(done_any) + user.visible_message(span_notice("[user] recharges [interacting_with]!"), span_notice("You recharge [interacting_with]!")) + + return ITEM_INTERACT_SUCCESS /obj/item/inducer/attack_self(mob/user) - if(opened && powerdevice) + if(opened && !QDELETED(powerdevice)) user.visible_message(span_notice("[user] removes [powerdevice] from [src]!"), span_notice("You remove [powerdevice].")) powerdevice.update_appearance() user.put_in_hands(powerdevice) - powerdevice = null - update_appearance() - - -/obj/item/inducer/examine(mob/living/user) - . = ..() - var/obj/item/stock_parts/power_store/our_cell = get_cell() - if(!isnull(our_cell)) - . += span_notice("Its display shows: [display_energy(our_cell.charge)].") - else - . += span_notice("Its display is dark.") - if(opened) - . += span_notice("Its battery compartment is open.") - -/obj/item/inducer/update_overlays() - . = ..() - if(!opened) - return - . += "inducer-[!isnull(get_cell()) ? "bat" : "nobat"]" + update_appearance(UPDATE_OVERLAYS) /obj/item/inducer/empty - cell_type = null + powerdevice = null opened = TRUE /obj/item/inducer/orderable - cell_type = /obj/item/stock_parts/power_store/battery/upgraded + powerdevice = /obj/item/stock_parts/power_store/battery/upgraded opened = FALSE /obj/item/inducer/sci icon_state = "inducer-sci" inhand_icon_state = "inducer-sci" desc = "A tool for inductively charging internal power cells. This one has a science color scheme, and is less potent than its engineering counterpart." - cell_type = null + powerdevice = null opened = TRUE -/obj/item/inducer/sci/Initialize(mapload) - . = ..() - update_appearance() - /obj/item/inducer/syndicate icon_state = "inducer-syndi" inhand_icon_state = "inducer-syndi" desc = "A tool for inductively charging internal power cells. This one has a suspicious colour scheme, and seems to be rigged to transfer charge at a much faster rate." power_transfer_multiplier = 2 // 2x the base speed - cell_type = /obj/item/stock_parts/power_store/cell/super + powerdevice = /obj/item/stock_parts/power_store/battery/super diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 4b210c47e9fca..2e7682eda1fd1 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -648,7 +648,7 @@ name = "Internal inducer" icon = 'icons/obj/tools.dmi' icon_state = "inducer-engi" - cell_type = null + powerdevice = null /obj/item/inducer/cyborg/get_cell() var/obj/item/robot_model/possible_model = loc @@ -657,7 +657,7 @@ . = silicon_friend.cell /obj/item/inducer/cyborg/screwdriver_act(mob/living/user, obj/item/tool) - return FALSE + return NONE /obj/item/borg/upgrade/pinpointer name = "medical cyborg crew pinpointer" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 58e99dc8839aa..7a3fcef368ada 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -134,7 +134,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) if(isnull(card_reader_choices)) card_reader_choices = list( "Personal", - "Departmental", + "Job", "None" ) if(access_choices) @@ -800,11 +800,11 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) switch(choice) if("Personal") //only the player who swiped their id has access. id_card = WEAKREF(id) - name = "[id.registered_name] locker" - desc = "now owned by [id.registered_name]. [initial(desc)]" - if("Departmental") //anyone who has the same access permissions as this id has access - name = "[id.assignment] closet" - desc = "Its a [id.assignment] closet. [initial(desc)]" + name = "[id.registered_name]'s locker" + desc += " It has been ID locked to [id.registered_name]." + if("Job") //anyone who has the same access permissions as this id has access. Does NOT apply to the whole department. + name = "[id.assignment]'s locker" + desc += " It has been access locked to [id.assignment]s." set_access(id.GetAccess()) if("None") //free for all name = initial(name) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index a464f41827678..f5e63bcf23bba 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -452,6 +452,10 @@ desc = "A wondrous decorated Christmas tree." icon_state = "pine_c" +/obj/structure/flora/tree/pine/xmas/presentless + icon_state = "pinepresents" + desc = "A wondrous decorated Christmas tree. It has presents, though none of them seem to have your name on them." + /obj/structure/flora/tree/pine/xmas/presents icon_state = "pinepresents" desc = "A wondrous decorated Christmas tree. It has presents!" diff --git a/code/game/sound.dm b/code/game/sound.dm index ee91eebffa140..0b388d810903b 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -525,6 +525,22 @@ 'sound/effects/liquid_pour/liquid_pour2.ogg', 'sound/effects/liquid_pour/liquid_pour3.ogg', ) + if(SFX_SNORE_FEMALE) + soundin = pick_weight(list( + 'sound/mobs/humanoids/human/snore/snore_female1.ogg' = 33, + 'sound/mobs/humanoids/human/snore/snore_female2.ogg' = 33, + 'sound/mobs/humanoids/human/snore/snore_female3.ogg' = 33, + 'sound/mobs/humanoids/human/snore/snore_mimimi1.ogg' = 1, + )) + if(SFX_SNORE_MALE) + soundin = pick_weight(list( + 'sound/mobs/humanoids/human/snore/snore_male1.ogg' = 20, + 'sound/mobs/humanoids/human/snore/snore_male2.ogg' = 20, + 'sound/mobs/humanoids/human/snore/snore_male3.ogg' = 20, + 'sound/mobs/humanoids/human/snore/snore_male3.ogg' = 20, + 'sound/mobs/humanoids/human/snore/snore_male5.ogg' = 20, + 'sound/mobs/humanoids/human/snore/snore_mimimi2.ogg' = 1, + )) if(SFX_CAT_MEOW) soundin = pick_weight(list( 'sound/creatures/cat/cat_meow1.ogg' = 33, diff --git a/code/modules/admin/verbs/ert.dm b/code/modules/admin/verbs/ert.dm index 23f1627503e06..71722eb6d64ab 100644 --- a/code/modules/admin/verbs/ert.dm +++ b/code/modules/admin/verbs/ert.dm @@ -77,6 +77,8 @@ else ertemplate = new /datum/ert/centcom_official + var/human_authority_setting = CONFIG_GET(string/human_authority) + var/list/settings = list( "preview_callback" = CALLBACK(src, PROC_REF(makeERTPreviewIcon)), "mainsettings" = list( @@ -84,7 +86,7 @@ "teamsize" = list("desc" = "Team Size", "type" = "number", "value" = ertemplate.teamsize), "mission" = list("desc" = "Mission", "type" = "string", "value" = ertemplate.mission), "polldesc" = list("desc" = "Ghost poll description", "type" = "string", "value" = ertemplate.polldesc), - "enforce_human" = list("desc" = "Enforce human authority", "type" = "boolean", "value" = "[(CONFIG_GET(flag/enforce_human_authority) ? "Yes" : "No")]"), + "enforce_human" = list("desc" = "Enforce human authority", "type" = "boolean", "value" = "[(human_authority_setting == HUMAN_AUTHORITY_ENFORCED ? "Yes" : "No")]"), "open_armory" = list("desc" = "Open armory doors", "type" = "boolean", "value" = "[(ertemplate.opendoors ? "Yes" : "No")]"), "leader_experience" = list("desc" = "Pick an experienced leader", "type" = "boolean", "value" = "[(ertemplate.leader_experience ? "Yes" : "No")]"), "random_names" = list("desc" = "Randomize names", "type" = "boolean", "value" = "[(ertemplate.random_names ? "Yes" : "No")]"), diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 27c1fd5a0ea89..741bdeeed7b7c 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -381,7 +381,10 @@ if(ishuman(spawned_mob)) var/mob/living/carbon/human/human_mob = spawned_mob - human_mob.set_species(species_type) + // ignore if it's already the same + if(human_mob.dna.species != species_type) + human_mob.set_species(species_type) + human_mob.equipOutfit(outfit) op_mind.special_role = role_to_play @@ -411,6 +414,7 @@ desc = "Call up some backup from ARC for monkey mayhem." icon = 'icons/obj/devices/voice.dmi' icon_state = "walkietalkie" + spawn_type = /mob/living/carbon/human/species/monkey species_type = /datum/species/monkey outfit = /datum/outfit/syndicate_monkey antag_datum = /datum/antagonist/syndicate_monkey @@ -424,13 +428,26 @@ monkey_man.fully_replace_character_name(monkey_man.real_name, pick(GLOB.syndicate_monkey_names)) - monkey_man.make_clever_and_no_dna_scramble() + monkey_man.crewlike_monkify() + + // fuck you i am no longer playing around. this goes against the entire soul of the item + RegisterSignal(monkey_man, COMSIG_SPECIES_GAIN, PROC_REF(allergy)) + monkey_man.mind.enslave_mind_to_creator(user) var/obj/item/implant/explosive/imp = new(src) imp.implant(monkey_man, user) +/obj/item/antag_spawner/loadout/monkey_man/proc/allergy(mob/living/second_lifer, datum/species/folly_species) + SIGNAL_HANDLER + if(is_simian(second_lifer)) + return + // timer is long to let them panic and consider their folly, and because allergies take a while + second_lifer.visible_message(span_bolddanger("[second_lifer] starts swelling unhealthily in size. It looks like they had an allergic reaction to becoming a [folly_species]!"), span_userdanger("As your monkey features morph, you feel your allergies coming in. Oh no.")) + // no brain or items. organs are funny though + second_lifer.inflate_gib(drop_bitflags = DROP_ORGANS|DROP_BODYPARTS, gib_time = 25 SECONDS, anim_time = 40 SECONDS) + /datum/outfit/syndicate_monkey name = "Syndicate Monkey Agent Kit" diff --git a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm index 5491251d1aa53..20eccc6977900 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm @@ -249,7 +249,7 @@ /obj/item/clothing/mask/chameleon = 20, /obj/item/language_manual/codespeak_manual/unlimited = 10, /obj/item/storage/mail_counterfeit_device = 10, - /obj/item/traitor_machine_trapper = 10, + /obj/item/clothing/glasses/thermal = 10, /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher = 10, )) diff --git a/code/modules/antagonists/space_dragon/carp_rift.dm b/code/modules/antagonists/space_dragon/carp_rift.dm index 6038c5e6820b7..6299bde9275cd 100644 --- a/code/modules/antagonists/space_dragon/carp_rift.dm +++ b/code/modules/antagonists/space_dragon/carp_rift.dm @@ -111,6 +111,8 @@ healing_color = COLOR_BLUE, \ ) + AddComponent(/datum/component/fishing_spot, /datum/fish_source/carp_rift) + gravity_aura = new( /* host = */src, /* range = */15, diff --git a/code/modules/antagonists/space_dragon/space_dragon.dm b/code/modules/antagonists/space_dragon/space_dragon.dm index 090c8f66dc82e..74b0c60a872ce 100644 --- a/code/modules/antagonists/space_dragon/space_dragon.dm +++ b/code/modules/antagonists/space_dragon/space_dragon.dm @@ -112,7 +112,7 @@ var/icon/icon = icon('icons/mob/nonhuman-player/spacedragon.dmi', "spacedragon") icon.Blend(COLOR_STRONG_VIOLET, ICON_MULTIPLY) - icon.Blend(icon('icons/mob/nonhuman-player/spacedragon.dmi', "overlay_base"), ICON_OVERLAY) + icon.Blend(icon('icons/mob/nonhuman-player/spacedragon.dmi', "spacedragon_overlay_base"), ICON_OVERLAY) icon.Crop(10, 9, 54, 53) icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE) diff --git a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm index 6e722b1515eb4..3367540239703 100644 --- a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm +++ b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm @@ -7,6 +7,7 @@ /datum/traitor_objective/ultimate/infect_ai = 1, /datum/traitor_objective/ultimate/romerol = 1, /datum/traitor_objective/ultimate/supermatter_cascade = 1, + /datum/traitor_objective/ultimate/no_escape = 1, ) weight = 100 diff --git a/code/modules/antagonists/traitor/objectives/final_objective/no_escape.dm b/code/modules/antagonists/traitor/objectives/final_objective/no_escape.dm new file mode 100644 index 0000000000000..12cbdcf2d01fa --- /dev/null +++ b/code/modules/antagonists/traitor/objectives/final_objective/no_escape.dm @@ -0,0 +1,48 @@ +/datum/traitor_objective/ultimate/no_escape + name = "Attach a beacon to the escape shuttle that will attract a singularity to consume everything." + description = "Go to %AREA%, and receive the smuggled beacon. Set up the beacon anywhere on the shuttle, \ + and charge it using an inducer then, IT COMES. Warning: The singularity will consume all in it's path, you included." + + ///area type the objective owner must be in to receive the satellites + var/area/beacon_spawn_area_type + ///checker on whether we have sent the beacon yet + var/sent_beacon = FALSE + +/datum/traitor_objective/ultimate/no_escape/generate_objective(datum/mind/generating_for, list/possible_duplicates) + var/list/possible_areas = GLOB.the_station_areas.Copy() + for(var/area/possible_area as anything in possible_areas) + if(!ispath(possible_area, /area/station/maintenance/solars) && !ispath(possible_area, /area/station/solars)) + possible_areas -= possible_area + if(length(possible_areas) == 0) + return FALSE + beacon_spawn_area_type = pick(possible_areas) + replace_in_name("%AREA%", initial(beacon_spawn_area_type.name)) + return TRUE + +/datum/traitor_objective/ultimate/no_escape/generate_ui_buttons(mob/user) + var/list/buttons = list() + if(!sent_beacon) + buttons += add_ui_button("", "Pressing this will call down a pod with the smuggled beacon.", "beacon", "beacon") + return buttons + +/datum/traitor_objective/ultimate/no_escape/ui_perform_action(mob/living/user, action) + . = ..() + switch(action) + if("beacon") + if(sent_beacon) + return + var/area/delivery_area = get_area(user) + if(delivery_area.type != beacon_spawn_area_type) + to_chat(user, span_warning("You must be in [initial(beacon_spawn_area_type.name)] to receive the smuggled beacon.")) + return + sent_beacon = TRUE + podspawn(list( + "target" = get_turf(user), + "style" = /datum/pod_style/syndicate, + "spawn" = list( + /obj/item/sbeacondrop/no_escape, + /obj/item/inducer/syndicate, + /obj/item/wrench + ) + )) + diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm index a0e927c631938..d6ab89cb8a855 100644 --- a/code/modules/clothing/outfits/plasmaman.dm +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -4,7 +4,7 @@ uniform = /obj/item/clothing/under/plasmaman gloves = /obj/item/clothing/gloves/color/plasmaman head = /obj/item/clothing/head/helmet/space/plasmaman - r_hand= /obj/item/tank/internals/plasmaman/belt/full + r_hand = /obj/item/tank/internals/plasmaman/belt/full internals_slot = ITEM_SLOT_HANDS /datum/outfit/plasmaman/security diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 124dfcee41c0b..cd646d1df9ac2 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -93,6 +93,12 @@ if(fishing_modifier) AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) +/obj/item/clothing/suit/space/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) + . = ..() + if(isnull(cell)) + return + toggle_spacesuit(toggler = null, manual_toggle = FALSE) //turn on the thermal regulator by default. + /// Start Processing on the space suit when it is worn to heat the wearer /obj/item/clothing/suit/space/equipped(mob/living/user, slot) . = ..() @@ -161,7 +167,10 @@ thermal_on = FALSE // support for items that interact with the cell -/obj/item/clothing/suit/space/get_cell() +/obj/item/clothing/suit/space/get_cell(atom/movable/interface, mob/user) + if(istype(interface, /obj/item/inducer)) + to_chat(user, span_alert("Error: unable to interface with [interface].")) + return null return cell // Show the status of the suit and the cell diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index 5b7cceb72b196..c5bd80e5d7174 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -1304,6 +1304,10 @@ /obj/item/fish/proc/undo_petted() fish_flags &= ~FISH_FLAG_PETTED +/obj/item/fish/update_atom_colour() + . = ..() + aquarium_vc_color = color || initial(aquarium_vc_color) + /// Returns random fish, using random_case_rarity probabilities. /proc/random_fish_type(required_fluid) var/static/probability_table diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index c9ab3325af367..b0eec9d58f29e 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -427,6 +427,8 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) catalog_description = "This fish contains toxins. Feeding it to predatory fishes or people is not recommended." diff_traits_inheritability = 25 reagents_to_add = list(/datum/reagent/toxin/tetrodotoxin = 1) + ///The amount of venom injected if the fish has a stinger is multiplied by this value. + var/venom_mult = 1 /datum/fish_trait/toxic/apply_to_fish(obj/item/fish/fish) . = ..() @@ -438,13 +440,13 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) SIGNAL_HANDLER if(!HAS_TRAIT(source, TRAIT_FISH_STINGER)) return - add_venom(source, /datum/reagent/toxin/tetrodotoxin, new_weight, mult = source.status == FISH_DEAD ? 0.1 : 0.25) + add_venom(source, reagents_to_add[1], new_weight, mult = (source.status == FISH_DEAD ? 0.1 : 0.25) * venom_mult) /datum/fish_trait/toxic/proc/on_status_change(obj/item/fish/source) SIGNAL_HANDLER if(!HAS_TRAIT(source, TRAIT_FISH_STINGER)) return - change_venom_on_death(source, /datum/reagent/toxin/tetrodotoxin, 0.25, 0.1) + change_venom_on_death(source, reagents_to_add[1], 0.25 * venom_mult, 0.1 * venom_mult) /datum/fish_trait/toxic/proc/on_eaten(obj/item/fish/source, obj/item/fish/predator) if(HAS_TRAIT(predator, TRAIT_FISH_TOXIN_IMMUNE)) @@ -463,7 +465,14 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /datum/fish_trait/toxic/apply_to_mob(mob/living/basic/mob) . = ..() - mob.AddElement(/datum/element/venomous, /datum/reagent/toxin/tetrodotoxin, 0.5 * mob.mob_size) + mob.AddElement(/datum/element/venomous, reagents_to_add[1], 0.5 * mob.mob_size * venom_mult) + +/datum/fish_trait/toxic/carpotoxin + name = "Carpotoxic" + catalog_description = "This fish contains carpotoxin. Definitely not safe for consumption." + diff_traits_inheritability = 50 + reagents_to_add = list(/datum/reagent/toxin/carpotoxin = 4) + venom_mult = 6 /datum/fish_trait/toxin_immunity name = "Toxin Immunity" diff --git a/code/modules/fishing/fish/types/air_space.dm b/code/modules/fishing/fish/types/air_space.dm index dda3794ff4e1c..177ae9c6e0e7d 100644 --- a/code/modules/fishing/fish/types/air_space.dm +++ b/code/modules/fishing/fish/types/air_space.dm @@ -99,3 +99,85 @@ ///It spins, and dimly glows in the dark. /obj/item/fish/starfish/flop_animation() DO_FLOATING_ANIM(src) + +/obj/item/fish/baby_carp + name = "baby space carp" + desc = "A juvenile spawn of the dreaded space carp. Don't let the innocent looks fool you, they're aggressive little bastards." + icon_state = "baby_carp" + sprite_height = 3 + sprite_width = 5 + average_size = 35 + average_weight = 550 + stable_population = 7 + required_fluid_type = AQUARIUM_FLUID_ANY_WATER + random_case_rarity = FISH_RARITY_VERY_RARE + required_temperature_min = 0 + required_temperature_max = MIN_AQUARIUM_TEMP+200 + safe_air_limits = null + fillet_type = /obj/item/food/fishmeat/carp/no_tox + fish_traits = list( + /datum/fish_trait/carnivore, + /datum/fish_trait/aggressive, + /datum/fish_trait/predator, + /datum/fish_trait/necrophage, + /datum/fish_trait/no_mating, + /datum/fish_trait/toxic/carpotoxin, + ) + favorite_bait = list( + list( + FISH_BAIT_TYPE = FISH_BAIT_FOODTYPE, + FISH_BAIT_VALUE = MEAT, + ), + ) + disliked_bait = list( + list( + FISH_BAIT_TYPE = FISH_BAIT_FOODTYPE, + FISH_BAIT_VALUE = GRAIN|DAIRY, + ), + ) + beauty = FISH_BEAUTY_GREAT + +/obj/item/fish/baby_carp/Initialize(mapload, apply_qualities = TRUE) + color = pick_weight(GLOB.carp_colors) + . = ..() + RegisterSignal(src, COMSIG_FISH_BEFORE_GROWING, PROC_REF(growth_checks)) + RegisterSignal(src, COMSIG_FISH_FINISH_GROWING, PROC_REF(on_growth)) + update_appearance(UPDATE_OVERLAYS) + +/obj/item/fish/baby_carp/update_overlays() + . = ..() + var/mutable_appearance/eyes = mutable_appearance(icon, "baby_carp_eyes") + if(status == FISH_DEAD) + eyes.icon_state += "_dead" + else + eyes.appearance_flags = RESET_COLOR + . += eyes + +///Determines the speed at which the carp grows based on how big it's +/obj/item/fish/baby_carp/update_size_and_weight(new_size = average_size, new_weight = average_weight) + . = ..() + var/growth_rate = 4.5 MINUTES + growth_rate *= clamp(size/average_size, 0.5, 2) + growth_rate *= clamp(weight/average_weight, 0.5, 2) + + AddComponent(/datum/component/fish_growth, /mob/living/basic/carp/advanced, growth_rate) + +/obj/item/fish/baby_carp/proc/growth_checks(datum/source, seconds_per_tick) + SIGNAL_HANDLER + var/hunger = CLAMP01((world.time - last_feeding) / feeding_frequency) + if(health <= initial(health) * 0.6 || hunger >= 0.6) //if too hurt or hungry, don't grow. + return COMPONENT_DONT_GROW + + if(!isaquarium(loc)) + return + + var/obj/structure/aquarium/aquarium = loc + if(!aquarium.reproduction_and_growth) //the aquarium has breeding disabled + return COMPONENT_DONT_GROW + if(length(aquarium.get_fishes()) > AQUARIUM_MAX_BREEDING_POPULATION * 0.5) //check if there's enough room to maturate. + return COMPONENT_DONT_GROW + +/obj/item/fish/baby_carp/proc/on_growth(datum/source, mob/living/basic/carp/result) + SIGNAL_HANDLER + //yes, this means that if we use a spraycan on the fish, the resulting space carp will be of spraycan color + result.set_greyscale(colors = list(color)) diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index 38455068ce22e..c2db0a43fc9b5 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -41,6 +41,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) /obj/item/fish/stingray = FISH_ICON_WEAPON, /obj/item/fish/swordfish = FISH_ICON_WEAPON, /obj/item/fish/zipzap = FISH_ICON_ELECTRIC, + /obj/item/knife/carp = FISH_ICON_WEAPON, /obj/item/seeds/grass = FISH_ICON_SEED, /obj/item/seeds/random = FISH_ICON_SEED, /obj/item/storage/wallet = FISH_ICON_COIN, diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index 2f56ffaad3cd1..f182287040082 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -193,6 +193,7 @@ fish_table = list( FISHING_DUD = 5, /obj/item/fish/starfish = 6, + /obj/item/fish/baby_carp = 6, /obj/item/stack/ore/bluespace_crystal = 2, /mob/living/basic/carp = 2, ) @@ -580,6 +581,25 @@ var/picked_path = pick(seeds_to_draw_from) return new picked_path(get_turf(fishing_spot)) +/datum/fish_source/carp_rift + catalog_description = "Space Dragon Rifts" + radial_state = "carp" + fish_table = list( + FISHING_DUD = 3, + /obj/item/fish/baby_carp = 5, + /mob/living/basic/carp = 1, + /mob/living/basic/carp/passive = 1, + /mob/living/basic/carp/mega = 1, + /obj/item/clothing/head/fedora/carpskin = 1, + /obj/item/toy/plush/carpplushie = 1, + /obj/item/toy/plush/carpplushie/dehy_carp/peaceful = 1, + /obj/item/knife/carp = 1, + ) + fish_counts = list( + /mob/living/basic/carp/mega = 2, + ) + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 18 + /datum/fish_source/deepfryer catalog_description = "Deep Fryers" radial_state = "fryer" diff --git a/code/modules/hallucination/screwy_health_doll.dm b/code/modules/hallucination/screwy_health_doll.dm index 7bab267563c74..2a8eeba16e2b3 100644 --- a/code/modules/hallucination/screwy_health_doll.dm +++ b/code/modules/hallucination/screwy_health_doll.dm @@ -66,12 +66,11 @@ bodyparts -= source /// Whenever a bodypart we're tracking has their health hud updated, override it with our fake overlay -/datum/hallucination/fake_health_doll/proc/on_bodypart_hud_update(obj/item/bodypart/source, mob/living/carbon/human/owner) +/datum/hallucination/fake_health_doll/proc/on_bodypart_hud_update(obj/item/bodypart/source, mob/living/carbon/human/owner, list/overridable_key) SIGNAL_HANDLER - var/mutable_appearance/fake_overlay = mutable_appearance('icons/hud/screen_gen.dmi', "[source.body_zone][bodyparts[source]]") - owner.hud_used.healthdoll.add_overlay(fake_overlay) - return COMPONENT_OVERRIDE_BODYPART_HEALTH_HUD + overridable_key[1] = bodyparts[source] + return OVERRIDE_BODYPART_HEALTH_HUD /// Signal proc for [COMSIG_BODYPART_CHECKED_FOR_INJURY]. Our bodyparts look a lot more wounded than they actually are. /datum/hallucination/fake_health_doll/proc/on_bodypart_checked(obj/item/bodypart/source, mob/living/carbon/examiner, list/check_list, list/limb_damage) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 41ff0c058cebc..c086dce7c8156 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -120,8 +120,7 @@ /// Alternate titles to register as pointing to this job. var/list/alternate_titles - /// Does this job ignore human authority? - var/ignore_human_authority = FALSE + var/human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED /// String key to track any variables we want to tie to this job in config, so we can avoid using the job title. We CAPITALIZE it in order to ensure it's unique and resistant to trivial formatting changes. /// You'll probably break someone's config if you change this, so it's best to not to. @@ -531,11 +530,28 @@ if(!player_client) return // Disconnected while checking for the appearance ban. - var/require_human = CONFIG_GET(flag/enforce_human_authority) && (job.job_flags & JOB_HEAD_OF_STAFF) - if(require_human) - var/all_authority_require_human = CONFIG_GET(flag/enforce_human_authority_on_everyone) - if(!all_authority_require_human && job.ignore_human_authority) - require_human = FALSE + var/human_authority_setting = CONFIG_GET(string/human_authority) + var/require_human = FALSE + + // If the job in question is a head of staff, + // check the config to see if we should force the player onto a human character or not + if(job.job_flags & JOB_HEAD_OF_STAFF) + switch(human_authority_setting) + + // If non-humans are the norm and jobs must be forced to be only for humans + // then we only force the player to be a human if the job exclusively allows humans + if(HUMAN_AUTHORITY_HUMAN_WHITELIST) + require_human = job.human_authority == JOB_AUTHORITY_HUMANS_ONLY + + // If humans are the norm and jobs must be allowed to be played by non-humans + // then we only force the player to be a human if the job doesn't allow for non-humans to play it + if(HUMAN_AUTHORITY_NON_HUMAN_WHITELIST) + require_human = job.human_authority != JOB_AUTHORITY_NON_HUMANS_ALLOWED + + // If humans are the norm and there is no chance that a non-human can be a head of staff + // always return true, since there is no chance that a non-human can be a head of staff. + if(HUMAN_AUTHORITY_ENFORCED) + require_human = TRUE src.job = job.title diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 5b82c9adb7116..99bc35bb60320 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -46,6 +46,8 @@ job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS rpg_title = "Star Duke" + human_authority = JOB_AUTHORITY_HUMANS_ONLY + voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 7ac1b6e29af9b..f85c2c54973b9 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -46,6 +46,8 @@ rpg_title = "Head Crystallomancer" job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS + human_authority = JOB_AUTHORITY_HUMANS_ONLY + voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 3f580b8e932a5..c9f126bb750bc 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -43,6 +43,8 @@ rpg_title = "High Cleric" job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS + human_authority = JOB_AUTHORITY_HUMANS_ONLY + voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index e863a782d9b0c..1b8480f0d0b57 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -41,6 +41,9 @@ family_heirlooms = list(/obj/item/reagent_containers/cup/glass/trophy/silver_cup) rpg_title = "Guild Questgiver" job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS + + human_authority = JOB_AUTHORITY_HUMANS_ONLY + voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index f3627c3c2a257..b9560708114be 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -37,6 +37,8 @@ rpg_title = "Guard Leader" job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS + human_authority = JOB_AUTHORITY_HUMANS_ONLY + voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 858ce8b645536..32053daa5d8c8 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -36,7 +36,7 @@ rpg_title = "Steward" job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS voice_of_god_power = 1.4 //Command staff has authority - ignore_human_authority = TRUE + human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED /datum/outfit/job/quartermaster name = "Quartermaster" diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 5d3c620322759..420138a6b9fba 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -44,6 +44,8 @@ rpg_title = "Archmagister" job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS + human_authority = JOB_AUTHORITY_HUMANS_ONLY + voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm index b1ae57de1ffe6..d776ae6251f7f 100644 --- a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm +++ b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm @@ -33,7 +33,7 @@ rpg_title = "Royal Guard" allow_bureaucratic_error = FALSE job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS - ignore_human_authority = TRUE + human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED /datum/job/bridge_assistant/after_spawn(mob/living/spawned, client/player_client) . = ..() 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 a6e77d77a510c..d6f89357b4489 100644 --- a/code/modules/jobs/job_types/station_trait/human_ai.dm +++ b/code/modules/jobs/job_types/station_trait/human_ai.dm @@ -40,7 +40,7 @@ random_spawns_possible = FALSE allow_bureaucratic_error = FALSE job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS - ignore_human_authority = TRUE //we can safely assume NT doesn't care what species AIs are made of, much less if they can't even afford an AI. + human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED //we can safely assume NT doesn't care what species AIs are made of, much less if they can't even afford an AI. /datum/job/human_ai/get_roundstart_spawn_point() return get_latejoin_spawn_point() @@ -111,6 +111,18 @@ l_hand = /obj/item/paper/default_lawset_list +/datum/outfit/job/human_ai/pre_equip(mob/living/carbon/human/equipped, visualsOnly) + . = ..() + if(visualsOnly) + return + if(is_safe_turf(equipped.loc, dense_atoms = TRUE)) //skip this if it's safe. We allow dense atoms because we spawn out of the inactive core. + return + if(isnull(equipped.dna.species.outfit_important_for_life)) //custom species stuff will handle this for us. + internals_slot = ITEM_SLOT_SUITSTORE + suit_store = /obj/item/tank/internals/oxygen + suit = /obj/item/clothing/suit/space/nasavoid + head = /obj/item/clothing/head/helmet/space/nasavoid + /datum/outfit/job/human_ai/post_equip(mob/living/carbon/human/equipped, visualsOnly) . = ..() if(visualsOnly) @@ -122,9 +134,6 @@ ADD_TRAIT(equipped, TRAIT_COMMISSIONED, INNATE_TRAIT) equipped.faction |= list(FACTION_SILICON, FACTION_TURRET) - var/static/list/allowed_areas = typecacheof(list(/area/station/ai_monitored)) - equipped.AddComponent(/datum/component/hazard_area, area_whitelist = allowed_areas) - /obj/item/paper/default_lawset_list name = "Lawset Note" desc = "A note explaining the lawset, quickly written yet everso important." diff --git a/code/modules/jobs/job_types/station_trait/pun_pun.dm b/code/modules/jobs/job_types/station_trait/pun_pun.dm index eca4861e77ef0..b6ac7b813bffc 100644 --- a/code/modules/jobs/job_types/station_trait/pun_pun.dm +++ b/code/modules/jobs/job_types/station_trait/pun_pun.dm @@ -37,7 +37,7 @@ /datum/job/pun_pun/after_spawn(mob/living/carbon/human/monkey, client/player_client) . = ..() - monkey.make_clever_and_no_dna_scramble() + monkey.crewlike_monkify() /datum/outfit/job/pun_pun name = "Pun Pun" diff --git a/code/modules/mapfluff/ruins/spaceruin_code/commsbuoy.dm b/code/modules/mapfluff/ruins/spaceruin_code/commsbuoy.dm new file mode 100644 index 0000000000000..895200d487a1b --- /dev/null +++ b/code/modules/mapfluff/ruins/spaceruin_code/commsbuoy.dm @@ -0,0 +1,267 @@ +/obj/structure/fluff/commsbuoy_receiver + name = "interstellar receiver" + desc = "A dish-shaped component of the Comms Buoy used to detect and record interstellar signals." + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "broadcast receiver" + +/obj/structure/fluff/commsbuoy_processor + name = "comms buoy processor unit" + desc = "This machine is used to process and unscramble interstellar transmissions, to then be relayed and broadcast." + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "processor" + +/obj/structure/fluff/commsbuoy_broadcaster + name = "interstellar broadcaster" + desc = "A dish-shaped component of the Comms Buoy used to broadcast processed interstellar signals." + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "broadcaster" + +/obj/structure/fluff/sat_dish + name = "satellite dish" + desc = "I wonder if they get any sports channels out here." + density = FALSE + deconstructible = TRUE + icon = 'icons/obj/fluff/general.dmi' + icon_state = "sat_dish" + +/obj/item/keycard/nt_commsbuoy + name = "Nanotrasen comms buoy keycard" + desc = "A keycard with the NT logo prominently displayed. The last user broke off the end; the card can still swipe, but this won't insert \ + into any chip readers now. On the back, mostly obscured by dried blood, the text \"SPINWARD\" is printed, followed by an illegible ID string." + color = "#4c80b1" + puzzle_id = "nt_commsbuoy" + +/obj/machinery/door/puzzle/keycard/nt_commsbuoy + name = "secure airlock" + puzzle_id = "nt_commsbuoy" + +/area/ruin/space/nt_commsbuoy + name = "\improper Nanotrasen Comms Buoy" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + has_gravity = FALSE + ambientsounds = list( + 'sound/ambience/engineering/ambisin2.ogg', + 'sound/ambience/misc/signal.ogg', + 'sound/ambience/misc/signal.ogg', + 'sound/ambience/general/ambigen9.ogg', + 'sound/ambience/engineering/ambitech.ogg', + 'sound/ambience/engineering/ambitech2.ogg', + 'sound/ambience/engineering/ambitech3.ogg', + 'sound/ambience/misc/ambimystery.ogg', + ) //same ambience as tcommsat + +/obj/item/paper/fluff/ruins/nt_commsbuoy + color = COLOR_BLUE_GRAY + +/obj/item/paper/fluff/ruins/nt_commsbuoy/table_of_contents + name = "Table of Contents: NT-EBCB Model 7" + desc = "The Table of Contents page, text mostly faded. Rest of handbook not included." + default_raw_text = {" +

Nanotrasen Extraorbital Bluespace Communications Buoy Operations Manual

+
PROPERTY OF NANOTRASEN. DO NOT DISTRIBUTE.
+
+

Table of Contents

+ Legal Disclaimers: p1-p6
+ How to Sign: Nondisclosure Agreement: p7
+ Main and Secondary Dish: p8-p10
+ Standard Operation Codes: p11
+ Local-Network Array: p12-p13
+ Interstellar Relay: p14-p27
+ Maintinence: p28-p46
+ Common Error Codes: p47
+ Contacting NT Tech Support: p48-54
+
+ (The page is torn straight along the end of the Table of Contents... wish they'd left the actual Contents.) + "} + +/obj/item/paper/fluff/ruins/nt_commsbuoy/torn_page + name = "Page 33: NT-EBCB Model 7" + desc = "Page 33, torn out and annotated with lots of underlining." + default_raw_text = {" +
PROPERTY OF NANOTRASEN. DO NOT DISTRIBUTE.
+
+ ... is listing any of the mentioned Operation or Error codes. If the shown error is \ + not listed in the manual, please refer to pages 48/54 to contact a Nanotrasen Techician for direct assistance.
+

Realigning the Satellite Dish

+ Now that you have identified the Error code as an alignment issue, repairs will follow a simple step-by-step list. Be sure to follow the \ + list precisely, as additional damage may occur while the dish is misaligned.
+ 1. Assess the outside of the Comms Buoy for any damage or indication of impact to the dish. If any is found, refer to the Replacement Parts subsection\ + on page 43.
+ 2. Before entering the Comms Buoy, collect the Nanotrasen Comms Buoy keycard provided in the front of this manual. This keycard is vital to \ + the repair process, operational efficiency of the Buoy, and in disabling the automated defensive system.
+ 3. Display this card prominently on your persons. This can be done with an official Nanotrasen neck lanyard or Nanotrasen clip-on retractible laynard, \ + worn on your collar, attached to a breast pocket, or on your waist.
+ 4. Enter the Comms Buoy from the designated airlock. There is no system aboard to recycle air, so keep internals and a suit handy in case \ + the Comms Buoy has depressurized.
+ 5. Immediately upon entering the room, be sure to disable the Automated Defense System (refer to page 29). \ + Failiure to follow this step may risk injury or even death.
+ 6. Proceed to the terminal corresponding to the misaligned disk - the Primary Dish controller (pages 8/9) can be located in the room past the Local-Network Array (pages 12/13), \ + while the one closest to the airlock will control the Secondary Dish (page 10).
+ 7. Insert the Nanotrasen Comms Buoy keycard into the slot along the bottom right of the terminal (refer to diagram RD-2). +
+ (The back of the page is covered in blood. A shame, now you can't see the diagram...) + "} + +/obj/item/paper/fluff/ruins/nt_commsbuoy/inspection + name = "Spinward-NT-EBCB Inspection Report" + desc = "A few notes from the pre-activation inspection. Probably shouldn't still be here post-activation." + default_raw_text = {" +

"SS13-Relay" Spinward NT-EBCB Pre-Activation Inspection

+
+ Alright, just a few notes for consideration before we launch this new model. Would really appreciate review and action on the listed items.
+ - Open space on the exterior chassis. Nanotrasen insignia and paint? Could sell advertising space?
+ - The Primary Dish has proven to be sufficient for even severe network loads. Offloading half of its processing to the Secondary just creates \ + a fault risk; isn't this meant to be a backup? Why are we using it at all times?
+ - Interstellar Relay has some outdated encryption. This sat shouldn't have even left CC until this was updated.
+ - Please reconsider deployment location. SS13's local space is not secure enough for untested comms equipment. Combine with above \ + note about encryption, this is a serious security risk.
+ - Turrets are functioning as expected, read the ID correctly as long as the full barcode is unobscured. However, please review: location of \ + turrets. Critical consoles are in the firing line and NOT laser-resistant. No, a backup recorder in the Main Dish is not sufficient.
+ - A note of praise: including a manual with each satellite is very good. Better recommendation might be a console, or something similar \ + which people can't just tear off the corkboard.
+ - I fixed the breaker while I was aboard; it was routing 2kW into lighting and blew them all out. Simple wiring fault. Fix before launching \ + other Model-7s to prevent power issues.
+ - While it's not a habitable satellite, a fax machine might have been handy. Now I have to make sure not to lose these notes during the return \ + trip. +
+
PROPERTY OF NANOTRASEN. DO NOT DISTRIBUTE.
+ "} + +/obj/machinery/computer/terminal/nt_commsbuoy + name = "satellite dish operations terminal" + icon_screen = "comm" + tguitheme = "ntos" + upperinfo = "SATELLITE DISH OPERATIONS READOUT" + content = list( + "10/07/2563 - Inbound Packet Stability - FAIL
\ + Please realign dish!
", + "17/07/2563 - Inbound Packet Stability - FAIL
\ + Please realign dish!
", + "19/07/2563 - Outbound Packet Stability - SUCCESS
", + "24/07/2563 - Inbound Packet Stability - FAIL
\ + Please realign dish!
", + "02/08/2563 - Inbound Packet Stability - FAIL
\ + Please realign dish!
", + "09/08/2563 - Inbound Packet Stability - FAIL
\ + Please realign dish!
", + "13/08/2563 - Secondary Dish reports manual alignment changes.
\ + If this was not intentional, please check the exterior for signs of impact damage!
", + "13/08/2563 - Outbound Packet Stability - SUCCESS
", + "14/08/2563 - Inbound Packet Stability - SUCCESS
\ + Forwarding to Processor for signal restoration.
\ + ... Signal restored, Inbound relayed to Outbound
\ + ... Outbound Packet Stability - SUCCESS
", + "15/08/2563 - Outbound Packet Stability - SUCCESS
", + ) + +/obj/machinery/computer/terminal/nt_commsbuoy/blackbox + name = "blackbox transcription terminal" + upperinfo = "BLACKBOX TRANSCRIPT - 13/08/2563" + content = list( + "Notice: this transcript was generated by Nanotrasen speech-to-text. By reading this transcript you are hereby agreeing to the speech-to-text terms \ + of service, and agree that any fault or inaccuracies in transcriptions legally falls entirely on the speaker.
", + "11:07 - NTSS WAKAHIRU
\ + Yeah, we're close enough. Passing within about a thousand meters of that Buoy that's been having trouble. We can re-route to check on it, I've got \ + an extraorbital engineer aboard. Hell, guy's already looking for the right handbook.
", + "11:08 - NANOTRASEN TRAFFIC CONTROL
\ + Approved, Wakahiru. Redirect per the updated charts coming in on your CDTI, keep your speed below sub-light until further notice. ETA will be 27 minutes. \ + Be sure to follow all Company regulations during repairs, these systems are extremely sensitive and you will be held liable for any new damages.", + "11:10 - NTSS WAKAHIRU
\ + Adjusting course now, and already printing out the waivers. Clearing Broadband.", + "11:11 - NTSS WAKAHIRU - Local
\ + Operations to the Bridge, repeat, Operations to the Bridge.
", + "11:34 - (TRANSPONDER INACTIVE)
\ + Control, I've got a, uh- fish or something chewing through my NAV array, can you guys dispatch a team or something? Bring a, like, big net?", + "11:37 - NANOTRASEN TRAFFIC CONTROL
\ + Negative. Your Transponder is inactive - stop all operations, a Security patrol is being dispatched to your location.", + "11:37 - (TRANSPONDER INACTIVE)
\ + Y'know what, that's close enough. Make sure that they bring some repair tools with them. And a harpoon.
", + "11:40 - NTSS WAKAHIRU - Local
\ + Allllllright, guys, we're at the reported Buoy. NT's Traffic-Con said they've been getting messy data through the relay, too messy to forward. \ + Probably just a misaligned dish. Operations will be dispatching the Away team soon, but otherwise just keep doing whatever it is you're doing.", + "11:47 - Unidentified - Local
\ + This is Away to Wakahiru, how read.", + "11:47 - NTSS WAKAHIRU - Local
\ + Loud and clear Away. What's the hold-up?", + "11:48 - Unidentified - Local
\ + Yeah, uh, this access card doesn't seem to be working on the dish controller. Kept the turrets tame and opened the front door, but \ + the console's not responding to it. Lost that manual page I brought with me too... Huh? One second- Oh, insert it entirely? I don't think- Dude- dude, I know how to put a card into a reader, just let me-", + "11:50 - NT-EBCB-7 ARRAY
\ + ALERT. LIFE FORMS DETECTED WITHOUT VALID IDENTIFICATION. INITIATING DEFENSIVE PROTOCOL.", + "11:50 - Unidentified - Local
\ + SHIIIIIT!! GET THE CARD BACK OUT OF THE CONSOLE! GET IT OUT! G-", + "11:51 - NT-EBCB-7 ARRAY
\ + ALL LIFE FORMS ELIMINATED. HAVE A SECURE DAY!
", + "12:07 - NTSS WAKAHIRU
\ + NT-TC, this is the NTSS Wakahiru. You're, uh... going to need to dispatch a cleanup crew to that satellite. Sending you our Operations report now.", + ) + +/obj/machinery/computer/terminal/nt_commsbuoy/relay + name = "long-range interstellar relay operations terminal" + upperinfo = "LONG-RANGE INTERSTELLAR RELAY OPERATIONS READOUT" + content = list( + "19/07/2563 - Outbound Direct -
\ + From: totally_not_a_burner@kosmokomm.net
\ + To: john_doe_a_deer_a_female_deer@kosmokomm.net
\ +
\ + im telling you! they dont monitor this relay. ive had a bug on the interstellar relay since it was launched. outdated encryption, \ + its an easy tap. just be patient.
\ +
PACKET FLAGGED AS SUSPICIOUS. LOGGING FOR REVIEW.

", + + "13/08/2563 - Outbound Direct -
\ + From: NT_S13TC_OFFICIAL@NTFIDspinward.nt
\ + To: wilson_peters@NTFIDspinward.nt
\ +
\ + Hello,
\ + Your ticket has been marked as Resolved with the following comment:
\ + \"This is Spinward Sector 13 NT Traffic Control, reaching out to inform you that your ticket has been resolved. The relay should now \ + be operating as expected. Please re-attempt sending that message again. If any other issue arises, open a new ticket.\"
\ + Thank you for your patience and continued support.
\ +
The Spinward Project - brought to you by Nanotrasen Futures and Innovation Division, in partnership with Nanotrasen \ + Heavy Industry.

", + + "14/08/2563 - Inbound to Foward -
\ + From: wilson_peters@NTFIDspinward.nt
\ + Relay Target: PORT_ELLIS
\ +
\ + Hey. I miss you. Hope we can holo-call again soon.
\ + Work's been busy. Wish you could be here for it, but I know you were adamant on getting your citizenship. I hope Gateway's been nice to you.
\ + I was working on that project folder you left me, the plasma stuff. Really see why you asked to change divisions...
\ +
\ + Regardless of the heavy topic of the research, I've made some astounding breakthroughs. A majority of this is still your notes just progressing, \ + long-term ingestion of plasma - specifically Pudicitite - in humanoid species. I really had hoped these projections weren't so accurate. \ + Guess it just shows your dazzling intellect... as dark as this is.
\ +
\ + That doomed assistant you had on observation finally expired. The constant medium-level exposure, even treated with a myriad of medications, \ + left the Amygdala extremely malformed like we were seeing prior. Additionally, it entirely and irrepairably destroyed every neural pathway in \ + the Hypothalamus, leaving the subject on a direct path to literally burning out.
\ + The damage to their bodily temperature regulation wasn't the focus, nor did I get much opportunity to make it one. Security had to kill them \ + pre-emptively; their Amygdala is engorged and stained with purple and white streaks (almost as vibrant as your scales). Whatever this damage \ + truly is seems to have contributed to overstimulation and amplified emotional responses to the testing.
\ +
\ + It's... a perfect storm. The loss of control of emotional responses in tandem with the exaggurated environmental stimuli. I've already pushed \ + a few of the results up as high as I can and advised we push towards improving our plasma filtration, especially in masks. Specifically \ + the Mining gas masks, as your papers mentioned - the elevated gas exposure makes them a high risk group.
\ + My peers over here are already adjusting their testing to boost this to Central's attention so that other stations might \ + contribute to improving our protections from this.
\ +
\ + I know you told me to stop messaging you, especially about this - but I thought you deserved to know, of all people. You were right. You were \ + always right. Please... respond. Even just to tell me if *I* did something right.
\ +
The Spinward Project - brought to you by Nanotrasen Futures and Innovation Division, in partnership with Nanotrasen Heavy Industry.

", + + "15/08/2563 - Outbound Direct -
\ + From: totally_not_a_burner@kosmokomm.net
\ + To: john_doe_a_deer_a_female_deer@kosmokomm.net
\ +
\ + IM THE BEST HACKER IN THE GALAXY. youre paying me TRIPLE for that, holy CRAP the syndicate are going to pay us so much. actually you owe me \ + at least half the profits. no no over half i did all the work.
\ + (Attached data file: WEGOTIT.syndzip)
\ +
PACKET FLAGGED AS SUSPICIOUS. BEGINNING TRACE.
\ +
ORIGIN TRACED. NT-DAP DISPATCHED.
\ + DESTINATION TRACED. NT-DAP DISPATCHED.
\ + DATA FILE SCANNED AND FORWARDED TO NT-DAP.
\ +
\ + FILE ORIGIN TRACED TO NT STATION. LOCKDOWN INITIATED.
\ + SECURITY ADVISORY RAISED TO: RED STAR.
\ + NT-DAP DISPATCHED. TARGET: wilson_peters.

", + ) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp.dm b/code/modules/mob/living/basic/space_fauna/carp/carp.dm index 3461f5b104e98..f1c12cc3ce9e9 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp.dm @@ -96,6 +96,7 @@ AddComponent(/datum/component/aggro_emote, emote_list = string_list(list("gnashes"))) AddComponent(/datum/component/regenerator, outline_colour = regenerate_colour) + AddComponent(/datum/component/profound_fisher) if (tamer) tamed(tamer, feedback = FALSE) befriend(tamer) diff --git a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm index f672e60ee2940..b1acd8f9631b2 100644 --- a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm +++ b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm @@ -62,6 +62,11 @@ /// Our wing flap action var/datum/action/cooldown/mob_cooldown/wing_buffet/buffet + ///Are currently sharkified or a plain space dragon? + var/shark_form = FALSE + ///The amount of fish (weight) the space dragon has to eat to be sharkified and receive a cheevo for it. + var/fish_left = 15000 // 30 fish with a weight of 500. + /mob/living/basic/space_dragon/Initialize(mapload) . = ..() add_traits(list(TRAIT_SPACEWALK, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_NO_FLOATING_ANIM, TRAIT_HEALS_FROM_CARP_RIFTS), INNATE_TRAIT) @@ -70,6 +75,7 @@ AddElement(/datum/element/wall_tearer, tear_time = 4 SECONDS, reinforced_multiplier = 3, do_after_key = DOAFTER_SOURCE_SPACE_DRAGON_INTERACTION) AddElement(/datum/element/door_pryer, pry_time = 4 SECONDS, interaction_key = DOAFTER_SOURCE_SPACE_DRAGON_INTERACTION) AddComponent(/datum/component/seethrough_mob) + AddComponent(/datum/component/profound_fisher, new /obj/item/fishing_rod/mob_fisher/dragon(src)) RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) RegisterSignal(src, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_changed)) RegisterSignal(src, COMSIG_ATOM_PRE_EX_ACT, PROC_REF(on_exploded)) @@ -89,9 +95,33 @@ . = ..() if(!isnull(chosen_colour)) return + if(client.get_award_status(/datum/award/achievement/misc/sharkdragon)) + if(tgui_alert(src, "Shall you take the dragon form or the shark form?","Shark Form Unlocked", list("Dragon","Shark")) == "Shark") + sharkify() rename_dragon() select_colour() +/mob/living/basic/space_dragon/mind_initialize() + . = ..() + if(shark_form && mind.get_skill_level(/datum/skill/fishing) < SKILL_LEVEL_APPRENTICE) + mind.set_level(/datum/skill/fishing, SKILL_LEVEL_APPRENTICE, TRUE) + +/mob/living/basic/space_dragon/proc/sharkify() + if(shark_form) + return + pixel_z -= 3 + base_pixel_z -= 3 + do_jitter_animation(150) + shark_form = TRUE + desc = "A piscine mutation of the fearsome leviathan whose flight defies modern physics. Said to be the other ultimate stage in the life cycle of the Space Carp." + icon_state = icon_state == icon_living ? "sharkdragon" : "sharkdragon_dead" + icon_living = "sharkdragon" + icon_dead = "sharkdragon_dead" + if(mind && mind.get_skill_level(/datum/skill/fishing) < SKILL_LEVEL_APPRENTICE) + mind.set_level(/datum/skill/fishing, SKILL_LEVEL_APPRENTICE, TRUE) + client?.give_award(/datum/award/achievement/misc/sharkdragon, src) + update_appearance() + /// Allows the space dragon to pick a funny name /mob/living/basic/space_dragon/proc/rename_dragon() var/chosen_name = sanitize_name(reject_bad_text(tgui_input_text(src, "What would you like your name to be?", "Choose Your Name", real_name, MAX_NAME_LEN))) @@ -125,9 +155,9 @@ icon_state = icon_living return if (HAS_TRAIT(src, TRAIT_WING_BUFFET_TIRED)) - icon_state = "spacedragon_gust_2" + icon_state = "[icon_living]_gust_2" return - icon_state = "spacedragon_gust" + icon_state = "[icon_living]_gust" /mob/living/basic/space_dragon/update_overlays() . = ..() @@ -139,7 +169,7 @@ else if (HAS_TRAIT(src, TRAIT_WING_BUFFET)) overlay_state = "overlay_gust" - var/mutable_appearance/overlay = mutable_appearance(icon, overlay_state) + var/mutable_appearance/overlay = mutable_appearance(icon, "[icon_living]_[overlay_state]") overlay.appearance_flags = RESET_COLOR . += overlay @@ -157,6 +187,8 @@ if (DOING_INTERACTION(source, DOAFTER_SOURCE_SPACE_DRAGON_INTERACTION)) balloon_alert(source, "busy!") return COMPONENT_HOSTILE_NO_ATTACK + if(isfish(target)) + INVOKE_ASYNC(src, PROC_REF(try_eat), target) if (!isliving(target)) return var/mob/living/living_target = target @@ -166,14 +198,23 @@ return COMPONENT_HOSTILE_NO_ATTACK /// Try putting something inside us -/mob/living/basic/space_dragon/proc/try_eat(mob/living/food) +/mob/living/basic/space_dragon/proc/try_eat(atom/movable/food) balloon_alert(src, "swallowing...") if (do_after(src, 3 SECONDS, target = food)) - eat(food) + if(isliving(food)) + eat(food) + else if(isfish(food)) + eat_fish(food) /// Succeed in putting something inside us /mob/living/basic/space_dragon/proc/eat(mob/living/food) - adjust_health(-food.maxHealth * 0.25) + var/health_recovered = food.maxHealth * 0.25 + if(shark_form) + if(istype(food, /mob/living/basic/carp)) + health_recovered *= 1.75 // plus 7.5 points when eating advanced space carps (from the rift) + else + health_recovered *= 0.75 // minus 7.5 points when eating a human for example. + adjust_health(round(-health_recovered, 1)) if (QDELETED(food) || food.loc == src) return FALSE playsound(src, 'sound/effects/magic/demon_attack1.ogg', 60, TRUE) @@ -182,6 +223,43 @@ food.forceMove(src) return TRUE +/mob/living/basic/space_dragon/proc/eat_fish(obj/item/fish/fish) + //a standard fish weights about 500 units on average, rarely exceeds 2000 units, the amount healed is less than a one fiftyth of our total on average. + var/health_recovered = fish.weight * 0.014 + if(shark_form) + health_recovered *= 2 + else + fish_left -= fish.weight + if(fish_left <= 0) + addtimer(CALLBACK(src, PROC_REF(begin_sharkify)), 2 SECONDS) + fish_left = initial(fish_left) //prevent begin_sharkify from being called again by eating another fish. + adjust_health(round(-health_recovered, 1)) + playsound(src, 'sound/effects/magic/demon_attack1.ogg', 40, TRUE) + visible_message(span_boldwarning("[src] swallows [fish] whole!")) + if(HAS_TRAIT(fish, TRAIT_YUCKY_FISH)) + balloon_alert(src, "disgusting!") + to_chat(src, span_warning("that [fish.name] tasted awful, you feel like you're about to throw up...")) + addtimer(CALLBACK(src, PROC_REF(barf_contents)), 3 SECONDS) + qdel(fish) + +/mob/living/basic/space_dragon/proc/begin_sharkify() + do_jitter_animation(300) + addtimer(CALLBACK(src, PROC_REF(sharkify)), 1.2 SECONDS) + visible_message(span_warning("[src] begins mutating!")) + +/mob/living/basic/space_dragon/proc/barf_contents() + if(stat == DEAD) + return + new /obj/effect/decal/cleanable/vomit(loc) + playsound(src, 'sound/effects/splat.ogg', vol = 50, vary = TRUE) + visible_message(span_danger("[src] vomits up everything it ate so far!")) + for(var/atom/movable/eaten in src) + if(HAS_TRAIT(eaten, TRAIT_NOT_BARFABLE)) + continue + eaten.forceMove(eaten.loc) + if(prob(90)) + step(eaten, pick(GLOB.alldirs)) + /mob/living/basic/space_dragon/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() if (isliving(arrived)) @@ -230,5 +308,10 @@ . = ..() mind.add_antag_datum(/datum/antagonist/space_dragon) +/// The internal fishing rod of our space dragon +/obj/item/fishing_rod/mob_fisher/dragon + difficulty_modifier = -14 + hook = /obj/item/fishing_hook/jaws + #undef REJECT_DARK_COLOUR_THRESHOLD #undef DOAFTER_SOURCE_SPACE_DRAGON_INTERACTION diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 8d4e66bccda6e..abf7cdaabdd99 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -17,12 +17,6 @@ var/datum/brain_trauma/BT = T BT.on_death() -/mob/living/carbon/proc/inflate_gib() // Plays an animation that makes mobs appear to inflate before finally gibbing - addtimer(CALLBACK(src, PROC_REF(gib), DROP_BRAIN|DROP_ORGANS|DROP_ITEMS), 2.5 SECONDS) - var/matrix/M = matrix() - M.Scale(1.8, 1.2) - animate(src, time = 40, transform = M, easing = SINE_EASING) - /mob/living/carbon/gib(drop_bitflags=NONE) add_memory_in_range(src, 7, /datum/memory/witness_gib, protagonist = src) if(drop_bitflags & DROP_ITEMS) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index a045c1df04207..b2470514df149 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -622,7 +622,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(ITEM_SLOT_OCLOTHING) return equip_delay_self_check(I, H, bypass_equip_delay_self) if(ITEM_SLOT_GLOVES) - if(H.num_hands < 2) + if(H.num_hands == 0) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) if(ITEM_SLOT_FEET) @@ -1456,6 +1456,10 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/get_sneeze_sound(mob/living/carbon/human/human) return +/// Returns the species' snore sound. +/datum/species/proc/get_snore_sound(mob/living/carbon/human/human) + return + /datum/species/proc/get_mut_organs(include_brain = TRUE) var/list/mut_organs = list() mut_organs += mutant_organs diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 903d489846ab2..0b12d7ac46000 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -705,46 +705,10 @@ /mob/living/carbon/human/update_health_hud() if(!client || !hud_used) return - // Updates the health bar, also sends signal . = ..() - - // Updates the health doll - if(!hud_used.healthdoll) - return - - hud_used.healthdoll.cut_overlays() - if(stat == DEAD) - hud_used.healthdoll.icon_state = "healthdoll_DEAD" - return - - hud_used.healthdoll.icon_state = "healthdoll_OVERLAY" - for(var/obj/item/bodypart/body_part as anything in bodyparts) - var/icon_num = 0 - - if(SEND_SIGNAL(body_part, COMSIG_BODYPART_UPDATING_HEALTH_HUD, src) & COMPONENT_OVERRIDE_BODYPART_HEALTH_HUD) - continue - - var/damage = body_part.burn_dam + body_part.brute_dam - var/comparison = (body_part.max_damage/5) - if(damage) - icon_num = 1 - if(damage > (comparison)) - icon_num = 2 - if(damage > (comparison*2)) - icon_num = 3 - if(damage > (comparison*3)) - icon_num = 4 - if(damage > (comparison*4)) - icon_num = 5 - if(has_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy)) - icon_num = 0 - if(icon_num) - hud_used.healthdoll.add_overlay(mutable_appearance('icons/hud/screen_gen.dmi', "[body_part.body_zone][icon_num]")) - for(var/t in get_missing_limbs()) //Missing limbs - hud_used.healthdoll.add_overlay(mutable_appearance('icons/hud/screen_gen.dmi', "[t]6")) - for(var/t in get_disabled_limbs()) //Disabled limbs - hud_used.healthdoll.add_overlay(mutable_appearance('icons/hud/screen_gen.dmi', "[t]7")) + // Handles changing limb colors and stuff + hud_used.healthdoll?.update_appearance() /mob/living/carbon/human/fully_heal(heal_flags = HEAL_ALL) if(heal_flags & HEAL_NEGATIVE_MUTATIONS) @@ -1074,16 +1038,18 @@ if(use_random_name) fully_replace_character_name(real_name, generate_random_mob_name()) -///Proc used to prevent syndicate monkeys and player-selectable Pun Pun able to use objects while stuck in monkey mode. -/mob/living/carbon/human/proc/make_clever_and_no_dna_scramble() +///Proc used to make monkey roles able to function like crew, but not be able to shift into humans easily. +/mob/living/carbon/human/proc/crewlike_monkify() + if(!ismonkey(src)) + set_species(/datum/species/monkey) dna.add_mutation(/datum/mutation/human/clever) // Can't make them human or nonclever. At least not with the easy and boring way out. for(var/datum/mutation/human/mutation as anything in dna.mutations) mutation.mutadone_proof = TRUE mutation.instability = 0 + mutation.class = MUT_OTHER - // Extra backup! - ADD_TRAIT(src, TRAIT_NO_DNA_SCRAMBLE, SPECIES_TRAIT) + add_traits(list(TRAIT_NO_DNA_SCRAMBLE, TRAIT_BADDNA, TRAIT_BORN_MONKEY), SPECIES_TRAIT) /mob/living/carbon/human/species/abductor race = /datum/species/abductor diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 77b73cae9bc4d..61b26f8aff1aa 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -210,6 +210,20 @@ There are several things that need to be remembered: feature_y_offset = glove_offset["y"] gloves_overlay.pixel_y += feature_y_offset + + // We dont have any >2 hands human species (and likely wont ever), so theres no point in splitting this because: + // It will only run if the left hand OR the right hand is missing, and it wont run if both are missing because you cant wear gloves with no arms + // (unless admins mess with this then its their fault) + if(num_hands < default_num_hands) + var/static/atom/movable/alpha_filter_target + if(isnull(alpha_filter_target)) + alpha_filter_target = new(null) + alpha_filter_target.icon = 'icons/effects/effects.dmi' + alpha_filter_target.icon_state = "missing[!has_left_hand(check_disabled = FALSE) ? "l" : "r"]" + alpha_filter_target.render_target = "*MissGlove [REF(src)] [!has_left_hand(check_disabled = FALSE) ? "L" : "R"]" + gloves_overlay.add_overlay(alpha_filter_target) + gloves_overlay.filters += filter(type="alpha", render_source=alpha_filter_target.render_target, y=feature_y_offset, flags=MASK_INVERSE) + overlays_standing[GLOVES_LAYER] = gloves_overlay apply_overlay(GLOVES_LAYER) diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 4c89f9d4b66c1..215640126fa0f 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -108,6 +108,10 @@ return 'sound/mobs/humanoids/human/sniff/female_sniff.ogg' return 'sound/mobs/humanoids/human/sniff/male_sniff.ogg' +/datum/species/human/felinid/get_snore_sound(mob/living/carbon/human/felinid) + if(felinid.physique == FEMALE) + return SFX_SNORE_FEMALE + return SFX_SNORE_MALE /proc/mass_purrbation() diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index cbb16fea3dccc..92f9110d03f1a 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -88,6 +88,11 @@ return 'sound/mobs/humanoids/human/sniff/female_sniff.ogg' return 'sound/mobs/humanoids/human/sniff/male_sniff.ogg' +/datum/species/human/get_snore_sound(mob/living/carbon/human/human) + if(human.physique == FEMALE) + return SFX_SNORE_FEMALE + return SFX_SNORE_MALE + /datum/species/human/get_species_description() return "Humans are the dominant species in the known galaxy. \ Their kind extend from old Earth to the edges of known space." @@ -124,7 +129,9 @@ to humans. As a human, silicons are required to both protect and obey you.", )) - if(CONFIG_GET(flag/enforce_human_authority)) + var/human_authority_setting = CONFIG_GET(string/human_authority) + + if(human_authority_setting == HUMAN_AUTHORITY_NON_HUMAN_WHITELIST || human_authority_setting == HUMAN_AUTHORITY_ENFORCED) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, SPECIES_PERK_ICON = "bullhorn", diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 45faab6713931..de24a90071c5e 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -109,6 +109,11 @@ return 'sound/mobs/humanoids/human/sniff/female_sniff.ogg' return 'sound/mobs/humanoids/human/sniff/male_sniff.ogg' +/datum/species/lizard/get_snore_sound(mob/living/carbon/human/lizard) + if(lizard.physique == FEMALE) + return SFX_SNORE_FEMALE + return SFX_SNORE_MALE + /datum/species/lizard/get_physical_attributes() return "Lizardpeople can withstand slightly higher temperatures than most species, but they are very vulnerable to the cold \ and can't regulate their body-temperature internally, making the vacuum of space extremely deadly to them." diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index bcbdf0276df6f..fdddfc12b4ae0 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -90,7 +90,7 @@ var/can_burn = FALSE if(!isclothing(H.w_uniform) || !(H.w_uniform.clothing_flags & PLASMAMAN_PREVENT_IGNITION)) can_burn = TRUE - else if(!isclothing(H.gloves)) + else if(!isclothing(H.gloves) || H.num_hands < H.default_num_hands) //If you dont have the other glove then the suit isnt really sealed is it? can_burn = TRUE else if(!HAS_TRAIT(H, TRAIT_NOSELFIGNITION_HEAD_ONLY) && (!isclothing(H.head) || !(H.head.clothing_flags & PLASMAMAN_PREVENT_IGNITION))) can_burn = TRUE diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 03a29762f6dc3..d4005cf51ebed 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -27,6 +27,13 @@ SEND_SIGNAL(src, COMSIG_LIVING_GIBBED, drop_bitflags) qdel(src) +// Plays an animation that makes mobs appear to inflate before finally gibbing +/mob/living/proc/inflate_gib(drop_bitflags=DROP_BRAIN|DROP_ORGANS|DROP_ITEMS, gib_time = 2.5 SECONDS, anim_time = 4 SECONDS) + addtimer(CALLBACK(src, PROC_REF(gib), drop_bitflags), gib_time) + var/matrix/M = matrix() + M.Scale(1.8, 1.2) + animate(src, time = anim_time, transform = M, easing = SINE_EASING) + /mob/living/proc/gib_animation() return diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index c71359c58f12b..7420a5d7bad76 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -436,7 +436,6 @@ return return user.dna.species.get_sniff_sound(user) - /datum/emote/living/snore key = "snore" key_third_person = "snores" @@ -445,6 +444,12 @@ emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE stat_allowed = UNCONSCIOUS +// eventually we want to give species their own "snoring" sounds +/datum/emote/living/snore/get_sound(mob/living/carbon/human/user) + if(!istype(user)) + return + return user.dna.species.get_snore_sound(user) + /datum/emote/living/stare key = "stare" key_third_person = "stares" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2ac9c3dcab25f..9c2021061da1e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -2163,6 +2163,19 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/start_look_up() SIGNAL_HANDLER + + looking_vertically = TRUE + + var/turf/current_turf = get_turf(src) + var/turf/above_turf = GET_TURF_ABOVE(current_turf) + + //Check if turf above exists + if(!above_turf) + to_chat(src, span_warning("There's nothing interesting above.")) + to_chat(src, "You set your head straight again.") + end_look_up() + return + var/turf/ceiling = get_step_multiz(src, UP) if(!ceiling) //We are at the highest z-level. if (prob(0.1)) @@ -2183,7 +2196,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) to_chat(src, span_warning("You can't see through the floor above you.")) return - looking_vertically = TRUE reset_perspective(ceiling) /mob/living/proc/stop_look_up() @@ -2214,6 +2226,19 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/start_look_down() SIGNAL_HANDLER + + looking_vertically = TRUE + + var/turf/current_turf = get_turf(src) + var/turf/below_turf = GET_TURF_BELOW(current_turf) + + //Check if turf below exists + if(!below_turf) + to_chat(src, span_warning("There's nothing interesting below.")) + to_chat(src, "You set your head straight again.") + end_look_up() + return + var/turf/floor = get_turf(src) var/turf/lower_level = get_step_multiz(floor, DOWN) if(!lower_level) //We are at the lowest z-level. @@ -2235,7 +2260,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) to_chat(src, span_warning("You can't see through the floor below you.")) return - looking_vertically = TRUE reset_perspective(lower_level) /mob/living/proc/stop_look_down() @@ -2765,18 +2789,40 @@ GLOBAL_LIST_EMPTY(fire_appearances) set category = "IC" if(looking_vertically) + to_chat(src, "You set your head straight again.") end_look_up() - else - look_up() + return + + var/turf/current_turf = get_turf(src) + var/turf/above_turf = GET_TURF_ABOVE(current_turf) + + //Check if turf above exists + if(!above_turf) + to_chat(src, span_warning("There's nothing interesting above. Better keep your eyes ahead.")) + return + + to_chat(src, "You tilt your head upwards.") + look_up() /mob/living/verb/lookdown() set name = "Look Down" set category = "IC" if(looking_vertically) + to_chat(src, "You set your head straight again.") end_look_down() - else - look_down() + return + + var/turf/current_turf = get_turf(src) + var/turf/below_turf = GET_TURF_BELOW(current_turf) + + //Check if turf below exists + if(!below_turf) + to_chat(src, span_warning("There's nothing interesting below. Better keep your eyes ahead.")) + return + + to_chat(src, "You tilt your head downwards.") + look_down() /** * Totals the physical cash on the mob and returns the total. diff --git a/code/modules/power/singularity/dark_matter_singularity.dm b/code/modules/power/singularity/dark_matter_singularity.dm index bd379162b13a6..294c2063b1b98 100644 --- a/code/modules/power/singularity/dark_matter_singularity.dm +++ b/code/modules/power/singularity/dark_matter_singularity.dm @@ -13,11 +13,12 @@ icon_state = "dark_matter_s1" singularity_icon_variant = "dark_matter" maximum_stage = STAGE_FOUR + energy = 250 singularity_component_type = /datum/component/singularity/bloodthirsty ///to avoid cases of the singuloth getting blammed out of existence by the very meteor it rode in on... COOLDOWN_DECLARE(initial_explosion_immunity) -/obj/singularity/dark_matter/Initialize(mapload, starting_energy = 250) +/obj/singularity/dark_matter/Initialize(mapload, starting_energy) . = ..() COOLDOWN_START(src, initial_explosion_immunity, 5 SECONDS) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 0475736f6a502..40385624007b7 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -28,7 +28,7 @@ var/maximum_stage = STAGE_SIX ///How strong are we? - var/energy = 100 + var/energy = 50 ///Do we lose energy over time? var/dissipate = TRUE /// How long should it take for us to dissipate in seconds? @@ -55,10 +55,10 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF | SHUTTLE_CRUSH_PROOF obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION -/obj/singularity/Initialize(mapload, starting_energy = 50) +/obj/singularity/Initialize(mapload, starting_energy) . = ..() - energy = starting_energy + energy = starting_energy || energy START_PROCESSING(SSsinguloprocess, src) SSpoints_of_interest.make_point_of_interest(src) @@ -70,7 +70,7 @@ singularity_component = WEAKREF(new_component) - expand(current_size) + check_energy() for (var/obj/machinery/power/singularity_beacon/singu_beacon as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/singularity_beacon)) if (singu_beacon.active) @@ -293,19 +293,19 @@ qdel(src) return FALSE switch(energy)//Some of these numbers might need to be changed up later -Mport - if(1 to 199) + if(STAGE_ONE_ENERGY_REQUIREMENT to STAGE_TWO_ENERGY_REQUIREMENT) allowed_size = STAGE_ONE - if(200 to 499) + if(STAGE_TWO_ENERGY_REQUIREMENT to STAGE_THREE_ENERGY_REQUIREMENT) allowed_size = STAGE_TWO - if(500 to 999) + if(STAGE_THREE_ENERGY_REQUIREMENT to STAGE_FOUR_ENERGY_REQUIREMENT) allowed_size = STAGE_THREE - if(1000 to 1999) + if(STAGE_FOUR_ENERGY_REQUIREMENT to STAGE_FIVE_ENERGY_REQUIREMENT) allowed_size = STAGE_FOUR - if(2000 to INFINITY) - if(energy >= 3000 && consumed_supermatter) - allowed_size = STAGE_SIX - else - allowed_size = STAGE_FIVE + if(STAGE_FIVE_ENERGY_REQUIREMENT to STAGE_SIX_ENERGY_REQUIREMENT) + allowed_size = STAGE_FIVE + if(STAGE_SIX_ENERGY_REQUIREMENT to INFINITY) + allowed_size = consumed_supermatter ? STAGE_SIX : STAGE_FIVE + if(current_size != allowed_size) expand() return TRUE @@ -496,10 +496,6 @@ . = ..() deadchat_plays(mode = DEMOCRACY_MODE) -/// Special singularity that spawns for shuttle events only -/obj/singularity/shuttle_event - anchored = FALSE - /// Special singularity spawned by being sucked into a black hole during emagged orion trail. /obj/singularity/orion move_self = FALSE @@ -512,3 +508,11 @@ /obj/singularity/orion/process(seconds_per_tick) if(SPT_PROB(0.5, seconds_per_tick)) mezzer() + +/// Special singularity that spawns for shuttle events only +/obj/singularity/shuttle_event + anchored = FALSE // this is required to work with shuttle event otherwise singularity gets stuck and doesn't move + +/obj/singularity/shuttle_event/no_escape + energy = STAGE_SIX_ENERGY + consumed_supermatter = TRUE // so we can get to the final stage diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 439c0b8d177b4..8c40d2d731aa6 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -153,10 +153,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) ///Stores the time of when the last zap occurred var/last_power_zap = 0 - ///Stores the tick of the machines subsystem of when the last zap occurred. Gives a passage of time in the perspective of SSmachines. - var/last_power_zap_perspective_machines = 0 - ///Same as [last_power_zap_perspective_machines], but based around the high energy zaps found in handle_high_power(). - var/last_high_energy_zap_perspective_machines = 0 + ///Stores the tick of the machines subsystem of when the last zap energy accumulation occurred. Gives a passage of time in the perspective of SSmachines. + var/last_energy_accumulation_perspective_machines = 0 + ///Same as [last_energy_accumulation_perspective_machines], but based around the high energy zaps found in handle_high_power(). + var/last_high_energy_accumulation_perspective_machines = 0 + /// Accumulated energy to be transferred from supermatter zaps. + var/list/zap_energy_accumulation = list() ///Do we show this crystal in the CIMS modular program var/include_in_cims = TRUE @@ -297,22 +299,25 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) // PART 3: POWER PROCESSING internal_energy_factors = calculate_internal_energy() zap_factors = calculate_zap_transmission_rate() - var/delta_time = (SSmachines.times_fired - last_power_zap_perspective_machines) * SSmachines.wait / (1 SECONDS) - if(delta_time && internal_energy && (last_power_zap + (4 - internal_energy * 0.001) SECONDS) < world.time) + var/delta_time = (SSmachines.times_fired - last_energy_accumulation_perspective_machines) * SSmachines.wait / (1 SECONDS) + var/accumulated_energy = accumulate_energy(ZAP_ENERGY_ACCUMULATION_NORMAL, energy = internal_energy * zap_transmission_rate * delta_time) + if(accumulated_energy && (last_power_zap + (4 - internal_energy * 0.001) SECONDS) < world.time) + var/discharged_energy = discharge_energy(ZAP_ENERGY_ACCUMULATION_NORMAL) playsound(src, 'sound/items/weapons/emitter2.ogg', 70, TRUE) hue_angle_shift = clamp(903 * log(10, (internal_energy + 8000)) - 3590, -50, 240) var/zap_color = color_matrix_rotate_hue(hue_angle_shift) supermatter_zap( zapstart = src, range = 3, - zap_str = internal_energy * zap_transmission_rate * delta_time, + zap_str = discharged_energy, zap_flags = ZAP_SUPERMATTER_FLAGS, - zap_cutoff = 240 KILO WATTS * delta_time, + zap_cutoff = 240 KILO JOULES, power_level = internal_energy, color = zap_color, ) + last_power_zap = world.time - last_power_zap_perspective_machines = SSmachines.times_fired + last_energy_accumulation_perspective_machines = SSmachines.times_fired // PART 4: DAMAGE PROCESSING temp_limit_factors = calculate_temp_limit() @@ -716,7 +721,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) activation_logged = TRUE // so we dont spam the log. else if(!internal_energy) last_power_zap = world.time - last_power_zap_perspective_machines = SSmachines.times_fired + last_energy_accumulation_perspective_machines = SSmachines.times_fired return additive_power /** Log when the supermatter is activated for the first time. @@ -893,6 +898,28 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) delamination_strategy.on_select(src) return TRUE +/** + * Accumulates energy for the zap_energy_accumulation key. + * Args: + * * key: The zap energy accumulation key to use. + * * energy: The amount of energy to accumulate. + * Returns: The accumulated energy for that key. + */ +/obj/machinery/power/supermatter_crystal/proc/accumulate_energy(key, energy) + . = (zap_energy_accumulation[key] ? zap_energy_accumulation[key] : 0) + energy + zap_energy_accumulation[key] = . + +/** + * Depletes a portion of the accumulated energy for the given key and returns it. Used for discharging energy from the supermatter. + * Args: + * * key: The zap energy accumulation key to use. + * * portion: The portion of the accumulated energy that gets discharged. + * Returns: The discharged energy for that key. + */ +/obj/machinery/power/supermatter_crystal/proc/discharge_energy(key, portion = ZAP_ENERGY_DISCHARGE_PORTION) + . = portion * zap_energy_accumulation[key] + zap_energy_accumulation[key] -= . + /obj/machinery/proc/supermatter_zap(atom/zapstart = src, range = 5, zap_str = 3.2 MEGA JOULES, zap_flags = ZAP_SUPERMATTER_FLAGS, list/targets_hit = list(), zap_cutoff = 1.2 MEGA JOULES, power_level = 0, zap_icon = DEFAULT_ZAP_ICON_STATE, color = null) if(QDELETED(zapstart)) return diff --git a/code/modules/power/supermatter/supermatter_extra_effects.dm b/code/modules/power/supermatter/supermatter_extra_effects.dm index a21a5ee728739..4f35c1abe7219 100644 --- a/code/modules/power/supermatter/supermatter_extra_effects.dm +++ b/code/modules/power/supermatter/supermatter_extra_effects.dm @@ -91,7 +91,7 @@ /obj/machinery/power/supermatter_crystal/proc/handle_high_power() if(internal_energy <= POWER_PENALTY_THRESHOLD && damage <= danger_point) //If the power is above 5000 or if the damage is above 550 - last_high_energy_zap_perspective_machines = SSmachines.times_fired //Prevent oddly high initial zap due to high energy zaps not getting triggered via too low energy. + last_high_energy_accumulation_perspective_machines = SSmachines.times_fired //Prevent oddly high initial zap due to high energy zaps not getting triggered via too low energy. return var/range = 4 zap_cutoff = 1500 @@ -129,11 +129,13 @@ if(zap_count >= 1) playsound(loc, 'sound/items/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) - var/delta_time = (SSmachines.times_fired - last_high_energy_zap_perspective_machines) * SSmachines.wait / (1 SECONDS) - if(delta_time) + var/delta_time = (SSmachines.times_fired - last_high_energy_accumulation_perspective_machines) * SSmachines.wait / (1 SECONDS) + var/accumulated_energy = accumulate_energy(ZAP_ENERGY_ACCUMULATION_HIGH_ENERGY, energy = clamp(internal_energy * 3200, 6.4e6, 3.2e7) * delta_time) + if(accumulated_energy) for(var/i in 1 to zap_count) - supermatter_zap(src, range, clamp(internal_energy * 3200, 6.4e6, 3.2e7) * delta_time, flags, zap_cutoff = src.zap_cutoff * delta_time, power_level = internal_energy, zap_icon = src.zap_icon) - last_high_energy_zap_perspective_machines = SSmachines.times_fired + var/discharged_energy = discharge_energy(ZAP_ENERGY_ACCUMULATION_HIGH_ENERGY, portion = 1 - (1 - ZAP_ENERGY_DISCHARGE_PORTION) ** INVERSE(zap_count)) + supermatter_zap(src, range = range, zap_str = discharged_energy, zap_flags = flags, zap_cutoff = src.zap_cutoff, power_level = internal_energy, zap_icon = src.zap_icon) + last_high_energy_accumulation_perspective_machines = SSmachines.times_fired if(prob(5)) supermatter_anomaly_gen(src, FLUX_ANOMALY, rand(5, 10)) if(prob(5)) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 0648f7992487b..b4cd8fa490472 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -77,7 +77,10 @@ recharge_newshot() //and try to charge a new shot update_appearance() -/obj/item/gun/energy/get_cell() +/obj/item/gun/energy/get_cell(atom/movable/interface, mob/user) + if(istype(interface, /obj/item/inducer)) + to_chat(user, span_alert("Error: unable to interface with [interface].")) + return null return cell /obj/item/gun/energy/Initialize(mapload) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index d8cc74b1079a6..39fcf59eae827 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1093,7 +1093,7 @@ var/mob/living/carbon/human/human_mob = affected_mob if (ismonkey(human_mob)) if (!HAS_TRAIT(human_mob, TRAIT_BORN_MONKEY)) - human_mob.dna.remove_mutation(/datum/mutation/human/race) + human_mob.dna.remove_mutation(/datum/mutation/human/race, mutadone = TRUE) else if (HAS_TRAIT(human_mob, TRAIT_BORN_MONKEY)) human_mob.monkeyize() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 06537e591c976..8e8d9c1b9b15e 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -138,7 +138,7 @@ */ /obj/item/reagent_containers/syringe/on_accidental_consumption(mob/living/carbon/victim, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) if(source_item) - to_chat(victim, span_boldwarning("There's a [src] in [source_item]!!")) + to_chat(victim, span_boldwarning("There's \a [src] in [source_item]!!")) else to_chat(victim, span_boldwarning("[src] injects you!")) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 907d76c575a9f..bf6e81a955760 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -1210,6 +1210,7 @@ event_list.Add(event) if(launch_status == ENDGAME_LAUNCHED) event.start_up_event(0) + return event #ifdef TESTING #undef DOCKING_PORT_HIGHLIGHT diff --git a/code/modules/shuttle/shuttle_events/blackhole.dm b/code/modules/shuttle/shuttle_events/blackhole.dm new file mode 100644 index 0000000000000..c73245be926a9 --- /dev/null +++ b/code/modules/shuttle/shuttle_events/blackhole.dm @@ -0,0 +1,82 @@ +///Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through +/datum/shuttle_event/simple_spawner/black_hole + name = "Black Hole (Oh no!)" + event_probability = 0 // only admin spawnable + spawn_probability_per_process = 10 + activation_fraction = 0.35 + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + spawning_list = list(/obj/singularity/shuttle_event = 1) + // only spawn it once + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +///Kobayashi Maru version +/datum/shuttle_event/simple_spawner/black_hole/adminbus + name = "Black Holes (OH GOD!)" + spawn_probability_per_process = 50 + activation_fraction = 0.2 + spawning_list = list(/obj/singularity/shuttle_event = 10) + remove_from_list_when_spawned = TRUE + +/// No Escape traitor final objective +/datum/shuttle_event/simple_spawner/black_hole/no_escape + name = "Black Hole Massive (is not admin spawnable)" + spawn_probability_per_process = -1.875 // starts in the negative but increases over time + activation_fraction = 0 // no delay + spawning_list = list(/obj/singularity/shuttle_event/no_escape = 1) + remove_from_list_when_spawned = TRUE + /// How much the spawn_probability_per_process increases or decreases over time + /// since spawn_probability starts negative after 15 seconds the prob reaches 0% + /// then every 8 seconds after, the prob increases by ~1% + var/probability_rate_of_change = 0.125 + /// The beacon that is drawing the singularity closer to the escape shuttle + var/obj/machinery/power/singularity_beacon/syndicate/no_escape/beacon + +/datum/shuttle_event/simple_spawner/black_hole/no_escape/proc/announcement() + priority_announce( + text = "Sensors indicate that a black hole's gravitational field is affecting the region of space we are heading through.", + title = "The Orion Trail", + sound = 'sound/announcer/notice/notice1.ogg', + has_important_message = TRUE, + sender_override = "Emergency Shuttle", + color_override = "red", + ) + +/datum/shuttle_event/simple_spawner/black_hole/no_escape/activate() + . = ..() + + addtimer(CALLBACK(src, PROC_REF(announcement)), 5 SECONDS) + port.setTimer(port.timeLeft(1) + 1 MINUTES) // the singularity causes a time distortion + +/datum/shuttle_event/simple_spawner/black_hole/no_escape/event_process() + . = ..() + if(!.) + return + + if((SSshuttle.emergency.mode == SHUTTLE_ESCAPE)) // only while shuttle is in transit + if(beacon && beacon.active) + var/area/escape_shuttle_area = get_area(beacon) + if(istype(escape_shuttle_area, /area/shuttle/escape) && SSshuttle.emergency.is_in_shuttle_bounds(beacon)) + spawn_probability_per_process += probability_rate_of_change + else // beacon is not on shuttle and likely got jettisoned in space + // since the beacon is still powered and attracting the singularity it results in x2 rate of decrease + spawn_probability_per_process -= (probability_rate_of_change * 2) + else // beacon is unpowered or destroyed + spawn_probability_per_process -= probability_rate_of_change + + if(prob(spawn_probability_per_process)) + spawn_movable(get_type_to_spawn()) + return SHUTTLE_EVENT_CLEAR + +/datum/shuttle_event/simple_spawner/black_hole/no_escape/get_spawn_turf() + RETURN_TYPE(/turf) + + if(beacon && beacon.active) + var/area/escape_shuttle_area = get_area(beacon) + if(istype(escape_shuttle_area, /area/shuttle/escape) && SSshuttle.emergency.is_in_shuttle_bounds(beacon)) + // beacon is active and on shuttle so singularity will directly hit the shuttle + return pick(spawning_turfs_hit) + + // otherwise beacon is turned off, destroyed, or spaced so there is a chance to miss + // the singularity is 11x11 so even a miss can have a glancing hit against the shuttle + return pick(spawning_turfs_hit + spawning_turfs_miss) diff --git a/code/modules/shuttle/shuttle_events/misc.dm b/code/modules/shuttle/shuttle_events/misc.dm index 4891d5af7998f..9f6db855a7611 100644 --- a/code/modules/shuttle/shuttle_events/misc.dm +++ b/code/modules/shuttle/shuttle_events/misc.dm @@ -38,25 +38,3 @@ while(islist(spawn_list)) spawn_list = pick_weight(spawn_list) return spawn_list - -///Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through -/datum/shuttle_event/simple_spawner/black_hole - name = "Black Hole (Oh no! Just one though!)" - event_probability = 0 // only admin spawnable - spawn_probability_per_process = 10 - activation_fraction = 0.35 - spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE - spawning_list = list(/obj/singularity/shuttle_event = 1) - // only spawn it once - remove_from_list_when_spawned = TRUE - self_destruct_when_empty = TRUE - -///Kobayashi Maru version -/datum/shuttle_event/simple_spawner/black_hole/adminbus - name = "Black Holes (OH GOD! Will literally kill everyone!)" - event_probability = 0 - spawn_probability_per_process = 50 - activation_fraction = 0.2 - spawning_list = list(/obj/singularity/shuttle_event = 10) - remove_from_list_when_spawned = TRUE - diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index c53443503fdd5..54aeaf52e39a1 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -207,9 +207,9 @@ if(arm_owner.hud_used) var/atom/movable/screen/inventory/hand/associated_hand = arm_owner.hud_used.hand_slots["[held_index]"] associated_hand?.update_appearance() - if(arm_owner.gloves) - arm_owner.dropItemToGround(arm_owner.gloves, TRUE) . = ..() + if(arm_owner.num_hands == 0) + arm_owner.dropItemToGround(arm_owner.gloves, TRUE) arm_owner.update_worn_gloves() //to remove the bloody hands overlay /obj/item/bodypart/leg/drop_limb(special, dismembered, move_to_floor = TRUE) diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index c4cfd2410d261..0ec9373249a17 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -361,7 +361,7 @@ name = "Simian Agent Reinforcements" desc = "Call in an extremely well trained monkey secret agent from our Syndicate Banana Department. \ They've been trained to operate machinery and can read, but they can't speak Common. \ - Please note that these are free-range monkeys that don't react with Mutadone." + Please note that these are free-range monkeys that don't react with Mutadone. May contain severe allergies to species-changing phenomena." item = /obj/item/antag_spawner/loadout/monkey_man cost = 6 restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_GENETICIST, JOB_ASSISTANT, JOB_MIME, JOB_CLOWN, JOB_PUN_PUN) diff --git a/config/config.txt b/config/config.txt index 151fcc4959325..a34f8c84a6a89 100644 --- a/config/config.txt +++ b/config/config.txt @@ -230,6 +230,8 @@ REQUEST_INTERNET_ALLOWED youtube\.com\/watch?v=,youtu\.be\/,soundcloud\.com\/,ba ## Jobs have specific "keys" tied to their in-game datums, those should sync up otherwise it will fail to load. ## Setting Total/Spawn Positions to -1 will open unlimited join slots for it. ## Playtime Requirements is in minutes, Required Account Age is in days. +## Human Authority Whitelist Setting can either be 0 or 1. +## Make sure to read the start of the file to get a more in-depth explanation of what each entry does! #LOAD_JOBS_FROM_TXT ## Uncomment this to forbid admins from possessing the singularity. diff --git a/config/game_options.txt b/config/game_options.txt index 230e0a7b0d1b7..6e4ab55ec3db5 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -122,11 +122,12 @@ PROTECT_ROLES_FROM_ANTAGONIST ## Uncomment to prohibit assistants from becoming most antagonists. #PROTECT_ASSISTANT_FROM_ANTAGONIST -## If non-human species are barred from joining as a head of staff -#ENFORCE_HUMAN_AUTHORITY - -## If non-human species are barred from joining as a head of staff, including jobs flagged as allowed for non-humans, ie. Quartermaster. -#ENFORCE_HUMAN_AUTHORITY_ON_EVERYONE +## How human authority should be distributed. Can be set to four options (Make sure that what you type is exact!): +## "DISABLED"/Comment out/Put any invalid value: non-human races can be heads of staff and "human only" settings on jobs will be fully ignored. +## "HUMAN_WHITELIST": all heads-of-staff jobs will be able to be played by non-humans, unless that job incorporates the "human only" flag (Which can be configured via a variable or the job config txt). +## "NON_HUMAN_WHITELIST": non-humans will not be able to play as heads of staff, unless that job incorporates the "allow non-humans" flag (Which can be configured via a variable or the job config txt). +## "ENFORCED": non-humans cannot be heads of staff, only humans can. the "allow non-humans" setting will be ignored. +HUMAN_AUTHORITY HUMAN_WHITELIST ## If late-joining players have a chance to become a traitor/changeling ALLOW_LATEJOIN_ANTAGONISTS @@ -552,4 +553,4 @@ MAX_POSITIVE_QUIRKS 6 # A config that skews with the random spawners weights # If the value is lower than 1, it'll tend to even out the odds # If higher than 1, it'll lean toward common spawns even more. -RANDOM_LOOT_WEIGHT_MODIFIER 1 \ No newline at end of file +RANDOM_LOOT_WEIGHT_MODIFIER 1 diff --git a/config/jobconfig.toml b/config/jobconfig.toml index 294868e28bb5e..9296a5b9fc9ec 100644 --- a/config/jobconfig.toml +++ b/config/jobconfig.toml @@ -1,11 +1,12 @@ ## This is the configuration file for the job system. ## This will only be enabled when the config flag LOAD_JOBS_FROM_TXT is enabled. ## We use a system of keys here that directly correlate to the job, just to ensure they don't desync if we choose to change the name of a job. -## You are able to change (as of now) five different variables in this file. +## You are able to change (as of now) five (six if the job is a command head) different variables in this file. ## Total Positions are how many job slots you get in a shift, Spawn Positions are how many you get that load in at spawn. If you set this to -1, it is unrestricted. ## Playtime Requirements is in minutes, and the job will unlock when a player reaches that amount of time. ## However, that can be superseded by Required Account Age, which is a time in days that you need to have had an account on the server for. ## Also there is a required character age in years. It prevents player from joining as this job, if their character's age as is lower than required. Setting it to 0 means it is turned off for this job. +## Lastly there's Human Authority Whitelist Setting. You can set it to either "HUMANS_ONLY" or "NON_HUMANS_ALLOWED". Check the "Human Authority" setting on the game_options file to know which you should choose. Note that this entry only appears on jobs that are marked as heads of staff. ## As time goes on, more config options may be added to this file. ## You can use the admin verb 'Generate Job Configuration' in-game to auto-regenerate this config as a downloadable file without having to manually edit this file if we add more jobs or more things you can edit here. @@ -61,6 +62,7 @@ "# Total Positions" = 3 [CAPTAIN] +"# Human Authority Whitelist Setting" = "HUMANS_ONLY" "# Playtime Requirements" = 180 "# Required Account Age" = 14 "# Required Character Age" = 0 @@ -89,6 +91,7 @@ "# Total Positions" = 2 [CHIEF_ENGINEER] +"# Human Authority Whitelist Setting" = "HUMANS_ONLY" "# Playtime Requirements" = 180 "# Required Account Age" = 7 "# Required Character Age" = 0 @@ -96,6 +99,7 @@ "# Total Positions" = 1 [CHIEF_MEDICAL_OFFICER] +"# Human Authority Whitelist Setting" = "HUMANS_ONLY" "# Playtime Requirements" = 180 "# Required Account Age" = 7 "# Required Character Age" = 0 @@ -134,7 +138,7 @@ "# Playtime Requirements" = 120 "# Required Account Age" = 21 "# Required Character Age" = 0 -"# Spawn Positions" = 1 +"# Spawn Positions" = 3 "# Total Positions" = 0 [DETECTIVE] @@ -152,6 +156,7 @@ "# Total Positions" = 2 [HEAD_OF_PERSONNEL] +"# Human Authority Whitelist Setting" = "HUMANS_ONLY" "# Playtime Requirements" = 180 "# Required Account Age" = 10 "# Required Character Age" = 0 @@ -159,6 +164,7 @@ "# Total Positions" = 1 [HEAD_OF_SECURITY] +"# Human Authority Whitelist Setting" = "HUMANS_ONLY" "# Playtime Requirements" = 300 "# Required Account Age" = 14 "# Required Character Age" = 0 @@ -215,6 +221,7 @@ "# Total Positions" = 1 [QUARTERMASTER] +"# Human Authority Whitelist Setting" = "NON_HUMANS_ALLOWED" "# Playtime Requirements" = 0 "# Required Account Age" = 7 "# Required Character Age" = 0 @@ -222,6 +229,7 @@ "# Total Positions" = 1 [RESEARCH_DIRECTOR] +"# Human Authority Whitelist Setting" = "HUMANS_ONLY" "# Playtime Requirements" = 180 "# Required Account Age" = 7 "# Required Character Age" = 0 diff --git a/config/spaceruinblacklist.txt b/config/spaceruinblacklist.txt index f2ff777c1c07f..6df29bb5ace53 100644 --- a/config/spaceruinblacklist.txt +++ b/config/spaceruinblacklist.txt @@ -20,6 +20,9 @@ #_maps/RandomRuins/SpaceRuins/caravanambush.dmm #_maps/RandomRuins/SpaceRuins/clericden.dmm #_maps/RandomRuins/SpaceRuins/clownplanet.dmm +#_maps/RandomRuins/SpaceRuins/commsbuoy_lowtech.dmm +#_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm +#_maps/RandomRuins/SpaceRuins/commsbuoy_pirate.dmm #_maps/RandomRuins/SpaceRuins/crashedclownship.dmm #_maps/RandomRuins/SpaceRuins/crashedship.dmm #_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm diff --git a/html/changelogs/AutoChangeLog-pr-86582.yml b/html/changelogs/AutoChangeLog-pr-86582.yml new file mode 100644 index 0000000000000..fd91ce5c58774 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86582.yml @@ -0,0 +1,6 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Space carps and space dragons can now fish. Space dragons can now eat fish too, for a very mild healing." + - rscadd: "The carp rift is now a fishing spot, filled with carp-related loot, including baby space carps (aquarium fish that eventually grows into a real space carp in a matter of half a dozen minutes)." + - rscadd: "Added a shark form (and relative achievement) to space dragons, unlocked after eating an unspecificatedly high amount of fish." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86688.yml b/html/changelogs/AutoChangeLog-pr-86688.yml new file mode 100644 index 0000000000000..03dd6c4733d85 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86688.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - bugfix: "We found out that the money meant to purchase mutation vaccines for Syndicate Monkey agents against mutation was being embezzled to buy Space Yachts. We've repurposed their biomass towards a new and improved vaccine, which has the minor side effect of causing allergies if their species type is forcibly altered." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86700.yml b/html/changelogs/AutoChangeLog-pr-86700.yml new file mode 100644 index 0000000000000..a747e816cc210 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86700.yml @@ -0,0 +1,4 @@ +author: "Pickle-Coding" +delete-after: True +changes: + - balance: "The supermatter accumulates zap energy and discharges a portion of it to use for zapping per atmos tick, no longer being bounded by machinery ticking." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86796.yml b/html/changelogs/AutoChangeLog-pr-86796.yml new file mode 100644 index 0000000000000..1e219e5020fd7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86796.yml @@ -0,0 +1,4 @@ +author: "timothymtorres" +delete-after: True +changes: + - rscadd: "Add no escape final traitor objective that spawns a stage six (11x11) singularity shuttle event." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86815.yml b/html/changelogs/AutoChangeLog-pr-86815.yml new file mode 100644 index 0000000000000..aa6406fe7ac00 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86815.yml @@ -0,0 +1,4 @@ +author: "mc-oofert" +delete-after: True +changes: + - balance: "you may wear gloves one armed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86872.yml b/html/changelogs/AutoChangeLog-pr-86872.yml new file mode 100644 index 0000000000000..6710bbcacbeb0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86872.yml @@ -0,0 +1,4 @@ +author: "OrionTheFox" +delete-after: True +changes: + - rscadd: "3 new Space Ruins: two small Comms Buoys (fluff) and an NT Bluespace Comms Buoy. Employees are asked not to touch vital components when nearby this critical infrastructure." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86886.yml b/html/changelogs/AutoChangeLog-pr-86886.yml new file mode 100644 index 0000000000000..8ef2ca5babe68 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86886.yml @@ -0,0 +1,4 @@ +author: "TheSmallBlue" +delete-after: True +changes: + - config: "Both human authority settings were combined into a singular one, allowing for more flexibility" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86927.yml b/html/changelogs/AutoChangeLog-pr-86927.yml new file mode 100644 index 0000000000000..fd2788c4166a8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86927.yml @@ -0,0 +1,4 @@ +author: "ViralMilk22" +delete-after: True +changes: + - map: "Additional Icebox Ruin has been added \"Hunters Lodge\"." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86929.yml b/html/changelogs/AutoChangeLog-pr-86929.yml new file mode 100644 index 0000000000000..4b0754a90ced8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86929.yml @@ -0,0 +1,7 @@ +author: "SyncIt21" +delete-after: True +changes: + - qol: "adds extra examines & screentips for inducer" + - bugfix: "inducer charging rate scales with cell rating" + - bugfix: "syndicate inducers now have correct charge & batteries installed" + - refactor: "inducer attack chain has been improved & redundant vars/procs have been removed, report bugs on github" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86953.yml b/html/changelogs/AutoChangeLog-pr-86953.yml new file mode 100644 index 0000000000000..5d7f9943274b7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86953.yml @@ -0,0 +1,6 @@ +author: "JohnFulpWillard" +delete-after: True +changes: + - balance: "Human AIs spawn with a space suit on Wawastation." + - balance: "Human AIs no longer have slowdown and a ton of restrictions such as ladders when outside of the satellite." + - qol: "Spawning in with a space suit now has its thermal regulation on by default." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86964.yml b/html/changelogs/AutoChangeLog-pr-86964.yml new file mode 100644 index 0000000000000..d9287ddde95f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86964.yml @@ -0,0 +1,4 @@ +author: "grungussuss and redemptionarc" +delete-after: True +changes: + - sound: "snoring now has sounds, snoring will happen more often while asleep" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87009.yml b/html/changelogs/AutoChangeLog-pr-87009.yml new file mode 100644 index 0000000000000..84289dd16449d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87009.yml @@ -0,0 +1,7 @@ +author: "Jewelry-x" +delete-after: True +changes: + - bugfix: "fixed not being able to stop looking up or down if unable to find something until you found something" + - qol: "feedback for \"Look Up\" or \"Look Down\" verbs to reduce confusion caused by the verbs" + - qol: "limited usage of \"Look Up\" and \"Look Down\" to cases where there is a turf above your or below you accordingly" + - qol: "automatically stops you from looking up or down when there is no turf above or below you" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87011.yml b/html/changelogs/AutoChangeLog-pr-87011.yml new file mode 100644 index 0000000000000..8d02bd6520278 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87011.yml @@ -0,0 +1,6 @@ +author: "Melbert" +delete-after: True +changes: + - rscdel: "Having any wounds no longer gives you an alert in the top right" + - qol: "Having any wounds now make the corresponding bodypart on your health doll (the lil dude on the right side of the screen) glow red." + - refactor: "Refactored how the hud's health doll shows up for humans. Report any oddities" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87027.yml b/html/changelogs/AutoChangeLog-pr-87027.yml new file mode 100644 index 0000000000000..ad97813ea25f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87027.yml @@ -0,0 +1,4 @@ +author: "DaCoolBoss" +delete-after: True +changes: + - balance: "MI13 Fugitive Hunters can no longer spawn with machine trappers, instead they may now spawn with thermal goggles." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87035.yml b/html/changelogs/AutoChangeLog-pr-87035.yml new file mode 100644 index 0000000000000..a7fba947d8993 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87035.yml @@ -0,0 +1,4 @@ +author: "OrionTheFox" +delete-after: True +changes: + - spellcheck: "added a 's to Personal/Job lockers created with card readers, renamed 'Departmental' to 'Job' to prevent confusion, and made the description easier to read" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87049.yml b/html/changelogs/AutoChangeLog-pr-87049.yml new file mode 100644 index 0000000000000..341e5a14c38a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87049.yml @@ -0,0 +1,5 @@ +author: "grungussuss" +delete-after: True +changes: + - bugfix: "fixed a clientless AI spawning when a ghost poll for syndicate modsuit AI had no volunteers" + - admin: "AI rolebanned players can no longer role for Syndicate modsuit AI" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87059.yml b/html/changelogs/AutoChangeLog-pr-87059.yml new file mode 100644 index 0000000000000..1d7c139595a58 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87059.yml @@ -0,0 +1,5 @@ +author: "00-Steven" +delete-after: True +changes: + - bugfix: "Syringes can be put into cake/bread/cheese on right click again." + - spellcheck: "Biting into a hidden syringe no longer displays things like \"a the syringe\"." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87062.yml b/html/changelogs/AutoChangeLog-pr-87062.yml new file mode 100644 index 0000000000000..12ebc4edc59ed --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87062.yml @@ -0,0 +1,4 @@ +author: "Jewelry-x" +delete-after: True +changes: + - spellcheck: "capitalise cure_text for advanced slime mutation" \ No newline at end of file diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index d8b68c88d3812..28fc7bd210b6f 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/hud/radial_fishing.dmi b/icons/hud/radial_fishing.dmi index 90b2b17c83a8a..d77d9064882ff 100644 Binary files a/icons/hud/radial_fishing.dmi and b/icons/hud/radial_fishing.dmi differ diff --git a/icons/hud/screen_gen.dmi b/icons/hud/screen_gen.dmi index 86383abbef1e2..5b1c24d7789cc 100644 Binary files a/icons/hud/screen_gen.dmi and b/icons/hud/screen_gen.dmi differ diff --git a/icons/mob/nonhuman-player/spacedragon.dmi b/icons/mob/nonhuman-player/spacedragon.dmi index a1f3d4d782bc9..a453b4441e3a5 100644 Binary files a/icons/mob/nonhuman-player/spacedragon.dmi and b/icons/mob/nonhuman-player/spacedragon.dmi differ diff --git a/icons/obj/aquarium/fish.dmi b/icons/obj/aquarium/fish.dmi index eec60317b0e08..deabb8c7a3681 100644 Binary files a/icons/obj/aquarium/fish.dmi and b/icons/obj/aquarium/fish.dmi differ diff --git a/icons/obj/fluff/general.dmi b/icons/obj/fluff/general.dmi index f99cbaabc9a1d..b05ce2f83e8bb 100644 Binary files a/icons/obj/fluff/general.dmi and b/icons/obj/fluff/general.dmi differ diff --git a/icons/ui/achievements/achievements.dmi b/icons/ui/achievements/achievements.dmi index 740759467e0cc..8f6b9e1f42af9 100644 Binary files a/icons/ui/achievements/achievements.dmi and b/icons/ui/achievements/achievements.dmi differ diff --git a/sound/mobs/humanoids/human/snore/attribution.txt b/sound/mobs/humanoids/human/snore/attribution.txt new file mode 100644 index 0000000000000..e462719312383 --- /dev/null +++ b/sound/mobs/humanoids/human/snore/attribution.txt @@ -0,0 +1,2 @@ +male snores voiced by sadboysuss, license - CC-BY-SA +female snores and mimimi voiced by redemptionarc, license - CC-BY-SA diff --git a/sound/mobs/humanoids/human/snore/snore_female1.ogg b/sound/mobs/humanoids/human/snore/snore_female1.ogg new file mode 100644 index 0000000000000..51cfeb0424fa6 Binary files /dev/null and b/sound/mobs/humanoids/human/snore/snore_female1.ogg differ diff --git a/sound/mobs/humanoids/human/snore/snore_female2.ogg b/sound/mobs/humanoids/human/snore/snore_female2.ogg new file mode 100644 index 0000000000000..c5a9b44a4b896 Binary files /dev/null and b/sound/mobs/humanoids/human/snore/snore_female2.ogg differ diff --git a/sound/mobs/humanoids/human/snore/snore_female3.ogg b/sound/mobs/humanoids/human/snore/snore_female3.ogg new file mode 100644 index 0000000000000..68adb30fb1e29 Binary files /dev/null and b/sound/mobs/humanoids/human/snore/snore_female3.ogg differ diff --git a/sound/mobs/humanoids/human/snore/snore_male1.ogg b/sound/mobs/humanoids/human/snore/snore_male1.ogg new file mode 100644 index 0000000000000..3c9dfe97be8e2 Binary files /dev/null and b/sound/mobs/humanoids/human/snore/snore_male1.ogg differ diff --git a/sound/mobs/humanoids/human/snore/snore_male2.ogg b/sound/mobs/humanoids/human/snore/snore_male2.ogg new file mode 100644 index 0000000000000..de5993e518799 Binary files /dev/null and b/sound/mobs/humanoids/human/snore/snore_male2.ogg differ diff --git a/sound/mobs/humanoids/human/snore/snore_male3.ogg b/sound/mobs/humanoids/human/snore/snore_male3.ogg new file mode 100644 index 0000000000000..cd63a7fb4cfd0 Binary files /dev/null and b/sound/mobs/humanoids/human/snore/snore_male3.ogg differ diff --git a/sound/mobs/humanoids/human/snore/snore_male4.ogg b/sound/mobs/humanoids/human/snore/snore_male4.ogg new file mode 100644 index 0000000000000..fce8320a6c7e2 Binary files /dev/null and b/sound/mobs/humanoids/human/snore/snore_male4.ogg differ diff --git a/sound/mobs/humanoids/human/snore/snore_male5.ogg b/sound/mobs/humanoids/human/snore/snore_male5.ogg new file mode 100644 index 0000000000000..6773add51eccb Binary files /dev/null and b/sound/mobs/humanoids/human/snore/snore_male5.ogg differ diff --git a/sound/mobs/humanoids/human/snore/snore_mimimi1.ogg b/sound/mobs/humanoids/human/snore/snore_mimimi1.ogg new file mode 100644 index 0000000000000..31f84ec2a14aa Binary files /dev/null and b/sound/mobs/humanoids/human/snore/snore_mimimi1.ogg differ diff --git a/sound/mobs/humanoids/human/snore/snore_mimimi2.ogg b/sound/mobs/humanoids/human/snore/snore_mimimi2.ogg new file mode 100644 index 0000000000000..21d4f9f07d4f2 Binary files /dev/null and b/sound/mobs/humanoids/human/snore/snore_mimimi2.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 780c17d90deff..f26c253b981b2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1622,6 +1622,7 @@ #include "code\datums\id_trim\syndicate.dm" #include "code\datums\job_configs\_job_configs.dm" #include "code\datums\job_configs\default_positions.dm" +#include "code\datums\job_configs\human_authority.dm" #include "code\datums\job_configs\playtime_requirements.dm" #include "code\datums\job_configs\required_account_age.dm" #include "code\datums\job_configs\required_character_age.dm" @@ -3332,6 +3333,7 @@ #include "code\modules\antagonists\traitor\objectives\final_objective\battlecruiser.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\final_objective.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\infect_ai.dm" +#include "code\modules\antagonists\traitor\objectives\final_objective\no_escape.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\objective_dark_matteor.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\romerol.dm" #include "code\modules\antagonists\traitor\objectives\final_objective\supermatter_cascade.dm" @@ -4622,6 +4624,7 @@ #include "code\modules\mapfluff\ruins\spaceruin_code\bigderelict1.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\caravanambush.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\clericsden.dm" +#include "code\modules\mapfluff\ruins\spaceruin_code\commsbuoy.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\crashedclownship.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\crashedship.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\cyborgmothership.dm" @@ -5894,6 +5897,7 @@ #include "code\modules\shuttle\syndicate.dm" #include "code\modules\shuttle\white_ship.dm" #include "code\modules\shuttle\shuttle_events\_shuttle_events.dm" +#include "code\modules\shuttle\shuttle_events\blackhole.dm" #include "code\modules\shuttle\shuttle_events\carp.dm" #include "code\modules\shuttle\shuttle_events\humans.dm" #include "code\modules\shuttle\shuttle_events\meteors.dm"