diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_outpost31.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_outpost31.dmm new file mode 100644 index 00000000000..fe7878295d5 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_outpost31.dmm @@ -0,0 +1,4310 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ah" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/window/spawner/directional/east, +/obj/structure/table, +/obj/item/bikehorn/rubberducky, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"ai" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"an" = ( +/obj/effect/decal/cleanable/blood/old, +/mob/living/basic/fleshblob, +/turf/open/floor/iron/white, +/area/ruin/outpost31/medical) +"aq" = ( +/turf/closed/wall, +/area/ruin/outpost31/recroom) +"au" = ( +/obj/machinery/light/small/dim/directional/east, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/outpost31/crewquarters) +"aM" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/girder, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"aP" = ( +/obj/machinery/vending/boozeomat{ + onstation = 0 + }, +/obj/effect/mapping_helpers/broken_machine, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/outpost31/recroom) +"aV" = ( +/turf/closed/wall, +/area/ruin/outpost31/kitchendiningroom) +"bb" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"bg" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses, +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/outpost31/recroom) +"bp" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/airalarm/directional/east, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron, +/area/ruin/outpost31) +"by" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/barricade/wooden/crude/snow{ + opacity = 1 + }, +/turf/open/floor/plating, +/area/ruin/outpost31/commander_room) +"bE" = ( +/obj/structure/cable, +/obj/effect/mob_spawn/corpse/human/damaged{ + husk = 1; + burn_damage = 1000; + brute_damage = 0 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"bW" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/status_display{ + pixel_x = 32; + current_mode = 3; + current_picture = "biohazard" + }, +/turf/open/floor/iron/white{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"bX" = ( +/obj/structure/sink/kitchen/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"cd" = ( +/obj/item/reagent_containers/blood{ + pixel_x = 4; + pixel_y = 0 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/iron/white/smooth_half, +/area/ruin/outpost31/medical) +"ce" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"cf" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/frame/machine/secured, +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"ch" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/white/smooth_corner, +/area/ruin/outpost31/medical) +"ck" = ( +/obj/structure/closet, +/obj/item/tank/internals/plasma/full, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"cm" = ( +/obj/machinery/power/rtg/advanced{ + power_gen = 25000 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/west, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"cp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"cu" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"cw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"cy" = ( +/turf/closed/indestructible/reinforced, +/area/ruin/outpost31/medical) +"cz" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/window/spawner/directional/east, +/obj/structure/table, +/obj/effect/spawner/random/maintenance/no_decals, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"db" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"dm" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/status_display{ + pixel_x = -32; + current_mode = 3; + current_picture = "biohazard" + }, +/turf/open/floor/iron/white{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"dt" = ( +/obj/effect/puzzle_poddoor_open{ + id = "thingbosslootroom"; + queue_id = "thingbosslootroom" + }, +/turf/closed/indestructible/reinforced, +/area/ruin/outpost31/lootroom) +"dH" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"dK" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/machinery/duct, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"dP" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/iron/textured_half, +/area/ruin/outpost31) +"dV" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate, +/obj/item/stack/sheet/rglass/fifty, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"dW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"dZ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white/end{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31/crewquarters) +"eb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"eg" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/half_full{ + pixel_x = -3; + pixel_y = 16 + }, +/obj/item/cigarette/cigar/premium, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/outpost31/recroom) +"ep" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"eu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"eI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"eL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/outpost31/recroom) +"eS" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/white/smooth_half, +/area/ruin/outpost31/medical) +"eT" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/obj/effect/spawner/random/entertainment/arcade, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"fb" = ( +/obj/machinery/shower/directional/west, +/obj/structure/curtain, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"fC" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"fH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/recroom) +"fI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"fL" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/mapping_helpers/airlock/autoname, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"fM" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"fW" = ( +/obj/structure/chair, +/turf/open/floor/iron/textured_half{ + dir = 1 + }, +/area/ruin/outpost31) +"ge" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/catwalk_floor/iron, +/area/ruin/outpost31) +"gi" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/white, +/area/ruin/outpost31/medical) +"gu" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"gC" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/organ/brain/cybernetic/ai, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"gM" = ( +/turf/open/floor/iron/white, +/area/ruin/outpost31/medical) +"gO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"gZ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"he" = ( +/turf/closed/wall/r_wall, +/area/ruin/outpost31/medical) +"hi" = ( +/obj/item/ammo_casing/spent, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/underground/explored) +"ho" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/item/flamethrower, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"hs" = ( +/obj/structure/table, +/obj/machinery/processor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"ht" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"hD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"hN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"hT" = ( +/obj/machinery/light/warm/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"ih" = ( +/obj/structure/closet{ + name = "winter gear closet" + }, +/obj/item/clothing/suit/hooded/wintercoat/eva, +/obj/item/clothing/shoes/winterboots/ice_boots/eva, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"in" = ( +/mob/living/basic/boss/thing{ + dir = 1 + }, +/turf/open/indestructible/vault{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"iA" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"iH" = ( +/obj/structure/window/spawner/directional/west, +/obj/machinery/shower/directional/north, +/obj/structure/curtain, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"jl" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/paper, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"jv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair, +/turf/open/floor/plating, +/area/ruin/outpost31) +"jL" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"jM" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/textured_half{ + dir = 1 + }, +/area/ruin/outpost31) +"jN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"jP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"kh" = ( +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"ko" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/ammo_casing/spent, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"ks" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/closet/crate/bin, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"kA" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/recroom) +"kF" = ( +/obj/effect/mob_spawn/corpse{ + mob_type = /mob/living/basic/mining/wolf + }, +/turf/open/floor/wood, +/area/ruin/outpost31/kennel) +"kP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"kX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/mob/living/basic/fleshblob, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"lr" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/item/paperwork{ + desc = "Whatever nerd stuff they did down here."; + name = "map scraps"; + pixel_x = -5; + pixel_y = 15 + }, +/obj/item/pen/fountain{ + pixel_x = -5; + pixel_y = -8 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 9; + pixel_y = 0 + }, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"lz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"lF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/catwalk_floor/iron, +/area/ruin/outpost31) +"lM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"lO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"lR" = ( +/obj/structure/table/wood, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"lT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/barricade/wooden/crude/snow{ + opacity = 1 + }, +/turf/open/floor/plating, +/area/ruin/outpost31/kitchendiningroom) +"lU" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/white/smooth_half, +/area/ruin/outpost31/medical) +"lW" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/underground/explored) +"me" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/vending/snack, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"mq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/girder, +/turf/open/floor/plating, +/area/ruin/outpost31) +"mO" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"mU" = ( +/obj/machinery/door/airlock/public/glass, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/dark, +/area/ruin/outpost31) +"mV" = ( +/obj/machinery/light/warm/directional/north, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"mW" = ( +/turf/open/floor/circuit/red/off{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"ne" = ( +/turf/closed/wall/r_wall, +/area/ruin/outpost31/commander_room) +"nj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/puzzle/keycardpad/directional/north{ + late_initialize_pop = 1; + id = "thingbossentry" + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"no" = ( +/obj/structure/bed/pod{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/outpost31/crewquarters) +"nr" = ( +/obj/item/kirbyplants/random/dead, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"nH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"nJ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"nP" = ( +/obj/structure/cable, +/turf/closed/indestructible/reinforced, +/area/ruin/outpost31/lab) +"nT" = ( +/obj/structure/fence/cut, +/turf/open/floor/wood, +/area/ruin/outpost31/kennel) +"nV" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"oa" = ( +/turf/closed/wall/r_wall, +/area/ruin/outpost31/recroom) +"ob" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"og" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/maintenance/no_decals, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"oj" = ( +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"op" = ( +/obj/machinery/shower/directional/north, +/obj/structure/curtain, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"ov" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/barricade/wooden/crude/snow{ + opacity = 1 + }, +/turf/open/floor/plating, +/area/ruin/outpost31) +"oz" = ( +/obj/machinery/door/airlock, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/wood, +/area/ruin/outpost31/crewquarters) +"oF" = ( +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"oJ" = ( +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"oN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"oV" = ( +/obj/structure/table/wood, +/obj/item/storage/cans/sixbeer, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"pa" = ( +/obj/item/keycard{ + puzzle_id = "thingbossentry"; + name = "lab keycard"; + color = "blue" + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"pd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/machinery/coffeemaker, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"pe" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"pj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/food_or_drink/any_snack_or_beverage, +/obj/structure/table, +/obj/machinery/light/warm/dim/directional/south, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"pw" = ( +/obj/structure/closet/cabinet, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/wood, +/area/ruin/outpost31/crewquarters) +"py" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"pQ" = ( +/obj/item/knife, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"qa" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"qt" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "o31a" + }, +/turf/open/floor/plating, +/area/ruin/outpost31) +"qz" = ( +/turf/closed/wall/r_wall, +/area/ruin/outpost31/kennel) +"qH" = ( +/obj/structure/closet/preopen{ + name = "winter gear closet" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/pod/light, +/area/ruin/outpost31) +"qI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/item/flashlight/lantern, +/turf/open/floor/pod/light, +/area/ruin/outpost31) +"qK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/turf/open/floor/catwalk_floor/iron, +/area/ruin/outpost31) +"rb" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/ruin/outpost31) +"rf" = ( +/obj/machinery/washing_machine, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"rk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"rm" = ( +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) +"ru" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"rx" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/outpost31) +"rB" = ( +/obj/machinery/door/airlock/grunge, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron, +/area/ruin/outpost31/crewquarters) +"rO" = ( +/obj/machinery/door/airlock/public/glass, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"sd" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 8 + }, +/obj/effect/mapping_helpers/broken_machine, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/outpost31/recroom) +"sg" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"si" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/plating, +/area/ruin/outpost31) +"sk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"sm" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/emcloset, +/turf/open/floor/iron/textured_half, +/area/ruin/outpost31) +"sB" = ( +/obj/structure/window/spawner/directional/west, +/obj/machinery/shower/directional/south, +/obj/structure/curtain, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"sF" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigars/cohiba, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"sK" = ( +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) +"sL" = ( +/obj/structure/window/spawner/directional/east, +/obj/machinery/shower/directional/north, +/obj/structure/curtain, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"sP" = ( +/turf/closed/wall, +/area/ruin/outpost31/kennel) +"sQ" = ( +/obj/machinery/door/airlock, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/wood, +/area/ruin/outpost31/crewquarters) +"tj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"to" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"tx" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/broken/directional/west, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"tC" = ( +/obj/structure/closet/secure_closet/freezer/fridge/preopen, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"tG" = ( +/turf/open/floor/iron/textured_half, +/area/ruin/outpost31) +"tJ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/ammo_casing/spent, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"tS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/ammo_casing/spent, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"tV" = ( +/obj/machinery/door/airlock/public/glass, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/dark, +/area/ruin/outpost31) +"tX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/west, +/turf/open/floor/iron, +/area/ruin/outpost31) +"tZ" = ( +/obj/structure/table, +/obj/item/storage/medkit, +/turf/open/floor/iron/white/smooth_half{ + dir = 1 + }, +/area/ruin/outpost31/medical) +"ub" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/catwalk_floor/iron, +/area/ruin/outpost31) +"uj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"uA" = ( +/obj/structure/cable, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"uB" = ( +/turf/closed/mineral/random/snow/underground, +/area/template_noop) +"uI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"uN" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "o31a" + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"uR" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"vn" = ( +/obj/structure/closet/preopen{ + name = "winter gear closet" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/ruin/outpost31) +"vU" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/outpost31/crewquarters) +"vX" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"wb" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"wc" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron, +/area/ruin/outpost31) +"wp" = ( +/obj/structure/fence/door/opened{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/outpost31/kennel) +"wq" = ( +/obj/structure/cable, +/obj/machinery/light/small/broken/directional/east, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/outpost31/crewquarters) +"wr" = ( +/obj/machinery/smartfridge/petri/preloaded, +/turf/open/floor/iron/white/smooth_half{ + dir = 1 + }, +/area/ruin/outpost31/medical) +"wt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"wu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/obj/structure/girder, +/obj/structure/barricade/wooden, +/turf/open/floor/catwalk_floor/iron, +/area/ruin/outpost31) +"wx" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/iron/textured_half, +/area/ruin/outpost31) +"wE" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/item/pen, +/obj/item/pen/blue{ + pixel_x = -8; + pixel_y = -3 + }, +/obj/item/pen/red{ + pixel_x = -1; + pixel_y = 9 + }, +/obj/item/pen/fourcolor{ + pixel_x = 9; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"wO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"wP" = ( +/obj/structure/fence/cut/large, +/turf/open/floor/wood, +/area/ruin/outpost31/kennel) +"xc" = ( +/turf/closed/wall/r_wall, +/area/ruin/outpost31/radiomap) +"xk" = ( +/turf/closed/wall, +/area/ruin/outpost31/medical) +"xo" = ( +/obj/effect/gibspawner/generic/animal{ + virusProb = 0 + }, +/turf/open/floor/wood, +/area/ruin/outpost31/kennel) +"xP" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "o31B" + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"yo" = ( +/turf/closed/indestructible/reinforced, +/area/ruin/outpost31/lootroom) +"yp" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"yx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"yO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"yQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"yW" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/indestructible/reinforced, +/area/ruin/outpost31/lab) +"za" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"zd" = ( +/obj/machinery/door/airlock/grunge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"ze" = ( +/obj/structure/table/optable, +/obj/machinery/light/broken/directional/south, +/obj/effect/decal/cleanable/blood/old, +/obj/item/bodypart/arm/left{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/bodypart/arm/right{ + pixel_x = -4; + pixel_y = 1 + }, +/turf/open/floor/iron/white/smooth_half, +/area/ruin/outpost31/medical) +"zu" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"zv" = ( +/turf/closed/wall/r_wall, +/area/ruin/outpost31/crewquarters) +"zw" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/textured_large, +/area/ruin/outpost31/crewquarters) +"zy" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"zz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"zF" = ( +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"zN" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"zO" = ( +/obj/effect/turf_decal/siding/white, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"zY" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/welded, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "o31d" + }, +/obj/structure/barricade/wooden/crude/snow{ + opacity = 1 + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"Ae" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/vending/cigarette{ + onstation = 0 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"Ai" = ( +/obj/item/kirbyplants/random/dead, +/turf/open/floor/iron/white/smooth_corner{ + dir = 1 + }, +/area/ruin/outpost31/medical) +"Al" = ( +/obj/machinery/light/broken/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Au" = ( +/obj/machinery/iv_drip, +/obj/structure/bed/medical/anchored, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/turf/open/floor/iron/white/smooth_half, +/area/ruin/outpost31/medical) +"Aw" = ( +/obj/structure/closet/secure_closet{ + req_access = list("noopen") + }, +/obj/item/ammo_box/c9mm, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"AE" = ( +/obj/machinery/door/airlock/grunge, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"AG" = ( +/obj/machinery/door/airlock/grunge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"AR" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/item/paper_bin, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"Bb" = ( +/obj/machinery/light/warm/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Bc" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_white{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"Bg" = ( +/obj/machinery/light/broken/directional/east, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"Bj" = ( +/obj/structure/cable, +/obj/structure/grille/broken, +/obj/item/shard/plastitanium, +/obj/item/shard/plastitanium, +/turf/open/indestructible/plating{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"Bu" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Bz" = ( +/obj/structure/tank_dispenser/oxygen{ + oxygentanks = 5 + }, +/turf/open/floor/pod/light, +/area/ruin/outpost31) +"BI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/outpost31/recroom) +"BM" = ( +/obj/structure/table, +/turf/open/floor/iron/white/smooth_half{ + dir = 1 + }, +/area/ruin/outpost31/medical) +"BP" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/iron, +/area/ruin/outpost31) +"BQ" = ( +/obj/structure/flora/rock/icy/style_random, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/underground/explored) +"BU" = ( +/obj/machinery/shower/directional/south, +/obj/structure/curtain, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"BZ" = ( +/obj/structure/closet/preopen{ + name = "winter gear closet" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/pod/light, +/area/ruin/outpost31) +"Ca" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"Cb" = ( +/obj/machinery/light/warm/directional/south, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"Cc" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/crowbar, +/turf/open/floor/pod, +/area/ruin/outpost31) +"Ce" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"CA" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/window/spawner/directional/west, +/obj/structure/table, +/obj/item/broken_bottle, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"CC" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"CM" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/effect/spawner/random/maintenance/no_decals/two, +/turf/open/floor/plating, +/area/ruin/outpost31) +"CS" = ( +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/recroom) +"Db" = ( +/obj/machinery/door/airlock/grunge, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/autoname, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"Dg" = ( +/obj/structure/cable, +/obj/structure/grille/broken, +/obj/item/shard/plastitanium, +/obj/item/shard/plastitanium, +/obj/effect/mob_spawn/corpse/human/damaged{ + husk = 1 + }, +/turf/open/indestructible/plating{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"Dz" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/item/climbing_hook, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"DF" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/warm/directional/west, +/obj/structure/table, +/obj/item/mod/module/flamethrower, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"DM" = ( +/obj/structure/table/wood, +/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"DU" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/turf_decal/siding/blue/end{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/white/textured_large, +/area/ruin/outpost31/crewquarters) +"DW" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"Ea" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/item/paperwork{ + desc = "Whatever nerd stuff they did down here."; + name = "map scraps" + }, +/obj/item/paperwork{ + desc = "Whatever nerd stuff they did down here."; + name = "map scraps"; + pixel_x = 17; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"Ei" = ( +/obj/structure/bed/pod, +/turf/open/floor/wood, +/area/ruin/outpost31/crewquarters) +"EH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"EL" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"ES" = ( +/obj/item/kirbyplants/random/dead, +/obj/effect/turf_decal/siding/white{ + dir = 10 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"EY" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"Fb" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/mapping_helpers/airlock/autoname, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/structure/cable, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/iron/white, +/area/ruin/outpost31/medical) +"Fo" = ( +/obj/structure/closet/preopen{ + name = "winter gear closet" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Fu" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/food_or_drink/any_snack_or_beverage, +/obj/structure/table, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"FH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/iron, +/area/ruin/outpost31) +"FK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"FP" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"FQ" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/turf_decal/siding/blue/end, +/obj/effect/mapping_helpers/airlock/autoname, +/obj/effect/mapping_helpers/airlock/welded, +/turf/open/floor/iron/white/textured_large, +/area/ruin/outpost31/crewquarters) +"FW" = ( +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"FY" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Gg" = ( +/turf/closed/wall, +/area/ruin/outpost31) +"Gh" = ( +/turf/open/floor/wood, +/area/ruin/outpost31/crewquarters) +"Gz" = ( +/turf/closed/wall/r_wall, +/area/ruin/outpost31/kitchendiningroom) +"GR" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/iron/textured_half, +/area/ruin/outpost31) +"GW" = ( +/obj/machinery/puzzle/keycardpad/directional/west{ + id = "thingbosslootroom"; + late_initialize_pop = 1 + }, +/obj/item/paper{ + can_become_message_in_bottle = 0; + default_raw_text = "Research was promising. We managed to stream an artificial intelligence into an organic host via this brain. Too bad it needs all robotic organs because apparently the human biology hates not having a properly functional nervous system." + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/outpost31) +"Hk" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"Hm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/structure/aggro_gate, +/turf/open/floor/iron/dark{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"Hq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"Ht" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"HC" = ( +/obj/machinery/atmospherics/components/unary/airlock_pump{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"HF" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"HL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"HP" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_machine, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/white/smooth_half, +/area/ruin/outpost31/medical) +"HW" = ( +/turf/open/floor/iron, +/area/ruin/outpost31) +"Id" = ( +/obj/structure/table, +/obj/item/food/icecreamsandwich, +/turf/open/floor/iron/white/smooth_half, +/area/ruin/outpost31/medical) +"Ie" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "o31d" + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Ij" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/food/waffles, +/obj/machinery/microwave, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"Il" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/plate/large, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"Io" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"ID" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/item/paperwork{ + desc = "A map of the outpost."; + name = "outpost map" + }, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"IG" = ( +/turf/open/floor/catwalk_floor/iron_white{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"IL" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) +"IT" = ( +/obj/structure/sign/poster/random/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"Jd" = ( +/turf/closed/indestructible/reinforced, +/area/ruin/outpost31/lab) +"Jl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"Jq" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"JG" = ( +/obj/machinery/door/poddoor/preopen, +/obj/machinery/door/airlock/vault, +/obj/structure/fans/tiny/invisible, +/obj/structure/puzzle_blockade{ + id = "thingbossentry" + }, +/turf/open/floor/iron/white{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"JP" = ( +/obj/structure/table, +/obj/item/storage/medkit/fire, +/turf/open/floor/iron/white/smooth_corner{ + dir = 4 + }, +/area/ruin/outpost31/medical) +"Kh" = ( +/obj/structure/thing_boss_phase_depleter, +/turf/open/floor/circuit/red/off{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"KU" = ( +/obj/effect/spawner/random/decoration/glowstick/on, +/turf/open/floor/wood, +/area/ruin/outpost31/kennel) +"KW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron, +/area/ruin/outpost31) +"Lf" = ( +/obj/structure/closet/preopen{ + name = "winter gear closet" + }, +/turf/open/floor/pod/light, +/area/ruin/outpost31) +"Lk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/white/smooth_half, +/area/ruin/outpost31/medical) +"Lx" = ( +/turf/closed/wall, +/area/ruin/outpost31/commander_room) +"Ly" = ( +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"Lz" = ( +/obj/structure/closet/preopen{ + name = "winter gear closet" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/pod/light, +/area/ruin/outpost31) +"LA" = ( +/turf/closed/wall, +/area/ruin/outpost31/crewquarters) +"LQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/catwalk_floor/iron, +/area/ruin/outpost31) +"LW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Ma" = ( +/obj/structure/table/reinforced, +/obj/item/stack/spacecash/c500, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"Mf" = ( +/obj/structure/table/reinforced, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"Ml" = ( +/obj/machinery/door/airlock/public/glass, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"Mn" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"Ms" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Mw" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/ammo_casing/spent, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"ME" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"MK" = ( +/obj/structure/tank_dispenser/oxygen{ + oxygentanks = 5 + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"MO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"MQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"MT" = ( +/obj/structure/tank_dispenser/oxygen{ + oxygentanks = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"MW" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/storage/card_binder, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"Nc" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/directional/north{ + pixel_y = 33 + }, +/mob/living/basic/fleshblob, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"Nk" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/welded, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "o31c" + }, +/obj/structure/barricade/wooden/crude/snow{ + opacity = 1 + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"Nl" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"Nw" = ( +/obj/structure/reagent_dispensers/plumbed, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"NP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Ob" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"Oe" = ( +/obj/structure/sink/kitchen/directional/west, +/obj/structure/mirror/directional/east, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/recroom) +"Ol" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Oo" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"Or" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/cola{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/outpost31/recroom) +"Ov" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/outpost31) +"Oz" = ( +/obj/item/reagent_containers/blood{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/white, +/area/ruin/outpost31/medical) +"OW" = ( +/obj/machinery/griddle, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"Pb" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"Pd" = ( +/obj/machinery/door/airlock/public/glass, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/dark, +/area/ruin/outpost31) +"Pw" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"PG" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"PR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"PS" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/table, +/obj/item/storage/fancy/egg_box, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"PT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"PW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/girder, +/obj/structure/barricade/wooden, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Qj" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/maintenance/no_decals, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"Qy" = ( +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"QA" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/chair/office, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"QU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Rc" = ( +/turf/closed/wall, +/area/ruin/outpost31/radiomap) +"Rf" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/any_snack_or_beverage, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"Rm" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"RD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"RK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral, +/obj/item/crowbar, +/turf/open/floor/iron, +/area/ruin/outpost31) +"RL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) +"RO" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/autoname, +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"RQ" = ( +/obj/machinery/door/poddoor{ + id = "thingbosslootroom"; + name = "Storage Room 2" + }, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"RR" = ( +/obj/structure/closet/cabinet, +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/wood, +/area/ruin/outpost31/crewquarters) +"Sa" = ( +/obj/machinery/atmospherics/components/tank/air/layer2, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"Sg" = ( +/turf/closed/wall/r_wall, +/area/ruin/outpost31) +"Sm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"Sq" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"Sy" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/west, +/turf/open/floor/iron, +/area/ruin/outpost31) +"SB" = ( +/obj/item/surgery_tray/deployed, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/defibrillator_mount/loaded{ + pixel_y = -32 + }, +/turf/open/floor/iron/white/smooth_half, +/area/ruin/outpost31/medical) +"SJ" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "o31c" + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"SN" = ( +/obj/machinery/atmospherics/components/unary/passive_vent/layer4{ + dir = 8 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) +"SW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"Td" = ( +/obj/machinery/light_switch/directional/south, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) +"Tm" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Tq" = ( +/obj/machinery/power/rtg/advanced{ + power_gen = 25000 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"Tr" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/structure/table, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 6; + pixel_y = 0 + }, +/obj/item/trash/chips{ + pixel_x = -5; + pixel_y = 7 + }, +/turf/open/floor/iron/textured_half{ + dir = 1 + }, +/area/ruin/outpost31) +"Tv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"Tx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/girder, +/obj/structure/barricade/wooden, +/turf/open/floor/iron, +/area/ruin/outpost31) +"TP" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/underground/explored) +"TX" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/food/waffles, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"Ui" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/gibspawner/generic/animal{ + virusProb = 0 + }, +/turf/open/floor/wood, +/area/ruin/outpost31/kennel) +"Uv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"Uy" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"UA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/ruin/outpost31/medical) +"UH" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"UI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/ruin/outpost31/kennel) +"Vc" = ( +/obj/machinery/light/broken/directional/north, +/obj/item/storage/cans, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"Vd" = ( +/turf/closed/indestructible/reinforced, +/area/ruin/outpost31) +"Vg" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/recroom) +"Vm" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"Vx" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Vz" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken/directional/south, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"VA" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/decal/cleanable/glass, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"VG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron, +/area/ruin/outpost31) +"VK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate, +/obj/item/vending_refill/cola, +/obj/item/vending_refill/cigarette, +/obj/item/vending_refill/boozeomat, +/turf/open/floor/plating, +/area/ruin/outpost31/lootroom) +"VM" = ( +/obj/machinery/light/small/dim/directional/west, +/obj/structure/closet{ + name = "winter gear closet" + }, +/obj/item/clothing/shoes/winterboots/ice_boots/eva, +/obj/item/clothing/suit/hooded/wintercoat/eva, +/turf/open/floor/pod/light, +/area/ruin/outpost31) +"VR" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/textured_half, +/area/ruin/outpost31) +"VU" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/white/herringbone{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"VV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/outpost31/kennel) +"Wc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"Wd" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "o31B" + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"Wu" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/kitchendiningroom) +"Wy" = ( +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) +"WD" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "o31c" + }, +/turf/open/floor/pod/dark, +/area/ruin/outpost31) +"WQ" = ( +/turf/template_noop, +/area/template_noop) +"Xa" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"Xf" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/oven/range, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/kitchen/small, +/area/ruin/outpost31/kitchendiningroom) +"Xk" = ( +/obj/machinery/light_switch/directional/north, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/iron/white/smooth_corner{ + dir = 8 + }, +/area/ruin/outpost31/medical) +"XD" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/white{ + initial_gas_mix = "o2=14;n2=30;TEMP=293.15" + }, +/area/ruin/outpost31/lab) +"XI" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/outpost31) +"XJ" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"XN" = ( +/turf/open/floor/wood, +/area/ruin/outpost31/kennel) +"XQ" = ( +/obj/machinery/shower/directional/south, +/obj/structure/curtain, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/fluff/shower_drain, +/obj/item/food/candy_trash{ + desc = "Tooth fillings."; + name = "tooth fillings" + }, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"Yh" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/outpost31/recroom) +"Yk" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/machinery/duct, +/turf/open/floor/iron/white/textured_large, +/area/ruin/outpost31/crewquarters) +"Yo" = ( +/turf/open/misc/asteroid/snow/icemoon/do_not_chasm, +/area/icemoon/underground/explored) +"YG" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/outpost31/crewquarters) +"YK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron, +/area/ruin/outpost31) +"YT" = ( +/obj/structure/closet/preopen{ + name = "winter gear closet" + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/pod/light, +/area/ruin/outpost31) +"Zq" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/table, +/obj/item/soap/homemade, +/turf/open/floor/iron/freezer, +/area/ruin/outpost31/crewquarters) +"ZA" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/outpost31/crewquarters) +"ZB" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"ZL" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/structure/curtain, +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"ZM" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/grenade/iedcasing/spawned, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"ZT" = ( +/turf/open/floor/wood, +/area/ruin/outpost31/commander_room) +"ZX" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/iron, +/area/ruin/outpost31/radiomap) +"ZY" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/ruin/outpost31/crewquarters) + +(1,1,1) = {" +WQ +WQ +WQ +WQ +WQ +uB +uB +uB +uB +uB +uB +uB +uB +Yo +Yo +Yo +lW +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +uB +uB +uB +uB +uB +uB +uB +uB +uB +WQ +WQ +"} +(2,1,1) = {" +WQ +WQ +WQ +WQ +WQ +uB +uB +uB +uB +uB +uB +uB +uB +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +BQ +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +WQ +"} +(3,1,1) = {" +WQ +WQ +WQ +WQ +WQ +uB +uB +uB +uB +uB +uB +uB +Yo +BQ +Yo +Yo +Yo +Yo +BQ +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +TP +IL +yo +yo +yo +yo +yo +yo +yo +yo +yo +uB +"} +(4,1,1) = {" +WQ +WQ +WQ +WQ +uB +uB +uB +uB +uB +uB +uB +uB +Yo +Yo +Yo +Yo +hi +lW +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +TP +IL +yo +ce +dV +aM +DF +gC +jl +nH +yo +uB +"} +(5,1,1) = {" +WQ +WQ +WQ +WQ +uB +uB +uB +uB +uB +uB +uB +uB +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +IL +yo +SW +SW +SW +SW +SW +SW +ht +yo +uB +"} +(6,1,1) = {" +WQ +WQ +WQ +WQ +uB +uB +uB +uB +Sg +Sg +Sg +Sg +Sg +sK +Yo +BQ +Yo +Yo +Yo +Yo +Yo +Yo +Yo +BQ +Yo +Yo +Yo +Yo +Yo +sK +yo +ME +aM +aM +SW +SW +SW +VK +yo +uB +"} +(7,1,1) = {" +uB +uB +uB +uB +uB +uB +uB +uB +Sg +Lf +oF +Lf +Sg +Wy +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +sK +yo +yo +yo +yo +dt +RQ +RQ +yo +yo +Vd +"} +(8,1,1) = {" +uB +uB +uB +uB +uB +uB +uB +uB +Sg +YT +Jl +lM +uN +RL +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +rm +Vd +VM +Bz +Sg +GW +Ov +rx +Ov +CM +Vd +"} +(9,1,1) = {" +uB +uB +uB +uB +uB +uB +uB +uB +Sg +Lf +yQ +qI +Sg +SN +sK +sK +sK +sK +sK +sK +sK +sK +sK +sK +sK +sK +sK +sK +sK +sK +Nk +oF +HC +SJ +Ov +Ov +Ov +jv +CM +ov +"} +(10,1,1) = {" +uB +uB +oa +oa +oa +oa +oa +oa +oa +Sg +qt +Sg +Gz +Gz +lT +lT +Gz +Jd +Jd +Jd +Jd +nP +Jd +Jd +Jd +Jd +Jd +Jd +Jd +Jd +Vd +Sg +WD +Sg +Gg +mq +si +CM +CM +Vd +"} +(11,1,1) = {" +uB +oa +oa +eT +IT +py +yp +ES +aq +Ht +QU +lO +aV +Wu +gu +Tv +Tv +Jd +XD +dm +EH +Bc +mW +mW +mW +MO +ob +dm +XD +Jd +sm +Ht +QU +lO +xk +xk +xk +xk +xk +cy +"} +(12,1,1) = {" +uB +oa +Jq +CC +oJ +oJ +kh +UH +Ml +vX +ge +oN +rO +gu +gu +Rf +Fu +Jd +XD +wt +Hk +Bc +mW +Kh +mW +MO +VU +dW +XD +Jd +tG +Ht +lF +oN +xk +ch +wr +tZ +JP +cy +"} +(13,1,1) = {" +uB +oa +uR +Oo +oV +og +FP +bE +aq +MQ +ge +FY +aV +nJ +gu +Rf +pj +Jd +XD +MO +ob +Bc +mW +mW +mW +MO +IG +ob +XD +Jd +wx +Ht +ub +oN +xk +cd +Oz +gM +Id +cy +"} +(14,1,1) = {" +uB +oa +cu +Oo +DM +qa +Mn +Nl +aq +Ht +ge +oN +aV +Ij +gu +tj +tj +Jd +XD +zy +eu +Bc +nV +hD +uI +dH +ai +ob +XD +Jd +Jd +cp +qK +Uy +xk +Au +UA +gM +SB +cy +"} +(15,1,1) = {" +uB +oa +mV +Oo +lR +lR +Mn +Cb +aq +cp +LQ +oN +aV +pd +gu +gu +fI +Jd +eb +PT +Bj +Bj +Bj +MO +ai +FW +FW +ob +XD +Hm +Jd +nj +ub +oN +xk +Au +gM +an +ze +cy +"} +(16,1,1) = {" +uB +oa +uR +fC +og +qa +Mn +zO +aq +cp +YK +Ms +aV +Ae +gu +gu +me +nP +Bc +Bc +Dg +in +Bj +zu +IG +IG +IG +ob +XD +Hm +JG +cp +qK +Bb +xk +lU +gi +gM +HP +cy +"} +(17,1,1) = {" +uB +oa +uR +kh +sg +sg +kh +Qy +aq +FH +YK +Uy +aV +aV +TX +Il +aV +Jd +jP +Uv +Bj +Bj +Bj +MO +FW +FW +FW +za +XD +Hm +yW +cp +YK +Vx +Fb +Lk +gM +gM +eS +cy +"} +(18,1,1) = {" +uB +oa +Yh +Io +Rm +Rm +Rm +XJ +aq +cp +YK +oN +aV +OW +HL +jL +tC +Jd +XD +zN +dW +Bc +nV +Hq +eI +mO +FW +ob +XD +Jd +Jd +cp +YK +Uy +xk +Xk +BM +BM +Ai +cy +"} +(19,1,1) = {" +uB +oa +Or +eg +eL +aq +aq +aq +aq +cp +YK +Uy +aV +Xf +jL +pQ +PS +Jd +XD +rk +ob +Bc +mW +mW +mW +MO +IG +ob +XD +Jd +dP +Ht +YK +Uy +xk +xk +xk +xk +xk +he +"} +(20,1,1) = {" +uB +oa +BI +BI +BI +aq +fH +CS +Vg +Ht +YK +BP +RO +Xa +yx +jL +Vz +Jd +XD +gO +yO +Bc +mW +Kh +mW +MO +ru +RD +XD +Jd +GR +cp +KW +oN +Rc +Ea +lr +wE +AR +xc +"} +(21,1,1) = {" +uB +oa +sd +bg +aP +aq +kA +Oe +aq +cp +YK +Uy +aV +hs +PG +bX +Ob +Jd +XD +bW +EH +Bc +mW +mW +mW +MO +ob +bW +XD +Jd +VR +Ht +YK +Uy +Rc +ID +Pw +QA +ho +xc +"} +(22,1,1) = {" +qz +oa +aq +aq +aq +aq +aq +aq +aq +cp +YK +oN +aV +aV +aV +aV +aV +Jd +Jd +Jd +Jd +nP +Jd +Jd +Jd +Jd +Jd +Jd +Jd +Jd +Sg +cp +YK +Uy +Rc +ZX +Pw +Pw +ks +xc +"} +(23,1,1) = {" +qz +Sa +cw +gZ +cm +sP +Ht +cp +Ht +cp +YK +FK +cp +VG +cp +cp +Ht +Pd +tX +cp +cp +vX +pe +cp +Ht +Ht +Tx +cp +Ht +cp +Sy +cp +YK +Uy +fL +bb +Pw +Pw +CA +xc +"} +(24,1,1) = {" +qz +to +ko +VV +lz +AG +LW +YK +YK +YK +YK +YK +YK +ge +YK +YK +YK +tV +YK +YK +YK +YK +ge +YK +YK +YK +wu +YK +YK +ge +YK +YK +YK +XI +Db +bb +Pw +QA +Dz +xc +"} +(25,1,1) = {" +qz +Mw +Pb +tJ +Tq +sP +PR +wc +Bu +wO +hT +Tm +Uy +Uy +Uy +Uy +Uy +mU +oN +Al +bp +Uy +wO +EL +RK +db +PW +Uy +oN +Uy +Uy +HW +YK +Uy +Rc +Pw +Pw +ah +cz +xc +"} +(26,1,1) = {" +qz +sk +Mw +tS +sP +sP +zd +Gg +LA +LA +LA +LA +LA +LA +LA +LA +LA +LA +LA +LA +LA +LA +fW +Tr +jM +Lx +Lx +Lx +iA +Lx +Lx +cp +YK +oN +Rc +Qj +DW +wb +ZM +xc +"} +(27,1,1) = {" +qz +wP +wp +nT +sP +qH +kP +Lz +LA +RR +no +LA +RR +no +LA +RR +no +LA +Nw +dK +rf +LA +LA +LA +Lx +Lx +ck +tx +Ly +nr +Lx +Ht +LQ +Uy +Rc +cf +VA +VA +cf +xc +"} +(28,1,1) = {" +qz +UI +UI +xo +sP +vn +uj +vn +LA +Gh +Gh +LA +Gh +Gh +LA +Gh +Gh +LA +Nc +zF +oj +zF +op +LA +Ca +Ly +Ly +Ly +Ly +Td +Lx +Ol +YK +Wc +Rc +cf +cf +cf +cf +xc +"} +(29,1,1) = {" +qz +xo +KU +xo +sP +vn +uj +BZ +LA +sQ +LA +LA +sQ +LA +LA +sQ +LA +LA +Zq +Ce +oj +Ce +sL +LA +Aw +Ly +Ly +Ly +Ly +uA +AE +vX +YK +Uy +xc +xc +xc +xc +xc +xc +"} +(30,1,1) = {" +qz +xo +xo +Ui +sP +qH +kP +Cc +rB +dZ +ZY +wq +vU +YG +au +ZA +ZA +DU +zw +Yk +zw +Yk +zw +FQ +Ly +Ly +fM +Ly +Ly +uA +iA +Ht +qK +Uy +xc +uB +uB +uB +uB +uB +"} +(31,1,1) = {" +qz +kF +xo +XN +qz +Sg +xP +Sg +zv +oz +LA +LA +oz +LA +LA +oz +LA +LA +sB +zF +HF +zF +iH +LA +Sm +ep +ZB +Ma +kX +MW +Lx +Fo +NP +ih +xc +uB +uB +uB +uB +uB +"} +(32,1,1) = {" +qz +qz +qz +qz +qz +MT +jN +hN +zv +Gh +Gh +LA +Gh +Gh +LA +Gh +Gh +LA +BU +Ce +zF +zF +op +LA +Vc +ZT +Sq +Mf +ZT +Vm +ne +Sg +Ie +Sg +xc +uB +uB +uB +uB +uB +"} +(33,1,1) = {" +uB +uB +uB +uB +Sg +Sg +Wd +Sg +zv +pw +Ei +LA +pw +Ei +LA +pw +Ei +LA +XQ +fb +Bg +fb +op +LA +ZL +ZT +pa +EY +ZT +sF +ne +MK +zz +oF +xc +uB +uB +uB +uB +uB +"} +(34,1,1) = {" +WQ +uB +uB +uB +Sg +rb +sK +rb +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +by +by +by +ne +ne +ne +ne +Sg +zY +Sg +xc +uB +uB +uB +uB +uB +"} +(35,1,1) = {" +WQ +uB +uB +uB +uB +Yo +Yo +Yo +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +sK +sK +sK +uB +uB +uB +sK +rb +sK +rb +sK +uB +uB +uB +uB +uB +"} +(36,1,1) = {" +WQ +WQ +uB +BQ +Yo +Yo +Yo +Yo +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +Yo +Yo +Yo +uB +uB +Yo +Yo +Yo +Yo +Yo +Yo +uB +uB +uB +uB +WQ +"} +(37,1,1) = {" +WQ +WQ +uB +Yo +Yo +Yo +Yo +Yo +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +BQ +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +uB +uB +uB +WQ +"} +(38,1,1) = {" +WQ +WQ +WQ +Yo +Yo +Yo +Yo +Yo +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +uB +uB +uB +WQ +"} +(39,1,1) = {" +WQ +WQ +WQ +Yo +Yo +Yo +Yo +Yo +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +Yo +Yo +Yo +Yo +Yo +Yo +BQ +Yo +Yo +Yo +Yo +Yo +Yo +uB +uB +uB +WQ +"} +(40,1,1) = {" +WQ +WQ +WQ +Yo +Yo +Yo +Yo +Yo +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +uB +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +Yo +uB +uB +uB +WQ +WQ +"} diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm index 6a1433fa5ec..5ce90a76319 100644 --- a/code/__DEFINES/ai/monsters.dm +++ b/code/__DEFINES/ai/monsters.dm @@ -305,6 +305,20 @@ ///time till our next rest duration #define BB_DEER_NEXT_REST_TIMER "deer_next_rest_timer" +//the thing boss +#define BB_THETHING_CHARGE "BB_THETHING_CHARGE" +#define BB_THETHING_DECIMATE "BB_THETHING_DECIMATE" +#define BB_THETHING_BIGTENDRILS "BB_THETHING_BIGTENDRILS" +#define BB_THETHING_SHRIEK "BB_THETHING_SHRIEK" +#define BB_THETHING_CARDTENDRILS "BB_THETHING_CARDTENDRILS" +#define BB_THETHING_ACIDSPIT "BB_THETHING_ACIDSPIT" +/// Blackboard key for The Thing boss that determines attack mode. TRUE means it will focus on closing the distance and murdering the person in question. Otherwise AOE. +#define BB_THETHING_ATTACKMODE "BB_THETHING_ATTACKMODE" +/// The Thing will be in attack mode forever if true +#define BB_THETHING_NOAOE "BB_THETHING_NOAOE" +/// What (first in combo) attack was last executed +#define BB_THETHING_LASTAOE "BB_THETHING_LASTAOE" + //turtle ///our tree's ability #define BB_TURTLE_TREE_ABILITY "turtle_tree_ability" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index f4557f4b5c1..8205f47fe9a 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -76,6 +76,9 @@ #define COMSIG_MOB_MIND_TRANSFERRED_OUT_OF "mob_mind_transferred_out_of" /// From /mob/proc/ghostize() Called when a mob successfully ghosts #define COMSIG_MOB_GHOSTIZED "mob_ghostized" +/// can_roll_midround(datum/antagonist/antag_type) from certain midround rulesets, (mob/living/source, datum/mind/mind, datum/antagonist/antagonist) +#define COMSIG_MOB_MIND_BEFORE_MIDROUND_ROLL "mob_mind_transferred_out_of" + #define CANCEL_ROLL (1<<1) ///from base of obj/allowed(mob/M): (/obj) returns ACCESS_ALLOWED if mob has id access to the obj #define COMSIG_MOB_TRIED_ACCESS "tried_access" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_megafauna.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_megafauna.dm new file mode 100644 index 00000000000..52ee745f66c --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_megafauna.dm @@ -0,0 +1,2 @@ + +#define COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED "COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 6308ad94c89..04dbb129cf4 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -196,7 +196,7 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define isguardian(A) (istype(A, /mob/living/basic/guardian)) -#define ismegafauna(A) (istype(A, /mob/living/simple_animal/hostile/megafauna)) +#define ismegafauna(A) (istype(A, /mob/living/simple_animal/hostile/megafauna) || istype(A, /mob/living/basic/boss)) #define isclown(A) (istype(A, /mob/living/basic/clown)) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 5d35a7fcb87..7c31243c5c2 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -1412,6 +1412,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Trait given to atoms currently affected by projectile dampeners #define TRAIT_GOT_DAMPENED "got_dampened" +/// humans with this trait will have their health visible to AIs without suit +#define HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT "hmsensorsvisiblewithoutsuit" /// Apply to movables to say "hey, this movable is technically flat on the floor, so it'd be mopped up by a mop" #define TRAIT_MOPABLE "mopable" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index e351e155dc1..a4aeb1cab9b 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -585,6 +585,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_IGNORE_FIRE_PROTECTION" = TRAIT_IGNORE_FIRE_PROTECTION, "TRAIT_LEFT_EYE_SCAR" = TRAIT_LEFT_EYE_SCAR, "TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR, + "HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT" = HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT, "TRAIT_PREVENT_BLINKING" = TRAIT_PREVENT_BLINKING, "TRAIT_PREVENT_BLINK_LOOPS" = TRAIT_PREVENT_BLINK_LOOPS, "TRAIT_NO_EYELIDS" = TRAIT_NO_EYELIDS, diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm index 8d054026768..89602f2e7fa 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm @@ -261,7 +261,7 @@ candidates -= player else if(is_centcom_level(player.z)) candidates -= player // We don't autotator people in CentCom - else if(player.mind && (player.mind.special_role || !player.mind.can_roll_midround())) + else if(player.mind && (player.mind.special_role || !player.mind.can_roll_midround(antag_datum))) candidates -= player // We don't autotator people with roles already /datum/dynamic_ruleset/midround/from_living/autotraitor/execute() @@ -310,7 +310,7 @@ continue if(isnull(player.mind)) continue - if(player.mind.special_role || !player.mind.can_roll_midround()) + if(player.mind.special_role || !player.mind.can_roll_midround(antag_datum)) continue candidates += player @@ -479,7 +479,7 @@ candidates -= player continue - if(player.mind && (player.mind.special_role || !player.mind.can_roll_midround())) + if(player.mind && (player.mind.special_role || !player.mind.can_roll_midround(antag_datum))) candidates -= player /datum/dynamic_ruleset/midround/from_living/blob_infection/execute() diff --git a/code/controllers/subsystem/queuelinks.dm b/code/controllers/subsystem/queuelinks.dm index a6d56cf622e..1f891ee3ea5 100644 --- a/code/controllers/subsystem/queuelinks.dm +++ b/code/controllers/subsystem/queuelinks.dm @@ -60,6 +60,7 @@ SUBSYSTEM_DEF(queuelinks) if(what in partners) return partners += what + RegisterSignal(what, COMSIG_QDELETING, PROC_REF(link_object_deleted)) if(queue_max != 0 && max != 0 && max != queue_max) CRASH("Tried to change queue size to [max] from [queue_max]!") @@ -77,6 +78,10 @@ SUBSYSTEM_DEF(queuelinks) item.MatchedLinks(id, partners - item) qdel(src) +/datum/queue_link/proc/link_object_deleted(datum/source) // because CI and stuff + SIGNAL_HANDLER + partners -= source + /datum/queue_link/Destroy() . = ..() partners = null diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm index 7673551a653..4132a2cf2a5 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm @@ -164,3 +164,6 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(/mob, /obj/machinery/ if(length(priority_targets)) return pick(priority_targets) return ..() + +/datum/ai_behavior/find_potential_targets/bigger_range + vision_range = 16 diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm index 759355283ac..f80ffcc155e 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm @@ -17,3 +17,8 @@ /datum/ai_planning_subtree/simple_find_target/to_flee target_key = BB_BASIC_MOB_FLEE_TARGET + +/datum/ai_planning_subtree/simple_find_target/increased_range + +/datum/ai_planning_subtree/simple_find_target/increased_range/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + controller.queue_behavior(/datum/ai_behavior/find_potential_targets/bigger_range, target_key, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) diff --git a/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm index d552b69c142..2b2297c2d6d 100644 --- a/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm +++ b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm @@ -146,3 +146,11 @@ if(isturf(the_target)) return TRUE return ..() + +/// Subtype which searches for mobs that havent been gutted by megafauna +/datum/targeting_strategy/basic/no_gutted_mobs + +/datum/targeting_strategy/basic/no_gutted_mobs/can_attack(mob/living/owner, mob/living/target, vision_range) + if(!istype(target) || target.has_status_effect(/datum/status_effect/gutted)) + return FALSE + return ..() diff --git a/code/datums/elements/crusher_loot.dm b/code/datums/elements/crusher_loot.dm index c13c62a52ce..02499756095 100644 --- a/code/datums/elements/crusher_loot.dm +++ b/code/datums/elements/crusher_loot.dm @@ -6,7 +6,7 @@ /datum/element/crusher_loot element_flags = ELEMENT_BESPOKE argument_hash_start_idx = 2 - /// Path of the trophy dropped + /// Path of the trophy dropped (or list of trophies) var/trophy_type /// chance to drop the trophy, lowered by the mob only taking partial crusher damage instead of full /// for example, 25% would mean ~4 mobs need to die before you find one. @@ -36,7 +36,14 @@ var/datum/status_effect/crusher_damage/damage = target.has_status_effect(/datum/status_effect/crusher_damage) if(damage && prob((damage.total_damage/target.maxHealth) * drop_mod)) //on average, you'll need to kill 4 creatures before getting the item. by default. - if(drop_immediately) - new trophy_type(get_turf(target)) - else - target.butcher_results[trophy_type] = 1 + if(islist(trophy_type)) + for(var/trophypath in trophy_type) + make_path(target, trophypath) + return + make_path(target, trophy_type) + +/datum/element/crusher_loot/proc/make_path(mob/living/target, path) + if(drop_immediately) + new path(get_turf(target)) + else + target.butcher_results[path] = 1 diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index 1df318f9ee4..a9f0d7e5016 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -541,7 +541,9 @@ return affected_addiction.on_lose_addiction_points(src) /// Whether or not we can roll for midrounds, specifically checking if we have any major antag datums that should block it -/datum/mind/proc/can_roll_midround() +/datum/mind/proc/can_roll_midround(datum/antagonist/antag_type) + if(SEND_SIGNAL(current, COMSIG_MOB_MIND_BEFORE_MIDROUND_ROLL, src, antag_type) & CANCEL_ROLL) + return FALSE for(var/datum/antagonist/antag as anything in antag_datums) if(antag.block_midrounds) return FALSE diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index 6ab7539cecd..bca4e3c33cb 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -190,6 +190,12 @@ description = "A small laboratory and living space for Syndicate agents." suffix = "icemoon_underground_syndielab.dmm" +/datum/map_template/ruin/icemoon/underground/o31 + name = "Ice-Ruin Outpost 31" + id = "o31" + description = "Suspiciously dead silent. May or may not contain megafauna" + suffix = "icemoon_underground_outpost31.dmm" + //TODO: Bottom-Level ONLY Spawns after Refactoring Related Code /datum/map_template/ruin/icemoon/underground/plasma_facility name = "Ice-Ruin Abandoned Plasma Facility" diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm index 69d1e5abf4d..bc9a9226316 100644 --- a/code/game/area/areas/ruins/icemoon.dm +++ b/code/game/area/areas/ruins/icemoon.dm @@ -94,3 +94,40 @@ name = "\improper Syndicate Lab" ambience_index = AMBIENCE_DANGER sound_environment = SOUND_ENVIRONMENT_CAVE + +/area/ruin/outpost31 + name = "\improper Outpost 31" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + mood_bonus = -10 + mood_message = "Something very bad happened here..." + +/area/ruin/outpost31/medical + name = "\improper Outpost 31 Medical" + +/area/ruin/outpost31/kitchendiningroom + name = "\improper Outpost 31 Kitchen-Dining Room" + +/area/ruin/outpost31/kennel + name = "\improper Outpost 31 Kennel" + +/area/ruin/outpost31/radiomap + name = "\improper Outpost 31 Radio-Map Room" + +/area/ruin/outpost31/lab + name = "\improper Outpost 31 Lab" + area_flags = NOTELEPORT //megafauna arena + requires_power = FALSE + +/area/ruin/outpost31/lootroom + name = "\improper Outpost 31 Secondary Storage" + area_flags = NOTELEPORT //megafauna loot room + requires_power = FALSE + +/area/ruin/outpost31/recroom + name = "\improper Outpost 31 Rec Room" + +/area/ruin/outpost31/crewquarters + name = "\improper Outpost 31 Sleeping Quarters" + +/area/ruin/outpost31/commander_room + name = "\improper Outpost 31 Station Commander Office" diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index e32d09309c1..b06ee3c5af7 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -22,15 +22,17 @@ /datum/atom_hud/data/human/medical/basic -/datum/atom_hud/data/human/medical/basic/proc/check_sensors(mob/living/carbon/human/H) - if(!istype(H)) +/datum/atom_hud/data/human/medical/basic/proc/check_sensors(mob/living/carbon/human/human) + if(!istype(human)) return FALSE - var/obj/item/clothing/under/U = H.w_uniform - if(!istype(U)) + if(HAS_TRAIT(human, HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT)) + return TRUE + var/obj/item/clothing/under/undersuit = human.w_uniform + if(!istype(undersuit)) return FALSE - if(U.has_sensor < HAS_SENSORS) + if(undersuit.has_sensor < HAS_SENSORS) return FALSE - if(U.sensor_mode <= SENSOR_VITALS) + if(undersuit.sensor_mode <= SENSOR_VITALS) return FALSE return TRUE diff --git a/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm b/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm index 119099f587b..b1843196882 100644 --- a/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm +++ b/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm @@ -231,3 +231,23 @@ var/mob/living/basic/legion_brood/minion = new (LivingUser.loc) minion.assign_creator(LivingUser) next_use_time = world.time + 4 SECONDS + +//The Thing +/obj/item/crusher_trophy/flesh_glob + name = "glob of shifting flesh" + desc = "A glob of shifting flesh. Sealed shut permanently. Suitable as a trophy for a kinetic crusher." + icon_state = "glob" + denied_type = /obj/item/crusher_trophy/flesh_glob + bonus_value = 20 + /// the order in which we heal damage + var/static/list/damage_heal_order = list(BRUTE, BURN, OXY, TOX) + +/obj/item/crusher_trophy/flesh_glob/effect_desc() + return "melee hits heal you for [bonus_value * 0.2], and for [bonus_value * 0.5] on mark detonation" + +/obj/item/crusher_trophy/flesh_glob/on_melee_hit(mob/living/target, mob/living/user) + user.heal_ordered_damage(bonus_value * 0.2, damage_heal_order) + +/obj/item/crusher_trophy/flesh_glob/on_mark_detonation(mob/living/target, mob/living/user) + . = ..() + user.heal_ordered_damage(bonus_value * 0.5, damage_heal_order) diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index cfe087a8ab3..5ed8404459f 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -1115,3 +1115,170 @@ playsound(target, 'sound/effects/magic/lightningbolt.ogg', 100, TRUE) target.visible_message(span_danger("A thunderbolt strikes [target]!")) explosion(target, light_impact_range = (boosted ? 1 : 0), flame_range = (boosted ? 2 : 1), silent = TRUE) + + +/datum/action/innate/brain_undeployment + name = "Disconnect from shell" + desc = "Stop controlling your shell and resume normal core operations." + button_icon = 'icons/mob/actions/actions_AI.dmi' + button_icon_state = "ai_core" + +/datum/action/innate/brain_undeployment/Trigger(trigger_flags) + if(!..()) + return FALSE + var/obj/item/organ/brain/cybernetic/ai/shell_to_disconnect = owner.get_organ_by_type(/obj/item/organ/brain/cybernetic/ai) + + shell_to_disconnect.undeploy() + return TRUE + +/obj/item/organ/brain/cybernetic/ai + name = "AI-uplink brain" + desc = "Can be inserted into a body with NO ORGANIC INTERNAL ORGANS (robotic organs only) to allow AIs to control it. Comes with its own health sensors beacon. MUST be a humanoid or bad things happen to the consciousness." + can_smoothen_out = FALSE + /// if connected, our AI + var/mob/living/silicon/ai/mainframe + /// action for undeployment + var/datum/action/innate/brain_undeployment/undeployment_action = new + +/obj/item/organ/brain/cybernetic/ai/Initialize(mapload) + . = ..() + AddElement(/datum/element/noticable_organ, "%PRONOUN_Their eyes move with machine precision, their expression completely blank.") + +/obj/item/organ/brain/cybernetic/ai/Destroy() + . = ..() + undeploy() + mainframe = null + QDEL_NULL(undeployment_action) + +/obj/item/organ/brain/cybernetic/ai/on_mob_insert(mob/living/carbon/brain_owner, special, movement_flags) + . = ..() + brain_owner.add_traits(list(HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT, TRAIT_NO_MINDSWAP), ORGAN_TRAIT) + update_med_hud_status(brain_owner) + RegisterSignal(brain_owner, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(update_med_hud_status)) + RegisterSignal(brain_owner, COMSIG_CLICK, PROC_REF(owner_clicked)) + RegisterSignal(brain_owner, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item)) + RegisterSignal(brain_owner, COMSIG_MOB_MIND_BEFORE_MIDROUND_ROLL, PROC_REF(cancel_rolls)) + RegisterSignals(brain_owner, list(COMSIG_QDELETING, COMSIG_LIVING_PRE_WABBAJACKED), PROC_REF(undeploy)) + RegisterSignal(brain_owner, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_organ_gain)) + +/obj/item/organ/brain/cybernetic/ai/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) + undeploy() + . = ..() + organ_owner.remove_traits(list(HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT, TRAIT_NO_MINDSWAP), ORGAN_TRAIT) + UnregisterSignal(organ_owner, list(COMSIG_LIVING_HEALTH_UPDATE, COMSIG_CLICK, COMSIG_MOB_GET_STATUS_TAB_ITEMS, COMSIG_MOB_MIND_BEFORE_MIDROUND_ROLL, COMSIG_QDELETING, COMSIG_LIVING_PRE_WABBAJACKED)) + +/obj/item/organ/brain/cybernetic/ai/proc/cancel_rolls(mob/living/source, datum/mind/mind, datum/antagonist/antagonist) + SIGNAL_HANDLER + if(ispath(antagonist, /datum/antagonist/malf_ai)) + return + return CANCEL_ROLL + +/obj/item/organ/brain/cybernetic/ai/proc/get_status_tab_item(mob/living/source, list/items) + SIGNAL_HANDLER + if(!mainframe) + return + items += mainframe.get_status_tab_items() + +/obj/item/organ/brain/cybernetic/ai/proc/update_med_hud_status(mob/living/mob_parent) + SIGNAL_HANDLER + var/image/holder = mob_parent.hud_list?[STATUS_HUD] + if(isnull(holder)) + return + var/icon/size_check = icon(mob_parent.icon, mob_parent.icon_state, mob_parent.dir) + holder.pixel_y = size_check.Height() - ICON_SIZE_Y + if(mob_parent.stat == DEAD || HAS_TRAIT(mob_parent, TRAIT_FAKEDEATH) || isnull(mainframe)) + holder.icon_state = "huddead2" + holder.pixel_x = -8 // new icon states? nuh uh + else + holder.icon_state = "hudtrackingai" + holder.pixel_x = -16 + +// no thoughts only wifi +/obj/item/organ/brain/cybernetic/ai/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE) + return FALSE + +/obj/item/organ/brain/cybernetic/ai/proc/owner_clicked(datum/source, atom/location, control, params, mob/user) + SIGNAL_HANDLER + if(!isAI(user)) + return + var/list/lines = list() + lines += span_bold("[owner]") + lines += "Target is currently [!HAS_TRAIT(owner, TRAIT_INCAPACITATED) ? "functional" : "incapacitated"]" + lines += "Estimated organic/inorganic integrity: [owner.health]" + if(is_sufficiently_augmented()) + lines += "[span_boldnotice("Take control?")]
" + else + lines += span_warning("Organic organs detected. Robotic organs only, cannot take over.") + + to_chat(user, boxed_message(jointext(lines, "\n")), type = MESSAGE_TYPE_INFO) + +/obj/item/organ/brain/cybernetic/ai/Topic(href, href_list) + ..() + if(!href_list["ai_take_control"] || !is_sufficiently_augmented()) + return + var/mob/living/silicon/ai/AI = locate(href_list["ai_take_control"]) in GLOB.silicon_mobs + if(isnull(AI)) + return + if(AI.controlled_equipment) + to_chat(AI, span_warning("You are already loaded into an onboard computer!")) + return + if(!GLOB.cameranet.checkCameraVis(owner)) + to_chat(AI, span_warning("Target is no longer near active cameras.")) + return + if(!isturf(AI.loc)) + to_chat(AI, span_warning("You aren't in your core!")) + return + + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(undeploy)) + AI.deployed_shell = owner + deploy_init(AI) + ADD_TRAIT(AI.mind, TRAIT_UNCONVERTABLE, ORGAN_TRAIT) + AI.mind.transfer_to(owner) + +/obj/item/organ/brain/cybernetic/ai/proc/deploy_init(mob/living/silicon/ai/AI) + //todo camera maybe + mainframe = AI + RegisterSignal(AI, COMSIG_QDELETING, PROC_REF(ai_deleted)) + undeployment_action.Grant(owner) + update_med_hud_status(owner) + to_chat(owner, span_boldbig("You are still considered a silicon/cyborg/AI. Follow your laws.")) + +/obj/item/organ/brain/cybernetic/ai/proc/undeploy(datum/source) + SIGNAL_HANDLER + if(!owner?.mind || !mainframe) + return + UnregisterSignal(src, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING)) + mainframe.redeploy_action.Remove(mainframe) + mainframe.redeploy_action.last_used_shell = null + owner.mind.transfer_to(mainframe) + mainframe.deployed_shell = null + undeployment_action.Remove(owner) + if(mainframe.laws) + mainframe.laws.show_laws(mainframe) + if(mainframe.eyeobj) + mainframe.eyeobj.setLoc(loc) + REMOVE_TRAIT(mainframe.mind, TRAIT_UNCONVERTABLE, ORGAN_TRAIT) + mainframe = null + update_med_hud_status(owner) + +/obj/item/organ/brain/cybernetic/ai/proc/is_sufficiently_augmented() + var/mob/living/carbon/carb_owner = owner + . = TRUE + if(!istype(carb_owner)) + return + for(var/obj/item/organ/organ as anything in carb_owner.organs) + if(organ.organ_flags & ORGAN_EXTERNAL) + continue + if(!IS_ROBOTIC_ORGAN(organ) && !istype(organ, /obj/item/organ/tongue)) //tongues are not in the exosuit fab and nobody is going to bother to find them so + return FALSE + +/obj/item/organ/brain/cybernetic/ai/proc/on_organ_gain(datum/source, obj/item/organ/new_organ, special) + SIGNAL_HANDLER + if(!is_sufficiently_augmented()) + to_chat(owner, span_danger("Connection failure. Organics detected.")) + undeploy() + +/obj/item/organ/brain/cybernetic/ai/proc/ai_deleted(datum/source) + SIGNAL_HANDLER + to_chat(owner, span_danger("Your core has been rendered inoperable...")) + undeploy() diff --git a/code/modules/mob/living/basic/boss/boss.dm b/code/modules/mob/living/basic/boss/boss.dm new file mode 100644 index 00000000000..57b28848e48 --- /dev/null +++ b/code/modules/mob/living/basic/boss/boss.dm @@ -0,0 +1,140 @@ +//not quite simple animal megafauna but close enough +// port actual megafauna stuff once it gets used for lavaland megafauna +//im using it for stuff both of them get +/mob/living/basic/boss + combat_mode = TRUE + sentience_type = SENTIENCE_BOSS + mob_biotypes = MOB_ORGANIC|MOB_SPECIAL + faction = list(FACTION_MINING, FACTION_BOSS) + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) + obj_damage = 400 + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + unsuitable_atmos_damage = 0 + move_force = MOVE_FORCE_OVERPOWERING + move_resist = MOVE_FORCE_OVERPOWERING + pull_force = MOVE_FORCE_OVERPOWERING + mob_size = MOB_SIZE_HUGE + layer = LARGE_MOB_LAYER + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + /// List of loot if not killed by crusher. + var/list/loot + /// List of loot if killed by crusher. + var/list/crusher_loot + /// Achievement given to surrounding players when the megafauna is killed + var/achievement_type + /// Crusher achievement given to players when megafauna is killed + var/crusher_achievement_type + /// Score given to players when megafauna is killed + var/score_achievement_type + /// If the megafauna was actually killed (not just dying, then transforming into another type) + var/elimination = FALSE + /// Name for the GPS signal of the megafauna + var/gps_name = null + /// If this is a megafauna that is real (has achievements, gps signal) + var/true_spawn = TRUE + +/mob/living/basic/boss/Initialize(mapload) + . = ..() + AddElement(/datum/element/wall_tearer, tear_time = 1 SECONDS) + if(gps_name && true_spawn) + AddComponent(/datum/component/gps, gps_name) + ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) + add_traits(list(TRAIT_NO_TELEPORT, TRAIT_MARTIAL_ARTS_IMMUNE, TRAIT_LAVA_IMMUNE,TRAIT_ASHSTORM_IMMUNE, TRAIT_NO_FLOATING_ANIM), MEGAFAUNA_TRAIT) + AddComponent(/datum/component/seethrough_mob) + AddElement(/datum/element/simple_flying) + +/mob/living/basic/boss/gib() + if(health > 0) + return + return ..() + +/mob/living/basic/boss/dust(just_ash, drop_items, force) + if(!force && health > 0) + return + loot.Cut() + crusher_loot.Cut() + return ..() + +/mob/living/basic/boss/death(gibbed, list/force_grant) + if(gibbed) // in case they've been force dusted + return ..() + + if(health > 0) // prevents instakills + return + var/datum/status_effect/crusher_damage/crusher_dmg = has_status_effect(/datum/status_effect/crusher_damage) + ///Whether we killed the megafauna with primarily crusher damage or not + var/crusher_kill = (crusher_dmg && (crusher_dmg.total_damage >= floor(maxHealth * 0.6))) + if(true_spawn && !(flags_1 & ADMIN_SPAWNED_1)) + var/tab = "megafauna_kills" + if(crusher_kill) + tab = "megafauna_kills_crusher" + if(!elimination) //used so the achievment only occurs for the last legion to die. + grant_achievement(achievement_type, score_achievement_type, crusher_kill, force_grant) + SSblackbox.record_feedback("tally", tab, 1, "[initial(name)]") + + for(var/path in crusher_kill ? crusher_loot : loot) // using this instead of deathdrops and crusher_loot because we calculate differently and removing the element is ass + new path(drop_location()) + + return ..() + +/// Grants medals and achievements to surrounding players +/mob/living/basic/boss/proc/grant_achievement(medaltype, scoretype, crusher_kill, list/grant_achievement = list()) + if(!achievement_type || (flags_1 & ADMIN_SPAWNED_1) || !SSachievements.achievements_enabled) //Don't award medals if the medal type isn't set + return FALSE + if(!grant_achievement.len) + for(var/mob/living/victor in view(7,src)) + grant_achievement += victor + for(var/mob/living/victor in grant_achievement) + if(victor.stat || !victor.client) + continue + victor.add_mob_memory(/datum/memory/megafauna_slayer, antagonist = src) + victor.client.give_award(/datum/award/achievement/boss/boss_killer, victor) + victor.client.give_award(achievement_type, victor) + if(crusher_kill && istype(victor.get_active_held_item(), /obj/item/kinetic_crusher)) + victor.client.give_award(crusher_achievement_type, victor) + victor.client.give_award(/datum/award/score/boss_score, victor) //Score progression for bosses killed in general + victor.client.give_award(score_achievement_type, victor) //Score progression for specific boss killed + return TRUE + +/mob/living/basic/boss/early_melee_attack(mob/living/target, list/modifiers, ignore_cooldown) + . = ..() + if(!. || !istype(target)) + return + if(target.stat == DEAD || (target.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(target, TRAIT_NODEATH))) + devour(target) + +/// Devours a target and restores health to the megafauna +/mob/living/basic/boss/proc/devour(mob/living/victim) + if(isnull(victim) || victim.has_status_effect(/datum/status_effect/gutted)) + return FALSE + celebrate_kill(victim) + if(!is_station_level(z) || client) //NPC monsters won't heal while on station + heal_overall_damage(victim.maxHealth * 0.5) + victim.investigate_log("has been devoured by [src].", INVESTIGATE_DEATHS) + if(iscarbon(victim)) + qdel(victim.get_organ_slot(ORGAN_SLOT_LUNGS)) + qdel(victim.get_organ_slot(ORGAN_SLOT_HEART)) + qdel(victim.get_organ_slot(ORGAN_SLOT_LIVER)) + victim.adjustBruteLoss(500) + victim.death() //make sure they die + victim.apply_status_effect(/datum/status_effect/gutted) + return TRUE + +/mob/living/basic/boss/proc/celebrate_kill(mob/living/poor_sap) + visible_message( + span_danger("[src] disembowels [poor_sap]!"), + span_userdanger("You feast on [poor_sap]'s organs, restoring your health!")) + +/mob/living/basic/boss/ex_act(severity, target) + switch (severity) + if (EXPLODE_DEVASTATE) + adjustBruteLoss(250) + + if (EXPLODE_HEAVY) + adjustBruteLoss(100) + + if (EXPLODE_LIGHT) + adjustBruteLoss(50) + + return TRUE diff --git a/code/modules/mob/living/basic/boss/thing/thing.dm b/code/modules/mob/living/basic/boss/thing/thing.dm new file mode 100644 index 00000000000..7c0ac5b0123 --- /dev/null +++ b/code/modules/mob/living/basic/boss/thing/thing.dm @@ -0,0 +1,269 @@ +#define PHASEREGEN_FILTER "healing_glow" +#define RUIN_QUEUE "the_thing_depleter" +/mob/living/basic/boss/thing + name = "\improper Thing" + icon = 'icons/mob/simple/icemoon/thething.dmi' + icon_state = "p1" + icon_dead = "dead" + gender = NEUTER + maxHealth = 1800 //nicely divisible by three + health = 1800 + armour_penetration = 40 + melee_damage_lower = 30 + melee_damage_upper = 30 + sharpness = SHARP_EDGED + melee_attack_cooldown = CLICK_CD_SLOW + attack_verb_continuous = "eviscerates" + attack_verb_simple = "eviscerate" + attack_sound = 'sound/items/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH + speed = 3.5 //dont make this any faster PLEASE + gps_name = "L-4 Biohazard Beacon" + ai_controller = /datum/ai_controller/basic_controller/thing_boss + loot = list(/obj/item/keycard/thing_boss) + crusher_loot = list(/obj/item/keycard/thing_boss, /obj/item/crusher_trophy/flesh_glob) + mouse_opacity = MOUSE_OPACITY_OPAQUE + /// Current phase of the boss fight + var/phase = 1 + /// Time the Thing will be invulnerable between phases + var/phase_invul_time = 10 SECONDS + /// timer of phase invulnerability between phases + var/phase_invulnerability_timer + + // ruin logic + + /// if true, this boss may only be killed proper in its ruin by the associated machines as part of the bossfight. Turn off if admin shitspawn + var/maploaded = TRUE + +/mob/living/basic/boss/thing/Initialize(mapload) + . = ..() + var/static/list/innate_actions = list( + /datum/action/cooldown/mob_cooldown/the_thing/decimate = BB_THETHING_DECIMATE, + /datum/action/cooldown/mob_cooldown/charge/the_thing = BB_THETHING_CHARGE, + /datum/action/cooldown/mob_cooldown/the_thing/big_tendrils = BB_THETHING_BIGTENDRILS, + /datum/action/cooldown/mob_cooldown/the_thing/shriek = BB_THETHING_SHRIEK, + /datum/action/cooldown/mob_cooldown/the_thing/cardinal_tendrils = BB_THETHING_CARDTENDRILS, + /datum/action/cooldown/mob_cooldown/the_thing/acid_spit = BB_THETHING_ACIDSPIT, + ) + grant_actions_by_list(innate_actions) + AddComponent(/datum/component/basic_mob_attack_telegraph, telegraph_duration = 0.3 SECONDS) + maploaded = mapload + if(maploaded) + SSqueuelinks.add_to_queue(src, RUIN_QUEUE, 0) + return INITIALIZE_HINT_LATELOAD + +/mob/living/basic/boss/thing/LateInitialize() + SSqueuelinks.pop_link(RUIN_QUEUE) + +/mob/living/basic/boss/thing/update_icon_state() + . = ..() + if(stat) + icon_state = "dead" + return + icon_state = "p[phase]" + icon_living = icon_state + +/mob/living/basic/boss/thing/adjust_health(amount, updating_health = TRUE, forced = FALSE) + if(phase_invulnerability_timer || phase == 3 || stat || amount <= 0) + return ..() + var/potential_excess = bruteloss + amount - (maxHealth/3)*phase + if(potential_excess > 0) + amount -= potential_excess + . = ..() + if(bruteloss >= (maxHealth/3)*phase) + phase_health_depleted() + +/mob/living/basic/boss/thing/proc/phase_health_depleted() + if(phase_invulnerability_timer) + return //wtf? + if(!maploaded) + phase_successfully_depleted() + return + add_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED), MEGAFAUNA_TRAIT) + balloon_alert_to_viewers("invulnerable! overload the machines!") + visible_message(span_danger("[src] drops to the ground staggered, unable to keep up with injuries!")) + phase_invulnerability_timer = addtimer(CALLBACK(src, PROC_REF(phase_too_slow)), phase_invul_time, TIMER_STOPPABLE|TIMER_UNIQUE) + add_filter(PHASEREGEN_FILTER, 2, list("type" = "outline", "color" = COLOR_PALE_GREEN, "alpha" = 0, "size" = 1)) + var/filter = get_filter(PHASEREGEN_FILTER) + animate(filter, alpha = 200, time = 0.5 SECONDS, loop = -1) + animate(alpha = 0, time = 0.5 SECONDS) + SEND_SIGNAL(src, COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED) + +/// The Thing is successfully hit by incendiary fire while downed by damage (alternatively takes too much damage if not ruin spawned) +/mob/living/basic/boss/thing/proc/phase_successfully_depleted() + playsound(src, 'sound/effects/pop_expl.ogg', 65) + ai_controller?.set_blackboard_key(BB_THETHING_NOAOE, FALSE) + remove_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED), MEGAFAUNA_TRAIT) + deltimer(phase_invulnerability_timer) + phase_invulnerability_timer = null + if(phase < 3) //after phase 3 we literally just die + phase++ + emote("scream") + update_appearance() + var/filter = get_filter(PHASEREGEN_FILTER) + if(!isnull(filter)) + animate(filter) + remove_filter(PHASEREGEN_FILTER) + SEND_SIGNAL(src, COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED) + new /obj/effect/gibspawner/human/bodypartless(loc) + +/mob/living/basic/boss/thing/proc/phase_too_slow() + phase_invulnerability_timer = null + remove_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED), MEGAFAUNA_TRAIT) + balloon_alert_to_viewers("recovers!") + visible_message(span_danger("[src] recovers from the damage! Too slow!")) + adjust_health(-(maxHealth/3) * 0.5) //half of a phase (which is a third of maxhealth) + var/filter = get_filter(PHASEREGEN_FILTER) + if(!isnull(filter)) + animate(filter) + remove_filter(PHASEREGEN_FILTER) + emote("roar") + SEND_SIGNAL(src, COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED) + +/mob/living/basic/boss/thing/vv_edit_var(vname, vval) + . = ..() + if(vname == NAMEOF(src, phase)) + ai_controller?.set_blackboard_key(BB_THETHING_NOAOE, phase > 1 ? FALSE : TRUE) + update_appearance() + +/mob/living/basic/boss/thing/with_ruin_loot + loot = list(/obj/item/organ/brain/cybernetic/ai) // the main loot of the ruin, but if admin spawned the keycard is useless + crusher_loot = list(/obj/item/organ/brain/cybernetic/ai, /obj/item/crusher_trophy/flesh_glob) + +// special stuff for our ruin to make a cooler bossfight + +/obj/structure/thing_boss_phase_depleter + name = "Molecular Accelerator" + desc = "Weird-ass lab equipment." + icon_state = "thingdepleter" + anchored = TRUE + density = TRUE + move_resist = INFINITY + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + /// is this not broken yet + var/functional = TRUE + /// boss weakref + var/datum/weakref/boss_weakref + +/obj/structure/thing_boss_phase_depleter/Initialize(mapload) + . = ..() + go_in_floor() + SSqueuelinks.add_to_queue(src, RUIN_QUEUE, 0) + +/obj/structure/thing_boss_phase_depleter/MatchedLinks(id, list/partners) + if(id != RUIN_QUEUE) + return + var/mob/living/basic/boss/thing/thing = locate() in partners + if(isnull(thing)) + qdel(src) + return + boss_weakref = WEAKREF(thing) + RegisterSignal(thing, COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED, PROC_REF(thing_phaseupdated)) + +/obj/structure/thing_boss_phase_depleter/proc/thing_phaseupdated(mob/living/basic/boss/thing/source) + SIGNAL_HANDLER + if(!functional) + return + if(source.phase_invulnerability_timer) + go_out_floor() + else + go_in_floor() + +/obj/structure/thing_boss_phase_depleter/examine(mob/user) + . = ..() + . += density ? span_boldnotice("It may be possible to overload this and destroy that things defenses...") : span_bolddanger("The machine is currently being restrained by tendrils.") + +/obj/structure/thing_boss_phase_depleter/proc/set_circuit_floor(state) + for(var/turf/open/floor/circuit/circuit in RANGE_TURFS(1, loc)) + circuit.on = state + circuit.update_appearance() + +/obj/structure/thing_boss_phase_depleter/proc/go_in_floor() + if(!density) + return + density = FALSE + obj_flags &= ~CAN_BE_HIT + set_circuit_floor(FALSE) + name = "hatch" + icon_state = "thingdepleter_infloor" + +/obj/structure/thing_boss_phase_depleter/proc/go_out_floor() + if(density) + return + density = TRUE + obj_flags |= CAN_BE_HIT + set_circuit_floor(TRUE) + name = initial(name) + icon_state = "thingdepleter" + new /obj/effect/temp_visual/mook_dust(loc) + +/obj/structure/thing_boss_phase_depleter/interact(mob/user, list/modifiers) + var/mob/living/basic/boss/thing/the_thing = boss_weakref?.resolve() + if(!the_thing || !functional || !density) + return + if(!user.can_perform_action(src) || !user.can_interact_with(src)) + return + balloon_alert_to_viewers("overloading...") + icon_state = "thingdepleter_overriding" + if(!do_after(user, 1 SECONDS, target = src)) + if(density) + icon_state = "thingdepleter" + return + new /obj/effect/temp_visual/circle_wave/orange(loc) + playsound(src, 'sound/effects/explosion/explosion3.ogg', 100) + animate(src, transform = matrix()*1.5, time = 0.2 SECONDS) + animate(transform = matrix(), time = 0) + the_thing.phase_successfully_depleted() + functional = FALSE + go_in_floor() + icon_state = "thingdepleter_overriding" + addtimer(VARSET_CALLBACK(src, icon_state, "thingdepleter_broken"), 0.2 SECONDS) + +/obj/effect/temp_visual/circle_wave/orange + color = COLOR_ORANGE + +/obj/structure/aggro_gate + name = "biohazard gate" + desc = "A wall of solid light, only activating when a human is endangered by a biohazard, unfortunately that does little for safety as it locks you in with said biohazard. Virtually indestructible, you must evade (or kill) the threat." + icon = 'icons/effects/effects.dmi' + icon_state = "wave2" + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + move_resist = MOVE_FORCE_OVERPOWERING + opacity = FALSE + density = FALSE + invisibility = INVISIBILITY_MAXIMUM + anchored = TRUE + /// queue id + var/queue_id = RUIN_QUEUE + /// blackboard key for target + var/target_bb_key = BB_BASIC_MOB_CURRENT_TARGET + +/obj/structure/aggro_gate/Initialize(mapload) + . = ..() + SSqueuelinks.add_to_queue(src, queue_id) + +/obj/structure/aggro_gate/MatchedLinks(id, list/partners) + if(id != queue_id) + return + for(var/mob/living/partner in partners) + RegisterSignal(partner, COMSIG_AI_BLACKBOARD_KEY_SET(target_bb_key), PROC_REF(bar_the_gates)) + RegisterSignals(partner, list(COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_bb_key), COMSIG_LIVING_DEATH, COMSIG_MOB_LOGIN), PROC_REF(open_gates)) + +/obj/structure/aggro_gate/proc/bar_the_gates(mob/living/source) + SIGNAL_HANDLER + var/atom/target = source.ai_controller?.blackboard[target_bb_key] + if (QDELETED(target)) + return + invisibility = INVISIBILITY_NONE + density = TRUE + playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + do_sparks(3, cardinal_only = FALSE, source = src) + +/obj/structure/aggro_gate/proc/open_gates(mob/living/source) + playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + do_sparks(3, cardinal_only = FALSE, source = src) + density = FALSE + invisibility = INVISIBILITY_MAXIMUM + +#undef PHASEREGEN_FILTER +#undef RUIN_QUEUE diff --git a/code/modules/mob/living/basic/boss/thing/thing_abilities.dm b/code/modules/mob/living/basic/boss/thing/thing_abilities.dm new file mode 100644 index 00000000000..3bf466c148f --- /dev/null +++ b/code/modules/mob/living/basic/boss/thing/thing_abilities.dm @@ -0,0 +1,202 @@ +/datum/action/cooldown/mob_cooldown/the_thing + shared_cooldown = MOB_SHARED_COOLDOWN_3 + /// in what phases of The Thing bossfight is this available + var/list/available_in_phases = list(1,2,3) + +/datum/action/cooldown/mob_cooldown/the_thing/IsAvailable(feedback) + var/mob/living/basic/boss/thing/the_thing = owner + if(!istype(the_thing)) + return ..() + return ..() && (the_thing.phase in available_in_phases) + +//decimate + +/datum/action/cooldown/mob_cooldown/the_thing/decimate + name = "Decimate" + desc = "Create spikes in a radius." + button_icon = 'icons/obj/weapons/stabby.dmi' + button_icon_state = "huntingknife" + click_to_activate = FALSE + cooldown_time = 10 SECONDS + +/datum/action/cooldown/mob_cooldown/the_thing/decimate/Activate(atom/caster) + if(HAS_TRAIT_FROM(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)) + return + . = ..() + + ADD_TRAIT(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT) + caster.Shake(1.4, 0.8, 0.3 SECONDS) + caster.visible_message(span_danger("[caster] shakes violently!")) + + for(var/turf/open/target in RANGE_TURFS(2, caster) - caster.loc) + new /obj/effect/temp_visual/telegraphing/exclamation/animated(target, 1.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(make_spikes), caster), 1.5 SECONDS) + +/datum/action/cooldown/mob_cooldown/the_thing/decimate/proc/make_spikes(atom/caster) + REMOVE_TRAIT(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT) + for(var/turf/open/target in RANGE_TURFS(2, caster)) + if(locate(/obj/structure/thing_boss_spike) in target) + continue + new /obj/structure/thing_boss_spike(target) + +// charge + +/datum/action/cooldown/mob_cooldown/charge/the_thing + shared_cooldown = NONE + charge_damage = 35 + charge_past = 3 + +/datum/action/cooldown/mob_cooldown/charge/the_thing/charge_sequence(atom/movable/charger, atom/target_atom, delay, past) + if(HAS_TRAIT_FROM(owner, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)) + return + var/mob/living/basic/boss/thing/the_thing = owner + var/charge_count = the_thing.phase != 3 ? 1 : 2 + for(var/i in 1 to charge_count) + do_charge(owner, target_atom, charge_delay * i, charge_past) + +/datum/action/cooldown/mob_cooldown/charge/the_thing/do_charge_indicator(atom/charger, atom/charge_target) + var/turf/target_turf = get_turf(charge_target) + if(!target_turf) + return + new /obj/effect/temp_visual/telegraphing/exclamation/animated(target_turf) + var/obj/effect/temp_visual/decoy/decoy = new /obj/effect/temp_visual/decoy(charger.loc, charger) + animate(decoy, alpha = 0, color = COLOR_RED, transform = matrix()*2, time = 3) + +/datum/action/cooldown/mob_cooldown/charge/the_thing/hit_target(atom/movable/source, mob/living/target, damage_dealt) + target.visible_message(span_danger("[source] lunges into [target]!"), span_userdanger("[source] knocks you into the ground, slashing you in the process!")) + target.apply_damage(damage_dealt, BRUTE) + target.Knockdown(1 SECONDS) + playsound(get_turf(target), 'sound/items/weapons/rapierhit.ogg', 100, TRUE) + shake_camera(target, 4, 3) + +// square tendrils + +/datum/action/cooldown/mob_cooldown/the_thing/big_tendrils + name = "Square Tendrils" + desc = "Create spikes in a square around the target." + button_icon = 'icons/obj/weapons/stabby.dmi' + button_icon_state = "huntingknife" + cooldown_time = 5 SECONDS + available_in_phases = list(2,3) + +/datum/action/cooldown/mob_cooldown/the_thing/big_tendrils/Activate(atom/target) + if(HAS_TRAIT_FROM(owner, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)) + return + . = ..() + target = get_turf(target) + var/mob/living/living_owner = owner + var/delay = 1 SECONDS + if((living_owner.health <= living_owner.maxHealth/3) ? 2 : 1) + delay += 1 SECONDS + new /obj/effect/temp_visual/telegraphing/big(target, delay) + else + new /obj/effect/temp_visual/telegraphing/exclamation/animated(target) + addtimer(CALLBACK(src, PROC_REF(make_spikes), target), delay) + +/datum/action/cooldown/mob_cooldown/the_thing/big_tendrils/proc/make_spikes(atom/epicenter) + var/mob/living/living_owner = owner + var/radius = living_owner.health <= living_owner.maxHealth/3 ? 2 : 1 + for(var/turf/open/target in RANGE_TURFS(radius, epicenter)) + if(locate(/obj/structure/thing_boss_spike) in target) + continue + new /obj/effect/temp_visual/mook_dust(target) + new /obj/structure/thing_boss_spike(target) + +// shriek + +/datum/action/cooldown/mob_cooldown/the_thing/shriek + name = "Shriek" + desc = "Confuse in a radius." + button_icon = 'icons/obj/weapons/stabby.dmi' + button_icon_state = "huntingknife" + click_to_activate = FALSE + cooldown_time = 10 SECONDS + shared_cooldown = NONE + available_in_phases = list(2,3) + +/datum/action/cooldown/mob_cooldown/the_thing/shriek/Activate(atom/caster) + if(HAS_TRAIT_FROM(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)) + return + . = ..() + ADD_TRAIT(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT) + caster.visible_message(span_danger("[caster][caster.p_s()] flesh starts becoming filled with holes!")) + for(var/turf/open/target in RANGE_TURFS(2, caster)) + new /obj/effect/temp_visual/telegraphing/exclamation(target, 1 SECONDS) + addtimer(CALLBACK(src, PROC_REF(shriek), owner), 1 SECONDS) + +/datum/action/cooldown/mob_cooldown/the_thing/shriek/proc/shriek(atom/caster) + REMOVE_TRAIT(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT) + caster.visible_message(span_danger("[caster] shrieks! The sheer frequency of the sound makes your skin hurt and you feel like your brain is on fire!")) + SEND_SOUND(caster, sound('sound/effects/screech.ogg')) + for(var/mob/living/target in range(2, caster)) + if(target == owner) + continue + target.set_confusion_if_lower(5 SECONDS) + target.set_jitter_if_lower(5 SECONDS) + var/mob/living/carbon/carbon_target = target + if(istype(carbon_target)) + carbon_target.drop_all_held_items() + SEND_SOUND(target, sound('sound/effects/screech.ogg')) + +// card. tendrils + +/datum/action/cooldown/mob_cooldown/the_thing/cardinal_tendrils + name = "Cardinal Tendrils" + desc = "Create tendrils in all cardinal directions." + button_icon = 'icons/obj/weapons/stabby.dmi' + button_icon_state = "huntingknife" + cooldown_time = 10 SECONDS + available_in_phases = list(2,3) + click_to_activate = FALSE + /// range of tendril + var/range = 9 + +/datum/action/cooldown/mob_cooldown/the_thing/cardinal_tendrils/Activate(atom/targetted_turf) + if(HAS_TRAIT_FROM(owner, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)) + return + . = ..() + targetted_turf = get_turf(targetted_turf) + owner.Shake(1.4, 0.8, 0.3 SECONDS) + owner.visible_message(span_danger("[owner] shakes violently!")) + var/list/turf/target_turfs = find_turfs(targetted_turf) + for(var/turf/open/target in target_turfs) + new /obj/effect/temp_visual/telegraphing/exclamation/animated(target, 1.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(make_spikes), target_turfs, owner), 1.5 SECONDS) + +/datum/action/cooldown/mob_cooldown/the_thing/cardinal_tendrils/proc/find_turfs(atom/caster) + . = list() + for(var/direction in GLOB.cardinals) + for(var/turf/potential_turf as anything in get_line(caster, get_ranged_target_turf(caster, direction, range))) + if(potential_turf.density) + break + . += potential_turf + +/datum/action/cooldown/mob_cooldown/the_thing/cardinal_tendrils/proc/make_spikes(list/target_turfs, atom/caster) + REMOVE_TRAIT(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT) + for(var/turf/open/target as anything in target_turfs) + if(locate(/obj/structure/thing_boss_spike) in target) + continue + new /obj/effect/temp_visual/mook_dust(target) + new /obj/structure/thing_boss_spike(target) + +// acid + +/datum/action/cooldown/mob_cooldown/the_thing/acid_spit + name = "Acid Shower" + desc = "Spit patches of acid in a radius around you." + button_icon = 'icons/obj/weapons/stabby.dmi' + button_icon_state = "huntingknife" + cooldown_time = 10 SECONDS + click_to_activate = FALSE + available_in_phases = list(3) + +/datum/action/cooldown/mob_cooldown/the_thing/acid_spit/Activate(atom/target) + if(HAS_TRAIT_FROM(owner, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)) + return + . = ..() + var/turf/owner_turf = get_turf(owner) + owner.visible_message(span_danger("[owner] spits acid!")) + var/list/potential = RANGE_TURFS(4, owner_turf) + + for(var/i = 1 to rand(2,4)) + new /obj/effect/temp_visual/incoming_thing_acid(pick(potential)) diff --git a/code/modules/mob/living/basic/boss/thing/thing_ai.dm b/code/modules/mob/living/basic/boss/thing/thing_ai.dm new file mode 100644 index 00000000000..9d31d9c7698 --- /dev/null +++ b/code/modules/mob/living/basic/boss/thing/thing_ai.dm @@ -0,0 +1,70 @@ +/datum/ai_controller/basic_controller/thing_boss + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/no_gutted_mobs, + BB_TARGET_MINIMUM_STAT = DEAD, // Will attack dead ungutted mobs + BB_THETHING_ATTACKMODE = TRUE, //Whether we are using our melee abilities right now + BB_THETHING_NOAOE = TRUE, // Restricts us to only melee abilities + BB_THETHING_LASTAOE = null, // Last AOE ability key executed + BB_AGGRO_RANGE = 6, //lets not execute hearers for a 16 tile radius + ) + + ai_movement = /datum/ai_movement/basic_avoidance // dont need anything better because the arena is a square lol + idle_behavior = null + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target/increased_range, //aggros at 6, sees 16 tiles + /datum/ai_planning_subtree/thing_boss_aoe, + /datum/ai_planning_subtree/thing_boss_melee, + ) + +/datum/ai_planning_subtree/thing_boss_aoe/SelectBehaviors(datum/ai_controller/monkey/controller, seconds_per_tick) + var/mob/living/pawn = controller.pawn + if(HAS_TRAIT_FROM(pawn, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT) || (controller.blackboard[BB_THETHING_ATTACKMODE] || controller.blackboard[BB_THETHING_NOAOE])) + return + // our target + var/mob/living/shaft_miner = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(QDELETED(shaft_miner) || shaft_miner.stat == DEAD) //Dont use abilities on off z level targets, or dead shaft miners. We want to melee those. + return + + controller.set_blackboard_key(BB_THETHING_ATTACKMODE, TRUE) // putting this here so we go to melee mode if we cant do any aoe + var/static/list/aoe_attacks = list(BB_THETHING_DECIMATE, BB_THETHING_BIGTENDRILS, BB_THETHING_CARDTENDRILS, BB_THETHING_ACIDSPIT) + var/list/possible_attacks = aoe_attacks.Copy() - controller.blackboard[BB_THETHING_LASTAOE] + for(var/bb_action_key in possible_attacks) + var/datum/action/action = controller.blackboard[bb_action_key] + if(!action?.IsAvailable()) + possible_attacks -= bb_action_key + if(!length(possible_attacks)) + return + var/current_aoe_key = pick(possible_attacks) + controller.set_blackboard_key(BB_THETHING_LASTAOE, current_aoe_key) + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability, current_aoe_key, BB_BASIC_MOB_CURRENT_TARGET) + if(prob(60) && shaft_miner.body_position != LYING_DOWN) //potential follow-up + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability, BB_THETHING_CHARGE, BB_BASIC_MOB_CURRENT_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + + +/datum/ai_planning_subtree/thing_boss_melee/SelectBehaviors(datum/ai_controller/monkey/controller, seconds_per_tick) + var/mob/living/pawn = controller.pawn + if(HAS_TRAIT_FROM(pawn, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)) + return + + // our target + var/mob/living/shaft_miner = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(QDELETED(shaft_miner)) + return + var/target_dist = get_dist(pawn, shaft_miner) + + var/datum/action/shriek = controller.blackboard[BB_THETHING_SHRIEK] + var/datum/action/charge = controller.blackboard[BB_THETHING_CHARGE] + if(isnull(shriek) || isnull(charge)) + return // pray this never occurs + + controller.set_blackboard_key(BB_THETHING_ATTACKMODE, FALSE) + + if(shriek.IsAvailable() && target_dist <= 2 && shaft_miner.stat != DEAD) + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/min_range/short, BB_THETHING_SHRIEK, BB_BASIC_MOB_CURRENT_TARGET) + return + else if(charge.IsAvailable() && target_dist >= 5) // While we cant hit prone targets, this helps to close the distance. + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability, BB_THETHING_CHARGE, BB_BASIC_MOB_CURRENT_TARGET) + return + + controller.queue_behavior(/datum/ai_behavior/basic_melee_attack, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) diff --git a/code/modules/mob/living/basic/boss/thing/thing_objects.dm b/code/modules/mob/living/basic/boss/thing/thing_objects.dm new file mode 100644 index 00000000000..b1801b32164 --- /dev/null +++ b/code/modules/mob/living/basic/boss/thing/thing_objects.dm @@ -0,0 +1,130 @@ +/obj/structure/thing_boss_spike + name = "blades" + desc = "A sharp flurry of blades that have erupted from the ground." + icon_state = "thingspike" + density = FALSE //so ai considers it + anchored = TRUE + max_integrity = 1 // 1 hit + /// time before we fall apart + var/expiry_time = 10 SECONDS + +/obj/structure/thing_boss_spike/Initialize(mapload) + . = ..() + var/turf/our_turf = get_turf(src) +#ifndef UNIT_TESTS //just in case + new /obj/effect/temp_visual/mook_dust(loc) +#endif + var/hit_someone = FALSE + for(var/atom/movable/potential_target as anything in our_turf) + if (ismegafauna(potential_target) || potential_target == src) + continue + var/mob/living/living_victim = potential_target + if(isliving(living_victim)) + hit_someone = TRUE + living_victim.apply_damage(40, damagetype = BRUTE, sharpness = SHARP_POINTY) + else if(potential_target.uses_integrity && !(potential_target.resistance_flags & INDESTRUCTIBLE) && !(initial(potential_target.density)) && !HAS_TRAIT(potential_target, TRAIT_UNDERFLOOR)) + potential_target.take_damage(100, BRUTE) + if (hit_someone) + expiry_time /= 2 + playsound(src, 'sound/items/weapons/slice.ogg', vol = 50, vary = TRUE, pressure_affected = FALSE) + else + playsound(src, 'sound/misc/splort.ogg', vol = 25, vary = TRUE, pressure_affected = FALSE) + + QDEL_IN(src, expiry_time) + +/obj/structure/thing_boss_spike/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + if(damage_amount) + playsound(src, 'sound/effects/blob/blobattack.ogg', 50, TRUE) + else + playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE) + +/obj/structure/thing_boss_spike/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(!istype(mover, /mob/living/basic/boss/thing)) + return FALSE + +/obj/structure/thing_boss_spike/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(!istype(pass_info.requester_ref?.resolve(), /mob/living/basic/boss/thing)) + return FALSE + return ..() + +/obj/effect/temp_visual/telegraphing/exclamation + icon = 'icons/mob/telegraphing/telegraph.dmi' + icon_state = "exclamation" + duration = 1 SECONDS + +/obj/effect/temp_visual/telegraphing/exclamation/Initialize(mapload, duration) + if(!isnull(duration)) + src.duration = duration + return ..() + +/obj/effect/temp_visual/telegraphing/exclamation/animated + alpha = 0 + +/obj/effect/temp_visual/telegraphing/exclamation/animated/Initialize(mapload) + . = ..() + transform = matrix()*2 + animate(src, alpha = 255, transform = matrix(), time = duration/3) + +/obj/effect/temp_visual/telegraphing/big + icon = 'icons/mob/telegraphing/telegraph_96x96.dmi' + icon_state = "target_largebox" + pixel_x = -32 + pixel_y = -32 + color = COLOR_RED + duration = 2 SECONDS + +/obj/effect/temp_visual/incoming_thing_acid + icon = 'icons/obj/weapons/guns/projectiles.dmi' + icon_state = "toxin" + name = "acid" + desc = "Get out of the way!" + layer = FLY_LAYER + plane = ABOVE_GAME_PLANE + randomdir = FALSE + duration = 0.9 SECONDS + pixel_z = 270 + +/obj/effect/temp_visual/incoming_thing_acid/Initialize(mapload) + . = ..() + animate(src, pixel_z = 0, time = duration) + addtimer(CALLBACK(src, PROC_REF(make_acid)), 0.85 SECONDS) + +/obj/effect/temp_visual/incoming_thing_acid/proc/make_acid() + for(var/turf/open/open in RANGE_TURFS(1, loc)) + new /obj/effect/thing_acid(open) + +/obj/effect/thing_acid + name = "stomach acid" + icon = 'icons/effects/acid.dmi' + icon_state = "default" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + anchored = TRUE + /// how long does the acid exist for + var/duration_time = 5 SECONDS + +/obj/effect/thing_acid/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + QDEL_IN(src, duration_time) + +/obj/effect/thing_acid/proc/on_entered(datum/source, mob/living/victim) + SIGNAL_HANDLER + if(!istype(victim) || ismegafauna(victim)) + return + for(var/zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + var/blocked = victim.run_armor_check(zone, ACID) + victim.apply_damage(25, BURN, def_zone = zone, blocked = blocked) + to_chat(victim, span_userdanger("You are burnt by the acid!")) + playsound(victim, 'sound/effects/wounds/sizzle1.ogg', vol = 50, vary = TRUE) + qdel(src) + +/obj/item/keycard/thing_boss + name = "Storage Room 2 Keycard" + desc = "A fancy keycard for storage room 2." + color = COLOR_PALE_GREEN + puzzle_id = "thingbosslootroom" diff --git a/code/modules/mob/living/basic/ruin_defender/blob_of_flesh.dm b/code/modules/mob/living/basic/ruin_defender/blob_of_flesh.dm new file mode 100644 index 00000000000..c27fd7f8d1c --- /dev/null +++ b/code/modules/mob/living/basic/ruin_defender/blob_of_flesh.dm @@ -0,0 +1,72 @@ +/datum/ai_controller/basic_controller/fleshblob + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_AGGRO_RANGE = 7, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/mob/living/basic/fleshblob + name = "mass of flesh" + desc = "A moving slithering mass of flesh, seems to be very much in pain. Better avoid. It has no mouth and it must scream." + icon = 'icons/mob/simple/animal.dmi' + icon_state = "fleshblob" + icon_living = "fleshblob" + mob_size = MOB_SIZE_LARGE + gender = NEUTER + basic_mob_flags = DEL_ON_DEATH + faction = list(FACTION_HOSTILE, FACTION_MINING) + melee_damage_lower = 3 + melee_damage_upper = 3 + health = 160 + maxHealth = 160 + attack_sound = 'sound/items/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_SMASH + attack_verb_continuous = "attempts to assimilate" + attack_verb_simple = "attempt to assimilate" + mob_biotypes = MOB_ORGANIC + speed = 8 + combat_mode = TRUE + ai_controller = /datum/ai_controller/basic_controller/fleshblob + +/mob/living/basic/fleshblob/Initialize(mapload, obj/item/bodypart/limb) + . = ..() + grant_actions_by_list(list(/datum/action/consume/fleshblob)) + ADD_TRAIT(src, TRAIT_STRONG_GRABBER, INNATE_TRAIT) + AddElement(/datum/element/death_drops, string_list(list(/obj/effect/gibspawner/generic))) + AddComponent(\ + /datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/trails, \ + target_dir_change = TRUE,\ + ) + +/mob/living/basic/fleshblob/container_resist_act(mob/living/user) + . = ..() + if(!do_after(user, 4 SECONDS, target = src, timed_action_flags = IGNORE_TARGET_LOC_CHANGE|IGNORE_USER_LOC_CHANGE|IGNORE_INCAPACITATED)) + return FALSE + var/datum/action/consume/fleshblob/consume = locate() in actions + if(isnull(consume)) + return + consume.stop_consuming() + +/mob/living/basic/fleshblob/melee_attack(mob/living/target, list/modifiers, ignore_cooldown = FALSE) + if(target.loc == src || pulling == target) + return FALSE + . = ..() + if(!istype(target) || isnull(.)) // we deal 0 damage + return + start_pulling(target, state = GRAB_AGGRESSIVE) + var/datum/action/consume/fleshblob/consume = locate() in actions + if(isnull(consume)) + return + consume.Trigger() // subtrees wouldve spammed this shit repeatedly anyway + +/datum/action/consume/fleshblob + devour_verb = "assimilate" + devour_time = 3 SECONDS diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index 77ccf3ea483..f8dd01ca3a0 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -202,6 +202,10 @@ button_icon = 'icons/mob/actions/actions_slime.dmi' button_icon_state = "consume" check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE|AB_CHECK_INCAPACITATED + /// What do we call devouring something + var/devour_verb = "devour" + /// how much time to eat someone + var/devour_time = 1.5 SECONDS ///The mob thats being consumed by this creature var/mob/living/vored_mob @@ -223,8 +227,8 @@ to_chat(src, span_warning("You need to be pulling a creature for this to work!")) return FALSE var/mob/living/eat_target = ooze.pulling - owner.visible_message(span_warning("[ooze] starts attempting to devour [eat_target]!"), span_notice("You start attempting to devour [eat_target].")) - if(!do_after(ooze, 1.5 SECONDS, eat_target)) + owner.visible_message(span_warning("[ooze] starts attempting to [devour_verb] [eat_target]!"), span_notice("You start attempting to [devour_verb] [eat_target].")) + if(!do_after(ooze, devour_time, eat_target)) return FALSE if(!(eat_target.mob_biotypes & MOB_ORGANIC) || eat_target.stat == DEAD) @@ -238,7 +242,7 @@ vored_mob.forceMove(owner) ///AAAAAAAAAAAAAAAAAAAAAAHHH!!! RegisterSignal(vored_mob, COMSIG_QDELETING, PROC_REF(stop_consuming)) playsound(owner,'sound/items/eatfood.ogg', rand(30,50), TRUE) - owner.visible_message(span_warning("[src] devours [target]!"), span_notice("You devour [target].")) + owner.visible_message(span_warning("[owner] [devour_verb]s [target]!"), span_notice("You [devour_verb] [target].")) START_PROCESSING(SSprocessing, src) build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) @@ -260,7 +264,8 @@ var/mob/living/simple_animal/hostile/ooze/gelatinous/ooze = owner vored_mob.adjustBruteLoss(5) ooze.heal_ordered_damage((ooze.maxHealth * 0.03), list(BRUTE, BURN, OXY)) ///Heal 6% of these specific damage types each process - ooze.adjust_ooze_nutrition(3) + if(istype(ooze)) + ooze.adjust_ooze_nutrition(3) ///Dump 'em if they're dead. if(vored_mob.stat == DEAD) diff --git a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm index 1aac6e4c1ae..7b02f618081 100644 --- a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm +++ b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm @@ -315,6 +315,10 @@ All ShuttleMove procs go here . = ..() message_admins("Megafauna [src] [ADMIN_FLW(src)] moved via shuttle from [ADMIN_COORDJMP(oldT)] to [ADMIN_COORDJMP(loc)]") +/mob/living/basic/boss/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) + . = ..() + message_admins("Megafauna [src] [ADMIN_FLW(src)] moved via shuttle from [ADMIN_COORDJMP(oldT)] to [ADMIN_COORDJMP(loc)]") + /************************************Structure move procs************************************/ /obj/structure/grille/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) diff --git a/icons/mob/simple/animal.dmi b/icons/mob/simple/animal.dmi index 62e36fad550..5c419b03cb8 100644 Binary files a/icons/mob/simple/animal.dmi and b/icons/mob/simple/animal.dmi differ diff --git a/icons/mob/simple/icemoon/thething.dmi b/icons/mob/simple/icemoon/thething.dmi new file mode 100644 index 00000000000..7486749471a Binary files /dev/null and b/icons/mob/simple/icemoon/thething.dmi differ diff --git a/icons/mob/telegraphing/telegraph.dmi b/icons/mob/telegraphing/telegraph.dmi index b1ff26a4a10..c655de326f7 100644 Binary files a/icons/mob/telegraphing/telegraph.dmi and b/icons/mob/telegraphing/telegraph.dmi differ diff --git a/icons/obj/mining_zones/artefacts.dmi b/icons/obj/mining_zones/artefacts.dmi index 968bbe5b621..a12fdb67042 100644 Binary files a/icons/obj/mining_zones/artefacts.dmi and b/icons/obj/mining_zones/artefacts.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 9c19b982c95..a77b88944cb 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 1fb53dae109..873e223754d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -391,6 +391,7 @@ #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_guardian.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_main.dm" +#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_megafauna.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_silicon.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_simple.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_spawner.dm" @@ -4867,6 +4868,11 @@ #include "code\modules\mob\living\basic\blob_minions\blob_spore.dm" #include "code\modules\mob\living\basic\blob_minions\blob_zombie.dm" #include "code\modules\mob\living\basic\blob_minions\blobbernaut.dm" +#include "code\modules\mob\living\basic\boss\boss.dm" +#include "code\modules\mob\living\basic\boss\thing\thing.dm" +#include "code\modules\mob\living\basic\boss\thing\thing_abilities.dm" +#include "code\modules\mob\living\basic\boss\thing\thing_ai.dm" +#include "code\modules\mob\living\basic\boss\thing\thing_objects.dm" #include "code\modules\mob\living\basic\bots\_bots.dm" #include "code\modules\mob\living\basic\bots\bot_ai.dm" #include "code\modules\mob\living\basic\bots\bot_hud.dm" @@ -5067,6 +5073,7 @@ #include "code\modules\mob\living\basic\pets\penguin\penguin_ai.dm" #include "code\modules\mob\living\basic\pets\pet_cult\pet_cult_abilities.dm" #include "code\modules\mob\living\basic\pets\pet_cult\pet_cult_ai.dm" +#include "code\modules\mob\living\basic\ruin_defender\blob_of_flesh.dm" #include "code\modules\mob\living\basic\ruin_defender\cybersun_aicore.dm" #include "code\modules\mob\living\basic\ruin_defender\dark_wizard.dm" #include "code\modules\mob\living\basic\ruin_defender\flesh.dm"