diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000000..84bd4fa20aad9 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + target-branch: master + schedule: + interval: daily + labels: + - GitHub + open-pull-requests-limit: 10 diff --git a/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_abandoned_icewalker_den.dmm b/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_abandoned_icewalker_den.dmm new file mode 100644 index 0000000000000..2c4c5d0615608 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_abandoned_icewalker_den.dmm @@ -0,0 +1,1902 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ap" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"aQ" = ( +/obj/structure/bonfire/grill_pre_attached, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"ba" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"bn" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"bp" = ( +/obj/item/stack/sheet/mineral/stone, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/wall_torch/mount_only/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"bw" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"bS" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"ci" = ( +/obj/structure/closet/crate/wooden, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"co" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"cq" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/structure/punji_sticks/spikes, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"cE" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/bundlenatural, +/obj/item/pen/charcoal, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"cL" = ( +/obj/item/stack/sheet/mineral/stone, +/obj/item/stack/sheet/mineral/stone, +/obj/item/stack/sheet/mineral/stone, +/obj/item/stack/sheet/mineral/stone, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"db" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"dq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"dw" = ( +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"dy" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/mob_spawn/corpse/human/miner, +/obj/effect/decal/cleanable/blood/gibs, +/obj/effect/decal/cleanable/blood, +/obj/item/ammo_casing/arrow/bone, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"dE" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"dJ" = ( +/obj/structure/bed/maint{ + pixel_y = 13 + }, +/obj/structure/bed/maint, +/obj/item/bedsheet/black/double{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"dR" = ( +/obj/structure/reagent_crafting_bench, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"ed" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"ft" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"fL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"fN" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"fQ" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"gD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"gM" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"hJ" = ( +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"iJ" = ( +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/mineral/wood{ + amount = 15 + }, +/obj/item/stack/sheet/mineral/coal/ten, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"iS" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"jh" = ( +/obj/item/reagent_containers/cup/glass/bottle/lizardwine{ + pixel_y = 8; + pixel_x = -5 + }, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"jP" = ( +/obj/item/ammo_casing/arrow/bronze, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"jS" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"kf" = ( +/obj/structure/reagent_forge{ + pixel_y = 12 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"kh" = ( +/mob/living/basic/mining/wolf, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"kQ" = ( +/obj/structure/bed/maint, +/obj/item/bedsheet/black{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"lx" = ( +/obj/item/stack/sheet/mineral/stone, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"lE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"lG" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"lH" = ( +/obj/structure/bed/dogbed, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"lP" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"mz" = ( +/obj/structure/table/wood, +/obj/structure/large_mortar, +/obj/item/pestle{ + pixel_y = -1; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"nh" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"nq" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"nA" = ( +/obj/machinery/vending/primitive_catgirl_clothing_vendor, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/wall_torch/mount_only/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"nE" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"nP" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"oa" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"oi" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/stack/medical/aloe{ + pixel_y = 2; + pixel_x = 2 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"or" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"oG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"oR" = ( +/obj/structure/bed/maint{ + pixel_y = 13 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"pd" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"pf" = ( +/obj/structure/bed/maint{ + pixel_y = 13 + }, +/obj/item/bedsheet/black{ + pixel_y = 12 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"pV" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"qF" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"qJ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"qO" = ( +/obj/structure/chair/sofa/bamboo/left{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"qU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"rl" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"rz" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"rB" = ( +/obj/item/pickaxe/mini, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"rC" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/window/paperframe, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"rJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"rP" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"sH" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"sV" = ( +/obj/structure/bed/maint{ + pixel_y = 13 + }, +/obj/structure/bed/maint, +/obj/item/bedsheet/black/double, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"th" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/mob_spawn/corpse/human/miner/mod, +/obj/item/forging/reagent_weapon/spear, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"tw" = ( +/obj/item/forging/reagent_weapon/axe/fake_copper{ + pixel_x = 4; + pixel_y = -4 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"ty" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"tB" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"tT" = ( +/obj/effect/decal/cleanable/blood/trails, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"tU" = ( +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"uw" = ( +/obj/item/cultivator/rake, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"uS" = ( +/obj/structure/table/wood, +/obj/structure/chem_separator, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"vN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"vW" = ( +/obj/structure/bed/dogbed, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"wd" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"we" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"wA" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"wN" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"wZ" = ( +/obj/structure/wall_torch/mount_only/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"xg" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/structure/wall_torch/mount_only/directional/north, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"xj" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/punji_sticks/spikes, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"xs" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"xv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"xG" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/unpowered/abandoned_hearth) +"xS" = ( +/obj/structure/closet/crate/wooden, +/obj/item/reagent_containers/cup/glass/bottle/moonshine{ + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/glass/bottle/moonshine{ + pixel_x = 8 + }, +/obj/item/reagent_containers/cup/glass/bottle/hooch{ + pixel_y = 3; + pixel_x = -7 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"yw" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/closet/crate/wooden, +/obj/item/reagent_containers/cup/glass/bottle/moonshine{ + pixel_x = 8 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"zz" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"zE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Bm" = ( +/obj/item/reagent_containers/cup/mortar{ + pixel_y = -5; + pixel_x = 2 + }, +/obj/item/pestle{ + pixel_y = -7; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/bowl/mushroom_bowl{ + pixel_y = 8; + pixel_x = 3 + }, +/obj/item/reagent_containers/cup/bowl/mushroom_bowl{ + pixel_y = 12; + pixel_x = 3 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Cc" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Cl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"Cp" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Cs" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"CA" = ( +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"CE" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"CL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/trails{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Dc" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Di" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"Do" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"Dr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"DQ" = ( +/obj/structure/table/wood, +/obj/structure/large_mortar, +/obj/item/pestle{ + pixel_y = -1; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"DV" = ( +/obj/item/pestle{ + pixel_y = -9; + pixel_x = -7 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Ec" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/hatchet/wooden{ + pixel_y = 5; + pixel_x = -3 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"Ej" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Eq" = ( +/obj/item/stack/sheet/mineral/stone, +/obj/item/stack/sheet/mineral/stone, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Eu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Ey" = ( +/obj/item/reagent_containers/cup/glass/bottle/moonshine{ + pixel_y = 12; + pixel_x = 5; + name = "high quality wound number" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"EC" = ( +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"ED" = ( +/obj/item/shovel, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"EV" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"EX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"EZ" = ( +/obj/structure/table/wood, +/obj/item/knife/hunting{ + pixel_y = 5 + }, +/obj/item/kitchen/rollingpin, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Fu" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Fv" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"FS" = ( +/obj/structure/table/wood, +/obj/item/plate, +/obj/item/plate{ + pixel_y = 2; + pixel_x = 2 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Gy" = ( +/turf/closed/indestructible/stone, +/area/ruin/unpowered/abandoned_hearth) +"GC" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"GW" = ( +/obj/item/reagent_containers/cup/mortar{ + pixel_y = 9; + pixel_x = -3 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Hd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"HK" = ( +/obj/structure/barricade/wooden, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Jn" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/window/paperframe, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"JS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/punji_sticks/spikes, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Kl" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Kw" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"KG" = ( +/obj/item/storage/box/matches{ + pixel_y = -8; + pixel_x = -3 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"KH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"KZ" = ( +/obj/structure/barricade/wooden, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Lf" = ( +/obj/structure/chair/sofa/bamboo/right, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Lv" = ( +/obj/effect/mob_spawn/corpse/human/doctor, +/obj/effect/decal/cleanable/blood, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Nb" = ( +/obj/structure/bed/maint{ + pixel_y = 13 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Nc" = ( +/obj/structure/bed/maint{ + pixel_y = 13 + }, +/obj/structure/bed/maint, +/obj/item/bedsheet/black/double{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Nj" = ( +/obj/structure/punji_sticks/spikes, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Nz" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"NG" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"NI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/mob/living/basic/mining/wolf, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"NX" = ( +/obj/item/shield/buckler{ + pixel_y = 7; + pixel_x = -3 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Oi" = ( +/obj/item/reagent_containers/cup/mortar{ + pixel_y = 9; + pixel_x = 5 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Oo" = ( +/obj/structure/bed/maint, +/obj/structure/curtain/bounty, +/obj/item/restraints/handcuffs/cable/sinew, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Pb" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/wall_torch/mount_only/directional/north, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Pg" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Pi" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"Pl" = ( +/obj/item/shield/goliath{ + pixel_x = -6 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"PC" = ( +/obj/structure/bed/maint{ + pixel_y = 13 + }, +/obj/structure/bed/maint, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"PL" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"PT" = ( +/obj/item/stack/sheet/mineral/stone, +/obj/item/stack/sheet/mineral/stone, +/obj/item/stack/sheet/mineral/stone, +/obj/item/stack/sheet/mineral/stone, +/obj/effect/decal/cleanable/cobweb{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Qo" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"QO" = ( +/obj/item/ore_sensor{ + pixel_y = -1; + pixel_x = 7 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"QT" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"QY" = ( +/obj/effect/turf_decal/siding/wood, +/mob/living/basic/mining/wolf, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Si" = ( +/obj/structure/reagent_water_basin, +/obj/effect/decal/cleanable/cobweb{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"So" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"SZ" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"Tf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/bedsheet/black{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/bedsheet/black{ + pixel_x = 5; + pixel_y = 12 + }, +/obj/effect/decal/cleanable/cobweb{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Tw" = ( +/obj/structure/table/wood, +/obj/item/plate/oven_tray, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Us" = ( +/obj/item/stack/sheet/mineral/stone, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Uz" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"UM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/closet/crate/wooden/storage_barrel, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"UO" = ( +/obj/structure/fermenting_barrel, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"VP" = ( +/obj/structure/wall_torch/mount_only/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Wa" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/punji_sticks/spikes, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Wz" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"WR" = ( +/obj/structure/reagent_anvil, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Xh" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Xt" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Xx" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/window/paperframe, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"XW" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/seeds/poppy/lily/trumpet, +/obj/item/seeds/poppy, +/obj/item/seeds/pumpkin, +/obj/item/seeds/tomato, +/obj/item/seeds/whitebeet, +/obj/item/seeds/redbeet, +/obj/item/seeds/wheat, +/obj/item/seeds/wheat, +/obj/item/seeds/garlic, +/obj/item/seeds/garlic, +/obj/item/seeds/peas, +/obj/item/seeds/corn, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"Yf" = ( +/turf/template_noop, +/area/template_noop) +"Yj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_hearth) +"YH" = ( +/obj/machinery/oven/stone, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"Zu" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_hearth) +"ZO" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/asteroid/snow/ice/icemoon, +/area/ruin/unpowered/abandoned_hearth) + +(1,1,1) = {" +Yf +Yf +Yf +Yf +nq +Pg +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +"} +(2,1,1) = {" +Yf +Yf +Yf +Pg +Pg +Pg +Pg +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +"} +(3,1,1) = {" +Yf +Yf +Pg +Pg +oa +Pg +Pg +Gy +xG +KZ +xG +Gy +Yf +Yf +Yf +Pg +Pg +Yf +Yf +Yf +Yf +"} +(4,1,1) = {" +Yf +Yf +xG +Pg +wZ +Gy +Gy +Gy +Tf +Cp +Oo +Gy +Eq +Gy +Pg +Pg +Pg +Pg +Yf +Yf +Yf +"} +(5,1,1) = {" +Yf +xG +KZ +Xt +Pg +Pg +Jn +uS +DQ +dq +Ey +ba +xG +Pg +Pg +DV +Pg +Pg +Yf +Yf +Yf +"} +(6,1,1) = {" +Gy +Gy +Si +jP +Pg +dR +xj +cE +ap +vN +PL +Oo +Pg +Pg +Pg +GW +xG +Pg +Pg +Yf +Yf +"} +(7,1,1) = {" +PT +iJ +Pg +Pg +Pg +ci +cq +Oi +xv +th +oi +ba +KZ +Pg +Pg +Pg +Pg +Pg +tU +Yf +Yf +"} +(8,1,1) = {" +lx +kf +Pg +Pg +Pg +Gy +Eq +Gy +CE +CL +yw +Gy +Eq +Pg +Pg +kh +Pg +Pg +Pg +Yf +Yf +"} +(9,1,1) = {" +Gy +hJ +Pg +WR +Pg +Pl +rC +pf +ty +ba +qU +Nc +xG +Pg +EX +gD +UO +rB +Pg +Yf +Yf +"} +(10,1,1) = {" +Gy +Gy +VP +Pg +oa +jP +Wa +EC +QY +PL +fL +lH +tB +tT +Eu +nP +xG +Pg +Yf +Yf +Yf +"} +(11,1,1) = {" +Yf +xG +NX +Pg +Pg +tw +Xx +PC +dy +ba +qU +oR +xG +Pg +Dc +Pg +QO +Pg +Yf +Yf +Yf +"} +(12,1,1) = {" +Yf +HK +HK +Us +Pg +Gy +Gy +Gy +QT +bn +ft +Gy +Gy +Gy +xg +Pg +tU +Pg +Pg +Yf +Yf +"} +(13,1,1) = {" +Yf +Yf +Pg +Pg +Pg +Pg +xG +nA +Lf +bS +Nz +EC +xG +jS +gM +Pg +Pg +dw +Pg +Yf +Yf +"} +(14,1,1) = {" +Yf +Yf +nq +Pg +Xt +Pg +Uz +EC +Fu +EC +rl +Kw +EC +Nj +Pg +kh +Pg +CA +Lv +Yf +Yf +"} +(15,1,1) = {" +Yf +Yf +Pg +rB +Pg +Pg +xG +rz +Fu +bS +qO +xS +xG +sH +Pg +jP +Xt +xG +Pg +Pg +Yf +"} +(16,1,1) = {" +Yf +Yf +Yf +Pg +Pg +Gy +Gy +Gy +EC +EC +EC +Gy +Gy +Gy +fN +Pg +Pg +XW +xG +Pg +Yf +"} +(17,1,1) = {" +Yf +Yf +Yf +Pg +Pg +jP +xG +KG +ed +zE +Ej +Nb +xG +pd +UM +Di +Pg +ED +zz +Pg +Pg +"} +(18,1,1) = {" +Yf +Yf +Yf +Yf +Pg +Pg +KZ +dJ +Cc +mz +qU +kQ +JS +Yj +qF +Do +ZO +Pg +NG +rJ +Pg +"} +(19,1,1) = {" +Yf +Yf +Yf +Yf +Yf +Yf +JS +vW +iS +aQ +qU +sV +xG +KH +bw +we +or +rP +Pg +pV +Pg +"} +(20,1,1) = {" +Yf +Yf +Yf +Yf +Yf +Gy +Gy +Gy +iS +Hd +Fv +Gy +Gy +NI +Wz +uw +xs +gM +nE +Cl +Pg +"} +(21,1,1) = {" +Yf +Yf +Yf +Yf +Yf +Gy +dE +lP +Kl +So +lG +Xh +lE +oG +Pg +co +qJ +SZ +Ec +Pg +Pg +"} +(22,1,1) = {" +Yf +Yf +Yf +Yf +Yf +cL +YH +Zu +Fu +Fu +Fu +jh +KZ +Dr +Cs +Pg +Pi +EV +wd +Pg +Yf +"} +(23,1,1) = {" +Yf +Yf +Yf +Yf +Yf +Gy +wA +wN +Fu +Fu +Tw +Bm +xG +GC +nh +Pg +Qo +Pg +xG +Yf +Yf +"} +(24,1,1) = {" +Yf +Yf +Yf +Yf +Yf +Gy +Gy +bp +FS +db +EZ +Gy +Us +Gy +Pb +Eu +Pg +Pg +Yf +Yf +Yf +"} +(25,1,1) = {" +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Gy +xG +lE +xG +Gy +Yf +Pg +fQ +Pg +Pg +Pg +Yf +Yf +Yf +"} +(26,1,1) = {" +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Yf +Pg +Pg +Pg +Yf +Yf +Yf +Yf +"} diff --git a/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_abandoned_sacred_temple.dmm b/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_abandoned_sacred_temple.dmm new file mode 100644 index 0000000000000..4308bd1270c89 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_abandoned_sacred_temple.dmm @@ -0,0 +1,2836 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"au" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"aw" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"ba" = ( +/turf/closed/mineral/snowmountain/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"bJ" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"bS" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/soup_pot{ + pixel_y = 5; + pixel_x = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"cg" = ( +/obj/structure/wall_torch/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"cp" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/forging/reagent_weapon/sword, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"cr" = ( +/obj/structure/wall_torch/directional/west, +/mob/living/basic/ghost/swarm, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"cu" = ( +/obj/structure/table/wood, +/obj/item/soap/homemade, +/obj/item/reagent_containers/cup/rag{ + pixel_y = -3 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"cO" = ( +/obj/machinery/smartfridge/wooden/ration_shelf, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"cR" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"dF" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"dM" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/gold/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"dO" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"dQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/gold/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"eE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/stack/sheet/mineral/wood/fifty, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"eK" = ( +/turf/closed/mineral/snowmountain/cavern/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"fg" = ( +/turf/closed/wall/mineral/gold, +/area/ruin/unpowered/abandoned_sacred_temple) +"fj" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/ferny/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"fz" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"fH" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/ferny/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"gj" = ( +/obj/structure/window/green_glass_pane, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"ha" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"hi" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/mob_spawn/corpse/human/skeleton, +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"hk" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"hT" = ( +/obj/structure/closet/cabinet, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"io" = ( +/obj/structure/closet/crate/grave/filled, +/mob/living/basic/blankbody, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"is" = ( +/obj/structure/chair/wood/wings{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"iz" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"iH" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"iU" = ( +/turf/closed/wall/mineral/stone, +/area/ruin/unpowered/abandoned_sacred_temple) +"iW" = ( +/obj/structure/flora/tree/jungle/small/style_3, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"ju" = ( +/obj/structure/chair/wood/wings{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"jM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"kd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"kk" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"kF" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"kL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"kN" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/gold/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"kO" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"lh" = ( +/turf/template_noop, +/area/template_noop) +"li" = ( +/obj/structure/mineral_door/wood/large_gate, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"lP" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/ghost/swarm, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"lW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"lX" = ( +/obj/machinery/smartfridge/wooden/produce_bin, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"mn" = ( +/obj/structure/flora/tree/jungle/small/style_6, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"mE" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"mF" = ( +/obj/structure/millstone, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"mW" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"mZ" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"nf" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/gold/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"nX" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"oD" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"oV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"pk" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/gold/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"pu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"pK" = ( +/obj/structure/falsewall/wood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/mineral/gold/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"qm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"qE" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"si" = ( +/obj/structure/closet/cabinet, +/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/sacred_temple, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"sk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"sp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"sA" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"sV" = ( +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"th" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"tm" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/mob_spawn/corpse/human/skeleton, +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"tP" = ( +/obj/structure/reagent_water_basin, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"uk" = ( +/obj/structure/fluff/minepost, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"vf" = ( +/obj/structure/wall_torch/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"vm" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"wk" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"wN" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"xf" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"xv" = ( +/obj/item/reagent_containers/cup/bucket/wooden, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"yR" = ( +/obj/structure/reagent_water_basin, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"zK" = ( +/obj/structure/bed/maint, +/obj/item/bedsheet{ + dir = 1 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"zL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Ac" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"AA" = ( +/obj/structure/flora/tree/jungle/small/style_5, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"BM" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"CN" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"DO" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Ee" = ( +/obj/item/reagent_containers/cup/bucket/wooden, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Ex" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/forging/reagent_weapon/dagger, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"ES" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Fk" = ( +/obj/structure/table/wood/fancy/orange, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Gz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"GT" = ( +/obj/structure/rack/wooden, +/obj/item/plate/ceramic{ + pixel_y = 6; + pixel_x = -2 + }, +/obj/item/reagent_containers/cup/beaker/large/ceramic{ + pixel_y = -5; + pixel_x = 7 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"GW" = ( +/obj/machinery/cauldron, +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Hh" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Hq" = ( +/obj/structure/flora/tree/jungle/style_6, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"HI" = ( +/obj/structure/curtain/bounty/start_closed{ + name = "curtain" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"HS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Ia" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"IL" = ( +/obj/structure/rack/wooden, +/obj/item/reagent_containers/cup/glass/bottle/wine/unlabeled{ + pixel_y = 14; + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/glass/bottle/small{ + pixel_x = 7; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"JA" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/item/forging/reagent_weapon/hammer, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"JN" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Kd" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Kl" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/forging/reagent_weapon/staff, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"KZ" = ( +/obj/structure/wall_torch/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Le" = ( +/obj/machinery/griddle/stone, +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Lj" = ( +/obj/structure/fluff/minepost, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"LD" = ( +/obj/structure/bed/maint, +/obj/item/bedsheet{ + dir = 1 + }, +/mob/living/basic/ghost/swarm, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"LO" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/gold/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Mo" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/unpowered/abandoned_sacred_temple) +"Mr" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Mt" = ( +/obj/structure/table/wood, +/obj/item/cutting_board, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"MH" = ( +/obj/structure/table/wood, +/obj/structure/large_mortar, +/obj/item/pestle, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"ML" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/seeds/wheat, +/obj/item/seeds/wheat/meat, +/obj/item/seeds/wheat/oat, +/obj/item/seeds/wheat/rice, +/obj/item/seeds/potato, +/obj/item/seeds/potato/sweet, +/obj/item/seeds/carrot, +/obj/item/seeds/honeysuckle, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"MN" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"MW" = ( +/obj/structure/wall_torch/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"NB" = ( +/obj/structure/table/wood, +/obj/item/knife/butcher, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"NK" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"NN" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"NW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/ferny/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Od" = ( +/obj/structure/closet/crate/grave/filled, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Oh" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Ok" = ( +/obj/structure/wall_torch/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"OM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Pb" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Pe" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/mob/living/basic/ghost/swarm, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"PS" = ( +/obj/structure/statue/hearthkin/odin{ + anchored = 1; + can_be_unanchored = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"PV" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"PW" = ( +/obj/machinery/primitive_stove, +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Qi" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Qs" = ( +/obj/structure/fireplace{ + dir = 4; + pixel_y = -15 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"QG" = ( +/obj/structure/table/wood, +/obj/item/food/meat/slab/human/mutant/zombie{ + pixel_y = -10 + }, +/obj/item/food/meat/slab/human/mutant/zombie, +/obj/item/food/meat/slab/human/mutant/zombie{ + pixel_y = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Rx" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"RY" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Sc" = ( +/mob/living/basic/ghost/swarm, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"SH" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/primitive_centrifuge, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"SI" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"SK" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"SX" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/gold/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Tb" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Tk" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/mob/living/basic/ghost/swarm, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Tv" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"TP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Uh" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Ur" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Uv" = ( +/obj/structure/closet/cabinet, +/obj/item/reagent_containers/cup/bottle/curare, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Vd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Vn" = ( +/obj/structure/chair/wood/wings, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Vt" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"VG" = ( +/obj/structure/bed/maint, +/obj/item/bedsheet{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"VP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Wg" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"WA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"WK" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/lavendergrass/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Xw" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"XS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Yc" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Yg" = ( +/obj/structure/dresser, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Yi" = ( +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"Yo" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"YL" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/abandoned_sacred_temple) +"YT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Zg" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"Zu" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) +"ZX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/abandoned_sacred_temple) + +(1,1,1) = {" +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +"} +(2,1,1) = {" +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +"} +(3,1,1) = {" +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +"} +(4,1,1) = {" +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +lh +"} +(5,1,1) = {" +lh +lh +lh +lh +lh +lh +lh +lh +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +JN +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +"} +(6,1,1) = {" +lh +lh +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +eK +eK +eK +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +ba +ba +ba +ba +ba +ba +ba +ba +"} +(7,1,1) = {" +lh +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +eK +io +eK +eK +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +Ur +Yi +Yi +Yi +ba +ba +ba +ba +ba +"} +(8,1,1) = {" +lh +ba +ba +eK +eK +eK +eK +eK +eK +eK +eK +eK +eK +eK +eK +mZ +eK +eK +JN +JN +iU +iU +Mo +gj +gj +gj +gj +gj +gj +Mo +iU +iU +JN +iU +iU +Mo +gj +gj +gj +gj +gj +gj +Mo +iU +iU +Ur +Yi +Yi +Yi +Yi +Yi +ba +ba +ba +ba +"} +(9,1,1) = {" +lh +ba +ba +eK +Od +mZ +mZ +Od +Yo +mZ +mZ +fj +mZ +mZ +Tb +mZ +eK +eK +JN +JN +Mo +ha +zL +ju +ju +is +zL +ju +ju +zL +zL +Mo +JN +Mo +zK +Yg +LD +Yg +VG +Yg +VG +zL +Qs +XS +Mo +ML +SK +Yi +Yi +Yi +Pb +ba +ba +ba +ba +"} +(10,1,1) = {" +lh +ba +ba +eK +mZ +fj +mZ +WK +mZ +mZ +wk +mZ +Pe +WK +mZ +fj +eK +eK +JN +JN +Mo +vf +zL +Fk +zL +Fk +Fk +zL +Fk +Sc +cg +Mo +JN +Mo +Sc +zL +zL +zL +zL +Sc +zL +zL +sk +eE +Mo +mF +Yi +Yi +Qi +Pb +JN +ba +ba +ba +ba +"} +(11,1,1) = {" +lh +ba +ba +eK +eK +mZ +wk +mZ +mZ +Od +mZ +au +mZ +Od +mZ +eK +eK +iU +fg +fg +iU +zL +zL +Yc +Yc +zL +Yc +zL +Yc +zL +zL +iU +iU +iU +HI +HI +HI +zL +zL +TP +zL +zL +zL +si +iU +fg +fg +iU +bJ +JN +JN +ba +ba +ba +ba +"} +(12,1,1) = {" +lh +ba +ba +ba +eK +Od +mZ +mZ +Od +mZ +mZ +mZ +mZ +mZ +mZ +eK +eK +iU +dQ +nf +kN +zL +lP +zL +zL +zL +zL +zL +zL +zL +TP +zL +Kd +fg +Vn +Sc +HI +zL +zL +zL +zL +zL +zL +hT +fg +hk +wN +iU +JN +JN +JN +ba +ba +ba +ba +"} +(13,1,1) = {" +lh +ba +ba +ba +eK +mZ +mZ +mZ +Pe +mZ +Tb +Od +eK +eK +eK +eK +JN +Mo +pk +nf +kN +zL +zL +sp +NW +YT +OM +jM +Vd +th +zL +zL +JA +fg +cu +Ee +HI +MW +zL +zL +MW +hT +Uv +fg +fg +vm +zL +gj +JN +JN +JN +ba +ba +ba +ba +"} +(14,1,1) = {" +lh +ba +ba +ba +eK +Od +au +mZ +Od +mZ +mZ +eK +eK +Rx +nX +eK +JN +Mo +nf +nf +kN +zL +zL +HS +Uh +PV +PV +iz +PV +dO +zL +zL +Kl +Mo +Mo +Mo +Mo +Mo +NN +qE +Mo +Mo +Mo +Mo +uk +zL +zL +gj +JN +JN +JN +ba +ba +ba +ba +"} +(15,1,1) = {" +lh +ba +ba +ba +eK +mZ +mZ +fj +mZ +mZ +eK +eK +SI +SI +dF +nX +JN +Mo +XS +PS +kN +zL +zL +kd +sA +PV +mn +sA +fH +oD +zL +TP +BM +Mo +uk +KZ +zL +zL +zL +zL +zL +zL +fz +zL +zL +zL +zL +iU +JN +JN +JN +ba +ba +ba +ba +"} +(16,1,1) = {" +lh +ba +ba +ba +eK +Od +mZ +mZ +Od +mZ +eK +SI +SI +Rx +nX +eK +JN +pK +nf +nf +LO +lW +lW +VP +iz +PV +PV +Hh +PV +Zg +lW +lW +lW +lW +lW +lW +WA +lW +lW +lW +lW +lW +lW +lW +lW +lW +WA +li +kO +JN +JN +JN +ba +ba +ba +"} +(17,1,1) = {" +lh +ba +ba +eK +eK +mZ +WK +mZ +Zu +Zu +SI +SI +eK +eK +eK +eK +JN +pK +nf +nf +SX +qm +qm +kd +PV +PV +Tk +PV +Uh +Zg +qm +Ac +qm +qm +qm +qm +qm +qm +qm +qm +qm +qm +Ac +qm +qm +qm +qm +Tv +Pb +JN +xf +JN +ba +ba +ba +"} +(18,1,1) = {" +lh +ba +ba +eK +mZ +mZ +wk +Zu +mE +Zu +SI +eK +eK +mZ +mZ +eK +JN +Mo +XS +PS +kN +zL +zL +kd +iW +sA +fH +PV +sA +iH +zL +zL +Vt +Mo +Lj +CN +zL +zL +zL +zL +zL +zL +MW +zL +zL +zL +zL +iU +JN +JN +JN +JN +ba +ba +ba +"} +(19,1,1) = {" +lh +ba +ba +eK +Od +mZ +kF +hi +kk +hi +Zu +mZ +mZ +mZ +Od +eK +JN +Mo +nf +nf +kN +zL +zL +kd +MN +PV +sA +PV +AA +Zg +zL +zL +cp +Mo +Mo +Mo +Mo +Mo +NK +Oh +Mo +Mo +Mo +Mo +Lj +zL +zL +gj +JN +JN +JN +ba +ba +ba +ba +"} +(20,1,1) = {" +lh +ba +ba +eK +mZ +Pe +tm +Zu +ES +kk +Mr +aw +mZ +fj +mZ +eK +JN +Mo +pk +nf +kN +zL +zL +pu +Gz +ZX +Gz +Ia +Gz +oV +zL +zL +Ex +fg +GW +zL +zL +cr +zL +zL +KZ +zL +IL +fg +fg +vf +zL +gj +JN +JN +JN +ba +ba +ba +ba +"} +(21,1,1) = {" +lh +ba +ba +eK +mZ +mZ +RY +Zu +mW +Zu +hi +Zu +mZ +mZ +wk +eK +JN +iU +dM +nf +kN +zL +TP +Sc +zL +zL +zL +zL +zL +zL +zL +zL +Kd +fg +PW +zL +zL +zL +zL +zL +zL +zL +zL +lX +fg +DO +kL +iU +JN +JN +JN +ba +ba +ba +ba +"} +(22,1,1) = {" +lh +lh +ba +eK +WK +mZ +RY +Zu +Hq +Zu +Mr +Xw +Pe +WK +mZ +eK +JN +iU +fg +fg +iU +zL +zL +ju +ju +zL +ju +ju +ju +lP +zL +iU +iU +iU +cR +zL +NB +Mt +yR +wN +wN +SH +zL +GT +iU +fg +fg +iU +Ok +JN +JN +ba +ba +ba +ba +"} +(23,1,1) = {" +lh +lh +ba +eK +mZ +mZ +RY +mW +Zu +mW +hi +Zu +Od +mZ +mZ +eK +eK +eK +JN +JN +Mo +vf +zL +zL +Fk +Fk +zL +Fk +Fk +zL +cg +Mo +JN +Mo +cR +zL +QG +zL +zL +zL +zL +MH +zL +bS +Mo +JN +JN +JN +JN +JN +JN +ba +ba +ba +ba +"} +(24,1,1) = {" +lh +lh +ba +eK +mZ +mZ +tm +Zu +Zu +Mr +Zu +mZ +mZ +mZ +Tb +mZ +eK +eK +JN +JN +Mo +YL +zL +Yc +zL +Yc +Yc +zL +Yc +zL +zL +Mo +JN +Mo +Le +zL +zL +zL +TP +zL +zL +zL +zL +cO +Mo +JN +Mo +Mo +Mo +Ok +JN +ba +ba +ba +ba +"} +(25,1,1) = {" +lh +lh +ba +eK +eK +mZ +kF +tm +kF +tm +mZ +mZ +mZ +fj +mZ +mZ +eK +eK +JN +JN +iU +iU +Mo +gj +gj +gj +gj +gj +gj +Mo +iU +iU +JN +iU +iU +Mo +gj +gj +gj +gj +gj +gj +Mo +iU +iU +JN +Mo +sV +Wg +JN +xv +ba +ba +ba +ba +"} +(26,1,1) = {" +lh +lh +ba +ba +eK +eK +mZ +mZ +mZ +mZ +mZ +au +mZ +mZ +mZ +WK +eK +eK +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +JN +Mo +Mo +Mo +tP +ba +ba +ba +ba +ba +"} +(27,1,1) = {" +lh +lh +lh +ba +ba +eK +eK +eK +mZ +Od +mZ +mZ +WK +mZ +eK +eK +eK +ba +ba +ba +JN +JN +JN +JN +JN +JN +JN +JN +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +JN +JN +JN +JN +JN +JN +JN +JN +JN +ba +ba +ba +ba +lh +lh +lh +"} +(28,1,1) = {" +lh +lh +lh +lh +ba +ba +ba +eK +eK +eK +eK +eK +eK +eK +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +lh +lh +lh +"} +(29,1,1) = {" +lh +lh +lh +lh +lh +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +ba +lh +lh +lh +lh +"} +(30,1,1) = {" +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +lh +"} diff --git a/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_icewalker_lower.dmm b/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_icewalker_lower.dmm new file mode 100644 index 0000000000000..0ce6d5fa855db --- /dev/null +++ b/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_icewalker_lower.dmm @@ -0,0 +1,5295 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ac" = ( +/obj/structure/flora/ash/chilly, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ad" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/seeds/cabbage, +/obj/item/seeds/carrot, +/obj/item/seeds/carrot, +/obj/item/seeds/carrot/parsnip, +/obj/item/seeds/potato{ + pixel_y = 1 + }, +/obj/item/seeds/potato{ + pixel_y = 1 + }, +/obj/item/seeds/potato/sweet, +/obj/item/seeds/onion, +/obj/item/seeds/onion/red, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ap" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"at" = ( +/obj/structure/rack/wooden, +/obj/item/ore_sensor{ + pixel_y = -1; + pixel_x = 5 + }, +/obj/item/hatchet/wooden{ + pixel_y = 5; + pixel_x = -3 + }, +/obj/item/hatchet/wooden{ + pixel_y = 5; + pixel_x = 4 + }, +/obj/item/ore_sensor{ + pixel_y = -1; + pixel_x = -5 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"au" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/fishing_hook/weighted, +/obj/item/fishing_hook/shiny{ + pixel_y = 4; + pixel_x = -6 + }, +/obj/item/fishing_hook/bone{ + pixel_y = -6 + }, +/obj/item/fishing_line/sinew{ + pixel_x = 10 + }, +/obj/item/fishing_line/sinew{ + pixel_y = 11; + pixel_x = 5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"aA" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/food/cheese/firm_cheese{ + pixel_y = -2 + }, +/obj/item/food/cheese/firm_cheese{ + pixel_y = 1 + }, +/obj/item/food/cheese/firm_cheese{ + pixel_y = 3 + }, +/obj/item/food/cheese/firm_cheese{ + pixel_y = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"aB" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"aJ" = ( +/obj/structure/railing/wooden_fencing, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"aO" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"bc" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"bu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/wall_torch/spawns_lit/directional/east, +/obj/structure/rack/wooden, +/obj/item/forging/billow/primitive{ + pixel_y = 10 + }, +/obj/item/forging/tongs/primitive{ + pixel_x = 3; + pixel_y = -4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"bB" = ( +/obj/structure/fluff/minepost, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"bK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"bT" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"cM" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"cQ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/rack/wooden, +/obj/item/reagent_containers/cup/glass/trophy, +/obj/item/reagent_containers/cup/glass/trophy{ + pixel_y = 20; + pixel_x = 5 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"cU" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"cV" = ( +/obj/structure/mineral_door/wood/large_gate, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"de" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/sofa/bamboo/left, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"dj" = ( +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ds" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"dD" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/seeds/cotton, +/obj/item/seeds/cotton, +/obj/item/seeds/tea{ + pixel_y = 1 + }, +/obj/item/seeds/tea{ + pixel_y = 1 + }, +/obj/item/seeds/tea/catnip, +/obj/item/seeds/bamboo, +/obj/item/seeds/ambrosia, +/obj/item/seeds/grass, +/obj/item/seeds/honeysuckle, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"dF" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"dM" = ( +/obj/item/pillow/random{ + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"em" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/stack/sheet/leather{ + amount = 35 + }, +/obj/item/stack/sheet/cloth/ten, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/stack/sheet/cloth/ten, +/obj/item/stack/cable_coil/thirty, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"eq" = ( +/obj/structure/table/wood, +/obj/structure/large_mortar, +/obj/item/pestle{ + pixel_y = -1; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ev" = ( +/obj/machinery/smartfridge/wooden/produce_bin, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"eS" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"fJ" = ( +/obj/item/pillow/random{ + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"fK" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"fV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"fY" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"gg" = ( +/obj/structure/rack/wooden, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/thirtysix_twentyfour, +/obj/item/paint_palette, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"gr" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"gz" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"gK" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"gU" = ( +/obj/structure/rack/wooden, +/obj/item/climbing_hook{ + pixel_y = 7 + }, +/obj/item/climbing_hook, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"gW" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"hb" = ( +/obj/structure/rack/wooden, +/obj/effect/turf_decal/siding/wood, +/obj/structure/towel_bin/basket{ + pixel_y = 7 + }, +/obj/structure/towel_bin/basket{ + pixel_y = -5 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"hB" = ( +/obj/machinery/cauldron, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"hP" = ( +/obj/structure/reagent_water_basin, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"hR" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"hW" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ie" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"iy" = ( +/obj/structure/rack/wooden, +/obj/item/stack/sheet/iron/five{ + pixel_x = -7 + }, +/obj/item/stack/sheet/glass{ + pixel_y = 4 + }, +/obj/item/stack/sheet/glass{ + pixel_y = 4 + }, +/obj/item/stack/sheet/glass{ + pixel_y = 4 + }, +/obj/item/stack/sheet/glass{ + pixel_y = 4 + }, +/obj/item/stack/sheet/glass{ + pixel_y = 4 + }, +/obj/item/stack/sheet/copporcitite{ + amount = 37; + pixel_x = -4; + pixel_y = 10 + }, +/obj/item/stack/sheet/cobolterium{ + amount = 32; + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/stack/sheet/brussite{ + amount = 20 + }, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"iz" = ( +/obj/structure/railing/wooden_fencing/gate{ + dir = 4 + }, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"iI" = ( +/obj/structure/window/green_glass_pane, +/obj/structure/curtain/bounty, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ja" = ( +/obj/structure/table/wood, +/obj/structure/wall_torch/spawns_lit/directional/south, +/obj/item/reagent_containers/cup/glass/bottle/ale{ + pixel_x = 5 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"jf" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"js" = ( +/obj/structure/ore_vein/iron, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"jR" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ke" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/obj/structure/flora/ash/leaf_shroom, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kg" = ( +/obj/structure/rack/wooden, +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kh" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/stairs/wood{ + dir = 1 + }, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kt" = ( +/obj/item/flashlight/lantern, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kx" = ( +/obj/structure/rack/wooden, +/obj/item/clothing/glasses/blindfold/white{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/clothing/glasses/blindfold/white, +/obj/item/clothing/glasses/blindfold/white{ + pixel_x = 3; + pixel_y = -6 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kO" = ( +/obj/structure/loom, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kP" = ( +/obj/structure/chair/sofa/bamboo/left, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"la" = ( +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"lb" = ( +/obj/structure/window/green_glass_pane, +/obj/structure/curtain/bounty/start_closed, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"lg" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/flashlight/lantern{ + pixel_y = -3 + }, +/obj/item/flashlight/lantern{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/item/flashlight/lantern{ + pixel_x = 6; + pixel_y = 2 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ln" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"lv" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/seeds/coffee{ + pixel_y = -5 + }, +/obj/item/seeds/coffee{ + pixel_y = -5 + }, +/obj/item/seeds/coffee/robusta, +/obj/item/seeds/soya, +/obj/item/seeds/soya, +/obj/item/seeds/sugarcane, +/obj/item/seeds/tobacco, +/obj/item/seeds/tobacco, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"lx" = ( +/turf/closed/mineral/snowmountain/cavern, +/area/ruin/unpowered/primitive_catgirl_den) +"lA" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"lI" = ( +/obj/structure/mirror/directional/west, +/obj/structure/rack/wooden, +/obj/item/clothing/under/dress/skirt/primitive_catgirl_tailored_dress, +/obj/item/clothing/under/dress/skirt/primitive_catgirl_tailored_dress, +/obj/item/clothing/under/dress/skirt/primitive_catgirl_tailored_dress, +/obj/item/clothing/under/dress/skirt/primitive_catgirl_tailored_dress, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"lQ" = ( +/obj/structure/ore_vein/gold, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"mc" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ml" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"mq" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"mr" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"mG" = ( +/obj/structure/table/wood, +/obj/item/cutting_board, +/obj/item/knife/hunting{ + pixel_y = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"mH" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"mN" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/food/raw_tiziran_sausage{ + pixel_y = -4 + }, +/obj/item/food/raw_tiziran_sausage, +/obj/item/food/raw_tiziran_sausage{ + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"mS" = ( +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/obj/structure/ore_container/food_trough/raptor_trough, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"mU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"mZ" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/bowl/wood_bowl, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"nn" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"nG" = ( +/obj/machinery/griddle/stone, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"nI" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"nL" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/seeds/garlic, +/obj/item/seeds/garlic, +/obj/item/seeds/redbeet, +/obj/item/seeds/whitebeet, +/obj/item/seeds/tomato, +/obj/item/seeds/pumpkin, +/obj/item/seeds/plum, +/obj/item/seeds/berry, +/obj/item/seeds/grape, +/obj/item/seeds/watermelon, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"nQ" = ( +/obj/structure/bonfire/prelit, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"nR" = ( +/obj/machinery/primitive_stove, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"oe" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/pen/charcoal, +/obj/item/pen/charcoal{ + pixel_x = 5 + }, +/obj/item/pen/charcoal{ + pixel_y = -6 + }, +/obj/item/pen/charcoal{ + pixel_y = -7; + pixel_x = -5 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"of" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"ol" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/obj/structure/stairs/wood{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"om" = ( +/obj/structure/mirror/directional/west, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"oy" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"oB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/reagent_crafting_bench, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"oJ" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"oL" = ( +/obj/machinery/smartfridge/wooden/seed_shelf, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"oN" = ( +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"oQ" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"pd" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/seeds/aloe{ + pixel_y = -5 + }, +/obj/item/seeds/herbs{ + pixel_y = 3 + }, +/obj/item/seeds/herbs{ + pixel_y = 3 + }, +/obj/item/seeds/toechtauese{ + pixel_y = 5 + }, +/obj/item/seeds/poppy/lily/trumpet, +/obj/item/seeds/kronkus, +/obj/item/seeds/cannabis, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"pm" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"po" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"pA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"pW" = ( +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"qb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"qh" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"qr" = ( +/obj/structure/rack/wooden, +/obj/item/flashlight/flare/torch{ + pixel_y = 12; + pixel_x = -9 + }, +/obj/item/flashlight/flare/torch{ + pixel_y = 12; + pixel_x = -5 + }, +/obj/item/flashlight/flare/torch{ + pixel_y = 12; + pixel_x = -1 + }, +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"qu" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"qN" = ( +/obj/structure/rack/wooden, +/obj/item/reagent_containers/cup/glass/bottle/small{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/glass/bottle/small{ + pixel_x = 5; + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/glass/bottle/small{ + pixel_x = 7; + pixel_y = -2 + }, +/obj/item/reagent_containers/cup/glass/bottle/small{ + pixel_x = -8 + }, +/obj/item/reagent_containers/cup/glass/bottle/small{ + pixel_x = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"rd" = ( +/obj/structure/ore_vein/stone, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"rg" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"rL" = ( +/obj/structure/fluff/minepost, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"rY" = ( +/obj/structure/chair/sofa/bamboo{ + dir = 1 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"sj" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"sl" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"sq" = ( +/obj/structure/reagent_forge, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"su" = ( +/turf/closed/mineral/snowmountain/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"sz" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"sM" = ( +/obj/item/pillow, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"te" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"tu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"tz" = ( +/obj/structure/rack/wooden, +/obj/item/paper_bin/bundlenatural{ + pixel_y = 8; + pixel_x = 4 + }, +/obj/item/pen/charcoal{ + pixel_y = -7; + pixel_x = -5 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"tB" = ( +/obj/structure/ore_container/food_trough/raptor_trough, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"tI" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"uC" = ( +/obj/structure/rack/wooden, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"uG" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"uP" = ( +/obj/structure/hearthkin_rune_stone, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"uT" = ( +/obj/structure/rack/wooden, +/obj/item/climbing_hook{ + pixel_y = 7 + }, +/obj/item/climbing_hook, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"uV" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/stack/sheet/cloth/ten, +/obj/structure/rack/wooden, +/obj/item/food/grown/poppy/geranium, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"vd" = ( +/obj/machinery/portable_atmospherics/scrubber/huge{ + alpha = 0; + on = 1; + name = "air scrubber" + }, +/obj/structure/window/green_glass_pane, +/obj/structure/curtain/bounty, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"vk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/wood/fifty, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"vm" = ( +/obj/structure/flora/ash/cap_shroom, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"vq" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"vu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"vy" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"vG" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/primitive_centrifuge, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"vI" = ( +/obj/structure/table/wood, +/obj/item/food/honey_roll, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ws" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/trophy, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"wB" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/obj/structure/ore_container/food_trough/raptor_trough, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"wF" = ( +/obj/structure/rack/wooden, +/obj/item/fishing_rod/bone{ + pixel_x = -4 + }, +/obj/item/fishing_rod/bone{ + pixel_x = 3 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"wN" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"wQ" = ( +/obj/structure/curtain/bounty, +/obj/structure/window/green_glass_pane, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"wU" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"xc" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"xu" = ( +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"xT" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/food/rootdough, +/obj/item/food/rootdough{ + pixel_y = 5; + pixel_x = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"xU" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"xX" = ( +/obj/structure/table/wood, +/obj/item/food/honeybun, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"yd" = ( +/obj/structure/rack/wooden, +/obj/item/storage/box/matches{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"yf" = ( +/obj/structure/statue/hearthkin/odin, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"yn" = ( +/obj/structure/rack/wooden, +/obj/item/restraints/legcuffs/bola{ + pixel_y = 7; + pixel_x = 4 + }, +/obj/item/restraints/legcuffs/bola{ + pixel_y = 7; + pixel_x = -5 + }, +/obj/item/restraints/legcuffs/bola{ + pixel_y = -7; + pixel_x = 5 + }, +/obj/item/shield/buckler{ + pixel_y = -5; + pixel_x = 5 + }, +/obj/item/shield/buckler{ + pixel_y = 7; + pixel_x = -3 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"yp" = ( +/obj/structure/chair/sofa/bamboo/right{ + dir = 1 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"yx" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"yy" = ( +/obj/effect/mob_spawn/ghost_role/human/primitive_catgirl, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"yE" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"yN" = ( +/obj/structure/rack/wooden, +/obj/item/climbing_hook{ + pixel_y = 7 + }, +/obj/item/climbing_hook, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"yR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"yU" = ( +/obj/structure/window/green_glass_pane, +/obj/structure/curtain/bounty, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"zt" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"zu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"zy" = ( +/obj/item/pillow/random{ + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"zE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/rack/wooden, +/obj/item/reagent_containers/cup/glass/bottle/moonshine{ + pixel_y = -3; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/glass/bottle/wine/unlabeled{ + pixel_y = 14; + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/glass/bottle/wine/unlabeled{ + pixel_x = -3 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"zI" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/obj/structure/ore_vein/gold, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Aj" = ( +/obj/structure/chair/sofa/bamboo/right, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Aw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"AA" = ( +/obj/structure/rack/wooden, +/obj/item/instrument/glockenspiel, +/obj/item/instrument/guitar, +/obj/item/instrument/banjo, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"AE" = ( +/obj/machinery/smartfridge/wooden/ration_shelf, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"AF" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"AI" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"AK" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"AR" = ( +/obj/structure/table/wood, +/obj/item/flashlight/flare/candle/infinite{ + pixel_y = 15; + pixel_x = 11 + }, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Bd" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/seeds/corn, +/obj/item/seeds/corn, +/obj/item/seeds/wheat, +/obj/item/seeds/wheat, +/obj/item/seeds/wheat/oat, +/obj/item/seeds/wheat/rice, +/obj/item/seeds/cocoapod, +/obj/item/seeds/korta_nut, +/obj/item/seeds/korta_nut, +/obj/item/seeds/korta_nut/sweet, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Be" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Bh" = ( +/obj/structure/railing/wooden_fencing/gate{ + dir = 1 + }, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Bq" = ( +/obj/structure/rack/wooden, +/obj/item/pickaxe{ + pixel_x = -5 + }, +/obj/item/pickaxe, +/obj/item/pickaxe{ + pixel_x = 5 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/item/pickaxe{ + pixel_x = -5 + }, +/obj/item/pickaxe{ + pixel_x = 5 + }, +/obj/item/pickaxe, +/obj/effect/turf_decal/siding/wood, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"BA" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"BF" = ( +/obj/machinery/vending/primitive_catgirl_clothing_vendor, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"BG" = ( +/obj/structure/rack/wooden, +/obj/item/ore_sensor{ + pixel_y = -1; + pixel_x = -5 + }, +/obj/item/ore_sensor{ + pixel_y = -1; + pixel_x = 5 + }, +/obj/item/ore_sensor{ + pixel_y = 10; + pixel_x = -5 + }, +/obj/item/ore_sensor{ + pixel_y = 10; + pixel_x = 5 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"BL" = ( +/obj/machinery/portable_atmospherics/scrubber/huge{ + alpha = 0; + on = 1; + name = "air scrubber" + }, +/turf/closed/wall/mineral/stone, +/area/ruin/unpowered/primitive_catgirl_den) +"BU" = ( +/obj/structure/rack/wooden, +/obj/item/reagent_containers/cup/soup_pot{ + pixel_y = 12; + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/glass/bottle/wine/unlabeled{ + pixel_y = 14; + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/glass/bottle/wine/unlabeled{ + pixel_x = -3 + }, +/obj/item/reagent_containers/cup/glass/bottle/small{ + pixel_x = 7; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ca" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Co" = ( +/obj/structure/stairs/wood{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"CD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"CU" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"CX" = ( +/obj/structure/rack/wooden, +/obj/item/flashlight/flare/torch{ + pixel_y = 12; + pixel_x = 7 + }, +/obj/item/flashlight/flare/torch{ + pixel_y = 12; + pixel_x = 15 + }, +/obj/item/flashlight/flare/torch{ + pixel_y = 12; + pixel_x = 11 + }, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Df" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Di" = ( +/obj/structure/rack/wooden, +/obj/item/reagent_containers/cup/bowl/mushroom_bowl{ + pixel_y = 8; + pixel_x = 3 + }, +/obj/item/reagent_containers/cup/bowl/mushroom_bowl{ + pixel_y = 12; + pixel_x = 3 + }, +/obj/item/storage/box/matches{ + pixel_y = -8; + pixel_x = -3 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Dz" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"DB" = ( +/obj/structure/mineral_door/wood/large_gate, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"DJ" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Eh" = ( +/obj/structure/table/wood, +/obj/item/food/bread/meat, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ej" = ( +/obj/structure/stairs/wood{ + dir = 8 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Er" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Es" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/bowl/mushroom_bowl, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"EL" = ( +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"EP" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ER" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/structure/table/wood, +/obj/item/plate/oven_tray/material/fake_copper, +/obj/item/reagent_containers/cup/soup_pot{ + pixel_y = 5; + pixel_x = 4 + }, +/obj/item/kitchen/rollingpin{ + pixel_x = -16; + pixel_y = 7 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"EU" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"EZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/sofa/bamboo/right, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"Fj" = ( +/obj/structure/chair/wood, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Fw" = ( +/obj/item/pillow/random{ + pixel_y = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"FG" = ( +/obj/structure/reagent_crafting_bench, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"FK" = ( +/obj/structure/rack/wooden, +/obj/item/ore_sensor{ + pixel_y = -1; + pixel_x = 5 + }, +/obj/item/hatchet/wooden{ + pixel_y = 5; + pixel_x = -3 + }, +/obj/item/hatchet/wooden{ + pixel_y = 5; + pixel_x = 4 + }, +/obj/item/ore_sensor{ + pixel_y = -1; + pixel_x = -5 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"FP" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"FW" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"FX" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ga" = ( +/obj/structure/stairs/wood{ + dir = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Gf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Gy" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/reagent_anvil, +/obj/item/forging/hammer/primitive, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"GD" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"GU" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Hd" = ( +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"Hv" = ( +/obj/structure/rack/wooden, +/obj/item/dice/d20{ + name = "Scratched Dice"; + desc = "A die with twenty sides. Useful for all sort of social games- this one was clearly rescued from the wastes though, considering how scratched it is." + }, +/obj/item/chisel/primitive, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"HB" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Is" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/structure/flora/ash/stem_shroom, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"IE" = ( +/obj/structure/rack/wooden, +/obj/item/pickaxe{ + pixel_x = -5 + }, +/obj/item/pickaxe, +/obj/item/pickaxe{ + pixel_x = 5 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/item/pickaxe{ + pixel_x = -5 + }, +/obj/item/pickaxe{ + pixel_x = 5 + }, +/obj/item/pickaxe, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"IF" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/bowl/wood_bowl{ + pixel_y = -5 + }, +/obj/item/reagent_containers/cup/bowl/wood_bowl{ + pixel_y = 8; + pixel_x = 3 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"II" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"IJ" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"IQ" = ( +/obj/machinery/smartfridge/wooden/produce_bin, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"IR" = ( +/obj/structure/rack/wooden, +/obj/item/clothing/suit/jacket/primitive_catgirl_coat, +/obj/item/clothing/suit/jacket/primitive_catgirl_coat, +/obj/item/clothing/suit/jacket/primitive_catgirl_coat, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"IS" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/restraints/handcuffs/cable/sinew, +/obj/item/restraints/handcuffs/cable/sinew{ + pixel_x = -3 + }, +/obj/item/restraints/handcuffs/cable/sinew{ + pixel_x = -3; + pixel_y = 6 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Jj" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/fish/chasm_crab/ice{ + pixel_y = -4; + pixel_x = -3 + }, +/obj/item/fish/chasm_crab/ice{ + pixel_y = 5; + pixel_x = 3 + }, +/obj/item/fish/dwarf_moonfish{ + pixel_x = -5 + }, +/obj/item/fish/dwarf_moonfish{ + pixel_x = -2; + pixel_y = 8 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Jl" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"Jn" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"Jq" = ( +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Jt" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"JF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/rack/wooden, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"JI" = ( +/obj/structure/curtain/bounty, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"JN" = ( +/obj/structure/rack/wooden, +/obj/item/soap/homemade{ + pixel_y = 11 + }, +/obj/item/soap/homemade{ + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_y = -3 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_y = -3; + pixel_x = 6 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"JO" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"JQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"JT" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/obj/structure/rack/wooden, +/obj/item/clothing/under/dress/skirt/primitive_catgirl_tunic, +/obj/item/clothing/under/dress/skirt/primitive_catgirl_tunic, +/obj/item/clothing/under/dress/skirt/primitive_catgirl_tunic, +/obj/item/clothing/under/dress/skirt/primitive_catgirl_tunic, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Kc" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Kd" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/unpowered/primitive_catgirl_den) +"Kn" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Kr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/sofa/bamboo, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"Ku" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/rack/wooden, +/obj/item/forging/billow/primitive{ + pixel_y = 10 + }, +/obj/item/forging/tongs/primitive{ + pixel_x = 3; + pixel_y = -4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Kz" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/wirecutters/primitive, +/obj/item/wrench/primitive, +/obj/item/screwdriver/primitive, +/obj/item/crowbar/primitive, +/obj/item/weldingtool/mini, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"KU" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/seeds/greenbean, +/obj/item/seeds/greenbean, +/obj/item/seeds/olive, +/obj/item/seeds/olive, +/obj/item/seeds/peanut, +/obj/item/seeds/peas, +/obj/item/seeds/banana, +/obj/effect/turf_decal/siding/wood, +/obj/item/seeds/cherry, +/obj/item/seeds/lemon, +/obj/item/seeds/lime, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"LA" = ( +/obj/structure/flora/ash/tall_shroom, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"LC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/rack/wooden, +/obj/item/cultivator/rake, +/obj/item/reagent_containers/cup/bucket/wooden, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/shovel, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"LG" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"LR" = ( +/obj/structure/flora/ash/leaf_shroom, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"LU" = ( +/obj/structure/rack/wooden, +/obj/item/plate/blowing_glass{ + pixel_y = -9; + pixel_x = -2 + }, +/obj/item/plate/blowing_glass{ + pixel_y = -6; + pixel_x = -1 + }, +/obj/item/plate/ceramic{ + pixel_y = 6; + pixel_x = -2 + }, +/obj/item/plate/ceramic{ + pixel_y = 8; + pixel_x = -3 + }, +/obj/item/plate/ceramic{ + pixel_y = 11; + pixel_x = -1 + }, +/obj/item/reagent_containers/cup/beaker/large/blowing_glass{ + pixel_y = 9; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/beaker/large/blowing_glass{ + pixel_y = 9; + pixel_x = 5 + }, +/obj/item/reagent_containers/cup/beaker/large/ceramic{ + pixel_y = -5; + pixel_x = 7 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"LV" = ( +/obj/structure/table/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Md" = ( +/turf/closed/wall/mineral/stone, +/area/ruin/unpowered/primitive_catgirl_den) +"Mg" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"Mr" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Mw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/wood/fifty, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"MQ" = ( +/obj/structure/rack/wooden, +/obj/item/flashlight/flare/torch{ + pixel_y = 12; + pixel_x = -1 + }, +/obj/item/flashlight/flare/torch{ + pixel_y = 12; + pixel_x = 7 + }, +/obj/item/flashlight/flare/torch{ + pixel_y = 12; + pixel_x = 3 + }, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Nb" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"Nr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Nz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"NA" = ( +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"NP" = ( +/obj/structure/stairs/wood{ + dir = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"NR" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Od" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Of" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Oi" = ( +/obj/structure/flora/ash/seraka, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Oz" = ( +/obj/structure/rack/wooden, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"OI" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/food/plumphelmetbiscuit{ + pixel_y = -5 + }, +/obj/item/food/plumphelmetbiscuit{ + pixel_y = -2 + }, +/obj/item/food/plumphelmetbiscuit{ + pixel_y = 1 + }, +/obj/item/food/plumphelmetbiscuit{ + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"OY" = ( +/obj/structure/chair/sofa/bamboo, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Pk" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Pz" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/bowl/mushroom_bowl{ + pixel_y = 8; + pixel_x = 3 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"PB" = ( +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"PL" = ( +/obj/structure/mineral_door/wood/large_gate, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Qb" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/bowl/ceramic, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Qj" = ( +/obj/machinery/oven/stone, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Qx" = ( +/obj/structure/stairs/wood, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"QF" = ( +/obj/structure/rack/wooden, +/obj/item/gun/ballistic/bow/longbow, +/obj/item/storage/bag/quiver/full, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"QT" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"QU" = ( +/obj/structure/rack/wooden, +/obj/item/raptor_dex, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ra" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Rk" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Rp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"RJ" = ( +/obj/structure/table/wood, +/obj/item/flashlight/flare/candle/infinite{ + pixel_y = 15; + pixel_x = -10 + }, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"RW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"RZ" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/seeds/plump{ + pixel_y = -9 + }, +/obj/item/seeds/plump{ + pixel_y = -9 + }, +/obj/item/seeds/chanter{ + pixel_y = 1 + }, +/obj/item/seeds/chanter{ + pixel_y = 1 + }, +/obj/item/seeds/tower{ + pixel_y = -3 + }, +/obj/item/seeds/tower{ + pixel_y = -3 + }, +/obj/item/seeds/glowshroom, +/obj/item/seeds/poppy, +/obj/item/seeds/reishi, +/obj/item/seeds/reishi, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Sa" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Sp" = ( +/obj/machinery/smartfridge/drying/rack, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Sq" = ( +/obj/item/pillow/random{ + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"SG" = ( +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"SL" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Tx" = ( +/obj/effect/spawner/random/lavaland_mob/raptor, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"TS" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"TW" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"TY" = ( +/obj/structure/curtain/bounty, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"TZ" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/obj/structure/hearthkin_rune_stone, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ud" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Uk" = ( +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"UA" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/fish/armorfish{ + pixel_y = -8 + }, +/obj/item/fish/armorfish{ + pixel_y = -3; + pixel_x = 5 + }, +/obj/item/fish/armorfish{ + pixel_y = -4; + pixel_x = -1 + }, +/obj/item/fish/needlefish{ + pixel_x = -4 + }, +/obj/item/fish/needlefish{ + pixel_x = 6; + pixel_y = 3 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Vc" = ( +/obj/structure/fluff/minepost, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"Vp" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Vx" = ( +/obj/structure/table/wood, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Vy" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"VU" = ( +/obj/structure/millstone, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"VW" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Wa" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Wp" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ww" = ( +/obj/structure/railing/wooden_fencing, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"WP" = ( +/obj/structure/railing/wooden_fencing, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"WS" = ( +/obj/structure/chair/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"WU" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"WW" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Xe" = ( +/obj/structure/table/wood, +/obj/structure/wall_torch/spawns_lit/directional/south, +/obj/item/food/grown/herbs{ + pixel_x = -5 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Xi" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/misc/hay/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Xu" = ( +/obj/structure/ore_vein/silver, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"XX" = ( +/obj/structure/rack/wooden, +/obj/item/reagent_containers/cup/rag{ + pixel_y = -3 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_y = -3; + pixel_x = 6 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Yk" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/food/cheese/mozzarella{ + pixel_y = -6 + }, +/obj/item/food/cheese/mozzarella{ + pixel_y = -3; + pixel_x = -3 + }, +/obj/item/food/cheese/mozzarella, +/obj/item/food/cheese/mozzarella{ + pixel_y = 3; + pixel_x = -3 + }, +/obj/item/food/cheese/mozzarella{ + pixel_y = 7 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"YA" = ( +/obj/item/target/archery{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"YE" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/primitive_catgirl_den) +"YO" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"YQ" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"YX" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"YZ" = ( +/obj/structure/rack/wooden, +/obj/item/paper_bin/bundlenatural{ + pixel_y = -7; + pixel_x = 3 + }, +/obj/item/paper_bin/bundlenatural{ + pixel_y = 8; + pixel_x = 4 + }, +/obj/item/paper_bin/bundlenatural{ + pixel_y = 8; + pixel_x = -5 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ze" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Zj" = ( +/obj/structure/flora/ash/stem_shroom, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Zu" = ( +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ZB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ZM" = ( +/obj/structure/rack/wooden, +/obj/item/gun/ballistic/bow/longbow, +/obj/item/storage/bag/quiver/full, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ZU" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) + +(1,1,1) = {" +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +"} +(2,1,1) = {" +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +"} +(3,1,1) = {" +NR +NR +NR +NR +Md +NR +Md +Md +NR +Md +NR +NR +xU +uP +NR +NR +NR +xU +NR +NR +Md +NR +Md +NR +Md +NR +Md +NR +Md +NR +Md +NR +Md +NR +Md +NR +NR +Md +NR +NR +Md +NR +NR +NR +NR +"} +(4,1,1) = {" +NR +NR +Kd +Kd +Md +Md +Md +Md +Md +Md +Kd +Md +Kd +Md +Od +NR +Md +Kd +Md +Kd +Md +Md +Md +Kd +Md +Md +Md +Kd +Md +Md +Md +Kd +Md +Md +Md +Kd +Kd +Md +Md +Md +Md +Kd +Kd +NR +NR +"} +(5,1,1) = {" +NR +NR +Kd +Hd +gr +gr +pm +Od +NR +NR +Xu +Md +su +Md +ml +AF +Md +su +Md +NR +wB +mr +WP +NR +wB +mr +WP +NR +wB +mr +WP +NR +wB +mr +WP +NR +Dz +tB +Jq +mr +Jq +Jq +Kd +NR +NR +"} +(6,1,1) = {" +NR +NR +Kd +oJ +Zu +Zu +Zu +Zu +Od +NR +NR +Md +Kd +Md +NR +Er +Md +Kd +Md +NR +Dz +Jq +WP +NR +Dz +Jq +WP +NR +Dz +Jq +WP +NR +Dz +Jq +WP +NR +Dz +Jq +Jq +Jq +Jq +Jq +Kd +NR +NR +"} +(7,1,1) = {" +NR +NR +Kd +pm +Md +mU +mU +Md +cM +rd +NR +aJ +Ej +CX +wN +jf +Of +Ej +zI +NR +Ca +iz +Xi +NR +Ca +iz +Xi +NR +Ca +iz +Xi +NR +Ca +iz +Xi +NR +Ca +EL +EL +Jq +Jq +Jq +Kd +NR +NR +"} +(8,1,1) = {" +NR +NR +Kd +Uk +FW +Uk +Uk +FW +zu +Od +NR +NR +gz +NR +NR +jf +NR +YX +NR +NR +QT +HB +HB +Kc +HB +HB +HB +Kc +HB +HB +HB +Kc +HB +HB +HB +Kc +HB +HB +Zu +Dz +Tx +Jq +Kd +NR +NR +"} +(9,1,1) = {" +NR +NR +Kd +Kn +Uk +Uk +Uk +Uk +Uk +Aw +NR +NR +NR +EP +NR +jf +NR +FX +NR +bc +NR +NR +NR +NR +NR +NR +NR +NR +NR +xU +NR +NR +NR +NR +ac +NR +NR +NR +Er +Dz +Jq +Jq +Kd +NR +NR +"} +(10,1,1) = {" +NR +NR +Md +oB +Rp +Ku +Uk +Uk +Uk +Aw +js +ac +NR +jf +NR +jf +WW +NR +NR +NA +NR +xU +dj +NR +QU +WW +xU +Kd +Kd +Kd +wQ +wQ +Kd +Kd +Kd +Kd +Kd +NR +Er +Bh +Jq +Jq +Kd +NR +NR +"} +(11,1,1) = {" +NR +Md +Md +sq +SG +Gy +Uk +Uk +aO +Md +Wp +NR +NR +ds +NR +jf +NR +NR +EP +NR +Kd +Kd +Kd +vd +Kd +yU +Kd +Kd +AA +FW +Uk +Uk +Uk +FW +om +Uk +yU +NR +Er +Dz +Jq +Jq +Kd +NR +NR +"} +(12,1,1) = {" +NR +NR +Md +hP +SG +qu +Uk +gU +Uk +Ra +xu +lQ +NR +NR +NR +Er +AK +oy +HB +AK +TY +Uk +FW +Uk +om +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +yU +dj +Er +Ca +mS +EL +Kd +NR +NR +"} +(13,1,1) = {" +NR +Md +Md +iy +SG +qu +bB +uT +Uk +Ra +Zu +AK +AK +Od +NR +Er +xu +NR +NR +QT +TY +Uk +qb +Rp +Rk +dM +Rk +Nr +Uk +qb +Rk +Rp +dM +Rk +Nr +Uk +yU +NR +YX +NR +NR +NR +Kd +NR +NR +"} +(14,1,1) = {" +NR +Md +Md +FG +SG +qu +Uk +yN +Uk +Ra +Zu +HB +HB +HB +Kc +Zu +DJ +NR +WW +Be +Kd +Uk +Sq +LV +xX +IF +LV +JO +Uk +JQ +ws +Eh +LV +Es +qu +Uk +Kd +Kd +TY +Kd +Kd +NR +Kd +NR +NR +"} +(15,1,1) = {" +NR +NR +Md +sq +SG +Gy +Uk +Uk +aO +Md +YO +NR +NR +NR +NR +YX +NR +Kd +Kd +Kd +Kd +Uk +JQ +mZ +nQ +nQ +LV +zy +bB +Sq +Pz +nQ +nQ +LV +zy +Uk +Uk +FW +Uk +Hv +Md +NR +Md +Md +NR +"} +(16,1,1) = {" +NR +Md +Md +hP +Ud +bu +Uk +Uk +sz +Nz +NR +NR +NA +NR +NR +YX +NR +Kd +Co +Uk +Uk +Uk +WS +LV +Qb +LV +vI +qu +Uk +WS +LV +LV +ws +LV +JO +Uk +Uk +Uk +Uk +gg +Md +NR +Md +Md +NR +"} +(17,1,1) = {" +NR +NR +Kd +te +qu +Md +ZU +dF +Md +NR +NR +NR +NR +dj +NR +YX +NR +Kd +Co +Uk +Uk +Uk +Df +ln +pA +fJ +ln +ZB +Uk +Df +ln +fJ +pA +ln +ZB +Uk +Uk +Uk +Uk +qN +Kd +NR +Kd +NR +NR +"} +(18,1,1) = {" +NR +NR +Kd +Mw +vk +Kd +Uk +Uk +Kd +NR +NR +NR +NR +NR +mc +xu +NR +Kd +Co +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Uk +OI +Kd +NR +Kd +NR +NR +"} +(19,1,1) = {" +NR +NR +Md +Kd +Kd +Kd +Uk +aO +Kd +NR +NR +WW +NR +NR +QT +xu +NR +Kd +Co +Uk +Uk +Uk +sz +Uk +Uk +Uk +Uk +Uk +Uk +Uk +Fw +BL +Md +Md +Md +JI +JI +Md +Md +Md +Md +NR +Md +Md +NR +"} +(20,1,1) = {" +NR +Md +Md +at +Uk +Uk +Uk +IS +Kd +NR +NR +NR +NR +NR +Md +YX +Md +Kd +Kd +Kd +Kd +Kd +Kd +Kd +Kd +Kd +Fw +Fw +Uk +Uk +Fw +Md +Sp +SG +GD +SG +SG +LV +Vx +Xe +Md +dj +Md +NR +NR +"} +(21,1,1) = {" +NR +NR +Md +BG +Uk +Uk +QF +Kd +Kd +NR +NR +NR +su +su +su +Zu +su +su +su +su +su +su +su +su +su +Kd +Kd +Kd +Kd +Kd +Kd +Md +Qj +SG +SG +LV +SG +SG +SG +nR +yU +NR +Md +Md +NR +"} +(22,1,1) = {" +NR +Md +Md +IE +Uk +Uk +ZM +Kd +NR +ac +NR +su +su +Kd +Kd +Zu +Kd +Kd +Kd +Kd +Kd +Kd +Kd +Kd +su +su +Kd +Jj +GD +SG +SG +JI +SG +SG +SG +eq +SG +SG +SG +nR +yU +NR +Md +NR +NR +"} +(23,1,1) = {" +NR +NR +Md +FK +Uk +Uk +ZM +Kd +su +NR +NR +Kd +Kd +Kd +uC +SG +GD +SG +Hd +oJ +Zu +ke +vm +Kd +Kd +Kd +Kd +UA +SG +SG +ev +Md +hB +SG +SG +LV +SG +SG +SG +ja +Md +NR +Md +Md +NR +"} +(24,1,1) = {" +NR +Md +Md +BG +Uk +Uk +yn +Kd +su +NR +Kd +Kd +LA +Kd +uC +SG +SG +SG +SG +Hd +YE +Zu +Zu +Zj +Zu +II +Kd +aA +SG +SG +AE +Md +ER +mG +nG +vG +SG +Di +BU +LU +Kd +NR +Kd +NR +NR +"} +(25,1,1) = {" +NR +NR +Md +Bq +Ww +Ga +Kd +Kd +uG +uG +Kd +Zu +Zu +Kd +Kd +uC +SG +SG +SG +Hd +oJ +Zu +Zu +Zu +gK +wU +Kd +Yk +SG +SG +mN +Kd +Md +Md +Md +Kd +JI +Kd +Md +Md +Kd +NR +Kd +NR +NR +"} +(26,1,1) = {" +NR +NR +Kd +Kd +Kd +Kd +Kd +su +sj +su +Kd +Is +Zu +Zu +Kd +Kd +uC +qu +eS +yR +Hd +qh +qh +qh +Hd +Hd +Kd +xT +SG +SG +SG +Kd +Zu +Zu +SL +Zu +Zu +xu +sl +NR +NR +NR +Kd +NR +NR +"} +(27,1,1) = {" +NR +NR +Kd +su +Hd +Hd +Hd +Hd +Hd +su +Kd +Zu +nn +Zu +Zu +Kd +Kd +yE +eS +EZ +Hd +Hd +Hd +Hd +Hd +Hd +Kd +Kd +Kd +Kd +JI +Kd +Zu +Zu +Zu +Zu +Zu +xu +ac +NR +NR +NR +Md +Md +NR +"} +(28,1,1) = {" +NR +NR +Kd +Kd +Kd +Kd +Kd +Hd +Hd +Kd +Kd +qh +Hd +YE +Zu +Zu +Kd +fK +eS +Kr +Hd +Hd +Hd +Hd +Kd +Kd +Kd +Zu +LA +Kd +Zu +Zu +Zu +Zu +Zu +Zu +Zu +xu +NR +NR +NR +WW +Md +NR +NR +"} +(29,1,1) = {" +Be +Md +Md +pA +CD +po +Kd +Kd +Kd +Kd +Hd +Hd +Hd +Hd +YE +mH +Kd +yE +eS +Kr +Hd +Hd +Hd +rY +Kd +tI +Zu +Zu +yx +Kd +su +qh +qh +YE +Zu +Zu +Zu +eS +NR +NR +NR +NR +Md +NR +NR +"} +(30,1,1) = {" +NR +mc +PL +Uk +Uk +Df +pA +CD +po +Md +Hd +Hd +Hd +Hd +Hd +Kd +Kd +vu +eS +de +Hd +Hd +Hd +yp +Kd +of +qh +qh +Hd +Kd +su +Hd +Hd +gr +Mg +Mg +Mg +eS +zt +zt +Jn +NR +Md +Md +NR +"} +(31,1,1) = {" +NR +QT +Vy +Uk +Uk +Uk +Uk +Uk +JQ +Md +Hd +Hd +Hd +Jl +Jl +Kd +Uk +PB +aB +yR +Hd +Hd +Hd +Hd +Jl +Jl +Hd +Hd +Hd +Kd +su +Hd +oJ +Zu +Zu +Zu +Zu +eS +TS +pW +NR +NR +Md +Md +NR +"} +(32,1,1) = {" +Be +Md +Md +Kd +Nr +Fj +gW +Wa +JQ +Kd +Kd +Kd +Kd +Kd +fY +qu +eS +qb +Rp +mq +Hd +Vc +Hd +Hd +Jl +Kd +Hd +Hd +Hd +Kd +su +gr +pm +Zu +Zu +Zu +Zu +eS +NR +Nb +NR +NA +Md +NR +NR +"} +(33,1,1) = {" +NR +NR +Kd +Oz +qu +Fj +gW +Wa +JQ +kg +Kd +uC +GD +SG +SG +qu +eS +JQ +SG +Hd +Hd +Hd +Hd +wU +Kd +Kd +Hd +Hd +wU +Kd +su +Zu +Zu +Zu +Zu +Zu +Zu +xu +NR +NR +NR +NR +Md +NR +NR +"} +(34,1,1) = {" +NR +NR +lb +uC +qu +Fj +gW +Wa +JQ +uC +Md +uC +SG +SG +SG +qu +eS +JQ +Hd +Hd +Hd +Hd +Hd +Hd +Kd +Hd +Hd +Hd +Hd +Kd +su +Zu +Zu +Zu +Zu +Zu +Zu +xu +NR +NR +WW +NR +Md +Md +NR +"} +(35,1,1) = {" +NR +NR +lb +uC +qu +Fj +gW +Wa +JQ +uC +Md +uC +SG +SG +SG +qu +Uk +JQ +Hd +Hd +Hd +Hd +Hd +Hd +Kd +Kd +Kd +Kd +Kd +Kd +su +Zu +Zu +kt +Zu +Zu +Zu +xu +NR +NR +NR +NR +Kd +NR +NR +"} +(36,1,1) = {" +NR +NR +lb +uC +qu +Uk +Uk +Uk +JQ +jR +Kd +Md +au +SG +rL +qu +Uk +JQ +Hd +Hd +Hd +Hd +Hd +Hd +Ze +SG +SG +SG +Md +su +su +fV +Zu +Zu +Zu +Zu +Zu +xu +NR +dj +NR +NR +Kd +NR +NR +"} +(37,1,1) = {" +NR +NR +Kd +Oz +qu +Uk +Uk +Uk +JQ +SG +SG +Kd +wF +SG +SG +qu +eS +JQ +Hd +Hd +Hd +Hd +Hd +Hd +Ze +SG +SG +jR +Md +su +VU +YQ +Zu +Zu +Zu +Zu +Zu +Zu +Od +oN +Md +Md +Md +NR +NR +"} +(38,1,1) = {" +NR +NR +Kd +Kd +Kd +Kd +oQ +Kd +iI +iI +Kd +Kd +hb +SG +SG +qu +eS +JQ +SG +Hd +Hd +Hd +Hd +Hd +SG +SG +SG +SG +Md +su +kO +YQ +Zu +Zu +cU +Zu +Zu +Zu +Zu +Qx +Kd +su +Kd +rg +NR +"} +(39,1,1) = {" +NR +NR +Md +Md +Md +ac +YX +NR +NR +NR +NR +Md +JN +SG +SG +qu +eS +JQ +SG +Hd +Hd +Hd +Hd +Hd +Ze +SG +su +su +su +su +oL +YQ +Zu +Zu +Zu +Zu +Zu +Zu +xu +Jt +Md +Md +Md +NR +NR +"} +(40,1,1) = {" +NR +NR +Kd +su +Kd +ol +xu +NR +NR +WW +NR +su +su +JF +zE +qu +eS +Df +pA +RW +RW +RW +RW +RW +Ze +su +Kd +Md +Md +Kd +IQ +YQ +Zu +Zu +Zu +Zu +Zu +Zu +Zu +Od +NR +cV +xu +NR +NR +"} +(41,1,1) = {" +NR +Be +Md +Md +Md +rg +jf +NR +NR +NR +NR +su +su +Md +uV +qu +bT +GU +ie +GU +GU +GU +GU +GU +Uk +Md +Kd +dD +pd +Kd +Kd +Mr +Zu +Zu +Zu +Zu +kt +Zu +HB +HB +AK +EU +xu +NR +NR +"} +(42,1,1) = {" +NR +NR +NR +cV +xu +wN +jf +NR +ac +NR +NA +NR +NR +su +su +su +Md +Md +Md +Md +Md +Md +Uk +Uk +Md +Md +lv +SG +ad +Uk +PL +YQ +Zu +Zu +Zu +Zu +Zu +xu +NR +qr +Md +Md +Md +uP +NR +"} +(43,1,1) = {" +NR +NR +mc +EU +Zu +Kc +xu +NR +NR +NR +dj +NR +NR +su +su +su +su +su +su +su +su +NR +Er +Zu +Md +nL +SG +SG +KU +Uk +Kd +yU +yU +Kd +QT +Zu +HB +HB +Kc +Qx +Kd +su +Kd +rg +NR +"} +(44,1,1) = {" +NR +TZ +Md +Md +Md +MQ +Zu +Md +NR +NR +NR +NR +EP +Md +NR +NR +dj +NR +NR +WW +Be +Md +Zu +mH +Kd +Bd +pA +pA +RZ +Uk +LC +Kz +em +Md +NR +YX +NR +NR +WW +Pk +Md +Md +Md +NR +NR +"} +(45,1,1) = {" +NR +NR +Kd +su +Kd +kh +HB +xc +Kc +Kc +Kc +AK +HB +SL +AK +AK +AK +AK +IJ +AK +AK +Zu +Zu +Zu +PL +Uk +Uk +Uk +Uk +Uk +Df +pA +po +Kd +NR +YX +NR +NR +NR +NR +NR +NR +Kd +NR +NR +"} +(46,1,1) = {" +NR +NR +Md +Md +Md +NR +NR +NR +NR +NR +NR +jf +NR +QT +HB +HB +Zu +Kd +Md +dF +Md +Kd +Kd +mH +Kd +Uk +Uk +qb +Nr +Uk +Uk +Uk +JQ +Kd +NR +YX +NR +NA +NR +NR +NR +NR +Kd +NR +NR +"} +(47,1,1) = {" +NR +NR +Kd +NR +NR +NR +NR +NR +NR +su +su +vq +uG +NR +NR +NR +Kd +Kd +qu +Uk +Gf +yf +Kd +Zu +Md +NP +NP +ap +FP +Rp +Nr +Uk +hR +Md +NR +YX +NR +NR +NR +ac +NR +NR +Md +Md +NR +"} +(48,1,1) = {" +NR +NR +Kd +NR +lx +lx +lx +su +su +su +tI +tI +sj +sj +su +Kd +Kd +yd +qu +Uk +Uk +Uk +Md +Zu +Kd +Md +Kd +Kd +Kd +Md +Kd +ZU +Kd +Kd +Kd +xu +NR +NR +NR +NR +NR +dj +Md +NR +NR +"} +(49,1,1) = {" +NR +NR +Kd +lx +lx +Zj +LR +su +su +su +TW +Zu +nI +sj +su +Md +vy +pA +ZB +Uk +RJ +aO +Md +mH +Md +lg +kx +IR +BF +lI +JT +SG +BF +YZ +Kd +Zu +Od +NR +NR +NR +NR +YA +Md +NR +NR +"} +(50,1,1) = {" +NR +Md +Md +lx +vm +Zu +Zu +Oi +su +CU +Zu +Zu +Zu +LG +su +Md +Aj +sM +Aj +Uk +Vp +sM +Md +Zu +DB +SG +SG +SG +SG +SG +SG +SG +SG +oe +Kd +Md +VW +NR +NR +NR +NR +NR +Md +Md +NR +"} +(51,1,1) = {" +NR +NR +Md +lx +Zj +Zu +Zu +Zu +Zu +Zu +Zu +yy +Zu +su +su +Md +OY +sM +OY +Uk +lA +sM +Md +mH +Md +lg +SG +Sa +SG +SG +SG +SG +Sa +SG +SG +hW +xu +NR +NR +NR +NR +YA +Md +Md +NR +"} +(52,1,1) = {" +NR +NR +Md +lx +vm +Zu +Zu +Zu +su +su +Zu +Zu +Zu +LG +su +Md +kP +sM +kP +Uk +AR +aO +Md +Zu +Kd +Md +Kd +Kd +Kd +Md +Kd +Kd +Kd +Kd +Kd +Md +VW +NR +NR +NR +NR +NR +Md +NR +NR +"} +(53,1,1) = {" +NR +Md +Md +lx +LA +Zu +Zu +Zu +su +la +WU +WU +WU +su +su +Md +bK +Rp +Nr +Uk +Uk +Uk +Md +AI +HB +HB +HB +HB +HB +HB +HB +HB +HB +HB +HB +HB +BA +NR +NR +NA +NR +YA +Md +NR +NR +"} +(54,1,1) = {" +NR +NR +Kd +lx +LR +Zu +LR +su +su +su +su +su +su +su +su +Kd +XX +tz +cQ +Uk +tu +yf +Kd +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +Md +Md +NR +"} +(55,1,1) = {" +NR +NR +Kd +lx +Oi +LA +lx +su +su +su +su +su +su +lx +NR +Kd +Kd +Kd +Kd +Kd +Kd +Kd +Kd +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +ac +NR +WW +NR +NR +Kd +NR +NR +"} +(56,1,1) = {" +NR +NR +Kd +lx +lx +lx +lx +lx +lx +lx +lx +lx +lx +NR +dj +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +WW +NR +NR +NR +dj +NR +NR +NR +NR +NR +NR +NR +Kd +NR +NR +"} +(57,1,1) = {" +NR +NR +Kd +Kd +Kd +Kd +Md +Md +Md +Md +Md +Md +Kd +Kd +Kd +Kd +Md +Md +Md +Md +Md +Md +Kd +Kd +Kd +Kd +Md +Md +Md +Md +Md +Kd +Kd +Kd +Kd +Md +Md +Md +Md +Md +Kd +Kd +Kd +NR +NR +"} +(58,1,1) = {" +NR +NR +NR +NR +NR +NR +Md +NR +Md +Md +NR +Md +NR +NR +NR +NR +Md +NR +Md +Md +NR +Md +NR +NR +NR +NR +Md +NR +Md +NR +Md +NR +NR +NR +NR +Md +NR +Md +NR +Md +NR +NR +NR +NR +NR +"} +(59,1,1) = {" +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +"} +(60,1,1) = {" +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +NR +"} diff --git a/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_icewalker_upper.dmm b/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_icewalker_upper.dmm new file mode 100644 index 0000000000000..00a2c419fee29 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_icewalker_upper.dmm @@ -0,0 +1,3792 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ap" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ay" = ( +/obj/item/food/grown/aloe{ + pixel_x = 5 + }, +/obj/item/food/grown/aloe, +/obj/item/food/grown/aloe{ + pixel_y = 5 + }, +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"aN" = ( +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"aX" = ( +/obj/structure/window/green_glass_pane, +/obj/structure/curtain/bounty, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"bd" = ( +/obj/structure/mannequin/wood, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"bL" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"bN" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"bU" = ( +/obj/structure/rack/wooden, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"cL" = ( +/obj/structure/closet/xenoarch/tribal_version, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"cM" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"da" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"dc" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"di" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"dl" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/large_mortar, +/obj/item/pestle{ + pixel_y = -1; + pixel_x = -8 + }, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"do" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/primitive_centrifuge{ + pixel_x = -14; + pixel_y = -1 + }, +/obj/item/paper_bin/bundlenatural{ + pixel_y = 8; + pixel_x = 3 + }, +/obj/item/pen/charcoal, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"dF" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"dR" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"dY" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"dZ" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/obj/item/reagent_containers/cup/glass/bottle/moonshine{ + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/glass/bottle/moonshine{ + pixel_x = 8 + }, +/obj/item/reagent_containers/cup/glass/bottle/hooch{ + pixel_y = 8 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ek" = ( +/turf/open/openspace/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ey" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/item/pillow, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"eL" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/obj/item/pillow, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"eP" = ( +/obj/item/flashlight/lantern, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"fW" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"gd" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"gk" = ( +/obj/structure/bed/double/pelt, +/obj/structure/curtain/bounty, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"gU" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"hb" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/primitive_centrifuge{ + pixel_x = -4; + pixel_y = 10 + }, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"hg" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ho" = ( +/obj/structure/rack/wooden, +/obj/item/bonesetter/primitive, +/obj/item/cautery/primitive, +/obj/item/chisel/primitive, +/obj/item/circular_saw/primitive, +/obj/item/scalpel/primitive, +/obj/item/retractor/primitive, +/obj/item/surgicaldrill/primitive, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"hx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"iI" = ( +/obj/structure/fluff/minepost, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"iL" = ( +/obj/structure/fireplace, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"iU" = ( +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"iV" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"jd" = ( +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"je" = ( +/obj/structure/rugs/pelt/black{ + dir = 4; + pixel_y = -15 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kd" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kr" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kH" = ( +/obj/structure/curtain/bounty, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kI" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"kM" = ( +/obj/structure/window/green_glass_pane, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"lF" = ( +/obj/structure/bed/double/pelt/black{ + dir = 1 + }, +/obj/item/bedsheet/double{ + dir = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"lO" = ( +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"mP" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"nN" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"on" = ( +/obj/structure/table/wood, +/obj/structure/large_mortar, +/obj/item/pestle{ + pixel_y = -1; + pixel_x = -8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"oT" = ( +/obj/structure/closet/crate/wooden/storage_barrel, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"pw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"pH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"pJ" = ( +/obj/structure/table/wood, +/obj/item/xenoarch/strange_rock, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"qu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"qT" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/calling_horn/hearthkin, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"rT" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/railing/wooden_fencing, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"st" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/obj/structure/rack/wooden, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"sB" = ( +/obj/structure/rack/wooden, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/reagent_containers/cup/glass/bottle{ + pixel_x = -8 + }, +/obj/item/reagent_containers/cup/glass/bottle{ + pixel_x = 1 + }, +/obj/item/reagent_containers/cup/glass/bottle{ + pixel_x = 7 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"sE" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"sO" = ( +/obj/structure/railing/wooden_fencing/gate, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"uo" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"uy" = ( +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"uR" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"vH" = ( +/obj/structure/railing/wooden_fencing/gate{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"vP" = ( +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"wg" = ( +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"wj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"wQ" = ( +/obj/structure/rugs/pelt/black, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"xk" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"xn" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"xE" = ( +/obj/machinery/cauldron, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"xG" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"xR" = ( +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/obj/structure/railing/wooden_fencing, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"AW" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Bv" = ( +/obj/item/pillow, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"CJ" = ( +/obj/structure/table/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"DH" = ( +/obj/structure/closet/cardboard, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"DL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/rack/wooden, +/obj/item/clothing/shoes/winterboots/ice_boots/primitive_catgirl_boots{ + pixel_y = 8; + pixel_x = -4 + }, +/obj/item/clothing/shoes/winterboots/ice_boots/primitive_catgirl_boots{ + pixel_y = 8; + pixel_x = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ee" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Eg" = ( +/obj/structure/rack/wooden, +/obj/item/bedsheet, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Et" = ( +/obj/structure/millstone, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Fg" = ( +/obj/machinery/smartfridge/wooden/seed_shelf, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Fm" = ( +/obj/structure/table/wood, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Fo" = ( +/obj/structure/rack/wooden, +/obj/item/storage/crayons, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Fs" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Fv" = ( +/obj/machinery/smartfridge/drying/rack, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"FB" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"FO" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Gj" = ( +/obj/structure/railing/wooden_fencing, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Gs" = ( +/obj/structure/rack/wooden, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"GN" = ( +/turf/closed/mineral/snowmountain/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"HV" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/mannequin/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ib" = ( +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Id" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ii" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"IF" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Jh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Js" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"JI" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"JJ" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"KK" = ( +/obj/structure/bed/double/pelt/black, +/obj/item/bedsheet/double, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Lq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/wall_torch/spawns_lit/directional/south, +/obj/structure/rack/wooden, +/obj/item/toy/crayon/spraycan, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Lt" = ( +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/obj/item/pillow, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"LA" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"LF" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"LQ" = ( +/obj/structure/mineral_door/wood/large_gate{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"LR" = ( +/turf/closed/mineral/snowmountain/cavern, +/area/ruin/unpowered/primitive_catgirl_den) +"Ma" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/rack/wooden, +/obj/item/clothing/suit/apron/chef/colorable_apron/primitive_catgirl_leather, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"My" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"MM" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Nn" = ( +/obj/structure/table/wood, +/obj/structure/chem_separator{ + pixel_y = 12 + }, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Nt" = ( +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"NI" = ( +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/obj/structure/mannequin/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ou" = ( +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/openspace/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"OD" = ( +/obj/structure/geyser, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"OG" = ( +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"OI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Qe" = ( +/obj/structure/rack/wooden, +/obj/item/bedsheet, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Qg" = ( +/obj/structure/rack/wooden, +/obj/item/clothing/shoes/winterboots/ice_boots/primitive_catgirl_boots{ + pixel_y = 8; + pixel_x = -4 + }, +/obj/item/clothing/shoes/winterboots/ice_boots/primitive_catgirl_boots{ + pixel_y = 8; + pixel_x = 4 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"QK" = ( +/obj/structure/closet/cardboard, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"QQ" = ( +/obj/structure/rack/wooden, +/obj/item/reagent_containers/cup/mortar{ + pixel_y = 9; + pixel_x = 5 + }, +/obj/item/smelling_salts{ + pixel_y = -9; + pixel_x = -5 + }, +/obj/item/smelling_salts{ + pixel_y = -9; + pixel_x = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"QZ" = ( +/obj/structure/rack/wooden, +/obj/item/bedsheet, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Rf" = ( +/obj/structure/mannequin/wood, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Rs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"RX" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"RZ" = ( +/obj/machinery/smartfridge/wooden/produce_bin, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Sf" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Sv" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"SG" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"SN" = ( +/obj/structure/rack/wooden, +/obj/item/food/grown/tobacco{ + pixel_y = -4; + pixel_x = -4 + }, +/obj/item/food/grown/tobacco{ + pixel_y = -4; + pixel_x = 2 + }, +/obj/item/plate/oven_tray/material/fake_tin{ + pixel_y = 5 + }, +/obj/item/plate/oven_tray/material/fake_brass{ + pixel_y = 8; + pixel_x = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Ta" = ( +/obj/structure/table/wood, +/obj/item/xenoarch/strange_rock, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Tq" = ( +/obj/structure/bed/double/pelt, +/obj/item/bedsheet/black/double, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"TQ" = ( +/obj/structure/rugs/pelt{ + pixel_y = -15; + dir = 8 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Uc" = ( +/obj/structure/rugs/pelt, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Uv" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/unpowered/primitive_catgirl_den) +"UM" = ( +/obj/structure/table/wood, +/obj/item/food/grown/poppy/lily, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Vc" = ( +/turf/closed/wall/mineral/stone, +/area/ruin/unpowered/primitive_catgirl_den) +"Vk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/wall_torch/spawns_lit/directional/west, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"VR" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/obj/item/pillow, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"VV" = ( +/obj/structure/flora/ash/chilly, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"VY" = ( +/obj/structure/railing/wooden_fencing, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Wb" = ( +/obj/structure/table/wood, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"WN" = ( +/obj/structure/window/green_glass_pane, +/obj/structure/curtain/bounty, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"WR" = ( +/obj/structure/wall_torch/spawns_lit/directional/north, +/turf/open/openspace/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"WS" = ( +/obj/structure/railing/wooden_fencing, +/obj/structure/railing/wooden_fencing{ + dir = 4 + }, +/turf/open/floor/wood/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Xg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Xu" = ( +/turf/open/misc/grass/roofing, +/area/ruin/unpowered/primitive_catgirl_den) +"XV" = ( +/obj/structure/rack/wooden, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/wall_torch/spawns_lit/directional/west, +/obj/item/reagent_containers/cup/glass/bottle{ + pixel_x = -8 + }, +/obj/item/reagent_containers/cup/glass/bottle{ + pixel_x = 1 + }, +/obj/item/reagent_containers/cup/glass/bottle{ + pixel_x = 7 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Yj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/wall_torch/spawns_lit/directional/south, +/obj/structure/rack/wooden, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"YK" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/misc/dirt/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"YR" = ( +/obj/structure/rack/wooden, +/obj/item/clothing/suit/jacket/primitive_catgirl_coat{ + pixel_y = 7; + pixel_x = -4 + }, +/obj/item/clothing/under/dress/skirt/primitive_catgirl_body_wraps{ + pixel_x = 6; + pixel_y = -6 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"YZ" = ( +/obj/structure/rack/wooden, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/reagent_containers/cup/glass/bottle{ + pixel_x = 1 + }, +/obj/item/reagent_containers/cup/glass/bottle{ + pixel_x = -8 + }, +/obj/item/reagent_containers/cup/glass/bottle{ + pixel_x = 7 + }, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"Zv" = ( +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) +"ZX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/wall_torch/spawns_lit/directional/east, +/turf/open/floor/stone/icemoon, +/area/ruin/unpowered/primitive_catgirl_den) + +(1,1,1) = {" +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +"} +(2,1,1) = {" +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +"} +(3,1,1) = {" +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +ek +ek +Xu +Xu +ek +ek +Xu +Xu +Xu +Xu +Xu +Xu +ek +ek +ek +"} +(4,1,1) = {" +ek +ek +Uv +Uv +Vc +Vc +Vc +Vc +Vc +Vc +Uv +Id +Sf +kI +ek +ek +Id +Sf +kI +Uv +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +ek +"} +(5,1,1) = {" +ek +ek +Uv +ek +ek +ek +ek +ek +ek +ek +ek +FO +aN +Gj +ek +ek +FO +aN +Gj +ek +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +ek +"} +(6,1,1) = {" +ek +ek +Uv +ek +ek +ek +ek +ek +ek +ek +ek +JI +aN +xR +ek +ek +JI +aN +xR +ek +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +ek +"} +(7,1,1) = {" +ek +ek +Uv +Uv +Uv +Uv +Uv +Uv +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +ek +ek +"} +(8,1,1) = {" +ek +ek +Uv +wg +wg +uy +wg +aN +Uv +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Xu +Xu +Xu +Xu +ek +ek +"} +(9,1,1) = {" +ek +ek +Uv +ek +ek +ek +ek +JI +aN +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Xu +Xu +Xu +Xu +ek +ek +"} +(10,1,1) = {" +ek +ek +Vc +ek +ek +ek +ek +ek +FO +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +ek +ek +Xu +Xu +Xu +Xu +ek +ek +"} +(11,1,1) = {" +ek +ek +Vc +WR +ek +ek +ek +ek +FO +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +aN +aN +aN +aN +cM +aN +aN +aN +Uv +ek +ek +Xu +Xu +Xu +Xu +ek +ek +"} +(12,1,1) = {" +ek +ek +Vc +ek +ek +ek +ek +ek +FO +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Uv +aN +aN +wg +uy +wg +wg +wg +wg +wg +Lt +wg +wg +Lt +aN +RX +Uv +ek +ek +Xu +Xu +Xu +Xu +ek +ek +"} +(13,1,1) = {" +ek +ek +Vc +ek +ek +ek +ek +ek +ap +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Uv +aN +Gj +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +FO +aN +Uv +ek +ek +ek +ek +ek +Uv +ek +ek +"} +(14,1,1) = {" +ek +ek +Vc +WR +ek +ek +ek +ek +FO +Uv +ek +ek +ek +ek +ek +ek +Uv +Uv +Uv +Uv +Uv +aN +Gj +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +FO +aN +Uv +Uv +WN +Uv +Uv +ek +Uv +ek +ek +"} +(15,1,1) = {" +ek +ek +Vc +ek +ek +ek +ek +ek +FO +Uv +ek +ek +ek +ek +ek +Uv +Uv +aN +wg +wg +wg +wg +xR +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +FO +aN +Uv +oT +OG +lF +Uv +ek +Vc +ek +ek +"} +(16,1,1) = {" +ek +ek +Vc +ek +ek +ek +ek +ek +FO +Uv +ek +ek +ek +ek +ek +Uv +hg +aN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +FO +aN +Uv +iL +je +OG +Uv +ek +Vc +ek +ek +"} +(17,1,1) = {" +ek +ek +Uv +ek +ek +ek +Id +ey +aN +Uv +ek +ek +ek +ek +ek +Uv +aN +aN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +FO +aN +JJ +OG +OG +bN +Uv +ek +Uv +ek +ek +"} +(18,1,1) = {" +ek +ek +Uv +ek +ek +Uv +eL +aN +aN +Uv +ek +ek +ek +ek +ek +Uv +aN +aN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +FO +aN +Uv +OG +OG +Gs +Uv +ek +Uv +ek +ek +"} +(19,1,1) = {" +ek +ek +Vc +Uv +Uv +Uv +FO +aN +aN +Uv +ek +ek +ek +ek +ek +Uv +hg +aN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +VR +Sf +Sf +aN +RX +Uv +Uv +Uv +Uv +Uv +ek +Vc +ek +ek +"} +(20,1,1) = {" +ek +ek +Vc +ek +ek +ek +eL +aN +aN +Uv +ek +ek +ek +ek +ek +Uv +aN +aN +Sf +Sf +Sf +Sf +Sf +Sf +ey +rT +ek +ek +ek +ek +ek +FO +aN +aN +aN +aN +Uv +OG +OG +Gs +Uv +ek +Vc +ek +ek +"} +(21,1,1) = {" +ek +ek +Vc +ek +ek +ek +FO +aN +aN +Uv +ek +ek +SG +qT +GN +Uv +aN +Ee +aN +aN +aN +aN +Ee +aN +aN +aN +Sf +Sf +Sf +Sf +Sf +aN +aN +Ee +aN +aN +JJ +OG +TQ +OG +Uv +ek +Vc +ek +ek +"} +(22,1,1) = {" +ek +ek +Vc +ek +ek +ek +FO +RX +Uv +Uv +ek +fW +My +My +VV +Uv +Uv +Uv +Uv +dY +LA +Uv +Uv +Uv +aN +aN +aN +Ee +aN +aN +aN +aN +Uv +Uv +iV +Uv +Uv +iL +OG +OG +Uv +ek +Vc +ek +ek +"} +(23,1,1) = {" +ek +ek +Vc +ek +ek +ek +FO +aN +Uv +ek +ek +GN +OD +My +My +My +My +My +VY +aN +aN +Zv +My +Uv +Uv +Uv +Uv +Uv +Uv +iV +Uv +Uv +Uv +OG +Uc +Gs +Uv +OG +OG +bN +Uv +ek +Vc +ek +ek +"} +(24,1,1) = {" +ek +ek +Vc +ek +ek +ek +FO +aN +Uv +ek +GN +GN +My +My +xG +mP +dc +My +sO +aN +aN +vH +xG +mP +dc +My +VV +Uv +oT +OG +wQ +Uv +Tq +OG +dR +oT +Uv +OG +Tq +oT +Uv +ek +Uv +ek +ek +"} +(25,1,1) = {" +ek +ek +Vc +ek +ek +ek +FO +aN +Uv +ek +GN +iU +My +gd +My +My +My +My +VY +aN +aN +Zv +My +My +My +gd +My +Uv +Uv +OG +OG +Uv +Uv +WN +Uv +Uv +Uv +Uv +WN +Uv +Uv +ek +Uv +ek +ek +"} +(26,1,1) = {" +ek +ek +Uv +HV +sE +aN +aN +aN +Uv +kM +Uv +My +Uv +Uv +aX +aX +Uv +Uv +Uv +xk +LQ +Uv +Uv +My +iU +My +My +My +Uv +bU +KK +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Uv +ek +ek +"} +(27,1,1) = {" +ek +ek +Uv +bd +nN +aN +aN +aN +aN +RX +Uv +Uv +Uv +sB +OG +OG +YZ +XV +QQ +hx +MM +OG +Uv +Uv +Uv +Uv +Uv +My +Uv +Uv +WN +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(28,1,1) = {" +ek +ek +Uv +Rf +nN +aN +aN +aN +aN +aN +xn +qu +Vk +LF +wj +OG +OG +OG +OG +hx +MM +OG +Eg +gk +Qe +gk +Uv +My +Xg +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(29,1,1) = {" +ek +ek +Vc +NI +Ib +wg +wg +wg +wg +aN +Uv +UM +OG +hx +uo +Rs +Rs +Rs +Rs +Sv +MM +OG +OG +OG +OG +OG +aX +My +Xg +GN +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(30,1,1) = {" +ek +ek +Vc +ek +ek +ek +ek +ek +ek +FO +Uv +on +Bv +Ii +qu +dF +aN +aN +iI +aN +uo +wj +OG +OG +OG +OG +aX +My +Xg +GN +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(31,1,1) = {" +ek +ek +Vc +WR +ek +ek +ek +ek +ek +FO +Uv +do +OG +OG +xE +hx +di +qu +qu +qu +qu +Jh +OG +OG +OG +dZ +Uv +My +Xg +GN +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(32,1,1) = {" +ek +ek +Vc +ek +ek +ek +ek +ek +ek +FO +Uv +Uv +hb +Bv +OG +hx +MM +OG +OG +OG +OG +OG +OG +QZ +gk +Uv +Uv +VV +Xg +GN +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(33,1,1) = {" +ek +ek +Uv +kI +ek +ek +ek +ek +ek +FO +aN +Uv +Nn +dl +Wb +hx +MM +OG +SN +Fv +OG +OG +ho +Uv +Uv +Uv +IF +My +Xg +GN +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(34,1,1) = {" +ek +ek +Uv +Gj +ek +ek +ek +ek +ek +FO +aN +Uv +Uv +Uv +Uv +hx +Jh +ay +Uv +Uv +aX +aX +Uv +Uv +vP +vP +Nt +My +Xg +GN +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(35,1,1) = {" +ek +ek +Uv +Fs +ek +ek +ek +ek +ek +FO +Uv +Uv +Js +vP +Uv +pw +Uv +Uv +Uv +gU +vP +vP +vP +jd +vP +vP +Nt +My +Xg +GN +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Uv +ek +ek +"} +(36,1,1) = {" +ek +ek +Uv +Gj +ek +ek +ek +ek +ek +FO +Uv +Fg +Js +vP +Uv +kd +Uv +vP +jd +vP +vP +vP +vP +vP +vP +vP +Nt +My +Xg +GN +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Uv +ek +ek +"} +(37,1,1) = {" +ek +ek +Uv +Gj +ek +ek +ek +ek +ek +FO +Uv +da +Js +vP +jd +vP +vP +vP +vP +vP +vP +vP +vP +vP +YK +YK +FB +lO +Xg +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Id +Sf +kI +ek +ek +"} +(38,1,1) = {" +ek +ek +Uv +aN +Sf +Sf +bL +Sf +Sf +aN +Uv +RZ +kr +vP +vP +vP +vP +vP +vP +vP +vP +vP +vP +Nt +eP +My +My +iU +Xg +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +aN +aN +Gj +ek +ek +"} +(39,1,1) = {" +ek +ek +Id +aN +Uv +Uv +Uv +Uv +Uv +Uv +Uv +My +eP +Js +vP +vP +vP +vP +vP +vP +vP +vP +YK +FB +My +GN +GN +GN +GN +GN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +JI +wg +WS +ek +ek +"} +(40,1,1) = {" +ek +ek +FO +aN +aN +ek +ek +ek +ek +ek +GN +GN +My +Js +vP +vP +vP +vP +vP +vP +vP +FB +My +lO +VV +GN +Xu +Xu +Xu +Xu +Xu +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +"} +(41,1,1) = {" +ek +ek +JI +wg +WS +ek +ek +ek +ek +ek +ek +GN +Et +kr +YK +vP +vP +vP +vP +FO +Gj +eP +iU +My +GN +GN +Xu +Xu +Xu +Xu +Xu +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +"} +(42,1,1) = {" +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +GN +My +My +kr +YK +YK +YK +FO +Gj +My +GN +GN +Xu +Xu +Xu +Xu +Xu +Xu +Xu +ek +ek +ek +ek +ek +ek +ek +ek +ek +Id +Sf +kI +ek +ek +"} +(43,1,1) = {" +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +GN +GN +GN +GN +GN +GN +GN +FO +Gj +ek +ek +ek +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +ek +ek +ek +ek +ek +ek +aN +aN +Gj +ek +ek +"} +(44,1,1) = {" +ek +ek +Id +Sf +kI +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +FO +Gj +ek +ek +ek +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +ek +ek +ek +ek +ek +ek +JI +wg +WS +ek +ek +"} +(45,1,1) = {" +ek +ek +FO +aN +aN +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Ou +FO +Gj +Ou +ek +ek +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +ek +ek +ek +ek +ek +ek +ek +ek +Uv +ek +ek +"} +(46,1,1) = {" +ek +ek +JI +wg +WS +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Uv +Uv +kH +kH +Uv +Uv +ek +Uv +Vc +Vc +Uv +Xu +Xu +Xu +Xu +Xu +Xu +ek +ek +ek +ek +ek +ek +ek +ek +Uv +ek +ek +"} +(47,1,1) = {" +ek +ek +Uv +ek +ek +ek +ek +ek +ek +GN +GN +GN +GN +ek +ek +ek +Uv +Uv +nN +aN +aN +Qg +Uv +ek +Vc +ek +ek +Vc +Xu +Xu +Xu +Xu +Xu +Xu +ek +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(48,1,1) = {" +ek +ek +Uv +ek +LR +LR +LR +ek +GN +GN +GN +GN +GN +GN +GN +Uv +Uv +Fo +nN +aN +aN +Lq +Uv +ek +Uv +aN +Gj +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(49,1,1) = {" +ek +ek +LR +LR +LR +LR +LR +GN +GN +GN +GN +GN +GN +GN +GN +Uv +Gs +AW +pH +aN +aN +YR +Uv +Uv +Uv +aN +aN +Xg +pJ +Fm +CJ +CJ +Ta +CJ +Uv +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(50,1,1) = {" +ek +ek +LR +LR +LR +LR +LR +LR +GN +GN +GN +GN +GN +GN +GN +Uv +st +nN +aN +aN +aN +aN +aN +aN +aN +aN +aN +Xg +OG +Bv +OG +Bv +OG +pJ +Uv +Uv +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(51,1,1) = {" +ek +ek +LR +LR +LR +LR +LR +LR +GN +GN +GN +GN +GN +GN +GN +Uv +Gs +nN +aN +aN +aN +aN +aN +aN +aN +aN +aN +Xg +OG +OG +OG +OG +OG +OG +cL +Uv +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(52,1,1) = {" +ek +ek +LR +LR +LR +LR +LR +LR +GN +GN +GN +GN +GN +GN +GN +Uv +QK +nN +aN +aN +aN +Ma +Uv +Uv +Uv +OI +ZX +uR +OG +OG +OG +OG +dR +OG +cL +Uv +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(53,1,1) = {" +ek +ek +LR +LR +LR +LR +LR +LR +GN +GN +GN +GN +GN +GN +GN +Uv +DH +nN +aN +aN +aN +Yj +Uv +ek +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(54,1,1) = {" +ek +ek +LR +LR +LR +LR +LR +GN +GN +GN +GN +GN +GN +GN +GN +Uv +QK +nN +aN +Ee +aN +DL +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Vc +ek +ek +"} +(55,1,1) = {" +ek +ek +Uv +LR +LR +LR +LR +LR +LR +LR +LR +LR +LR +LR +ek +Uv +Uv +Uv +Uv +Uv +Uv +Uv +Uv +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Uv +ek +ek +"} +(56,1,1) = {" +ek +ek +Uv +LR +LR +LR +LR +LR +LR +LR +LR +LR +LR +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +Uv +ek +ek +"} +(57,1,1) = {" +ek +ek +Uv +Uv +Uv +Uv +Vc +Vc +Vc +Vc +Vc +Vc +Uv +Uv +Uv +Uv +Vc +Vc +Vc +Vc +Vc +Vc +Uv +Uv +Uv +Uv +Vc +Vc +Vc +Vc +Vc +Uv +Uv +Uv +Uv +Vc +Vc +Vc +Vc +Vc +Uv +Uv +Uv +ek +ek +"} +(58,1,1) = {" +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +"} +(59,1,1) = {" +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +"} +(60,1,1) = {" +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +ek +"} diff --git a/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_magical_hotsprings.dmm b/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_magical_hotsprings.dmm new file mode 100644 index 0000000000000..1123c0bea2ff3 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/doppler/icemoon_underground_magical_hotsprings.dmm @@ -0,0 +1,506 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/mineral/snowmountain/icemoon{ + icon_state = "icerock" + }, +/area/ruin/unpowered/magic_hotsprings) +"l" = ( +/obj/item/food/grown/bluecherries, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/magic_hotsprings) +"o" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/magic_hotsprings) +"u" = ( +/obj/structure/spacevine{ + name = "thick vines"; + opacity = 1 + }, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/magic_hotsprings) +"x" = ( +/turf/closed/mineral/snowmountain/icemoon/unscrapeable{ + name = "ice cavern rock"; + icon_state = "icerock" + }, +/area/ruin/unpowered/magic_hotsprings) +"y" = ( +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/magic_hotsprings) +"z" = ( +/obj/item/food/grown/mushroom/jupitercup, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/magic_hotsprings) +"H" = ( +/mob/living/basic/lightgeist{ + light_color = "#42ECFF" + }, +/turf/open/water/hot_spring, +/area/ruin/unpowered/magic_hotsprings) +"I" = ( +/turf/open/water/hot_spring, +/area/ruin/unpowered/magic_hotsprings) +"J" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/turf/closed/mineral/snowmountain/icemoon/unscrapeable{ + name = "ice cavern rock"; + icon_state = "icerock" + }, +/area/ruin/unpowered/magic_hotsprings) +"O" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/magic_hotsprings) +"U" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) +"Y" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/magic_hotsprings) +"Z" = ( +/obj/item/food/grown/mushroom/libertycap, +/turf/open/floor/grass/fairy/icemoon, +/area/ruin/unpowered/magic_hotsprings) + +(1,1,1) = {" +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +"} +(2,1,1) = {" +U +U +a +a +a +a +a +a +a +a +a +a +a +a +x +x +a +a +U +U +"} +(3,1,1) = {" +U +a +a +a +a +a +a +a +a +a +a +a +a +a +x +y +x +a +a +U +"} +(4,1,1) = {" +a +a +a +a +O +o +a +a +a +y +Z +O +a +x +x +y +y +x +x +a +"} +(5,1,1) = {" +a +a +a +o +z +y +y +Y +y +o +y +y +y +x +u +u +y +y +x +a +"} +(6,1,1) = {" +a +a +a +y +y +y +o +y +y +y +y +l +Y +y +z +J +x +x +x +a +"} +(7,1,1) = {" +a +a +y +y +I +I +y +y +y +O +y +o +y +y +O +y +a +a +a +a +"} +(8,1,1) = {" +a +y +o +I +I +I +I +y +I +y +I +I +I +y +y +y +y +a +a +a +"} +(9,1,1) = {" +a +O +y +I +I +I +I +I +I +I +I +I +I +I +y +I +y +o +y +a +"} +(10,1,1) = {" +a +l +y +I +H +I +I +I +I +I +I +I +I +I +I +I +H +y +y +a +"} +(11,1,1) = {" +a +o +y +I +I +I +I +I +I +I +I +I +I +I +I +I +I +y +O +a +"} +(12,1,1) = {" +a +y +y +I +I +I +I +I +I +I +I +H +I +I +I +I +I +l +y +a +"} +(13,1,1) = {" +a +Y +y +I +I +I +I +I +I +y +I +I +I +I +I +I +y +y +o +a +"} +(14,1,1) = {" +a +Z +y +y +I +I +I +y +y +y +I +I +I +I +y +y +Y +y +Z +a +"} +(15,1,1) = {" +a +a +y +l +y +O +y +y +o +y +y +y +y +y +y +o +y +y +a +a +"} +(16,1,1) = {" +a +a +a +y +o +y +y +y +Y +z +y +o +y +y +y +y +o +a +a +a +"} +(17,1,1) = {" +a +a +a +a +y +y +a +a +a +y +O +a +a +y +O +y +a +a +a +a +"} +(18,1,1) = {" +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +"} +(19,1,1) = {" +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +"} +(20,1,1) = {" +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm new file mode 100644 index 0000000000000..8d90a5079dbb1 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm @@ -0,0 +1,1247 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clipboard{ + pixel_y = 3; + pixel_x = -4 + }, +/obj/structure/noticeboard/directional/north, +/obj/item/petri_dish/random, +/obj/item/paper/fluff/junkmail_generic{ + name = "weird note" + }, +/obj/item/paper/guides/antag/supermatter_sliver, +/obj/item/stack/sheet/mineral/plasma{ + pixel_x = 5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"aP" = ( +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/cup/soda_cans/beer{ + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/soda_cans/beer{ + pixel_x = 6 + }, +/obj/structure/closet/mini_fridge, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"bn" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/petri_dish{ + pixel_x = -10; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/mortar{ + pixel_x = -17; + pixel_y = 1 + }, +/obj/item/pestle{ + pixel_x = -12; + pixel_y = -2 + }, +/obj/structure/microscope, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"bx" = ( +/obj/item/cigbutt, +/turf/template_noop, +/area/template_noop) +"bC" = ( +/obj/machinery/navbeacon{ + location = "syndielab_beacon1"; + codes_txt = "patrol;next_patrol=syndielab_beacon2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"cd" = ( +/obj/structure/chair/sofa/corp/left, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"cg" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/light/warm/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/warning/gas_mask/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"ci" = ( +/obj/structure/flora/bush/pointy/style_3{ + pixel_y = -4; + pixel_x = 6 + }, +/obj/structure/flora/bush/ferny/style_2{ + pixel_y = 6; + pixel_x = -3 + }, +/turf/open/floor/grass{ + initial_gas_mix = "o2=1000;n2=1100;TEMP=280" + }, +/area/ruin/syndielab) +"cu" = ( +/obj/machinery/door/airlock/security{ + desc = "It opens and closes. Menacingly!"; + name = "Syndicate Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"cM" = ( +/mob/living/basic/trooper/syndicate/ranged/shotgun, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"cP" = ( +/obj/effect/mapping_helpers/bombable_wall, +/turf/closed/wall/r_wall/syndicate/nodiagonal{ + desc = "An ominous looking wall. It has extra insulation to keep the heat in."; + name = "plastitanium wall" + }, +/area/ruin/syndielab) +"dD" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/condiment/bbqsauce{ + pixel_y = 8; + pixel_x = -9 + }, +/obj/item/reagent_containers/condiment/donksauce{ + pixel_y = 5; + pixel_x = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"el" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"ex" = ( +/obj/structure/flora/tree/jungle/small/style_4{ + pixel_x = -14; + pixel_y = 5 + }, +/obj/structure/flora/bush/sunny{ + pixel_y = 12; + pixel_x = 12 + }, +/obj/structure/flora/bush/fullgrass/style_2, +/turf/open/floor/grass{ + initial_gas_mix = "o2=1000;n2=1100;TEMP=280" + }, +/area/ruin/syndielab) +"ey" = ( +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"gE" = ( +/obj/machinery/vending/donksnack{ + onstation_override = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"hl" = ( +/obj/machinery/navbeacon{ + location = "syndielab_beacon2"; + codes_txt = "patrol;next_patrol=syndielab_beacon3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"hn" = ( +/obj/machinery/computer/telecomms/monitor{ + dir = 8; + icon_keyboard = "syndie_key" + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"hu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"iy" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"iQ" = ( +/obj/structure/closet/crate/preopen, +/obj/item/radio/off{ + pixel_x = 8 + }, +/obj/item/radio/off{ + pixel_x = -5 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"lW" = ( +/obj/structure/filingcabinet, +/obj/item/paper/fluff/ruins/hauntedtradingpost/receipt/alternate, +/obj/item/pen, +/obj/item/paper/guides/antag/nuke_instructions, +/obj/item/cigarette/syndicate, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/sticker/syndicate, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"mi" = ( +/obj/structure/sign/poster/contraband/cybersun_six_hundred/directional/west, +/obj/item/vending_refill/donksoft{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/item/vending_refill/donksnackvendor, +/obj/structure/closet/crate/freezer/donk, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"na" = ( +/obj/item/climbing_hook, +/obj/item/pickaxe/silver{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/t_scanner/adv_mining_scanner{ + pixel_x = 3; + pixel_y = -1 + }, +/obj/item/hatchet/wooden{ + pixel_y = -7; + pixel_x = -3 + }, +/obj/structure/closet/crate/preopen, +/obj/structure/sign/poster/contraband/gorlex_recruitment/directional/west, +/obj/effect/decal/cleanable/plastic, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"nD" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/microwave, +/obj/machinery/light/warm/directional/east, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"nT" = ( +/obj/machinery/atmospherics/components/binary/pump/on/dark/hidden{ + dir = 1; + target_pressure = 180 + }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"oA" = ( +/obj/structure/syndicate_uplink_beacon, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"oY" = ( +/obj/effect/mapping_helpers/apc/syndicate_access, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/machinery/power/apc/auto_name/directional/east{ + cable_layer = 1 + }, +/obj/effect/mapping_helpers/apc/cut_AI_wire, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"pK" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/airalarm/directional/north, +/obj/item/implanter/radio, +/obj/item/implantcase{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/traitor_bug{ + pixel_y = 6; + pixel_x = 6 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"qy" = ( +/obj/item/clothing/suit/hooded/explorer/syndicate{ + pixel_x = 8; + pixel_y = -2 + }, +/obj/item/clothing/mask/gas/syndicate, +/obj/structure/rack, +/obj/machinery/light/warm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"qC" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"ry" = ( +/obj/item/clothing/shoes/workboots/mining{ + pixel_x = -7; + pixel_y = 10 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"rH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"rO" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"sa" = ( +/obj/effect/decal/cleanable/ash, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"sj" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"sp" = ( +/obj/effect/decal/cleanable/plastic, +/obj/structure/mop_bucket/janitorialcart{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"sV" = ( +/obj/machinery/vending/donksofttoyvendor{ + onstation_override = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"tb" = ( +/obj/machinery/light/warm/directional/north, +/obj/effect/decal/cleanable/oil/streak, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"tC" = ( +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"uT" = ( +/obj/structure/table/wood, +/obj/item/ammo_casing/shotgun/scatterlaser{ + pixel_y = 6; + pixel_x = 1 + }, +/obj/item/ammo_casing/shotgun/buckshot{ + pixel_y = 4; + pixel_x = 8 + }, +/turf/open/floor/carpet/red, +/area/ruin/syndielab) +"uX" = ( +/obj/structure/flora/bush/ferny{ + pixel_y = 2; + pixel_x = -2 + }, +/obj/machinery/air_sensor{ + chamber_id = "syndielab_biodome" + }, +/turf/open/floor/grass{ + initial_gas_mix = "o2=1000;n2=1100;TEMP=280" + }, +/area/ruin/syndielab) +"vr" = ( +/obj/structure/sign/poster/contraband/revolver/directional/east, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"vE" = ( +/obj/structure/safe, +/obj/item/book/granter/crafting_recipe/donk_secret_recipe, +/obj/item/stack/sheet/mineral/plasma/thirty, +/obj/item/storage/wallet/money{ + desc = "It can hold a few small and personal things." + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"vO" = ( +/obj/machinery/door/airlock/survival_pod{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"wh" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/trash/ready_donk{ + pixel_x = 6 + }, +/obj/structure/sign/poster/contraband/eat/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"wj" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"wl" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"wJ" = ( +/obj/structure/rack, +/obj/item/storage/backpack/satchel, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/clothing/suit/hooded/explorer/syndicate{ + pixel_x = 8; + pixel_y = -2 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"xa" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"xg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"xr" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/security{ + desc = "It opens and closes. Menacingly!"; + name = "Syndicate Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"yW" = ( +/turf/open/floor/carpet/red, +/area/ruin/syndielab) +"AD" = ( +/obj/structure/bookcase, +/obj/item/book/manual/fish_catalog{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/item/book/manual/nuclear{ + pixel_x = -5; + pixel_y = 1 + }, +/obj/item/book/manual/wiki/cytology{ + pixel_x = 6; + pixel_y = -2 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"AR" = ( +/turf/closed/wall/r_wall/syndicate/nodiagonal{ + desc = "An ominous looking wall. It has extra insulation to keep the heat in."; + name = "plastitanium wall" + }, +/area/ruin/syndielab) +"AX" = ( +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_y = -6; + pixel_x = 4 + }, +/turf/open/floor/carpet/red, +/area/ruin/syndielab) +"Co" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"CS" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Dd" = ( +/obj/item/storage/bag/trash/filled, +/obj/structure/closet/crate/bin, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"De" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/trash/semki{ + pixel_y = 12 + }, +/obj/item/soap/syndie, +/obj/structure/noticeboard/directional/east, +/obj/item/paper/fluff/junkmail_generic{ + name = "weird note" + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"EY" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/security/glass{ + desc = "It opens and closes. Menacingly!"; + name = "Syndicate Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Fz" = ( +/obj/structure/cable/layer1, +/obj/machinery/power/terminal{ + cable_layer = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"FJ" = ( +/obj/machinery/light/warm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Gi" = ( +/obj/machinery/navbeacon{ + location = "syndielab_beacon4"; + codes_txt = "patrol;next_patrol=syndielab_beacon1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"GL" = ( +/obj/structure/chair/office/tactical, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"GV" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/security{ + desc = "It opens and closes. Menacingly!"; + name = "Syndicate Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Hq" = ( +/obj/item/seeds/lavaland/cactus{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/seeds/lavaland/cactus{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/item/seeds/lavaland/fireblossom{ + pixel_y = 3; + pixel_x = 3 + }, +/obj/item/stack/ore/glass/basalt{ + amount = 50; + pixel_y = -3; + pixel_x = -3 + }, +/obj/structure/closet/crate/secure/cybersun/dawn, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"Hs" = ( +/obj/structure/rack, +/obj/item/storage/bag/trash, +/obj/item/pushbroom, +/obj/item/storage/bag/trash{ + pixel_x = 9; + pixel_y = -3 + }, +/obj/machinery/airalarm/directional/south, +/obj/structure/cable/layer1, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"HH" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/paper/guides/antag/hdd_extraction{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/tcomms{ + pixel_x = 12; + pixel_y = 1 + }, +/obj/structure/sign/poster/contraband/interdyne_gene_clinics/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"HS" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/syndicate, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"IQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/mob/living/basic/bot/dedbot, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Jc" = ( +/obj/effect/overloader_trap{ + uses_remaining = 1; + shock_damage = 55; + shock_range = 2; + machine_overload_damage = 160 + }, +/obj/machinery/telecomms/hub, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"JF" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/sign/poster/contraband/hacking_guide/directional/north, +/obj/item/assembly/signaler/cyborg{ + pixel_y = 5; + pixel_x = 6 + }, +/obj/item/assembly/voice{ + pixel_x = -5; + pixel_y = 3 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"Ka" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/security/glass{ + desc = "It opens and closes. Menacingly!"; + name = "Syndicate Airlock" + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"KV" = ( +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("syndielab_biodome"="Biodome Atmos"); + dir = 4; + name = "gas tank monitor"; + desc = "This computer connects to and controls the sensors and equipment in a nearby pressurised gas reservoir."; + icon_keyboard = "syndie_key" + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Lt" = ( +/obj/item/paper/fluff/operative, +/obj/structure/noticeboard/directional/north, +/obj/structure/cable/layer1, +/obj/item/ammo_casing/shotgun/buckshot/spent{ + pixel_x = 8; + pixel_y = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"MW" = ( +/turf/template_noop, +/area/template_noop) +"NM" = ( +/obj/structure/sign/poster/contraband/donk_co/directional/east, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Qj" = ( +/obj/structure/flora/bush/grassy{ + pixel_x = 15; + pixel_y = 3 + }, +/obj/structure/flora/bush, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ + dir = 1; + chamber_id = "syndielab_biodome" + }, +/turf/open/floor/grass{ + initial_gas_mix = "o2=1000;n2=1100;TEMP=280" + }, +/area/ruin/syndielab) +"QO" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/computer_disk/syndicate/camera_app{ + pixel_y = 4; + pixel_x = -5 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/crowbar/hammer{ + pixel_x = 3; + pixel_y = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"Sq" = ( +/obj/structure/rack, +/obj/item/pinata/donk{ + pixel_y = 10 + }, +/obj/item/storage/box/party_poppers{ + pixel_y = 1; + pixel_x = 7 + }, +/obj/item/storage/box/firecrackers{ + pixel_x = -8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Te" = ( +/obj/machinery/navbeacon{ + location = "syndielab_beacon3"; + codes_txt = "patrol;next_patrol=syndielab_beacon4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Tl" = ( +/obj/item/stack/tile/carpet/donk/thirty{ + pixel_x = 6; + pixel_y = -5 + }, +/obj/item/toy/plush/donkpocket{ + pixel_x = 12; + pixel_y = 3 + }, +/obj/item/stack/tile/carpet/donk/thirty{ + pixel_x = -6; + pixel_y = -5 + }, +/obj/item/toy/plush/donkpocket{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/stack/package_wrap, +/obj/structure/closet/crate/preopen, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"Ts" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/sign/poster/contraband/c20r/directional/north, +/obj/item/anomaly_releaser{ + pixel_y = 6 + }, +/obj/item/anomaly_releaser, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"TB" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"UF" = ( +/obj/machinery/door/airlock/survival_pod/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/fans/tiny, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"UM" = ( +/obj/item/ammo_box/c9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/structure/closet/crate/secure/gorlex_weapons{ + req_one_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/syndielab) +"Vf" = ( +/obj/effect/decal/cleanable/molten_object, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/stack/ore/plasma{ + pixel_x = 7; + pixel_y = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Vu" = ( +/obj/structure/aquarium/donkfish, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"VO" = ( +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Wn" = ( +/obj/machinery/computer/terminal{ + dir = 4; + upperinfo = "ERROR - NO FINGERPRINT MATCH ON FILE!"; + tguitheme = "syndicate"; + desc = "An state-of-the-art lab terminal. The Cybersun Industries logo is imprinted just below the screen."; + content = list("*Solid Matter Analyzer and Research Terminal*"); + name = "lab terminal"; + icon_screen = "tcboss"; + icon_keyboard = "syndie_key" + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Wo" = ( +/obj/structure/table/wood, +/obj/item/ammo_casing/shotgun/fletchette{ + pixel_y = 6 + }, +/obj/item/ammo_casing/shotgun/fletchette{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/gun/ballistic/shotgun/musket, +/turf/open/floor/carpet/red, +/area/ruin/syndielab) +"WO" = ( +/obj/item/trash/boritos/red{ + pixel_y = -9; + pixel_x = -5 + }, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) +"Xe" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/paint/red{ + pixel_y = 2; + pixel_x = -6 + }, +/obj/item/paint_palette{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/item/mod/paint, +/obj/structure/sign/poster/contraband/energy_swords/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Xm" = ( +/obj/structure/closet/crate/secure/trashcart, +/obj/item/relic, +/obj/item/storage/bag/trash/filled{ + pixel_y = 1; + pixel_x = 6 + }, +/obj/item/storage/bag/trash/filled{ + pixel_x = -6; + pixel_y = 1 + }, +/obj/item/storage/bag/trash/filled{ + pixel_y = -1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Xt" = ( +/turf/closed/mineral/snowmountain/icemoon, +/area/icemoon/underground/explored) +"YH" = ( +/obj/item/storage/medkit, +/obj/structure/sign/poster/contraband/free_key/directional/south, +/obj/structure/rack, +/obj/item/stack/medical/suture, +/obj/item/clothing/neck/stethoscope, +/obj/item/reagent_containers/hypospray/medipen/atropine, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Ze" = ( +/obj/machinery/porta_turret/syndicate/energy/cybersun, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"Zx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/power/smes/magical/cybersun{ + cable_layer = 1; + input_level = 180000; + output_level = 200000; + dir = 1 + }, +/obj/structure/cable/layer1, +/turf/open/floor/mineral/plastitanium, +/area/ruin/syndielab) +"ZW" = ( +/obj/structure/chair/sofa/corp/right, +/mob/living/basic/trooper/syndicate/ranged/shotgun, +/obj/machinery/light/warm/directional/north, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark/textured, +/area/ruin/syndielab) + +(1,1,1) = {" +MW +MW +MW +MW +Xt +Xt +bx +MW +MW +Xt +MW +MW +MW +MW +MW +MW +"} +(2,1,1) = {" +MW +MW +MW +MW +Xt +AR +AR +vO +AR +Xt +Xt +Xt +Xt +MW +MW +MW +"} +(3,1,1) = {" +MW +MW +Xt +Xt +Xt +AR +cg +xg +AR +AR +cP +AR +Xt +Xt +Xt +MW +"} +(4,1,1) = {" +MW +AR +AR +AR +AR +AR +AR +UF +AR +na +mi +AR +AR +AR +Xt +Xt +"} +(5,1,1) = {" +Xt +AR +aa +Wn +bC +EY +el +el +AR +iQ +iy +vE +Xe +AR +AR +Xt +"} +(6,1,1) = {" +Xt +AR +Ts +sj +FJ +AR +qy +el +AR +AD +ry +ey +VO +Tl +AR +Xt +"} +(7,1,1) = {" +Xt +AR +bn +Vf +xa +AR +Ze +Gi +cu +el +ey +wl +sa +Hq +AR +Xt +"} +(8,1,1) = {" +Xt +AR +AR +AR +EY +AR +qC +qC +AR +tb +HS +ey +sp +UM +AR +Xt +"} +(9,1,1) = {" +Xt +AR +pK +KV +el +nT +Qj +ex +qC +el +Sq +cM +Hs +AR +AR +Xt +"} +(10,1,1) = {" +Xt +AR +JF +sj +el +qC +uX +ci +qC +el +oY +Fz +Zx +AR +Xt +Xt +"} +(11,1,1) = {" +Xt +AR +Jc +oA +FJ +AR +qC +qC +AR +GV +AR +qC +qC +AR +Xt +MW +"} +(12,1,1) = {" +Xt +AR +HH +GL +hl +IQ +rH +rH +xr +Te +hu +TB +lW +AR +Xt +MW +"} +(13,1,1) = {" +Xt +AR +QO +hn +el +Xm +rO +aP +AR +Lt +AX +yW +YH +AR +Xt +MW +"} +(14,1,1) = {" +Xt +AR +AR +AR +EY +qC +qC +qC +AR +ZW +uT +yW +Vu +AR +Xt +MW +"} +(15,1,1) = {" +Xt +Xt +AR +gE +el +wj +dD +Co +AR +cd +Wo +yW +Dd +AR +Xt +MW +"} +(16,1,1) = {" +MW +Xt +AR +sV +NM +tC +tC +tC +Ka +WO +vr +CS +wJ +AR +Xt +MW +"} +(17,1,1) = {" +MW +Xt +AR +AR +AR +nD +wh +De +AR +AR +AR +AR +AR +AR +MW +MW +"} +(18,1,1) = {" +MW +MW +Xt +Xt +AR +AR +AR +AR +AR +Xt +Xt +Xt +Xt +Xt +Xt +MW +"} +(19,1,1) = {" +MW +MW +MW +Xt +Xt +Xt +Xt +Xt +Xt +Xt +MW +MW +MW +MW +MW +MW +"} diff --git a/_maps/doppler/automapper/automapper_config.toml b/_maps/doppler/automapper/automapper_config.toml new file mode 100644 index 0000000000000..8ed42800655a7 --- /dev/null +++ b/_maps/doppler/automapper/automapper_config.toml @@ -0,0 +1,27 @@ +# Automapper configuration +# [templates.example_template] - example_template should be replaced with the name of your map template. +# directory - The direct path to our map files. +# map_files - These are the names of the map files, including the extension, that will be loaded. Supports multiple for randomness. +# required_map - This is the name of the required map that needs to be loaded in order for this template to load. +# coordinates - The coordinates of the map template placement. (X, Y, Z). PLEASE NOTE: The Z coordinate is the same as would be shown in SDMM. NOT IN GAME. +# leave it at 1 if it is not a multi-z map. It is relative to the map file Z, not the one loaded in game. +# trait_name - The name of the Z level trait that will be used to determine what Z level we use. +# Traits - Station (for station relatied edits), CentCom (for edits on the CC map), Mining (for edits on Lavaland) +# More can be found in code\__DEFINES\maps.dm + +# ICEBOX MAP EDITS +# Icecats Camp Lower Level +[templates.icebox_icecats_lower] +map_files = ["icemoon_underground_icewalker_lower.dmm"] +directory = "_maps/RandomRuins/IceRuins/doppler/" +required_map = "IceBoxStation.dmm" +coordinates = [170, 16, 1] +trait_name = "Station" + +# Icecats Camp Upper Level +[templates.icebox_icecats_upper] +map_files = ["icemoon_underground_icewalker_upper.dmm"] +directory = "_maps/RandomRuins/IceRuins/doppler/" +required_map = "IceBoxStation.dmm" +coordinates = [170, 16, 2] +trait_name = "Station" diff --git a/code/__DEFINES/~doppler_defines/admin.dm b/code/__DEFINES/~doppler_defines/admin.dm new file mode 100644 index 0000000000000..d9b0c563b5035 --- /dev/null +++ b/code/__DEFINES/~doppler_defines/admin.dm @@ -0,0 +1 @@ +#define MUTE_LOOC (1<<6) diff --git a/code/__DEFINES/~doppler_defines/automapper.dm b/code/__DEFINES/~doppler_defines/automapper.dm new file mode 100644 index 0000000000000..d565286e53342 --- /dev/null +++ b/code/__DEFINES/~doppler_defines/automapper.dm @@ -0,0 +1,11 @@ +/// Place atom in open space in the middle of the room +#define AREA_SPAWN_MODE_OPEN 0 +/// Hug atom next to the wall. Tries not to block things. +#define AREA_SPAWN_MODE_HUG_WALL 1 +/// Mount atom to wall. desired_atom MUST have directional helpers. +#define AREA_SPAWN_MODE_MOUNT_WALL 2 + +#define AREA_SPAWN_MODE_COUNT 3 + +// "Required map" when we're writing over the centcom map. +#define AUTOMAPPER_MAP_BUILTIN "builtin" diff --git a/code/__DEFINES/~doppler_defines/banning.dm b/code/__DEFINES/~doppler_defines/banning.dm new file mode 100644 index 0000000000000..6e320960cbe95 --- /dev/null +++ b/code/__DEFINES/~doppler_defines/banning.dm @@ -0,0 +1 @@ +#define BAN_LOOC "LOOC" diff --git a/code/__DEFINES/~doppler_defines/logging.dm b/code/__DEFINES/~doppler_defines/logging.dm new file mode 100644 index 0000000000000..639329454b5cc --- /dev/null +++ b/code/__DEFINES/~doppler_defines/logging.dm @@ -0,0 +1,11 @@ +// Logging types for log_message() +#define LOG_SUBTLE (1 << 23) + +//Individual logging panel pages +#undef INDIVIDUAL_EMOTE_LOG +#define INDIVIDUAL_EMOTE_LOG (LOG_EMOTE | LOG_SUBTLE) +#undef INDIVIDUAL_SHOW_ALL_LOG +#define INDIVIDUAL_SHOW_ALL_LOG (LOG_ATTACK | LOG_SAY | LOG_WHISPER | LOG_EMOTE | LOG_SUBTLE | LOG_DSAY | LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS | LOG_OOC | LOG_ADMIN | LOG_OWNERSHIP | LOG_GAME | LOG_ADMIN_PRIVATE | LOG_ASAY | LOG_MECHA | LOG_VIRUS | LOG_SHUTTLE | LOG_ECON) + +// Game categories +#define LOG_CATEGORY_GAME_SUBTLE "game-subtle" diff --git a/code/__DEFINES/~doppler_defines/say.dm b/code/__DEFINES/~doppler_defines/say.dm new file mode 100644 index 0000000000000..a0e63033354ea --- /dev/null +++ b/code/__DEFINES/~doppler_defines/say.dm @@ -0,0 +1 @@ +#define LOOC_RANGE 7 diff --git a/code/__DEFINES/~doppler_defines/speech_channels.dm b/code/__DEFINES/~doppler_defines/speech_channels.dm new file mode 100644 index 0000000000000..1f5cf3d77a82b --- /dev/null +++ b/code/__DEFINES/~doppler_defines/speech_channels.dm @@ -0,0 +1,3 @@ +#define LOOC_CHANNEL "LOOC" // LOOC +#define WHIS_CHANNEL "Whis" // Whisper +#define DO_CHANNEL "Do" // Do diff --git a/code/__HELPERS/~doppler_helpers/chat.dm b/code/__HELPERS/~doppler_helpers/chat.dm new file mode 100644 index 0000000000000..949fedddb171d --- /dev/null +++ b/code/__HELPERS/~doppler_helpers/chat.dm @@ -0,0 +1,12 @@ +/** + * Returns a boolean based on whether or not the string contains a comma or an apostrophe, + * to be used for emotes to decide whether or not to have a space between the name of the user + * and the emote. + * + * Requires the message to be HTML decoded beforehand. Not doing it here for performance reasons. + * + * Returns TRUE if there should be a space, FALSE if there shouldn't. + */ +/proc/should_have_space_before_emote(string) + var/static/regex/no_spacing_emote_characters = regex(@"(,|')") + return no_spacing_emote_characters.Find(string) ? FALSE : TRUE diff --git a/code/__HELPERS/~doppler_helpers/logging.dm b/code/__HELPERS/~doppler_helpers/logging.dm new file mode 100644 index 0000000000000..3284327796ce8 --- /dev/null +++ b/code/__HELPERS/~doppler_helpers/logging.dm @@ -0,0 +1,3 @@ +/// This logs subtle emotes in game.log +/proc/log_subtle(text, list/data) + logger.Log(LOG_CATEGORY_GAME_SUBTLE, text, data) diff --git a/code/__HELPERS/~doppler_helpers/verbs.dm b/code/__HELPERS/~doppler_helpers/verbs.dm new file mode 100644 index 0000000000000..4d78f127e3efa --- /dev/null +++ b/code/__HELPERS/~doppler_helpers/verbs.dm @@ -0,0 +1,32 @@ +/** Get all hearers in range, ignores walls and such. Code stolen from `/proc/get_hearers_in_view()` + * Much faster and less expensive than range() +*/ +/proc/get_hearers_in_looc_range(atom/source, range_radius = LOOC_RANGE) + var/turf/center_turf = get_turf(source) + if(!center_turf) + return + + . = list() + var/old_luminosity = center_turf.luminosity + if(range_radius <= 0) //special case for if only source cares + for(var/atom/movable/target as anything in center_turf) + var/list/recursive_contents = target.important_recursive_contents?[RECURSIVE_CONTENTS_HEARING_SENSITIVE] + if(recursive_contents) + . += recursive_contents + return . + + var/list/hearables_from_grid = SSspatial_grid.orthogonal_range_search(source, RECURSIVE_CONTENTS_HEARING_SENSITIVE, range_radius) + + if(!length(hearables_from_grid))//we know that something is returned by the grid, but we dont know if we need to actually filter down the output + return . + + var/list/assigned_oranges_ears = SSspatial_grid.assign_oranges_ears(hearables_from_grid) + + for(var/mob/oranges_ear/ear in range(range_radius, center_turf)) + . += ear.references + + for(var/mob/oranges_ear/remaining_ear as anything in assigned_oranges_ears) //we need to clean up our mess + remaining_ear.unassign() + + center_turf.luminosity = old_luminosity + return . diff --git a/code/_globalvars/~doppler_globalvars/configuration.dm b/code/_globalvars/~doppler_globalvars/configuration.dm new file mode 100644 index 0000000000000..a22eba72d9cf0 --- /dev/null +++ b/code/_globalvars/~doppler_globalvars/configuration.dm @@ -0,0 +1,2 @@ +// LOOC Module +GLOBAL_VAR_INIT(looc_allowed, TRUE) diff --git a/code/datums/components/adjust_fishing_difficulty.dm b/code/datums/components/adjust_fishing_difficulty.dm new file mode 100644 index 0000000000000..b2f5f71a757d8 --- /dev/null +++ b/code/datums/components/adjust_fishing_difficulty.dm @@ -0,0 +1,110 @@ +///Influences the difficulty of the minigame when worn or if buckled to. +/datum/component/adjust_fishing_difficulty + ///The additive numerical modifier to the difficulty of the minigame + var/modifier + ///For items, in which slot it has to be worn to influence the difficulty of the minigame + var/slots + +/datum/component/adjust_fishing_difficulty/Initialize(modifier, slots = NONE) + if(!ismovable(parent) || !modifier) + return COMPONENT_INCOMPATIBLE + + if(!isitem(parent)) + var/atom/movable/movable_parent = parent + if(!movable_parent.can_buckle) + return COMPONENT_INCOMPATIBLE + + src.modifier = modifier + src.slots = slots + +/datum/component/adjust_fishing_difficulty/RegisterWithParent() + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_dropped)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_item_examine)) + else + RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, PROC_REF(on_buckle)) + RegisterSignal(parent, COMSIG_MOVABLE_UNBUCKLE, PROC_REF(on_unbuckle)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_buckle_examine)) + + update_check() + +/datum/component/adjust_fishing_difficulty/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_EXAMINE, + COMSIG_MOVABLE_BUCKLE, + COMSIG_MOVABLE_UNBUCKLE, + COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_DROPPED, + )) + + update_check(TRUE) + +/datum/component/adjust_fishing_difficulty/proc/update_check(removing = FALSE) + var/atom/movable/movable_parent = parent + for(var/mob/living/buckled_mob as anything in movable_parent.buckled_mobs) + update_user(buckled_mob, removing) + if(!isitem(movable_parent) || !isliving(movable_parent.loc)) + return + var/mob/living/holder = movable_parent.loc + var/obj/item/item = parent + if(holder.get_slot_by_item(movable_parent) & (slots || item.slot_flags)) + update_user(holder, removing) + +/datum/component/adjust_fishing_difficulty/proc/on_item_examine(obj/item/item, mob/user, list/examine_text) + SIGNAL_HANDLER + if(!HAS_MIND_TRAIT(user, TRAIT_EXAMINE_FISH)) + return + var/method = "[(slots || item.slot_flags) & ITEM_SLOT_HANDS ? "Holding" : "Wearing"] [item.p_them()]" + add_examine_line(user, examine_text, method) + +/datum/component/adjust_fishing_difficulty/proc/on_buckle_examine(atom/movable/source, mob/user, list/examine_text) + SIGNAL_HANDLER + if(!HAS_MIND_TRAIT(user, TRAIT_EXAMINE_FISH)) + return + add_examine_line(user, examine_text, "Buckling to [source.p_them()]") + +/datum/component/adjust_fishing_difficulty/proc/add_examine_line(mob/user, list/examine_text, method) + var/percent = HAS_MIND_TRAIT(user, TRAIT_EXAMINE_DEEPER_FISH) ? "[modifier]% " : "" + var/text = "[method] will make fishing [percent][modifier > 0 ? "easier" : "harder"]." + if(modifier > 0) + examine_text += span_nicegreen(text) + else + examine_text += span_danger(text) + +/datum/component/adjust_fishing_difficulty/proc/on_buckle(atom/movable/source, mob/living/buckled_mob, forced) + SIGNAL_HANDLER + update_user(buckled_mob) + +/datum/component/adjust_fishing_difficulty/proc/on_unbuckle(atom/movable/source, mob/living/buckled_mob, forced) + SIGNAL_HANDLER + update_user(buckled_mob, TRUE) + +/datum/component/adjust_fishing_difficulty/proc/on_equipped(obj/item/source, mob/living/wearer, slot) + SIGNAL_HANDLER + if(slot & (slots || source.slot_flags)) + update_user(wearer) + +/datum/component/adjust_fishing_difficulty/proc/on_dropped(obj/item/source, mob/living/dropper) + SIGNAL_HANDLER + update_user(dropper, TRUE) + +/datum/component/adjust_fishing_difficulty/proc/update_user(mob/living/user, removing = FALSE) + var/datum/fishing_challenge/challenge = GLOB.fishing_challenges_by_user[user] + if(removing) + UnregisterSignal(user, COMSIG_MOB_BEGIN_FISHING) + if(challenge) + UnregisterSignal(challenge, COMSIG_FISHING_CHALLENGE_GET_DIFFICULTY) + else + RegisterSignal(user, COMSIG_MOB_BEGIN_FISHING, PROC_REF(on_minigame_started)) + if(challenge) + RegisterSignal(challenge, COMSIG_FISHING_CHALLENGE_GET_DIFFICULTY, PROC_REF(adjust_difficulty)) + challenge?.update_difficulty() + +/datum/component/adjust_fishing_difficulty/proc/on_minigame_started(mob/living/source, datum/fishing_challenge/challenge) + SIGNAL_HANDLER + RegisterSignal(challenge, COMSIG_FISHING_CHALLENGE_GET_DIFFICULTY, PROC_REF(adjust_difficulty), TRUE) + +/datum/component/adjust_fishing_difficulty/proc/adjust_difficulty(datum/fishing_challenge/challenge, reward_path, obj/item/fishing_rod/rod, mob/living/user, list/holder) + SIGNAL_HANDLER + holder[1] += modifier diff --git a/code/datums/proximity_monitor/fields/void_storm.dm b/code/datums/proximity_monitor/fields/void_storm.dm new file mode 100644 index 0000000000000..c9e3bbbbcff91 --- /dev/null +++ b/code/datums/proximity_monitor/fields/void_storm.dm @@ -0,0 +1,37 @@ +/*! + * Void storm for the void heretic ascension + * + * Follows the heretic around and acts like an aura with damaging effects for non-heretics + */ +/datum/proximity_monitor/advanced/void_storm + edge_is_a_field = TRUE + // lazylist that keeps track of the overlays added + var/list/turf_effects + var/static/image/storm_overlay = image('icons/effects/weather_effects.dmi', "snow_storm") + +/datum/proximity_monitor/advanced/void_storm/New(atom/_host, range, _ignore_if_not_on_turf) + . = ..() + recalculate_field(full_recalc = TRUE) + +/datum/proximity_monitor/advanced/void_storm/recalculate_field(full_recalc) + full_recalc = TRUE // We always perform a full recalc because we need to update ALL the sprites + return ..() + +/datum/proximity_monitor/advanced/void_storm/cleanup_field_turf(turf/target) + . = ..() + var/obj/effect/abstract/effect = LAZYACCESS(turf_effects, target) + LAZYREMOVE(turf_effects, target) + if(effect) + qdel(effect) + +/datum/proximity_monitor/advanced/void_storm/setup_field_turf(turf/target) + . = ..() + var/obj/effect/abstract/effect = new(target) // Makes the field visible to players. + effect.alpha = 255 - get_dist(target, host.loc) * 23 + effect.color = COLOR_BLACK + effect.icon = storm_overlay.icon + effect.icon_state = storm_overlay.icon_state + effect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + effect.layer = ABOVE_ALL_MOB_LAYER + SET_PLANE(effect, ABOVE_GAME_PLANE, target) + LAZYSET(turf_effects, target, effect) diff --git a/code/game/objects/items/lighter.dm b/code/game/objects/items/lighter.dm new file mode 100644 index 0000000000000..a0613450b28d6 --- /dev/null +++ b/code/game/objects/items/lighter.dm @@ -0,0 +1,362 @@ +/obj/item/lighter + name = "\improper Zippo lighter" + desc = "The zippo." + icon = 'icons/obj/cigarettes.dmi' + icon_state = "zippo" + inhand_icon_state = "zippo" + worn_icon_state = "lighter" + w_class = WEIGHT_CLASS_TINY + obj_flags = CONDUCTS_ELECTRICITY + slot_flags = ITEM_SLOT_BELT + resistance_flags = FIRE_PROOF + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/fuel/oil = 5) + custom_price = PAYCHECK_CREW * 1.1 + light_system = OVERLAY_LIGHT + light_range = 2 + light_power = 1.3 + light_color = LIGHT_COLOR_FIRE + light_on = FALSE + toolspeed = 1.5 + tool_behaviour = TOOL_WELDER + ///The amount of heat a lighter has while it's on. We're using the define to ensure lighters can't do things we don't want them to. + var/heat_while_on = HIGH_TEMPERATURE_REQUIRED - 100 + ///The amount of time the lighter has been on for, for fuel consumption. + var/burned_fuel_for = 0 + ///The max amount of fuel the lighter can hold. + var/maximum_fuel = 6 + /// Whether the lighter is lit. + var/lit = FALSE + /// Whether the lighter is fancy. Fancy lighters have fancier flavortext and won't burn thumbs. + var/fancy = TRUE + /// The engraving overlay used by this lighter. + var/overlay_state + /// A list of possible engraving overlays. + var/list/overlay_list = list( + "plain", + "dame", + "thirteen", + "snake", + ) + +/obj/item/lighter/Initialize(mapload) + . = ..() + create_reagents(maximum_fuel, REFILLABLE | DRAINABLE) + reagents.add_reagent(/datum/reagent/fuel, maximum_fuel) + if(!overlay_state) + overlay_state = pick(overlay_list) + AddComponent(\ + /datum/component/bullet_intercepting,\ + block_chance = 0.5,\ + active_slots = ITEM_SLOT_SUITSTORE,\ + on_intercepted = CALLBACK(src, PROC_REF(on_intercepted_bullet)),\ + ) + update_appearance() + +/// Destroy the lighter when it's shot by a bullet +/obj/item/lighter/proc/on_intercepted_bullet(mob/living/victim, obj/projectile/bullet) + victim.visible_message(span_warning("\The [bullet] shatters on [victim]'s lighter!")) + playsound(victim, SFX_RICOCHET, 100, TRUE) + new /obj/effect/decal/cleanable/oil(get_turf(src)) + do_sparks(1, TRUE, src) + victim.dropItemToGround(src, force = TRUE, silent = TRUE) + qdel(src) + +/obj/item/lighter/cyborg_unequip(mob/user) + if(!lit) + return + set_lit(FALSE) + +/obj/item/lighter/suicide_act(mob/living/carbon/user) + if (lit) + user.visible_message(span_suicide("[user] begins holding \the [src]'s flame up to [user.p_their()] face! It looks like [user.p_theyre()] trying to commit suicide!")) + playsound(src, 'sound/items/welder.ogg', 50, TRUE) + return FIRELOSS + else + user.visible_message(span_suicide("[user] begins whacking [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) + return BRUTELOSS + +/obj/item/lighter/update_icon_state() + icon_state = "[initial(icon_state)][lit ? "-on" : ""]" + return ..() + +/obj/item/lighter/update_overlays() + . = ..() + . += create_lighter_overlay() + +/// Generates an overlay used by this lighter. +/obj/item/lighter/proc/create_lighter_overlay() + return mutable_appearance(icon, "lighter_overlay_[overlay_state][lit ? "-on" : ""]") + +/obj/item/lighter/ignition_effect(atom/A, mob/user) + if(get_temperature()) + . = span_infoplain(span_rose("With a single flick of [user.p_their()] wrist, [user] smoothly lights [A] with [src]. Damn [user.p_theyre()] cool.")) + +/obj/item/lighter/proc/set_lit(new_lit) + if(lit == new_lit) + return + + lit = new_lit + if(lit) + force = 5 + damtype = BURN + hitsound = 'sound/items/welder.ogg' + attack_verb_continuous = string_list(list("burns", "singes")) + attack_verb_simple = string_list(list("burn", "singe")) + heat = heat_while_on + START_PROCESSING(SSobj, src) + if(fancy) + playsound(src.loc , 'sound/items/zippo_on.ogg', 100, 1) + else + playsound(src.loc, 'sound/items/lighter_on.ogg', 100, 1) + if(isliving(loc)) + var/mob/living/male_model = loc + if(male_model.fire_stacks && !(male_model.on_fire)) + male_model.ignite_mob() + else + hitsound = SFX_SWING_HIT + force = 0 + heat = 0 + attack_verb_continuous = null //human_defense.dm takes care of it + attack_verb_simple = null + STOP_PROCESSING(SSobj, src) + if(fancy) + playsound(src.loc , 'sound/items/zippo_off.ogg', 100, 1) + else + playsound(src.loc , 'sound/items/lighter_off.ogg', 100, 1) + set_light_on(lit) + update_appearance() + +/obj/item/lighter/extinguish() + . = ..() + set_lit(FALSE) + +/obj/item/lighter/attack_self(mob/living/user) + if(!user.is_holding(src)) + return ..() + if(lit) + set_lit(FALSE) + if(fancy) + user.visible_message( + span_notice("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow."), + span_notice("You quietly shut off [src] without even looking at what you're doing. Wow.") + ) + else + user.visible_message( + span_notice("[user] quietly shuts off [src]."), + span_notice("You quietly shut off [src].") + ) + return + + if(get_fuel() <= 0) + return + + set_lit(TRUE) + + if(fancy) + user.visible_message( + span_notice("Without even breaking stride, [user] flips open and lights [src] in one smooth movement."), + span_notice("Without even breaking stride, you flip open and light [src] in one smooth movement.") + ) + return + + var/hand_protected = FALSE + var/mob/living/carbon/human/human_user = user + if(!istype(human_user) || HAS_TRAIT(human_user, TRAIT_RESISTHEAT) || HAS_TRAIT(human_user, TRAIT_RESISTHEATHANDS)) + hand_protected = TRUE + else if(!istype(human_user.gloves, /obj/item/clothing/gloves)) + hand_protected = FALSE + else + var/obj/item/clothing/gloves/gloves = human_user.gloves + if(gloves.max_heat_protection_temperature) + hand_protected = (gloves.max_heat_protection_temperature > 360) + + if(hand_protected || prob(75)) + user.visible_message( + span_notice("After a few attempts, [user] manages to light [src]."), + span_notice("After a few attempts, you manage to light [src].") + ) + return + + var/hitzone = user.held_index_to_dir(user.active_hand_index) == "r" ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND + user.apply_damage(5, BURN, hitzone) + user.visible_message( + span_warning("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn[user.p_s()] [user.p_their()] finger in the process."), + span_warning("You burn yourself while lighting the lighter!") + ) + user.add_mood_event("burnt_thumb", /datum/mood_event/burnt_thumb) + +/obj/item/lighter/attack(mob/living/target_mob, mob/living/user, params) + if(lit) + use(0.5) + if(target_mob.ignite_mob()) + message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(target_mob)] on fire with [src] at [AREACOORD(user)]") + log_game("[key_name(user)] set [key_name(target_mob)] on fire with [src] at [AREACOORD(user)]") + var/obj/item/cigarette/cig = help_light_cig(target_mob) + if(!lit || !cig || user.combat_mode) + return ..() + + if(cig.lit) + to_chat(user, span_warning("The [cig.name] is already lit!")) + if(target_mob == user) + cig.attackby(src, user) + return + + if(fancy) + cig.light(span_rose("[user] whips the [name] out and holds it for [target_mob]. [user.p_Their()] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with.")) + else + cig.light(span_notice("[user] holds the [name] out for [target_mob], and lights [target_mob.p_their()] [cig.name].")) + +///Checks if the lighter is able to perform a welding task. +/obj/item/lighter/tool_use_check(mob/living/user, amount, heat_required) + if(!lit) + to_chat(user, span_warning("[src] has to be on to complete this task!")) + return FALSE + if(get_fuel() < amount) + to_chat(user, span_warning("You need more welding fuel to complete this task!")) + return FALSE + if(heat < heat_required) + return FALSE + return TRUE + +/obj/item/lighter/process(seconds_per_tick) + if(lit) + burned_fuel_for += seconds_per_tick + if(burned_fuel_for >= TOOL_FUEL_BURN_INTERVAL) + use(used = 0.25) + + open_flame(heat) + +/obj/item/lighter/get_temperature() + return lit * heat + +/// Uses fuel from the lighter. +/obj/item/lighter/use(used = 0) + if(!lit) + return FALSE + + if(used > 0) + burned_fuel_for = 0 + + if(get_fuel() >= used) + reagents.remove_reagent(/datum/reagent/fuel, used) + if(get_fuel() <= 0) + set_lit(FALSE) + return TRUE + return FALSE + +///Returns the amount of fuel +/obj/item/lighter/proc/get_fuel() + return reagents.get_reagent_amount(/datum/reagent/fuel) + +/obj/item/lighter/greyscale + name = "cheap lighter" + desc = "A cheap lighter." + icon_state = "lighter" + maximum_fuel = 3 + fancy = FALSE + overlay_list = list( + "transp", + "tall", + "matte", + "zoppo", //u cant stoppo th zoppo + ) + + /// The color of the lighter. + var/lighter_color + /// The set of colors this lighter can be autoset as on init. + var/static/list/color_list = list( //Same 16 color selection as electronic assemblies + COLOR_ASSEMBLY_BLACK, + COLOR_FLOORTILE_GRAY, + COLOR_ASSEMBLY_BGRAY, + COLOR_ASSEMBLY_WHITE, + COLOR_ASSEMBLY_RED, + COLOR_ASSEMBLY_ORANGE, + COLOR_ASSEMBLY_BEIGE, + COLOR_ASSEMBLY_BROWN, + COLOR_ASSEMBLY_GOLD, + COLOR_ASSEMBLY_YELLOW, + COLOR_ASSEMBLY_GURKHA, + COLOR_ASSEMBLY_LGREEN, + COLOR_ASSEMBLY_GREEN, + COLOR_ASSEMBLY_LBLUE, + COLOR_ASSEMBLY_BLUE, + COLOR_ASSEMBLY_PURPLE + ) + +/obj/item/lighter/greyscale/Initialize(mapload) + . = ..() + if(!lighter_color) + lighter_color = pick(color_list) + update_appearance() + +/obj/item/lighter/greyscale/create_lighter_overlay() + var/mutable_appearance/lighter_overlay = ..() + lighter_overlay.color = lighter_color + return lighter_overlay + +/obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user) + if(get_temperature()) + . = span_notice("After some fiddling, [user] manages to light [A] with [src].") + + +/obj/item/lighter/slime + name = "slime zippo" + desc = "A specialty zippo made from slimes and industry. Has a much hotter flame than normal." + icon_state = "slighter" + heat_while_on = parent_type::heat_while_on + 1000 //Blue flame is hotter, this means this does act as a welding tool. + light_color = LIGHT_COLOR_CYAN + overlay_state = "slime" + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/medicine/pyroxadone = 5) + +/obj/item/lighter/skull + name = "badass zippo" + desc = "An absolutely badass zippo lighter. Just look at that skull!" + overlay_state = "skull" + +/obj/item/lighter/mime + name = "pale zippo" + desc = "In lieu of fuel, performative spirit can be used to light cigarettes." + icon_state = "mlighter" //These ones don't show a flame. + light_color = LIGHT_COLOR_HALOGEN + heat_while_on = 0 //I swear it's a real lighter dude you just can't see the flame dude I promise + overlay_state = "mime" + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/consumable/nothing = 10) + light_range = 0 + light_power = 0 + fancy = FALSE + +/obj/item/lighter/mime/ignition_effect(atom/A, mob/user) + . = span_infoplain("[user] lifts the [name] to the [A], which miraculously lights!") + +/obj/item/lighter/bright + name = "illuminative zippo" + desc = "Sustains an incredibly bright chemical reaction when you spark it. Avoid looking directly at the igniter when lit." + icon_state = "slighter" + light_color = LIGHT_COLOR_ELECTRIC_CYAN + overlay_state = "bright" + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/flash_powder = 10) + light_range = 8 + light_power = 3 //Irritatingly bright and large enough to cover a small room. + fancy = FALSE + +/obj/item/lighter/bright/examine(mob/user) + . = ..() + + if(lit && isliving(user)) + var/mob/living/current_viewer = user + current_viewer.flash_act(4) + +/obj/item/lighter/bright/ignition_effect(atom/A, mob/user) + if(get_temperature()) + . = span_infoplain(span_rose("[user] lifts the [src] to the [A], igniting it with a brilliant flash of light!")) + var/mob/living/current_viewer = user + current_viewer.flash_act(4) + +/obj/effect/spawner/random/special_lighter + name = "special lighter spawner" + icon_state = "lighter" + loot = list( + /obj/item/lighter/skull, + /obj/item/lighter/mime, + /obj/item/lighter/bright, + ) diff --git a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm new file mode 100644 index 0000000000000..da27cdbdaf9df --- /dev/null +++ b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm @@ -0,0 +1,187 @@ +//Mounted guns are basically a smaller equivalent to cannons, designed to use pre-existing ammo rather than cannonballs. +//Due to using pre-existing ammo, they dont require to be loaded with gunpowder or an equivalent. + +/obj/structure/mounted_gun + name = "Mounted Gun" + desc = "Default mounted gun for inheritance purposes." + density = TRUE + anchored = FALSE + icon = 'icons/obj/weapons/cannons.dmi' + icon_state = "falconet_patina" + var/icon_state_base = "falconet_patina" + var/icon_state_fire = "falconet_patina_fire" + max_integrity = 300 + ///whether the cannon can be unwrenched from the ground. Anchorable_cannon equivalent. + var/anchorable_gun = TRUE + ///Max shots per firing of the gun. + var/max_shots_per_fire = 1 + ///Shots currently loaded. Should never be more than max_shots_per_fire. + var/shots_in_gun = 1 + ///shots added to gun, per piece of ammo loaded. + var/shots_per_load = 1 + ///Accepted "ammo" type + var/obj/item/ammo_type = /obj/item/ammo_casing/strilka310 + ///Projectile from said gun. Doesnt automatically inherit said ammo's projectile in case you wanted to make a gun that shoots floor tiles or something. + var/obj/item/projectile_type = /obj/projectile/bullet/strilka310 + ///If the gun has anything in it. + var/loaded_gun = TRUE + ///If the gun is currently loaded with its maximum capacity. + var/fully_loaded_gun = TRUE + ///delay in firing the gun after lighting + var/fire_delay = 5 + ///Delay between shots + var/shot_delay = 3 + ///If the gun shakes the camera when firing + var/firing_shakes_camera = TRUE + ///sound of firing for all but last shot + var/fire_sound = 'sound/weapons/gun/general/mountedgun.ogg' + ///sound of firing for last shot + var/last_fire_sound = 'sound/weapons/gun/general/mountedgunend.ogg' + +/obj/structure/mounted_gun/wrench_act(mob/living/user, obj/item/tool) + . = ..() + if(!anchorable_gun) /// Can't anchor an unanchorable gun. + return FALSE + default_unfasten_wrench(user, tool) + return ITEM_INTERACT_SUCCESS + +///Covers Reloading and lighting of the gun +/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, params) + var/ignition_message = used_item.ignition_effect(src, user) // Checks if item used can ignite stuff. + if(istype(used_item, ammo_type)) + if(fully_loaded_gun) + balloon_alert(user, "already fully loaded!") + return + else + shots_in_gun = shots_in_gun + shots_per_load //Add one to the shots in the gun + + loaded_gun = TRUE // Make sure it registers theres ammo in there, so it can fire. + QDEL_NULL(used_item) + if(shots_in_gun >= max_shots_per_fire) + shots_in_gun = max_shots_per_fire // in case of somehow firing only some of a guns shots, and reloading, you still cant get above the maximum ammo size. + fully_loaded_gun = TRUE //So you cant load extra. + return + + else if(ignition_message) // if item the player used ignites, light the gun! + visible_message(ignition_message) + user.log_message("fired a cannon", LOG_ATTACK) + log_game("[key_name(user)] fired a cannon in [AREACOORD(src)]") + addtimer(CALLBACK(src, PROC_REF(fire)), fire_delay) //uses fire proc as shown below to shoot the gun + return + ..() + +/obj/structure/mounted_gun/proc/fire() + if (!loaded_gun) + balloon_alert_to_viewers("gun is not loaded!","",2) + return + for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself. + for(var/mob/shaken_mob in urange(10, src)) + if(shaken_mob.stat == CONSCIOUS && firing_shakes_camera == TRUE) + shake_camera(shaken_mob, 3, 1) + icon_state = icon_state_fire + if(loaded_gun) + + if (times_fired < shots_in_gun) + playsound(src, fire_sound, 50, FALSE, 5) + else + playsound(src, last_fire_sound, 50, TRUE, 5) + var/obj/projectile/fired_projectile = new projectile_type(get_turf(src)) + fired_projectile.firer = src + fired_projectile.fired_from = src + fired_projectile.fire(dir2angle(dir)) + sleep(shot_delay) + loaded_gun = FALSE + shots_in_gun = 0 + fully_loaded_gun = FALSE + icon_state = icon_state_base + +/obj/structure/mounted_gun/pipe + + name = "Pipe Organ Gun" + desc = "To become master over one who has killed, one must become a better killer. This engine of destruction is one of many things made to that end." + icon_state = "pipeorgangun" + icon_state_base = "pipeorgangun" + icon_state_fire = "pipeorgangun_fire" + anchored = FALSE + anchorable_gun = TRUE + max_shots_per_fire = 8 + shots_in_gun = 8 + shots_per_load = 2 + ammo_type = /obj/item/ammo_casing/junk + projectile_type = /obj/projectile/bullet/junk + loaded_gun = TRUE + fully_loaded_gun = TRUE + fire_delay = 3 + shot_delay = 2 + firing_shakes_camera = FALSE + +/obj/structure/mounted_gun/pipe/examine_more(mob/user) + . = ..() + . += span_notice("Looking down at the [name], you recall a tale told to you in some distant memory...") + + . += span_info("To commit an act of vengeance is not unlike to enter a blood pact with a devil, ending the life of another, at the cost of your own.") + . += span_info("When humanity first spilled the blood of its own kind, with likely nothing more than a rock, the seal was broken. Vengeance was borne unto the world.") + . += span_info("However, vengeance alone is not enough to carry through the grim deed of murder. One must an gain advantage over their adversary.") + . += span_info("As such, the man who ended another's life with a stone, was in turn smote himself by another wielding a spear. After spears, bows. Swords. Guns. Tanks. Missiles. And on and on Vengeance fed. Growing stronger. Growing Worse.") + . += span_info("Vengeance persists to this day. It sometimes may slumber, seemingly content with having gorged itself, but in the end, its ceaseless hunger can be neither numbed nor sated.") + +/obj/structure/mounted_gun/pipe/fire() + if (!loaded_gun) + balloon_alert_to_viewers("Gun is not loaded!","",2) + return + for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself. + for(var/mob/shaken_mob in urange(10, src)) + if((shaken_mob.stat == CONSCIOUS)&&(firing_shakes_camera == TRUE)) + shake_camera(shaken_mob, 3, 1) + icon_state = icon_state_fire + if(loaded_gun) + playsound(src, fire_sound, 50, TRUE, 5) + + var/list_of_projectiles = list( + /obj/projectile/bullet/junk = 40, + /obj/projectile/bullet/incendiary/fire/junk = 25, + /obj/projectile/bullet/junk/shock = 25, + /obj/projectile/bullet/junk/hunter = 20, + /obj/projectile/bullet/junk/phasic = 8, + /obj/projectile/bullet/junk/ripper = 8, + /obj/projectile/bullet/junk/reaper = 3, + ) + projectile_type = pick_weight(list_of_projectiles) + + var/obj/projectile/fired_projectile = new projectile_type(get_turf(src)) + fired_projectile.firer = src + fired_projectile.fired_from = src + fired_projectile.fire(dir2angle(dir)) + sleep(shot_delay) + loaded_gun = FALSE + shots_in_gun = 0 + fully_loaded_gun = FALSE + icon_state = icon_state_base + +/obj/structure/mounted_gun/canister_gatling //for the funny skeleton pirates! + + name = "Canister Gatling Gun" + desc = "''Quantity has a quality of its own.''" + icon_state = "canister_gatling" + icon_state_base = "canister_gatling" + icon_state_fire = "canister_gatling_fire" + anchored = FALSE + anchorable_gun = TRUE + max_shots_per_fire = 50 + shots_per_load = 50 + shots_in_gun = 50 + ammo_type = /obj/item/ammo_casing/canister_shot + projectile_type = /obj/projectile/bullet/shrapnel + loaded_gun = TRUE + fully_loaded_gun = TRUE + fire_delay = 3 + shot_delay = 1 + firing_shakes_camera = FALSE + +/obj/item/ammo_casing/canister_shot + name = "Canister Shot" + desc = "A gigantic... well, canister of canister shot. Used for reloading the Canister Gatling Gun." + icon_state = "canister_shot" + obj_flags = CONDUCTS_ELECTRICITY + throwforce = 0 + w_class = WEIGHT_CLASS_BULKY diff --git a/code/modules/antagonists/heretic/magic/void_conduit.dm b/code/modules/antagonists/heretic/magic/void_conduit.dm new file mode 100644 index 0000000000000..07ca0cbe2ab0f --- /dev/null +++ b/code/modules/antagonists/heretic/magic/void_conduit.dm @@ -0,0 +1,122 @@ +/datum/action/cooldown/spell/conjure/void_conduit + name = "Void Conduit" + desc = "Opens a gate to the Void; it releases an intermittent pulse that damages windows and airlocks, \ + while afflicting Heathens with void chill. \ + Affected Heretics instead receive low pressure resistance." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "void_rift" + + cooldown_time = 1 MINUTES + + sound = null + school = SCHOOL_FORBIDDEN + invocation = "MBR'C' TH' V''D!" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + + summon_radius = 0 + summon_type = list(/obj/structure/void_conduit) + summon_respects_density = TRUE + summon_respects_prev_spawn_points = TRUE + +/obj/structure/void_conduit + name = "Void Conduit" + desc = "An open gate which leads to nothingness. Releases pulses which you do not want to get hit by." + icon = 'icons/effects/effects.dmi' + icon_state = "void_conduit" + anchored = TRUE + density = TRUE + ///Overlay to apply to the tiles in range of the conduit + var/static/image/void_overlay = image(icon = 'icons/turf/overlays.dmi', icon_state = "voidtile") + ///List of tiles that we added an overlay to, so we can clear them when the conduit is deleted + var/list/overlayed_turfs = list() + ///How many tiles far our effect is + var/effect_range = 12 + ///id of the deletion timer + var/timerid + ///Audio loop for the rift being alive + var/datum/looping_sound/void_conduit/soundloop + +/obj/structure/void_conduit/Initialize(mapload) + . = ..() + soundloop = new(src, start_immediately = TRUE) + timerid = QDEL_IN_STOPPABLE(src, 1 MINUTES) + START_PROCESSING(SSobj, src) + for(var/turf/affected_turf as anything in RANGE_TURFS(effect_range, src)) + if(!isopenturf(affected_turf)) + continue + affected_turf.add_overlay(void_overlay) + overlayed_turfs += affected_turf + void_overlay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + void_overlay.alpha = 180 + +/obj/structure/void_conduit/Destroy(force) + QDEL_NULL(soundloop) + deltimer(timerid) + STOP_PROCESSING(SSobj, src) + for(var/turf/affected_turf as anything in overlayed_turfs) //If the portal is moved, the overlays don't stick around + affected_turf.cut_overlay(void_overlay) + return ..() + +/obj/structure/void_conduit/process(seconds_per_tick) + do_conduit_pulse() + +///Sends out a pulse +/obj/structure/void_conduit/proc/do_conduit_pulse() + var/list/turfs_to_affect = list() + for(var/turf/affected_turf as anything in RANGE_TURFS(effect_range, loc)) + var/distance = get_dist(loc, affected_turf) + if(!turfs_to_affect["[distance]"]) + turfs_to_affect["[distance]"] = list() + turfs_to_affect["[distance]"] += affected_turf + + for(var/distance in 0 to effect_range) + if(!turfs_to_affect["[distance]"]) + continue + addtimer(CALLBACK(src, PROC_REF(handle_effects), turfs_to_affect["[distance]"]), (1 SECONDS) * distance) + + new /obj/effect/temp_visual/circle_wave/void_conduit(get_turf(src)) + +///Applies the effects of the pulse "hitting" something. Freezes non-heretic, destroys airlocks/windows +/obj/structure/void_conduit/proc/handle_effects(list/turfs) + for(var/turf/affected_turf as anything in turfs) + for(var/atom/thing_to_affect as anything in affected_turf.contents) + + if(isliving(thing_to_affect)) + var/mob/living/affected_mob = thing_to_affect + if(affected_mob.can_block_magic(MAGIC_RESISTANCE)) + continue + if(IS_HERETIC(affected_mob)) + affected_mob.apply_status_effect(/datum/status_effect/void_conduit) + else + affected_mob.apply_status_effect(/datum/status_effect/void_chill, 1) + + if(istype(thing_to_affect, /obj/machinery/door) || istype(thing_to_affect, /obj/structure/door_assembly)) + var/obj/affected_door = thing_to_affect + affected_door.take_damage(rand(15, 30)) + + if(istype(thing_to_affect, /obj/structure/window) || istype(thing_to_affect, /obj/structure/grille)) + var/obj/structure/affected_structure = thing_to_affect + affected_structure.take_damage(rand(10, 20)) + +/datum/looping_sound/void_conduit + mid_sounds = 'sound/ambience/ambiatm1.ogg' + mid_length = 1 SECONDS + extra_range = 10 + volume = 40 + falloff_distance = 5 + falloff_exponent = 20 + +/datum/status_effect/void_conduit + duration = 15 SECONDS + status_type = STATUS_EFFECT_REPLACE + alert_type = null + +/datum/status_effect/void_conduit/on_apply() + ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "void_conduit") + return TRUE + +/datum/status_effect/void_conduit/on_remove() + REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "void_conduit") diff --git a/code/modules/antagonists/heretic/magic/void_prison.dm b/code/modules/antagonists/heretic/magic/void_prison.dm new file mode 100644 index 0000000000000..211a747c8008e --- /dev/null +++ b/code/modules/antagonists/heretic/magic/void_prison.dm @@ -0,0 +1,101 @@ +/datum/action/cooldown/spell/pointed/void_prison + name = "Void Prison" + desc = "Sends a heathen into the void for 10 seconds. \ + They will be unable to perform any actions for the duration. \ + Afterwards, they will be chilled and returned to the mortal plane." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "voidball" + ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' + sound = 'sound/magic/voidblink.ogg' + + cooldown_time = 1 MINUTES + cast_range = 3 + + sound = null + school = SCHOOL_FORBIDDEN + invocation = "V''D PR'S'N!" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + +/datum/action/cooldown/spell/pointed/void_prison/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + if(!ismob(cast_on)) + return SPELL_CANCEL_CAST + +/datum/action/cooldown/spell/pointed/void_prison/cast(mob/living/carbon/human/cast_on) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + cast_on.visible_message( + span_danger("A swirling, cold void wraps around [cast_on], but they burst free in a wave of heat!"), + span_danger("A yawning void begins to open before you, but a great wave of heat bursts it apart! You are protected!!") + ) + return + cast_on.apply_status_effect(/datum/status_effect/void_prison, "void_stasis") + +/datum/status_effect/void_prison + id = "void_prison" + duration = 10 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/void_prison + ///The overlay that gets applied to whoever has this status active + var/obj/effect/abstract/voidball/stasis_overlay + +/datum/status_effect/void_prison/on_creation(mob/living/new_owner, set_duration) + . = ..() + stasis_overlay = new /obj/effect/abstract/voidball(new_owner) + RegisterSignal(stasis_overlay, COMSIG_QDELETING, PROC_REF(clear_overlay)) + new_owner.vis_contents += stasis_overlay + stasis_overlay.animate_opening() + addtimer(CALLBACK(src, PROC_REF(enter_prison), new_owner), 1 SECONDS) + +/datum/status_effect/void_prison/on_remove() + if(!IS_HERETIC(owner)) + owner.apply_status_effect(/datum/status_effect/void_chill, 3) + if(stasis_overlay) + //Free our prisoner + owner.remove_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM, TRAIT_SOFTSPOKEN), REF(src)) + owner.forceMove(get_turf(stasis_overlay)) + stasis_overlay.forceMove(owner) + owner.vis_contents += stasis_overlay + //Animate closing the ball + stasis_overlay.animate_closing() + stasis_overlay.icon_state = "voidball_closed" + QDEL_IN(stasis_overlay, 1.1 SECONDS) + stasis_overlay = null + return ..() + +///Freezes our prisoner in place +/datum/status_effect/void_prison/proc/enter_prison(mob/living/prisoner) + stasis_overlay.forceMove(prisoner.loc) + prisoner.forceMove(stasis_overlay) + prisoner.add_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM, TRAIT_SOFTSPOKEN), REF(src)) + +///Makes sure to clear the ref in case the voidball ever suddenly disappears +/datum/status_effect/void_prison/proc/clear_overlay() + SIGNAL_HANDLER + stasis_overlay = null + +//----Voidball effect +/obj/effect/abstract/voidball + icon = 'icons/mob/actions/actions_ecult.dmi' + icon_state = "voidball_effect" + layer = ABOVE_ALL_MOB_LAYER + vis_flags = VIS_INHERIT_ID + +///Plays a opening animation +/obj/effect/abstract/voidball/proc/animate_opening() + flick("voidball_opening", src) + +///Plays a closing animation +/obj/effect/abstract/voidball/proc/animate_closing() + flick("voidball_closing", src) + +//---- Screen alert +/atom/movable/screen/alert/status_effect/void_prison + name = "Void Prison" + desc = "A Yawning void encases your mortal coil." //Go straight to jail, do not pass GO, do not collect 200$ + icon = 'icons/mob/actions/actions_ecult.dmi' + icon_state = "voidball_effect" diff --git a/code/modules/antagonists/heretic/status_effects/void_chill.dm b/code/modules/antagonists/heretic/status_effects/void_chill.dm new file mode 100644 index 0000000000000..ed4bf1f3cb521 --- /dev/null +++ b/code/modules/antagonists/heretic/status_effects/void_chill.dm @@ -0,0 +1,113 @@ +/*! + * Contains the "Void Chill" status effect. Harmful debuff which freezes and slows down non-heretics + * Cannot affect silicons (How are you gonna freeze a robot?) + */ +/datum/status_effect/void_chill + id = "void_chill" + duration = 30 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/void_chill + status_type = STATUS_EFFECT_REFRESH //Custom code + on_remove_on_mob_delete = TRUE + remove_on_fullheal = TRUE + ///Current amount of stacks we have + var/stacks + ///Maximum of stacks that we could possibly get + var/stack_limit = 5 + ///icon for the overlay + var/image/stacks_overlay + +/datum/status_effect/void_chill/on_creation(mob/living/new_owner, new_stacks, ...) + . = ..() + RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_stacks_overlay)) + set_stacks(new_stacks) + owner.add_atom_colour(COLOR_BLUE_LIGHT, TEMPORARY_COLOUR_PRIORITY) + owner.update_icon(UPDATE_OVERLAYS) + +/datum/status_effect/void_chill/on_apply() + if(issilicon(owner)) + return FALSE + return TRUE + +/datum/status_effect/void_chill/on_remove() + owner.update_icon(UPDATE_OVERLAYS) + owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BLUE_LIGHT) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/void_chill) + owner.remove_alt_appearance("heretic_status") + REMOVE_TRAIT(owner, TRAIT_HYPOTHERMIC, REF(src)) + UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) + +/datum/status_effect/void_chill/tick(seconds_between_ticks) + owner.adjust_bodytemperature(-12 * stacks * seconds_between_ticks) + +/datum/status_effect/void_chill/refresh(mob/living/new_owner, new_stacks, forced = FALSE) + . = ..() + if(forced) + set_stacks(new_stacks) + else + adjust_stacks(new_stacks) + owner.update_icon(UPDATE_OVERLAYS) + +///Updates the overlay that gets applied on our victim +/datum/status_effect/void_chill/proc/update_stacks_overlay(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + + linked_alert?.update_appearance(UPDATE_ICON_STATE|UPDATE_DESC) + owner.remove_alt_appearance("heretic_status") + stacks_overlay = image('icons/effects/effects.dmi', owner, "void_chill_partial") + if(stacks >= 5) + stacks_overlay = image('icons/effects/effects.dmi', owner, "void_chill_oh_fuck") + owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/heretic, "heretic_status", stacks_overlay, NONE) + +/** + * Setter and adjuster procs for stacks + * + * Arguments: + * - new_stacks + * + */ + +/datum/status_effect/void_chill/proc/set_stacks(new_stacks) + stacks = max(0, min(stack_limit, new_stacks)) + update_movespeed(stacks) + +/datum/status_effect/void_chill/proc/adjust_stacks(new_stacks) + stacks = max(0, min(stack_limit, stacks + new_stacks)) + update_movespeed(stacks) + if(stacks >= 5) + ADD_TRAIT(owner, TRAIT_HYPOTHERMIC, REF(src)) + +///Updates the movespeed of owner based on the amount of stacks of the debuff +/datum/status_effect/void_chill/proc/update_movespeed(stacks) + owner.add_movespeed_modifier(/datum/movespeed_modifier/void_chill, update = TRUE) + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/void_chill, update = TRUE, multiplicative_slowdown = (0.5 * stacks)) + linked_alert.maptext = MAPTEXT_TINY_UNICODE("[stacks]") + +/datum/status_effect/void_chill/lasting + id = "lasting_void_chill" + duration = -1 + +/datum/movespeed_modifier/void_chill + variable = TRUE + multiplicative_slowdown = 0.1 + +//---- Screen alert +/atom/movable/screen/alert/status_effect/void_chill + name = "Void Chill" + desc = "There's something freezing you from within and without. You've never felt cold this oppressive before..." + icon_state = "void_chill_minor" + +/atom/movable/screen/alert/status_effect/void_chill/update_icon_state() + . = ..() + if(!istype(attached_effect, /datum/status_effect/void_chill)) + return + var/datum/status_effect/void_chill/chill_effect = attached_effect + if(chill_effect.stacks >= 5) + icon_state = "void_chill_oh_fuck" + +/atom/movable/screen/alert/status_effect/void_chill/update_desc(updates) + . = ..() + if(!istype(attached_effect, /datum/status_effect/void_chill)) + return + var/datum/status_effect/void_chill/chill_effect = attached_effect + if(chill_effect.stacks >= 5) + desc = "You had your chance to run, now it's too late. You may never feel warmth again..." diff --git a/code/modules/autowiki/pages/fishing.dm b/code/modules/autowiki/pages/fishing.dm new file mode 100644 index 0000000000000..b71b8dab33026 --- /dev/null +++ b/code/modules/autowiki/pages/fishing.dm @@ -0,0 +1,445 @@ +/datum/autowiki/fish + page = "Template:Autowiki/Content/Fish" + +/datum/autowiki/fish/generate() + var/output = "" + + var/datum/reagent/def_food = /obj/item/fish::food + var/def_food_name = initial(def_food.name) + var/def_feeding = /obj/item/fish::feeding_frequency + var/def_feeding_text = DisplayTimeText(def_feeding) + var/def_breeding = /obj/item/fish::breeding_timeout + var/def_breeding_text = DisplayTimeText(def_breeding) + + var/list/generated_icons = list() + var/list/fish_types = subtypesof(/obj/item/fish) + sortTim(fish_types, GLOBAL_PROC_REF(cmp_fish_fluid)) + + for (var/obj/item/fish/fish as anything in fish_types) + + var/filename = FISH_AUTOWIKI_FILENAME(fish) + + if(!generated_icons[filename]) + upload_icon(icon(fish:icon, fish::icon_state, frame = 1), filename) + generated_icons[filename] = TRUE + + if(!(fish::fish_flags & FISH_FLAG_SHOW_IN_CATALOG)) + continue + + var/list/properties = SSfishing.fish_properties[fish] + + var/description = escape_value(fish::desc) + var/list/extra_info = list() + if(fish::fillet_type != /obj/item/food/fishmeat) + var/obj/item/fillet = fish::fillet_type + if(!fillet) + extra_info += "Cannot be butchered." + else + extra_info += "When butchered, it'll yield [initial(fillet.name)]." + var/datum/reagent/food = fish::food + if(food != def_food) + extra_info += "It has to be fed [initial(food.name)] instead of [def_food_name]" + if(fish::feeding_frequency != def_feeding) + extra_info += "It has to be fed every [DisplayTimeText(fish::feeding_frequency)] instead of [def_feeding_text]" + if(fish::breeding_timeout != def_breeding) + extra_info += "It takes [DisplayTimeText(fish::breeding_timeout)] to reproduce instead of [def_breeding_text]" + if(length(extra_info)) + description += "
[extra_info.Join(extra_info,"
")]" + + output += "\n\n" + include_template("Autowiki/FishEntry", list( + "name" = full_capitalize(escape_value(fish::name)), + "icon" = filename, + "description" = description, + "size_weight" = "[fish::average_size]cm / [fish::average_weight]g", + "fluid" = escape_value(fish::required_fluid_type), + "temperature" = "[fish::required_temperature_min] - [fish::required_temperature_max] K", + "stable_population" = fish::stable_population, + "traits" = generate_traits(properties[FISH_PROPERTIES_TRAITS]), + "favorite_baits" = generate_baits(properties[FISH_PROPERTIES_FAV_BAIT]), + "disliked_baits" = generate_baits(properties[FISH_PROPERTIES_BAD_BAIT], TRUE), + "beauty_score" = properties[FISH_PROPERTIES_BEAUTY_SCORE], + )) + + return output + +/datum/autowiki/fish/proc/generate_baits(list/baits, bad = FALSE) + var/list/list = list() + if(!length(baits)) + return list("None") + + for (var/identifier in baits) + if(ispath(identifier)) //Just a path + var/obj/item/item = identifier + list += initial(item.name) + continue + var/list/special_identifier = identifier + switch(special_identifier["Type"]) + if("Foodtype") + list += english_list(bitfield_to_list(special_identifier["Value"], FOOD_FLAGS_IC)) + if("Reagent") + var/datum/reagent/reagent = special_identifier["Value"] + list += "[reagent::name][bad ? "" : "(At least [special_identifier["Amount"]] units)"]" + + return list + +/datum/autowiki/fish/proc/generate_traits(list/traits) + var/output = "" + + for(var/trait_type in traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + output += include_template("Autowiki/FishTypeTraits", list( + "name" = escape_value(trait.name), + "description" = escape_value(trait.catalog_description), + )) + + return output + +/datum/autowiki/fish_trait + page = "Template:Autowiki/Content/Fish/Trait" + +/datum/autowiki/fish_trait/generate() + var/output = "" + + for(var/trait_type in GLOB.fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + var/desc = escape_value(trait.catalog_description) + if(length(trait.incompatible_traits)) + var/incompatible = list() + for(var/datum/fish_trait/bad as anything in trait.incompatible_traits) + incompatible += span_bold(initial(bad.name)) + desc += "
Incompatible with [english_list(incompatible)]." + output += include_template("Autowiki/FishAllTraits", list( + "name" = escape_value(trait.name), + "description" = escape_value(trait.catalog_description), + "inheritability" = trait.inheritability, + "inheritability_diff" = trait.diff_traits_inheritability, + + )) + + return output + +/datum/autowiki/fish_bait + page = "Template:Autowiki/Content/Fish/Bait" + +/datum/autowiki/fish_bait/generate() + var/output = "" + + var/list/generated_icons = list() + for (var/obj/item/food/bait/bait as anything in subtypesof(/obj/item/food/bait)) + if(!bait::show_on_wiki) + continue + + var/filename = SANITIZE_FILENAME("[bait::icon_state]_wiki_bait") + + var/quality = "Bland" + + var/list/foodtypes + if(ispath(bait, /obj/item/food/bait/doughball/synthetic)) + foodtypes = list("Don't worry about it") + else + foodtypes = bitfield_to_list(bait::foodtypes, FOOD_FLAGS_IC) || list("None") + + switch(bait::bait_quality) + if(TRAIT_BASIC_QUALITY_BAIT) + quality = "Basic" + if(TRAIT_GOOD_QUALITY_BAIT) + quality = "Good" + if(TRAIT_GREAT_QUALITY_BAIT) + quality = "Great" + + output += "\n\n" + include_template("Autowiki/FishBait", list( + "name" = full_capitalize(escape_value(bait::name)), + "icon" = filename, + "description" = escape_value(bait::desc), + "foodtypes" = foodtypes, + "quality" = quality, + )) + + if(!generated_icons[filename]) + upload_icon(icon(bait:icon, bait::icon_state, frame = 1), filename) + generated_icons[filename] = TRUE + + var/filename = SANITIZE_FILENAME(/obj/item/stock_parts/power_store/cell/lead::icon_state) + + var/lead_desc = /obj/item/stock_parts/power_store/cell/lead::desc + lead_desc += " You probably shouldn't use it unless you're trying to catch a zipzap." + output += "\n\n" + include_template("Autowiki/FishBait", list( + "name" = full_capitalize(escape_value(/obj/item/stock_parts/power_store/cell/lead::name)), + "icon" = filename, + "description" = lead_desc, + "foodtypes" = "None", + "quality" = "Poisonous", + )) + + upload_icon(icon(/obj/item/stock_parts/power_store/cell/lead::icon, /obj/item/stock_parts/power_store/cell/lead::icon_state), filename) + + var/obj/needletype = /obj/item/fish/needlefish + output += "\n\n" + include_template("Autowiki/FishBait", list( + "name" = "Baitfish", + "icon" = FISH_AUTOWIKI_FILENAME(needletype), + "description" = "Smaller fish such as goldfish, needlefish, armorfish and lavaloops can also be used as bait, It's a fish eat fish world.", + "foodtypes" = "Seafood?", + "quality" = "Good", + )) + + output += "\n\n" + include_template("Autowiki/FishBait", list( + "name" = "Food", + "icon" = "plain_bread", + "description" = "In absence of baits, food can be used as a substitute.", + "foodtypes" = "Depends", + "quality" = "Bland most of the times", + )) + + upload_icon(icon(/obj/item/food/bread/plain::icon, /obj/item/food/bread/plain::icon_state), "plain_bread") + + return output + +/datum/autowiki/fishing_line + page = "Template:Autowiki/Content/Fish/Line" + +/datum/autowiki/fishing_line/generate() + var/output = "" + + var/list/generated_icons = list() + for (var/obj/item/fishing_line/line as anything in typesof(/obj/item/fishing_line)) + var/filename = SANITIZE_FILENAME("[line::icon_state]_wiki_line") + + output += "\n\n" + include_template("Autowiki/FishLine", list( + "name" = full_capitalize(escape_value(line::name)), + "icon" = filename, + "description" = escape_value(line::wiki_desc), + )) + + if(!generated_icons[filename]) + upload_icon(icon(line:icon, line::icon_state), filename) + generated_icons[filename] = TRUE + + return output + +/datum/autowiki/fishing_hook + page = "Template:Autowiki/Content/Fish/Hook" + +/datum/autowiki/fishing_hook/generate() + var/output = "" + + var/list/generated_icons = list() + for (var/obj/item/fishing_hook/hook as anything in typesof(/obj/item/fishing_hook)) + var/filename = SANITIZE_FILENAME("[hook::icon_state]_wiki_hook") + + output += "\n\n" + include_template("Autowiki/FishHook", list( + "name" = full_capitalize(escape_value(hook::name)), + "icon" = filename, + "description" = escape_value(hook::wiki_desc), + )) + + if(!generated_icons[filename]) + upload_icon(icon(hook:icon, hook::icon_state), filename) + generated_icons[filename] = TRUE + + return output + +/datum/autowiki/fishing_rod + page = "Template:Autowiki/Content/Fish/Rod" + +/datum/autowiki/fishing_rod/generate() + var/output = "" + + var/list/generated_icons = list() + for (var/obj/item/fishing_rod/rod as anything in typesof(/obj/item/fishing_rod)) + if(!rod::show_in_wiki) + continue + + var/filename = SANITIZE_FILENAME("[rod::icon_state]_wiki_rod") + + var/desc = escape_value(rod::ui_description) + if(rod::wiki_description) + desc += "
[escape_value(rod::wiki_description)]" + output += "\n\n" + include_template("Autowiki/FishingRod", list( + "name" = full_capitalize(escape_value(rod::name)), + "icon" = filename, + "description" = desc, + )) + + if(!generated_icons[filename]) + var/icon/rod_icon = icon(rod:icon, rod::icon_state) + if(rod::reel_overlay) + var/icon/line = icon(rod::icon, rod::reel_overlay) + line.Blend(rod::default_line_color, ICON_MULTIPLY) + rod_icon.Blend(line, ICON_OVERLAY) + upload_icon(rod_icon, filename) + generated_icons[filename] = TRUE + + return output + +/datum/autowiki/fish_sources + page = "Template:Autowiki/Content/Fish/Source" + +/datum/autowiki/fish_sources/generate() + var/output = "" + + for(var/source_type in GLOB.preset_fish_sources) + var/datum/fish_source/source = GLOB.preset_fish_sources[source_type] + if(!source.catalog_description) + continue + + output += "\n\n" + include_template("Autowiki/FishSource", list( + "name" = full_capitalize(source.catalog_description), + "difficulty" = source.fishing_difficulty, + "contents" = get_contents(source), + )) + + ///Used for stuff that isn't fish by default + upload_icon(icon('icons/effects/random_spawners.dmi', "questionmark"), FISH_SOURCE_AUTOWIKI_QUESTIONMARK) + + return output + +/datum/autowiki/fish_sources/proc/get_contents(datum/fish_source/source) + var/output = "" + var/list/data = source.generate_wiki_contents(src) + sortTim(data, GLOBAL_PROC_REF(cmp_autowiki_fish_sources_content)) + for(var/list/entry in data) + entry[FISH_SOURCE_AUTOWIKI_WEIGHT] = "[round(entry[FISH_SOURCE_AUTOWIKI_WEIGHT], 0.1)]%" + var/weight_suffix = entry[FISH_SOURCE_AUTOWIKI_WEIGHT_SUFFIX] + if(weight_suffix) + entry[FISH_SOURCE_AUTOWIKI_WEIGHT] += " [weight_suffix]" + entry -= FISH_SOURCE_AUTOWIKI_WEIGHT + output += include_template("Autowiki/FishSourceContents", entry) + + return output + +///Sort the autowiki fish entries by their weight. However, duds always come first. +/proc/cmp_autowiki_fish_sources_content(list/A, list/B) + if(A[FISH_SOURCE_AUTOWIKI_NAME] == FISH_SOURCE_AUTOWIKI_DUD) + return -1 + if(B[FISH_SOURCE_AUTOWIKI_NAME] == FISH_SOURCE_AUTOWIKI_DUD) + return 1 + if(A[FISH_SOURCE_AUTOWIKI_NAME] == FISH_SOURCE_AUTOWIKI_OTHER) + return 1 + if(B[FISH_SOURCE_AUTOWIKI_NAME] == FISH_SOURCE_AUTOWIKI_OTHER) + return -1 + return B[FISH_SOURCE_AUTOWIKI_WEIGHT] - A[FISH_SOURCE_AUTOWIKI_WEIGHT] + +/datum/autowiki/fish_scan + page = "Template:Autowiki/Content/Fish/Scan" + +/datum/autowiki/fish_scan/generate() + var/output = "" + + var/list/generated_icons = list() + var/datum/techweb/techweb = locate(/datum/techweb/admin) in SSresearch.techwebs + for(var/scan_type in typesof(/datum/experiment/scanning/fish)) + techweb.add_experiment(scan_type) //Make sure each followup experiment is available + var/datum/experiment/scanning/fish/scan = locate(scan_type) in techweb.available_experiments + if(!scan) //Just to be sure, if the scan was already completed. + scan = locate(scan_type) in techweb.completed_experiments + + output += "\n\n" + include_template("Autowiki/FishScan", list( + "name" = full_capitalize(escape_value(scan.name)), + "description" = escape_value(scan.description), + "requirements" = build_requirements(scan), + "rewards" = build_rewards(scan, generated_icons), + + )) + + return output + +/datum/autowiki/fish_scan/proc/build_requirements(datum/experiment/scanning/fish/scan) + var/output = "" + for(var/obj/item/type as anything in scan.required_atoms) + var/name = initial(type.name) + //snowflake case because the default holographic fish is called goldfish but we don't want to confuse readers. + if(type == /obj/item/fish/holo) + name = "holographic Fish" + output += include_template("Autowiki/FishScanRequirements", list( + "name" = full_capitalize(escape_value(name)), + "amount" = scan.required_atoms[type], + )) + return output + +/datum/autowiki/fish_scan/proc/build_rewards(datum/experiment/scanning/fish/scan, list/generated_icons) + var/output = "" + var/datum/fish_source/portal/reward = GLOB.preset_fish_sources[scan.fish_source_reward] + var/filename = SANITIZE_FILENAME("fishing_portal_[reward.radial_state]") + + var/list/unlocks = list() + for(var/datum/experiment/unlock as anything in scan.next_experiments) + unlocks += initial(unlock.name) + output += include_template("Autowiki/FishScanRewards", list( + "name" = full_capitalize(escape_value("[reward.radial_name] Dimension")), + "icon" = filename, + "points" = scan.get_points_reward_text(), + "unlock" = english_list(unlocks, nothing_text = "Nothing"), + )) + + if(!generated_icons[filename]) + upload_icon(icon(icon = 'icons/hud/radial_fishing.dmi', icon_state = reward.radial_state), filename) + generated_icons[filename] = TRUE + + return output + +/datum/autowiki/fish_evolution + page = "Template:Autowiki/Content/Fish/Evolution" + +/datum/autowiki/fish_evolution/generate() + var/output = "" + + for(var/evo_type in GLOB.fish_evolutions) + var/datum/fish_evolution/evolution = GLOB.fish_evolutions[evo_type] + if(!evolution.show_on_wiki) + continue + + output += "\n\n" + include_template("Autowiki/FishEvolution", list( + "name" = escape_value(evolution.name), + "fish" = get_fish(evo_type), + "min_max_temp" = "[evolution.required_temperature_min] - [evolution.required_temperature_max] K", + "notes" = escape_value(evolution.conditions_note), + "result_icon" = evolution.show_result_on_wiki ? FISH_AUTOWIKI_FILENAME(evolution.new_fish_type) : FISH_SOURCE_AUTOWIKI_QUESTIONMARK, + )) + + return output + +/datum/autowiki/fish_evolution/proc/get_fish(evo_type) + var/output = "" + + for(var/obj/item/fish/fish as anything in GLOB.fishes_by_fish_evolution[evo_type]) + if(!(initial(fish.fish_flags) & FISH_FLAG_SHOW_IN_CATALOG)) + continue + output += include_template("Autowiki/FishEvolutionCandidate", list( + "name" = escape_value(full_capitalize(initial(fish.name))), + "icon" = FISH_AUTOWIKI_FILENAME(fish), + )) + + return output + +/datum/autowiki/fish_lure + page = "Template:Autowiki/Content/Fish/Lure" + +/datum/autowiki/fish_lure/generate() + var/output = "" + + for(var/obj/item/fishing_lure/lure as anything in SSfishing.lure_catchables) + var/state = initial(lure.icon_state) + var/filename = SANITIZE_FILENAME("[state]_wiki_lure") + output += "\n\n" + include_template("Autowiki/FishLure", list( + "name" = escape_value(full_capitalize(initial(lure.name))), + "desc" = escape_value(initial(lure.name)), + "icon" = filename, + "catchables" = build_catchables(SSfishing.lure_catchables[lure]), + )) + + upload_icon(icon(icon = initial(lure.icon), icon_state = state), filename) + + return output + +/datum/autowiki/fish_lure/proc/build_catchables(list/catchables) + var/output = "" + + for(var/obj/item/fish/fish as anything in catchables) + if(!(initial(fish.fish_flags) & FISH_FLAG_SHOW_IN_CATALOG)) + continue + output += include_template("Autowiki/FishLureCatchables", list( + "name" = escape_value(full_capitalize(initial(fish.name))), + "icon" = FISH_AUTOWIKI_FILENAME(fish), + )) + + return output diff --git a/code/modules/jobs/job_types/station_trait/pun_pun.dm b/code/modules/jobs/job_types/station_trait/pun_pun.dm new file mode 100644 index 0000000000000..eca4861e77ef0 --- /dev/null +++ b/code/modules/jobs/job_types/station_trait/pun_pun.dm @@ -0,0 +1,53 @@ +///Special job, active during monkey day. +/datum/job/pun_pun + title = JOB_PUN_PUN + description = "Assist the service department by serving drinks and food and entertaining the crew." + department_head = list(JOB_HEAD_OF_PERSONNEL) + faction = FACTION_STATION + total_positions = 0 + spawn_positions = 0 + supervisors = "the Bartender" + spawn_type = /mob/living/carbon/human/species/monkey/punpun + outfit = /datum/outfit/job/pun_pun + config_tag = "PUN_PUN" + random_spawns_possible = FALSE + paycheck = PAYCHECK_LOWER + paycheck_department = ACCOUNT_CIV + display_order = JOB_DISPLAY_ORDER_PUN_PUN + departments_list = list(/datum/job_department/service) + exclusive_mail_goodies = TRUE + mail_goodies = list( + /obj/item/food/grown/banana = 4, + /obj/effect/spawner/random/entertainment/money_medium = 3, + /obj/item/clothing/head/helmet/monkey_sentience = 1, + /obj/item/book/granter/sign_language = 1, + /obj/item/food/monkeycube = 1, + ) + rpg_title = "Homunculus" + allow_bureaucratic_error = FALSE + job_flags = (STATION_JOB_FLAGS|STATION_TRAIT_JOB_FLAGS)&~JOB_ASSIGN_QUIRKS + +/datum/job/pun_pun/get_spawn_mob(client/player_client, atom/spawn_point) + if (!player_client) + return + var/mob/living/monky = new spawn_type(get_turf(spawn_point)) + if(!GLOB.the_one_and_only_punpun) + GLOB.the_one_and_only_punpun = monky + return monky + +/datum/job/pun_pun/after_spawn(mob/living/carbon/human/monkey, client/player_client) + . = ..() + monkey.make_clever_and_no_dna_scramble() + +/datum/outfit/job/pun_pun + name = "Pun Pun" + jobtype = /datum/job/pun_pun + + id_trim = /datum/id_trim/job/pun_pun + belt = /obj/item/modular_computer/pda/pun_pun + uniform = /obj/item/clothing/under/suit/waiter + backpack_contents = list( + /obj/item/gun/ballistic/shotgun/monkey = 1, + /obj/item/storage/box/beanbag = 1, + ) + shoes = null //monkeys cannot equip shoes diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm new file mode 100644 index 0000000000000..04a056e0011de --- /dev/null +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -0,0 +1,9 @@ +/// Collects information displayed about src when examined by a user with a medical HUD. +/mob/living/carbon/human/get_medhud_examine_info(mob/living/user, datum/record/crew/target_record) + . = ..() + + if(istype(w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/undershirt = w_uniform + var/sensor_text = undershirt.get_sensor_text() + if(sensor_text) + . += "Sensor Status: [sensor_text]" diff --git a/code/modules/mob/living/silicon/ai/ai_actions/remote_power.dm b/code/modules/mob/living/silicon/ai/ai_actions/remote_power.dm new file mode 100644 index 0000000000000..fd45ed3d68795 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_actions/remote_power.dm @@ -0,0 +1,41 @@ +/datum/ai_module/power_apc + name = "Remote Power" + description = "remotely powers an APC from a distance" + one_purchase = TRUE + power_type = /datum/action/innate/ai/ranged/power_apc + unlock_text = span_notice("Remote APC power systems online.") + +/datum/action/innate/ai/ranged/power_apc + name = "remotely power APC" + desc = "Use to remotely power an APC." + button_icon = 'icons/obj/machines/wallmounts.dmi' + button_icon_state = "apc0" + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + enable_text = span_notice("You prepare to power any APC you see.") + disable_text = span_notice("You stop focusing on powering APCs.") + +/datum/action/innate/ai/ranged/power_apc/do_ability(mob/living/caller, atom/clicked_on) + + if (!isAI(caller)) + return FALSE + var/mob/living/silicon/ai/ai_caller = caller + + if(caller.incapacitated) + unset_ranged_ability(caller) + return FALSE + + if(!isapc(clicked_on)) + clicked_on.balloon_alert(ai_caller, "not an APC!") + return FALSE + + if(ai_caller.battery - 50 <= 0) + to_chat(ai_caller, span_warning("You do not have the battery to charge an APC!")) + return FALSE + + var/obj/machinery/power/apc/apc = clicked_on + var/obj/item/stock_parts/power_store/cell = apc.get_cell() + cell.give(STANDARD_BATTERY_CHARGE) + ai_caller.battery -= 50 + + + diff --git a/code/modules/unit_tests/~doppler/automapper.dm b/code/modules/unit_tests/~doppler/automapper.dm new file mode 100644 index 0000000000000..e0ba6a1983276 --- /dev/null +++ b/code/modules/unit_tests/~doppler/automapper.dm @@ -0,0 +1,33 @@ +/// Checks that all automapper TOML entries actually link to a map and that the config exists. +/datum/unit_test/automapper + var/config_path = "_maps/doppler/automapper/automapper_config.toml" + +/datum/unit_test/automapper/Run() + var/test_config = rustg_read_toml_file(config_path) + + if(!test_config) + TEST_FAIL("Automapper could not read/find TOML config [config_path]!") + return + + for(var/template in test_config["templates"]) + var/selected_template = test_config["templates"][template] + + for(var/map in selected_template["map_files"]) + var/map_file = selected_template["directory"] + selected_template["map_files"][map] + TEST_ASSERT(fexists(map_file), "[template] could not find map file [map_file]!") // Testing for map existence + + for(var/template_two in test_config["templates"]) // Testing for duplicate entries + if(template_two == template) + continue + var/selected_template_two = test_config["templates"][template_two] + + TEST_ASSERT_NOTEQUAL(selected_template["coordinates"], selected_template_two["coordinates"], "Automap template [template] had the same coords as [template_two]!") + TEST_ASSERT_NOTEQUAL(selected_template["map_files"], selected_template_two["map_files"], "Automap template [template] had the same map files as [template_two]!") + +/// This is like /datum/unit_test/log_mapping and tests if the integration with the current map failed. +/datum/unit_test/area_spawn + +/datum/unit_test/area_spawn/Run() + for(var/datum/area_spawn/area_spawn as anything in SSarea_spawn.failed_area_spawns) + TEST_FAIL("[area_spawn] could not find any suitable turfs among [english_list(initial(area_spawn.target_areas))].") + diff --git a/html/changelogs/AutoChangeLog-pr-86814.yml b/html/changelogs/AutoChangeLog-pr-86814.yml new file mode 100644 index 0000000000000..a57e7d4e0fc72 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86814.yml @@ -0,0 +1,4 @@ +author: "Sealed101" +delete-after: True +changes: + - spellcheck: "fixed examine and balloon alert text for boulder refining machinery" \ No newline at end of file diff --git a/icons/ui/inventory/tail.png b/icons/ui/inventory/tail.png new file mode 100644 index 0000000000000..d73d394717f23 Binary files /dev/null and b/icons/ui/inventory/tail.png differ diff --git a/modular_doppler/administration/code/preferences.dm b/modular_doppler/administration/code/preferences.dm new file mode 100644 index 0000000000000..3720993e1c5e9 --- /dev/null +++ b/modular_doppler/administration/code/preferences.dm @@ -0,0 +1,8 @@ +/datum/preference/toggle/admin + abstract_type = /datum/preference/toggle/admin + +/datum/preference/toggle/admin/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return is_admin(preferences.parent) diff --git a/modular_doppler/automapper/code/area_spawn_entries.dm b/modular_doppler/automapper/code/area_spawn_entries.dm new file mode 100644 index 0000000000000..31ca4aee7a81c --- /dev/null +++ b/modular_doppler/automapper/code/area_spawn_entries.dm @@ -0,0 +1,17 @@ +// Pets + +// Structures + +// Wall mounts. Use sparingly as walls are prime real estate +/datum/area_spawn/prison_cryo_console + // Keep to one area so it's in the same area as the pods, which is required. + target_areas = list(/area/station/security/prison) + desired_atom = /obj/machinery/computer/cryopod + mode = AREA_SPAWN_MODE_MOUNT_WALL + +/datum/area_spawn/prison_cryopod + target_areas = list(/area/station/security/prison) + desired_atom = /obj/machinery/cryopod/prison + mode = AREA_SPAWN_MODE_MOUNT_WALL + +// Job spawners diff --git a/modular_doppler/automapper/code/area_spawn_subsystem.dm b/modular_doppler/automapper/code/area_spawn_subsystem.dm new file mode 100644 index 0000000000000..ee6554d589f89 --- /dev/null +++ b/modular_doppler/automapper/code/area_spawn_subsystem.dm @@ -0,0 +1,376 @@ +SUBSYSTEM_DEF(area_spawn) + name = "Area Spawn" + flags = SS_NO_FIRE + + // Can't be on tile or a neighbor. + // Usually things where it's important to be sure the players can walk up to them, but aren't dense. + // See restricted_half_height_objects_list for things that you can also reach over. + var/list/restricted_objects_list = list( + /obj/machinery/recharge_station, + /obj/machinery/door, + /obj/structure/closet, + /obj/machinery/disposal/bin, + /obj/structure/table, + /obj/structure/stairs, + ) + + // Only Blacklist if on same tile because looks bad, etc, but doesn't need to be reached. + var/list/restricted_overlap_objects_list = list( + /obj/item/kirbyplants, + ) + + // Things here in some way act as walls. This is the result of extensive tweaking. + var/list/allowed_diagonal_objects_list = list( + /obj/structure/grille, + /obj/structure/window, + /obj/machinery/door, + ) + + // Wall mounts ironically are better off being on top of squares with dense things since you can click past them, + // And dense things aren't on walls. These objects should have normal density logic flipped. + var/list/flip_density_wall_mount_objects_list = list( + /obj/machinery, + /obj/structure/table, + /obj/structure/rack, + /obj/item/radio/intercom, + /obj/structure/noticeboard, + /obj/structure/sign, + /obj/structure/extinguisher_cabinet, + ) + + /// Cache of area turf info. + /// [area/area][stringed of AREA_SPAWN_MODE_*][string of priority #][turf index] + var/list/list/list/list/turf/area_turf_cache = list() + + /// Non-optional area spawns that failed to find an area. + var/list/datum/area_spawn/failed_area_spawns = list() + +/datum/controller/subsystem/area_spawn/Initialize() + for(var/iterating_type in subtypesof(/datum/area_spawn)) + var/datum/area_spawn/iterating_area_spawn = new iterating_type + iterating_area_spawn.try_spawn() + qdel(iterating_area_spawn) + clear_cache() + + for(var/iterating_type in subtypesof(/datum/area_spawn_over)) + var/datum/area_spawn_over/iterating_area_spawn_over = new iterating_type + iterating_area_spawn_over.try_spawn() + qdel(iterating_area_spawn_over) + + return SS_INIT_SUCCESS + +/** + * Clear the cached tiles for optimization or debugging purposes. + */ +/datum/controller/subsystem/area_spawn/proc/clear_cache() + LAZYCLEARLIST(area_turf_cache) + +/** + * Process the geometry of an area and cache the candidates. + * + * Returns turf candidate list. "[priority]" = + * + * Arguments: + * * area - the area to process + * * mode - The area_spawn_mode we're getting turfs for. + */ +/datum/controller/subsystem/area_spawn/proc/get_turf_candidates(area/area, mode) + var/list/list/list/turf/area_turf_info + + // Get area cache or make a new one. + if(!area_turf_cache[area.type]) + area_turf_info = area_turf_cache[area.type] = list(AREA_SPAWN_MODE_COUNT) + else + area_turf_info = area_turf_cache[area.type] + + // Different use cases have different lists of turfs. + // Get or create the cached list. + var/list/list/turf/turf_list + if(area_turf_info["[mode]"]) + return area_turf_info["[mode]"] + turf_list = area_turf_info["[mode]"] = list() + + // Get highest priority items + for(var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/iterating_turf as anything in zlevel_turfs) + // Only retain turfs of the highest priority + var/priority = process_turf(iterating_turf, mode) + if(priority > 0) + LAZYADDASSOC(turf_list, "[priority]", list(iterating_turf)) + + // Sort the priorities descending + return sortTim(turf_list, GLOBAL_PROC_REF(cmp_num_string_asc)) + +/** + * Process a specific turf and return priority number from 0 to infinity. + * + * Turfs with highest priority will be picked. Priority 0 means NEVER. + * + * Arguments: + * * turf - The turf to process + * * mode - The area_spawn_mode we're getting turfs for. + */ +/datum/controller/subsystem/area_spawn/proc/process_turf(turf/turf, mode) + // Only spawn on actual floors + if(!isfloorturf(turf)) + return 0 + + // Turf completely empty? + var/totally_empty = TRUE + for(var/atom/movable/found_movable in turf) + if(istype(found_movable, /obj/effect)) + continue + + // Some tile conditions for no-go + if(mode == AREA_SPAWN_MODE_MOUNT_WALL) + // Different blacklist logic than normal. See flip_density_wall_mount_objects_list + var/flip_density = is_type_in_list(found_movable, flip_density_wall_mount_objects_list) + if( + found_movable.density != flip_density \ + || (!flip_density && is_type_in_list(found_movable, restricted_objects_list)) + ) + return 0 + + // For wall mounts, we actually don't want to overlap wall items. + if(found_movable.layer > LOW_OBJ_LAYER) + totally_empty = FALSE + + continue + + // Every other mode. + if( + found_movable.density \ + || is_type_in_list(found_movable, restricted_objects_list) \ + || is_type_in_list(found_movable, restricted_overlap_objects_list) + ) + return 0 + + if(found_movable.layer > LOW_OBJ_LAYER && found_movable.layer < ABOVE_MOB_LAYER) + totally_empty = FALSE + + // Number of directions that have a closed wall + var/num_walls_found = 0 + // Found a dense object? + var/found_dense_object = FALSE + // Number of directions that have anything dense + var/num_dense_found = 0 + // Number of directions that have 2 squares of open space. + var/num_very_open_floors = 0 + for(var/dir in GLOB.cardinals) + var/turf/neighbor_turf = get_step(turf, dir) + if(isclosedturf(neighbor_turf)) + num_walls_found++ + num_dense_found++ + continue + if(mode == AREA_SPAWN_MODE_HUG_WALL) + var/turf/long_test_turf = get_step(neighbor_turf, dir) + if(isopenturf(long_test_turf)) + num_very_open_floors++ + for(var/atom/movable/found_movable in neighbor_turf) + if(istype(found_movable, /obj/effect)) + continue + + if(found_movable.density || is_type_in_list(found_movable, restricted_objects_list)) + found_dense_object = TRUE + num_dense_found++ + break + + // Wall hugging also, as a low priority, doesn't even want diagonal things. + var/num_diagonal_objects = 0 + if(mode == AREA_SPAWN_MODE_HUG_WALL) + for(var/dir in GLOB.diagonals) + var/turf/neighbor_turf = get_step(turf, dir) + for(var/atom/movable/found_movable in neighbor_turf) + if(istype(found_movable, /obj/effect)) + continue + + if( + !is_type_in_list(found_movable, allowed_diagonal_objects_list) \ + && (found_movable.density || is_type_in_list(found_movable, restricted_objects_list)) + ) + num_diagonal_objects++ + break + + switch(mode) + if(AREA_SPAWN_MODE_OPEN) + // For non-wall hug + // #1 priority is totally empty + // #2 priority is being in the middle of the room + return (totally_empty ? 10 : 0) + (4 - num_dense_found) + + if(AREA_SPAWN_MODE_HUG_WALL) + // For wall hugging, must be against wall, and not touching another dense object as it may completely block it. + if(num_walls_found == 0 || found_dense_object || num_walls_found == 4) + return 0 + + // #1 Priority after that: be in a totally empty square + // #2 (marginally) have clear diagnals + // #3 favor being in a cozy wall nook + // #4 be in a big room/hallway so we don't pinch a room down to 1 square of passage. + return (totally_empty ? 1000 : 0) + (400 - num_diagonal_objects * 100) + (num_walls_found * 10) + num_very_open_floors + + if(AREA_SPAWN_MODE_MOUNT_WALL) + // For mounting to walls. Must be against wall. + if(num_walls_found == 0 || num_walls_found == 4) + return 0 + + // #1 Priority after that: be in a totally empty square + // #2, actually don't be in a nook! + return (totally_empty ? 10 : 0) + (4 - num_walls_found) + + CRASH("Invalid area spawn mode [mode]!") + +/** + * Pick a turf candidate and remove from the list. + * + * Only picks one of the highest priority ones. + * + * Arguments: + * * turf_candidates - Turf candidate list produced by + */ +/datum/controller/subsystem/area_spawn/proc/pick_turf_candidate(list/list/turf/turf_candidates) + // Pick-n-take highest priority. + var/list/turf/sublist = turf_candidates[peek(turf_candidates)] + var/turf/winner = pick_n_take(sublist) + + // To be safe, remove the neighbors too. + for(var/dir in GLOB.cardinals) + var/turf/neighbor = get_step(winner, dir) + sublist -= neighbor + + // Remove this priority if it's now empty. + if(!LAZYLEN(sublist)) + pop(turf_candidates) + + // Extremely specific, but landmarks are immediately destroyed when created so can't be detected another way. + // This is the only landmark list that normally creates solid objects in non-maintenance spaces. + GLOB.secequipment -= winner + + return winner + +/** + * Area spawn datums + * + * Use these to spawn atoms in areas instead of placing them on a map. It will select any available open and entering turf. + */ +/datum/area_spawn + /// The target area for us to spawn the desired atom, the list is formatted, highest priority first. + var/list/target_areas + /// The atom that we want to spawn + var/desired_atom + /// The amount we want to spawn + var/amount_to_spawn = 1 + /// See code/__DEFINES/~doppler_defines/automapper.dm + var/mode = AREA_SPAWN_MODE_OPEN + /// Map blacklist, this is used to determine what maps we should not spawn on. + var/list/blacklisted_stations = list("Void Raptor", "Ouroboros", "Snowglobe Station", "Runtime Station", "MultiZ Debug", "Gateway Test", "Blueshift", "SerenityStation") + /// If failing to find a suitable area is OK, then this should be TRUE or CI will fail. + /// Should probably be true if the target_areas are random, such as ruins. + var/optional = FALSE + +/** + * Attempts to find a location using an algorithm to spawn the desired atom. + */ +/datum/area_spawn/proc/try_spawn() + if(SSmapping.config.map_name in blacklisted_stations) + return + + // Turfs that are available + var/list/available_turfs + + for(var/area_type in target_areas) + var/area/found_area = GLOB.areas_by_type[area_type] + if(isnull(found_area)) + continue + available_turfs = SSarea_spawn.get_turf_candidates(found_area, mode) + if(LAZYLEN(available_turfs)) + break + + if(!LAZYLEN(available_turfs)) + if(!optional) + log_mapping("[src.type] could not find any suitable turfs on map [SSmapping.config.map_name]!") + SSarea_spawn.failed_area_spawns += src.type + return + + for(var/i in 1 to amount_to_spawn) + var/turf/candidate_turf = SSarea_spawn.pick_turf_candidate(available_turfs) + + var/final_desired_atom = desired_atom + + if(mode == AREA_SPAWN_MODE_MOUNT_WALL) + // For wall mounts, we have to find the wall and spawn the right directional. + for(var/dir in GLOB.cardinals) + var/turf/neighbor_turf = get_step(candidate_turf, dir) + if(isopenturf(neighbor_turf)) + continue + + final_desired_atom = text2path("[desired_atom]/directional/[dir2text(dir)]") + break + + new final_desired_atom(candidate_turf) + +/** + * Spawns an atom on any turf that contains specific over atoms. + */ +/datum/area_spawn_over + /// The target area types for us to search for the over_atoms. + var/list/target_areas + /// The list of atom types to spawn the desired atom over. + var/list/over_atoms + /// The atom type that we want to spawn + var/desired_atom + /// Map blacklist, this is used to determine what maps we should not spawn on. + var/list/blacklisted_stations = list("Void Raptor", "Runtime Station", "MultiZ Debug", "Gateway Test") + +/** + * Spawn the atoms. + */ +/datum/area_spawn_over/proc/try_spawn() + if(SSmapping.config.map_name in blacklisted_stations) + return + + for(var/area_type in target_areas) + var/area/found_area = GLOB.areas_by_type[area_type] + if(!found_area) + continue + + for(var/list/zlevel_turfs as anything in found_area.get_zlevel_turf_lists()) + for(var/turf/candidate_turf as anything in zlevel_turfs) + // Don't spawn if there's already a desired_atom here. + if(is_type_on_turf(candidate_turf, desired_atom)) + continue + + for(var/over_atom_type in over_atoms) + // Spawn on the first one we find in the turf and stop. + if(is_type_on_turf(candidate_turf, over_atom_type)) + new desired_atom(candidate_turf) + // Break the over_atom_type loop. + break + +/obj/effect/turf_test + name = "PASS" + icon = 'modular_doppler/automapper/icons/area_test.dmi' + icon_state = "area_test" + color = COLOR_BLUE + anchored = TRUE + layer = LOW_OBJ_LAYER + +/** + * Show overlay over area of priorities. Wall priority over open priority. + */ +ADMIN_VERB(test_area_spawner, R_DEBUG, "Test Area Spawner", "Show area spawner placement candidates as an overlay.", ADMIN_CATEGORY_DEBUG, area/area) + for(var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/effect/turf_test/old_test in area_turf) + qdel(old_test) + + SSarea_spawn.clear_cache() + for(var/mode in 0 to AREA_SPAWN_MODE_COUNT - 1) + var/list/list/turf/mode_candidates = SSarea_spawn.get_turf_candidates(area, mode) + + for(var/priority in mode_candidates) + var/list/turf/turfs = mode_candidates[priority] + for(var/turf/turf as anything in turfs) + var/obj/overlay = new /obj/effect/turf_test(turf) + overlay.maptext = MAPTEXT(priority) + overlay.maptext_y = mode * 10 diff --git a/modular_doppler/automapper/code/automap_template.dm b/modular_doppler/automapper/code/automap_template.dm new file mode 100644 index 0000000000000..bbc5631ece37c --- /dev/null +++ b/modular_doppler/automapper/code/automap_template.dm @@ -0,0 +1,21 @@ +/datum/map_template/automap_template + name = "Automap Template" + should_place_on_top = FALSE + keep_cached_map = FALSE + + /// Our load turf + var/turf/load_turf + /// The map for which we load on + var/required_map + /// Touches builtin map. Clears the area manually instead of blacklisting + var/affects_builtin_map + +/datum/map_template/automap_template/New(path, rename, incoming_required_map, incoming_load_turf) + . = ..(path, rename, cache = TRUE) + + if(!incoming_required_map || !incoming_load_turf) + return + + required_map = incoming_required_map + load_turf = incoming_load_turf + affects_builtin_map = incoming_required_map == AUTOMAPPER_MAP_BUILTIN diff --git a/modular_doppler/automapper/code/automapper_subsystem.dm b/modular_doppler/automapper/code/automapper_subsystem.dm new file mode 100644 index 0000000000000..39e3d96bc341b --- /dev/null +++ b/modular_doppler/automapper/code/automapper_subsystem.dm @@ -0,0 +1,166 @@ +/** + * The AUTOMAPPER + * + * This is a subsystem designed to make modular mapping far easier. + * + * It does two things: Loads maps from an automapper config and loads area spawn datums for simpler items. + * + * The benefits? We don't need to have _doppler maps and can have a more unique feeling map experience as each time, it can be different. + * + * Please note, this uses some black magic to interject the templates mid world load to prevent mass runtimes down the line. + * + * LIMITED SUPPORT FOR NON-STATION LEVELS(until someone adds a better Z level handling system for this) + */ + +SUBSYSTEM_DEF(automapper) + name = "Automapper" + flags = SS_NO_FIRE + init_order = INIT_ORDER_AUTOMAPPER + /// The path to our TOML file + var/config_file = "_maps/doppler/automapper/automapper_config.toml" + /// Our loaded TOML file + var/loaded_config + /// Our preloaded map templates + var/list/preloaded_map_templates = list() + +/datum/controller/subsystem/automapper/Initialize() + loaded_config = rustg_read_toml_file(config_file) + return SS_INIT_SUCCESS + +/** + * This will preload our templates into a cache ready to be loaded later. + * + * IMPORTANT: This requires Z levels to exist in order to function, so make sure it is preloaded AFTER that. + */ +/datum/controller/subsystem/automapper/proc/preload_templates_from_toml(map_names) + if(!islist(map_names)) + map_names = list(map_names) + for(var/template in loaded_config["templates"]) + var/selected_template = loaded_config["templates"][template] + var/required_map = selected_template["required_map"] + + // !builtin is a magic code for built in maps, ie CentCom levels. + // We'll pretend it's loaded with the station z-level, because they by definition they are loaded before the station z-levels. + var/requires_builtin = (required_map == AUTOMAPPER_MAP_BUILTIN) && ((SSmapping.config.map_file in map_names) || SSmapping.config.map_file == map_names) + + if(!requires_builtin && !(required_map in map_names)) + continue + + var/list/coordinates = selected_template["coordinates"] + if(LAZYLEN(coordinates) != 3) + CRASH("Invalid coordinates for automap template [template]!") + + var/desired_z = SSmapping.levels_by_trait(selected_template["trait_name"])[coordinates[3]] + + var/turf/load_turf = locate(coordinates[1], coordinates[2], desired_z) + + if(!LAZYLEN(selected_template["map_files"])) + CRASH("Could not find any valid map files for automap template [template]!") + + var/map_file = selected_template["directory"] + pick(selected_template["map_files"]) + + if(!fexists(map_file)) + CRASH("[template] could not find map file [map_file]!") + + var/datum/map_template/automap_template/map = new(map_file, template, required_map, load_turf) + preloaded_map_templates += map + +#define INIT_ANNOUNCE(X) to_chat(world, span_boldannounce("[X]")); log_world(X) +/** + * Assuming we have preloaded our templates, this will load them from the cache. + */ +/datum/controller/subsystem/automapper/proc/load_templates_from_cache(map_names) + if(!islist(map_names)) + map_names = list(map_names) + for(var/datum/map_template/automap_template/iterating_template as anything in preloaded_map_templates) + if(iterating_template.affects_builtin_map && ((SSmapping.config.map_file in map_names) || SSmapping.config.map_file == map_names)) + // CentCom already started loading objects, place them in the netherzone + for(var/turf/old_turf as anything in iterating_template.get_affected_turfs(iterating_template.load_turf, FALSE)) + init_contents(old_turf) + else if(!(iterating_template.required_map in map_names)) + continue + if(iterating_template.load(iterating_template.load_turf, FALSE)) + INIT_ANNOUNCE("Loaded [iterating_template.name] at [iterating_template.load_turf.x], [iterating_template.load_turf.y], [iterating_template.load_turf.z]!") + log_world("AUTOMAPPER: Successfully loaded map template [iterating_template.name] at [iterating_template.load_turf.x], [iterating_template.load_turf.y], [iterating_template.load_turf.z]!") +#undef INIT_ANNOUNCE + +/** + * CentCom atoms aren't initialized but already exist, so must be properly initialized and then qdel'd. + * Arguments: + * * parent - parent turf + */ +/datum/controller/subsystem/automapper/proc/init_contents(atom/parent) + var/static/list/mapload_args = list(TRUE) + // Don't even initialize things in this list. Very specific edge cases. + var/static/list/type_blacklist = typecacheof(list( + /obj/docking_port/stationary, + /obj/structure/bookcase, + /obj/structure/closet, + /obj/item/storage, + /obj/item/reagent_containers, + )) + + var/previous_initialized_value = SSatoms.initialized + SSatoms.initialized = INITIALIZATION_INNEW_MAPLOAD + + // Force everything to init as if INITIALIZE_IMMEDIATE was called on them. + for(var/atom/atom_to_init as anything in parent.get_all_contents_ignoring(type_blacklist) - parent) + if(atom_to_init.flags_1 & INITIALIZED_1) + continue + SSatoms.InitAtom(atom_to_init, FALSE, mapload_args) + + SSatoms.initialized = previous_initialized_value + + // NOW we can finally delete everything. + for(var/atom/atom_to_del as anything in parent.get_all_contents() - parent) + qdel(atom_to_del, TRUE) + +/** + * Get whether a given turf of the map template is a /turf/template_noop. + * + * You'd think there would be a better API way of doing this, but there is not. + * + * Arguments: + * * map - The map_template we are looking at. + * * x - The zero-based x coordinate RELATIVE to the map_template. + * * y - The zero-based y coordinate RELATIVE to the map_template. + */ +/datum/controller/subsystem/automapper/proc/has_turf_noop(datum/map_template/map, x, y) + // Row of the map grid. + var/datum/grid_set/map_row = map.cached_map.gridSets[x + 1] + // Note that Y is upside-down in the map data. + // Which model, as in that key name in the map file, like pAK. + var/modelID = map_row.gridLines[map.height - y] + // Get the actual model text, ie the text of what's in this cell + var/model = map.cached_map.grid_models[modelID] + + // If this doesn't work right, the map is horribly malformed and shoul fail, + // Or you've map-edited template_noop which I'm fine with failing as well. + return findtextEx(model, "/turf/template_noop,\n") + +/** + * This returns a list of turfs that have been preloaded and preselected using our templates. + * + * Not really useful outside of load groups. + */ +/datum/controller/subsystem/automapper/proc/get_turf_blacklists(map_names) + if(!islist(map_names)) + map_names = list(map_names) + + var/list/blacklisted_turfs = list() + for(var/datum/map_template/automap_template/iterating_template as anything in preloaded_map_templates) + if(!(iterating_template.required_map in map_names)) + continue + + // Base of the coordinate system to introspect the templates. + var/base_x = iterating_template.load_turf.x + var/base_y = iterating_template.load_turf.y + + for(var/turf/blacklisted_turf as anything in iterating_template.get_affected_turfs(iterating_template.load_turf, FALSE)) + // Allow non-rectangular templates. Have to manually check the grid set since parsed_maps are not helpful for this. + + if(has_turf_noop(iterating_template, blacklisted_turf.x - base_x, blacklisted_turf.y - base_y)) + continue + + blacklisted_turfs[blacklisted_turf] = TRUE + return blacklisted_turfs diff --git a/modular_doppler/automapper/icons/area_test.dmi b/modular_doppler/automapper/icons/area_test.dmi new file mode 100644 index 0000000000000..5b0cce0974b69 Binary files /dev/null and b/modular_doppler/automapper/icons/area_test.dmi differ diff --git a/modular_doppler/automapper/readme.md b/modular_doppler/automapper/readme.md new file mode 100644 index 0000000000000..7f49711495709 --- /dev/null +++ b/modular_doppler/automapper/readme.md @@ -0,0 +1,13 @@ +## Credits +Code: [@Gandalf2k15] + +## About +This automapper is designed to make mapping far easier for modular maps, it should mean less manual map resets(ideally, never). +It supports two types of automapping, simple area automapper and template automapper. + +## Simple Area Automapper +What this will do is check an area for a suitable single tile to spawn an object in. It uses "intelligent" heatmapping to choose a suitable place. +It uses an algorithm to decide where to place a singular item, it will avoid blocking hallways or doors. + +## Template Automapper +This automapper is designed to load templates over existing maps using a template file and entry in the config toml. diff --git a/modular_doppler/emotes/code/hologram.dm b/modular_doppler/emotes/code/hologram.dm new file mode 100644 index 0000000000000..08ce03c90c6ec --- /dev/null +++ b/modular_doppler/emotes/code/hologram.dm @@ -0,0 +1,14 @@ +GLOBAL_LIST_EMPTY(hologram_impersonators) + +/obj/machinery/holopad/set_holo(mob/living/user, obj/effect/overlay/holo_pad_hologram/holo) + if(holo.Impersonation) + GLOB.hologram_impersonators[user] = holo + holo.become_hearing_sensitive() // Well, we need to show up on "get_hearers_in_view()" + . = ..() + +/obj/machinery/holopad/clear_holo(mob/living/user) + var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user] + if(hologram) + hologram.lose_hearing_sensitivity() + GLOB.hologram_impersonators -= user + . = ..() diff --git a/modular_doppler/enterprise_resource_planning/icons/mob/breasts_skintone.dmi b/modular_doppler/enterprise_resource_planning/icons/mob/breasts_skintone.dmi new file mode 100644 index 0000000000000..581d2cb402b44 Binary files /dev/null and b/modular_doppler/enterprise_resource_planning/icons/mob/breasts_skintone.dmi differ diff --git a/modular_doppler/hearthkin/primitive_production/code/primitive_surgery.dm b/modular_doppler/hearthkin/primitive_production/code/primitive_surgery.dm new file mode 100644 index 0000000000000..6575f18bd58de --- /dev/null +++ b/modular_doppler/hearthkin/primitive_production/code/primitive_surgery.dm @@ -0,0 +1,112 @@ +//ASH SURGERY +/obj/item/cautery/primitive + name = "primitive cautery" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "cautery" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_cautery + name = "Primitive Cautery" + result = /obj/item/cautery/primitive + +/obj/item/surgicaldrill/primitive + name = "primitive surgical drill" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "surgical_drill" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_drill + name = "Primitive Surgical Drill" + result = /obj/item/surgicaldrill/primitive + +/obj/item/scalpel/primitive + name = "primitive scalpel" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "scalpel" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_scalpel + name = "Primitive Scalpel" + result = /obj/item/scalpel/primitive + +/obj/item/circular_saw/primitive + name = "primitive circular saw" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "surgical_saw" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_saw + name = "Primitive Circular Saw" + result = /obj/item/circular_saw/primitive + +/obj/item/retractor/primitive + name = "primitive retractor" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "retractors" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_retractor + name = "Primitive Retractor" + result = /obj/item/retractor/primitive + +/obj/item/hemostat/primitive + name = "primitive hemostat" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "hemostat" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_hemostat + name = "Primitive Hemostat" + result = /obj/item/hemostat/primitive + +/obj/item/bonesetter/primitive + name = "primitive bonesetter" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "bonesetter" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_bonesetter + name = "Primitive Bonesetter" + result = /obj/item/bonesetter/primitive diff --git a/modular_doppler/hearthkin/primitive_production/code/primitive_tools.dm b/modular_doppler/hearthkin/primitive_production/code/primitive_tools.dm new file mode 100644 index 0000000000000..16861598339ed --- /dev/null +++ b/modular_doppler/hearthkin/primitive_production/code/primitive_tools.dm @@ -0,0 +1,103 @@ +//generic primitive recipe +/datum/crafting_recipe/primitive_recipe + reqs = list( + /obj/item/stack/sheet/bone = 1, + /obj/item/stack/sheet/sinew = 1, + ) + time = 4 SECONDS + category = CAT_TOOLS + +//ASH TOOL +/obj/item/screwdriver/primitive + name = "primitive screwdriver" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "screwdriver" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_screwdriver + name = "Primitive Screwdriver" + result = /obj/item/screwdriver/primitive + +/obj/item/wirecutters/primitive + name = "primitive wirecutters" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "cutters" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_cutters + name = "Primitive Wirecutters" + result = /obj/item/wirecutters/primitive + +/obj/item/wrench/primitive + name = "primitive wrench" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "wrench" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_wrench + name = "Primitive Wrench" + result = /obj/item/wrench/primitive + +/obj/item/crowbar/primitive + name = "primitive crowbar" + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "crowbar" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/primitive_recipe/primitive_crowbar + name = "Primitive Crowbar" + result = /obj/item/crowbar/primitive + +/obj/item/chisel/primitive + name = "primitive chisel" + desc = "Where there is a will there is a way; the tool head of this chisel is fashioned from bone shaped when it was fresh and then left to calcify in iron rich water, to make a strong head for all your carving needs." + icon = 'modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi' + icon_state = "chisel" + custom_materials = list(/datum/material/bone = SMALL_MATERIAL_AMOUNT * 1) + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + toolspeed = 4 + +/datum/crafting_recipe/primitive_recipe/primitive_chisel + name = "Primitive Chisel" + result = /obj/item/chisel/primitive + +/obj/item/mop/tribal + desc = "A primitive mop, made of cloth, sinew, and wood." + +/datum/crafting_recipe/mop + name = "Tribal Mop" + result = /obj/item/mop/tribal + reqs = list(/obj/item/stack/sheet/mineral/wood = 1, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/sinew = 1) + time = 3 SECONDS + category = CAT_TOOLS diff --git a/modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi b/modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi new file mode 100644 index 0000000000000..bf837cbfdfcc5 Binary files /dev/null and b/modular_doppler/hearthkin/primitive_production/icons/primitive_tools.dmi differ diff --git a/modular_doppler/hearthkin/primitive_structures/code/calling_horn.dm b/modular_doppler/hearthkin/primitive_structures/code/calling_horn.dm new file mode 100644 index 0000000000000..a2ede88617218 --- /dev/null +++ b/modular_doppler/hearthkin/primitive_structures/code/calling_horn.dm @@ -0,0 +1,44 @@ +//Object code. +/obj/structure/calling_horn/hearthkin + name = "bronze calling horn" + desc = "A magnificent bronze calling horn, used by the Hearthkin to call upon their own. It doesn't seem to be working right now, though." + icon_state = "hearthkin_meeting_horn" + icon = 'modular_doppler/hearthkin/primitive_structures/icons/bronze_horn.dmi' + anchored = TRUE + resistance_flags = FLAMMABLE + max_integrity = 100 + integrity_failure = 0.35 + +//Deconstruct code +/obj/structure/calling_horn/hearthkin/wrench_act(mob/living/user, obj/item/tool) + . = ..() + balloon_alert_to_viewers("disassembling...") + if(!do_after(user, 2 SECONDS, src)) + return + deconstruct(TRUE) + +/obj/structure/calling_horn/hearthkin/atom_deconstruct(disassembled) + var/obj/item/stack/sheet/bronze/bronze = new(drop_location(), 10) + transfer_fingerprints_to(bronze) + return ..() + +//Anchor code +/obj/structure/calling_horn/hearthkin/click_ctrl(mob/user) + set_anchored(!anchored) + balloon_alert(user, "[anchored ? "secured" : "unsecured"]") + +//Crafting code. +/datum/crafting_recipe/bronze_calling_horn + name = "Bronze Calling Horn" + category = CAT_FURNITURE + //recipe given to icecats as part of their spawner/team setting + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND + + reqs = list( + /obj/item/stack/sheet/bronze = 10, + ) + + result = /obj/structure/calling_horn/hearthkin + +// Our global message code. +// SOON IN CINEMAS diff --git a/modular_doppler/hearthkin/primitive_structures/code/hearthkin_rune_stone.dm b/modular_doppler/hearthkin/primitive_structures/code/hearthkin_rune_stone.dm new file mode 100644 index 0000000000000..76ba6c0815833 --- /dev/null +++ b/modular_doppler/hearthkin/primitive_structures/code/hearthkin_rune_stone.dm @@ -0,0 +1,41 @@ +//Object code. +/obj/structure/hearthkin_rune_stone + name = "rune stone" + desc = "A carved stone, with bright cyan runes inscribed upon it. A warning clearly states: HEARTHKIN SACRED LANDS. OUTLANDERS WILL BE KILLED UPON INVADING." + icon_state = "hearthkin_warning_stone" + icon = 'modular_doppler/hearthkin/primitive_structures/icons/decorations.dmi' + anchored = TRUE + resistance_flags = FLAMMABLE + max_integrity = 100 + integrity_failure = 0.35 + +//Deconstruct code +/obj/structure/hearthkin_rune_stone/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + balloon_alert_to_viewers("disassembling...") + if(!do_after(user, 2 SECONDS, src)) + return + deconstruct(TRUE) + +/obj/structure/hearthkin_rune_stone/atom_deconstruct(disassembled) + var/obj/item/stack/sheet/mineral/stone/stone = new(drop_location(), 10) + transfer_fingerprints_to(stone) + return ..() + +//Anchor code +/obj/structure/hearthkin_rune_stone/click_ctrl(mob/user) + set_anchored(!anchored) + balloon_alert(user, "[anchored ? "secured" : "unsecured"]") + +//Crafting code. +/datum/crafting_recipe/hearthkin_rune_stone + name = "Rune Stone" + category = CAT_FURNITURE + //recipe given to icecats as part of their spawner/team setting + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED | CRAFT_ONE_PER_TURF + + reqs = list( + /obj/item/stack/sheet/mineral/stone/ = 10, + ) + + result = /obj/structure/hearthkin_rune_stone diff --git a/modular_doppler/hearthkin/primitive_structures/icons/bronze_horn.dmi b/modular_doppler/hearthkin/primitive_structures/icons/bronze_horn.dmi new file mode 100644 index 0000000000000..d3a2f36d97e78 Binary files /dev/null and b/modular_doppler/hearthkin/primitive_structures/icons/bronze_horn.dmi differ diff --git a/modular_doppler/hearthkin/primitive_structures/icons/decorations.dmi b/modular_doppler/hearthkin/primitive_structures/icons/decorations.dmi new file mode 100644 index 0000000000000..b389a5147475a Binary files /dev/null and b/modular_doppler/hearthkin/primitive_structures/icons/decorations.dmi differ diff --git a/modular_doppler/hearthkin/primitive_structures/icons/fur_rugs.dmi b/modular_doppler/hearthkin/primitive_structures/icons/fur_rugs.dmi new file mode 100644 index 0000000000000..4c1a2f63d566a Binary files /dev/null and b/modular_doppler/hearthkin/primitive_structures/icons/fur_rugs.dmi differ diff --git a/modular_doppler/hearthkin/primitive_structures/sound/hearthkinhorn.ogg b/modular_doppler/hearthkin/primitive_structures/sound/hearthkinhorn.ogg new file mode 100644 index 0000000000000..9f94ecd75a5bd Binary files /dev/null and b/modular_doppler/hearthkin/primitive_structures/sound/hearthkinhorn.ogg differ diff --git a/modular_doppler/modular_cosmetics/code/towels.dm b/modular_doppler/modular_cosmetics/code/towels.dm new file mode 100644 index 0000000000000..25c685e9a8b65 --- /dev/null +++ b/modular_doppler/modular_cosmetics/code/towels.dm @@ -0,0 +1,526 @@ +/// Default shape of the towel, when it's folded. +#define TOWEL_FOLDED "" +/// Chest-down variant of the towel. +#define TOWEL_FULL "chest" +/// Waist-down variant of the towel. +#define TOWEL_WAIST "waist" +/// Head variant of the towel. +#define TOWEL_HEAD "head" +/// Shape of the towel when it has been used, and is no longer neatly folded. +#define TOWEL_USED "used" + +/// Icon path to the obj icon of the towel. +#define TOWEL_OBJ_ICON 'modular_doppler/modular_cosmetics/icons/obj/suit/towel.dmi' + +/// How much cloth goes into a towel. +#define TOWEL_CLOTH_AMOUNT 2 + +/// Ratio of how much reagents are lost when a towel is wrung. +#define TOWEL_WRING_LOSS_FACTOR 0.5 +/// How many reagents can be wrung at once. +#define TOWEL_WRING_AMOUNT 10 + +/// Portion (out of 1) of reagents that are lost during the transfer from a towel to a container. +#define SQUEEZING_DISPERSAL_RATIO 0.75 + + +/obj/item/towel + name = "towel" + desc = "Everyone knows what a towel is. Use it to dry yourself, or wear it around your chest, your waist or even your head!" + icon = TOWEL_OBJ_ICON + worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/suit/towel.dmi' + icon_state = "towel" + base_icon_state = "towel" + lefthand_file = 'modular_doppler/modular_cosmetics/icons/mob/inhands/towel_lefthand.dmi' + righthand_file = 'modular_doppler/modular_cosmetics/icons/mob/inhands/towel_righthand.dmi' + inhand_icon_state = "towel" + force = 0 + throwforce = 0 + throw_speed = 1 + throw_range = 2 // They're not very aerodynamic. + w_class = WEIGHT_CLASS_SMALL // Don't ask me why other cloth-related items are considered tiny, and not small like this one. + item_flags = NOBLUDGEON + resistance_flags = FLAMMABLE + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_DIGITIGRADE) + bodyshape_icon_files = list(BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/towel.dmi', + BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/towel_digi.dmi') + /// The shape we're currently in. + var/shape = TOWEL_FOLDED + /// How many units of liquid can this towel store? + var/max_reagent_volume = 25 + /// Are we currently wet? + var/wet = FALSE + + +/obj/item/towel/Initialize(mapload) + . = ..() + + create_reagents(max_reagent_volume) + register_context() + register_item_context() + + +/obj/item/towel/examine(mob/user) + . = ..() + + if(wet) + . += span_notice("\nIt appears to be wet.") + + + if(!ishuman(user) && !iscyborg(user)) + return + + . += "" // Just for an empty line + + var/in_hands = TRUE + if(ishuman(user)) + in_hands = user.get_active_held_item() == src || user.get_inactive_held_item() == src + + if(in_hands) + . += span_notice("Use in hand to shape [src] into something different.") + + if(in_hands && shape != TOWEL_FOLDED) + . += span_notice("Ctrl-click to [wet && ishuman(user) ? "wring parts of the liquids out of [src]" : "fold [src] neatly"].") + + if(iscyborg(user)) + return + + if(shape == TOWEL_FULL || shape == TOWEL_WAIST) + . += span_notice("Alt-click to adjust the fit of [src].") + + if(wet) + . += span_notice("Right-click [src] on a bucket to wring the liquids out of it and transfer a portion of them to the bucket.") + . += span_notice("Wash in a washing machine in order to clean [src].") + + +/obj/item/towel/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(istype(held_item) && (held_item.tool_behaviour == TOOL_WIRECUTTER || held_item.get_sharpness()) && !(flags_1 & HOLOGRAM_1)) + context[SCREENTIP_CONTEXT_LMB] = "Shred into cloth" + + if(ishuman(user)) + if((shape == TOWEL_FULL || shape == TOWEL_WAIST)) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Adjust Fit" + + var/mob/living/carbon/human/towel_user = user + var/worn = towel_user.wear_suit == src || towel_user.head == src + + if(!worn) + context[SCREENTIP_CONTEXT_LMB] = "Change Shape" + context[SCREENTIP_CONTEXT_CTRL_LMB] = wet ? "Wring" : "Fold" + + if(iscyborg(user)) + context[SCREENTIP_CONTEXT_CTRL_LMB] = wet ? "Wring" : "Fold" + + return CONTEXTUAL_SCREENTIP_SET + + +/obj/item/towel/add_item_context(datum/source, list/context, mob/living/target) + if(isliving(target) && target.fire_stacks < 0) // If the target indeed is a living mob, and has wet stacks (which are just negative fire stacks) + context[SCREENTIP_CONTEXT_LMB] = "Dry up" + return CONTEXTUAL_SCREENTIP_SET + + return NONE + + +/obj/item/towel/attack(mob/living/target_mob, mob/living/user, params) + . = ..() + if(!user.Adjacent(target_mob)) + return + + var/free_space = reagents.maximum_volume - reagents.total_volume + if(free_space <= 0) + to_chat(user, span_warning("Your [src] can't absorb any more liquid!")) + return + + var/cleaning_themselves = target_mob == user + + target_mob.visible_message(span_notice("[user] starts drying [cleaning_themselves ? "themselves" : target_mob] up with [src]."), span_notice("[cleaning_themselves ? "You start drying yourself" : "[user] starts drying you"] up with \the [src]."), ignored_mobs = cleaning_themselves ? null : user) + + if(!cleaning_themselves) + to_chat(user, span_notice("You start drying [target_mob] up with [src].")) + + if(!do_after(user, 2 SECONDS, src)) + to_chat(user, span_notice("You stop drying [target_mob].")) + return + + + target_mob.visible_message(span_notice("[user] finishes drying [cleaning_themselves ? "themselves" : target_mob] up with [src]."), span_notice("[cleaning_themselves ? "You finish drying yourself" : "[user] finishes drying you "] up with \the [src]."), ignored_mobs = cleaning_themselves ? null : user) + + if(!cleaning_themselves) + to_chat(user, span_notice("You finish drying [target_mob] up with [src].")) + + var/water_to_remove = min(max(-target_mob.fire_stacks, 0), free_space) + + if(!water_to_remove) + return + + reagents.add_reagent(/datum/reagent/water, water_to_remove) + target_mob.set_wet_stacks(0, remove_fire_stacks = FALSE) + + set_wet(TRUE, update_visuals = shape != TOWEL_FOLDED) + + if(shape == TOWEL_FOLDED) + change_towel_shape(user, TOWEL_USED, TRUE) + + +/obj/item/towel/attack_self(mob/user, modifiers) + . = ..() + + /// Initializing this only once to avoid having to do it every time + var/static/list/datum/radial_menu_choice/worn_options = list() + + if(!length(worn_options)) + for(var/variant in list(TOWEL_FULL, TOWEL_WAIST, TOWEL_HEAD)) + var/datum/radial_menu_choice/option = new + var/image/variant_image = image(icon = TOWEL_OBJ_ICON, icon_state = "[base_icon_state]-[variant]") + + option.image = variant_image + worn_options[capitalize(variant)] = option + + var/choice = show_radial_menu(user, src, worn_options, require_near = TRUE, tooltips = TRUE) + + if(!choice) + return + + change_towel_shape(user, LOWER_TEXT(choice)) + + +/obj/item/towel/attackby(obj/item/attacking_item, mob/user, params) + . = ..() + + if(!(attacking_item.tool_behaviour == TOOL_WIRECUTTER || attacking_item.get_sharpness())) + return + + if(flags_1 & HOLOGRAM_1) // Just in case there's ever holographic towels. + return + + var/obj/item/stack/sheet/cloth/shreds = new (get_turf(src), TOWEL_CLOTH_AMOUNT) + + if(!QDELETED(shreds)) //stacks merged + transfer_fingerprints_to(shreds) + shreds.add_fingerprint(user) + + to_chat(user, span_notice("You tear [src] up into cloth.")) + qdel(src) + + +/obj/item/towel/pre_attack_secondary(atom/target, mob/living/user, params) + . = ..() + + if(!istype(target, /obj/item/reagent_containers/cup/bucket)) + return + + if(!reagents.total_volume) + to_chat(user, span_warning("\The [src] is dry, you can't squeeze anything out!")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + var/obj/item/reagent_containers/cup/bucket/target_bucket = target + + if(target_bucket.reagents.total_volume >= target_bucket.reagents.maximum_volume) + to_chat(user, span_warning("[target] is full!")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + transfer_towel_reagents_to(target_bucket.reagents, reagents.total_volume, user, loss_factor = SQUEEZING_DISPERSAL_RATIO, make_used = TRUE) // If it didn't have enough space, oh well, you lost like 3/4th of what was in the towel anyway, there's just even more loss that way. Doesn't really matter. + + to_chat(user, span_notice("You wring the liquid out of [src], transferring some of it to [target].")) + + playsound(target, 'sound/effects/slosh.ogg', 25, TRUE) + + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + +/obj/item/towel/click_alt(mob/user) + if(!(shape == TOWEL_FULL || shape == TOWEL_WAIST)) + return CLICK_ACTION_BLOCKING + + if(!ishuman(user)) + return CLICK_ACTION_BLOCKING + + var/mob/living/carbon/human/towel_user = user + var/worn = towel_user.wear_suit == src + + change_towel_shape(user, shape == TOWEL_FULL ? TOWEL_WAIST : TOWEL_FULL, silent = worn) + + // No need to display the different message if they're not wearing it. + if(!worn) + return CLICK_ACTION_SUCCESS + + to_chat(user, span_notice(shape == TOWEL_FULL ? "You raise \the [src] over your [shape]." : "You lower \the [src] down to your [shape].")) + return CLICK_ACTION_SUCCESS + + +/obj/item/towel/item_ctrl_click(mob/user) + if(!wet && shape == TOWEL_FOLDED) // You can't fold a wet towel, so you can't get a folded towel that's also wet. And you can't fold what's already folded, obviously. + to_chat(user, span_warning("You can't fold a towel that's already folded!")) + return + + if(ishuman(user) || iscyborg(user)) + if(iscyborg(user) && wet) // Cyborgs can't wring towels. + to_chat(user, span_warning("Folding a wet towel doesn't really make sense. You stop yourself before doing that.")) + return CLICK_ACTION_BLOCKING + + var/in_hands = TRUE + + if(ishuman(user)) + in_hands = user.get_active_held_item() == src || user.get_inactive_held_item() == src + + + if(!in_hands) // They need to be in your hands, unless you're a cyborg. + return CLICK_ACTION_BLOCKING + + if(!wet) + change_towel_shape(user, TOWEL_FOLDED, silent = TRUE) + to_chat(user, span_notice("You fold [src] up neatly.")) + return CLICK_ACTION_SUCCESS + + // No cyborgs past this point. + + to_chat(user, span_warning("You start wringing [src], it's going to make a mess!")) + + if(!do_after(user, 2 SECONDS, src)) + to_chat(user, span_warning("You give wringing [src] a second thought, and stop doing it, maybe for the best...")) + return CLICK_ACTION_BLOCKING + + var/turf/current_turf = get_turf(src) // It's done by a user so it should always have a turf. + + var/datum/reagents/temp_holder = new(max_reagent_volume) + var/transfer_amount = min(reagents.total_volume, TOWEL_WRING_AMOUNT) + + transfer_towel_reagents_to(temp_holder, transfer_amount, user, loss_factor = TOWEL_WRING_LOSS_FACTOR, make_used = TRUE) + + wring(user, current_turf, temp_holder) //because we don't have a liquids subsystem, this proc just imitates the try_splash from reagent_containers but only for turf + + qdel(temp_holder) + + user.visible_message(span_warning("[user] wrings [src], making a mess on \the [current_turf]!"), span_warning("You wring [src], making a mess on \the [current_turf]!")) + return CLICK_ACTION_SUCCESS + +/obj/item/towel/proc/wring(mob/user, atom/target, datum/reagents/reagent_holder) + var/reagent_text + user.visible_message( + span_danger("[user] splashes the contents of [src] onto [target]."), + span_danger("You splash the contents of [src] onto [target]."), + ignored_mobs = target, + ) + SEND_SIGNAL(target, COMSIG_ATOM_SPLASHED) + + playsound(target, 'sound/effects/slosh.ogg', 25, TRUE) + + var/mutable_appearance/splash_animation = mutable_appearance('icons/effects/effects.dmi', "splash") + splash_animation.icon_state = "splash_floor" + splash_animation.color = mix_color_from_reagents(reagent_holder.reagent_list) + target.flick_overlay_view(splash_animation, 1 SECONDS) + + for(var/datum/reagent/reagent as anything in reagent_holder.reagent_list) + reagent_text += "[reagent] ([num2text(reagent.volume)])," + + var/mob/thrown_by = thrownby?.resolve() + if(isturf(target) && reagent_holder.reagent_list.len && thrown_by) + log_combat(thrown_by, target, "splashed (thrown) [english_list(reagent_holder.reagent_list)]") + message_admins("[ADMIN_LOOKUPFLW(thrown_by)] splashed (thrown) [english_list(reagent_holder.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].") + + reagent_holder.expose(target, TOUCH) + log_combat(user, target, "splashed", reagent_text) + reagent_holder.clear_reagents() + + return TRUE + +/obj/item/towel/machine_wash(obj/machinery/washing_machine/washer) + . = ..() // This isn't really needed, but I'm including it in case we ever get dyeable towels. + + // Washing allows you to remove all reagents from a towel, so it comes out clean! + reagents.remove_all(reagents.total_volume) + + set_wet(FALSE, FALSE) + make_used(null, silent = TRUE) + + var/fresh_mood = AddComponent(/datum/component/onwear_mood, saved_event_type = /datum/mood_event/fresh_laundry, examine_string = "[src] looks crisp and pristine.") + + QDEL_IN(fresh_mood, 2 MINUTES) + + +/obj/item/towel/dropped(mob/user, silent) + . = ..() + + if(!ishuman(loc) && shape != TOWEL_FOLDED) + make_used(user, silent = TRUE) + + +/** + * Helper proc to handle setting the towel's `wet` variable, changing the icon_state + * accordingly and making the towel look a little damp if wet, and removing that + * color if not wet. + * + * Arguments: + * * new_wetness - Whether we're now wet or not. + * * update_visuals (optional) - Whether we call `update_appearance()` and + * `update_slot_icon()`. Set to `FALSE` if you're already calling a proc that + * updates the towel's appearance, like `change_towel_shape()` (if you're sure + * that it WILL change the appearance). Defaults to `TRUE`. + */ +/obj/item/towel/proc/set_wet(new_wetness, update_visuals = TRUE) + if(new_wetness == wet) + return + + wet = new_wetness + + color = wet ? "#CCCCCC" : null + + if(wet) // This is to allow it to show what it contains, without saying that it contains nothing when it's dry. + reagents.flags |= TRANSPARENT + else + reagents.flags &= ~TRANSPARENT + + if(update_visuals) + update_appearance() + update_slot_icon() + + +/** + * Helper to change the shape of the towel, so that it updates its look both + * in-hand and on the body of the wearer. + * + * Arguments: + * * user - Mob that's trying to change the shape of the towel. + * * new_shape - The new shape that the towel can be in. + * * silent (optional) - Whether we produce a to_chat to the user to elaborate on + * the new shape it is now in. Requires `user` to be non-null if `TRUE` in order to + * do anything. Defaults to `FALSE`. + */ +/obj/item/towel/proc/change_towel_shape(mob/user, new_shape, silent = FALSE) + if(new_shape == shape) + return + + shape = new_shape + + icon_state = "[base_icon_state][shape ? "-[shape]" : ""]" + + if(shape == TOWEL_HEAD) + flags_inv |= HIDEHAIR + else + flags_inv &= ~HIDEHAIR + + update_appearance() + update_slot_related_flags() + + if(!silent && user) + to_chat(user, span_notice(shape ? "You adjust [src] so that it can be worn over your [shape]." : "You fold [src] neatly.")) + + +/** + * Helper proc to change the slot flags of the towel based on its shape. + */ +/obj/item/towel/proc/update_slot_related_flags() + switch(shape) + if(TOWEL_FULL) + slot_flags = ITEM_SLOT_OCLOTHING + body_parts_covered = CHEST | GROIN | LEGS + + if(TOWEL_WAIST) + slot_flags = ITEM_SLOT_OCLOTHING + body_parts_covered = GROIN | LEGS + + if(TOWEL_HEAD) + slot_flags = ITEM_SLOT_HEAD + body_parts_covered = HEAD + + else + slot_flags = NONE + body_parts_covered = NONE + + update_slot_icon() + + +/** + * Simple helper to make the towel into a used towel shape. + * + * Arguments: + * * user - Mob that's making the towel used. Can be null if `silent` is `FALSE`. + * * silent (optional) - Whether we produce a to_chat to the user to elaborate on + * the new shape it is now in. Requires `user` to be non-null if `TRUE` in order to + * do anything. Defaults to `FALSE`. + */ +/obj/item/towel/proc/make_used(mob/user, silent = FALSE) + change_towel_shape(user, TOWEL_USED, silent) + + +/** + * Helper to transfer reagents from the towel to something else, handling all + * the work related to ensuring that the towel gets updated visually if it now + * becomes dry, while also optionally applying a loss factor to the transfer. + * + * Arguments: + * * target - Reagents target of the reagents transfer. + * * amount - Amount of reagents that are going to be affected by the transfer. + * Won't go above the maximum amount of volume of the target, and it will handle + * making sure that it uses the right amount of reagents if the towel doesn't + * have enough reagents in it for it. + * * user - Mob that does the transfer, if any. + * * loss_factor (optional) - Factor of reagents that get lost during transfer. + * Defaults to 0. + * * make_used (optional) - Whether or not we change the towel to the used sprite. + * Defaults to `FALSE`. + */ +/obj/item/towel/proc/transfer_towel_reagents_to(datum/reagents/target, amount, mob/user, loss_factor = 0, make_used = FALSE) + if(!reagents.total_volume || !target || !amount) + return + + amount = min(amount, reagents.total_volume, (target.maximum_volume - target.total_volume) / (1 - loss_factor)) + + if(!amount) + return + + reagents.trans_to(target, amount * (1 - loss_factor), no_react = TRUE, transferred_by = user) + + if(loss_factor && reagents.total_volume) + reagents.remove_all(amount * loss_factor) + + if(!reagents.total_volume) + set_wet(FALSE, !make_used) + + if(make_used) + make_used(user, silent = TRUE) + + +/** + * Helper to transfer reagents to the towel. + * + * Arguments: + * * source - Reagents source of the reagents transfer. + * * amount - Amount of reagents that are going to be affected by the transfer. + * Won't go above the maximum amount of volume of the towel, and it will handle + * making sure that it uses the right amount of reagents if the source doesn't + * have enough reagents for it. + * * user - Mob that does the transfer, if any. + * * make_used (optional) - Whether or not we change the towel to the used sprite. + * Defaults to `TRUE`. + */ +/obj/item/towel/proc/transfer_reagents_to_towel(datum/reagents/source, amount, mob/user, make_used = TRUE) + if(!source || !amount || !source.total_volume) + return + + amount = min(amount, source.total_volume, reagents.maximum_volume - reagents.total_volume) + + if(!amount) + return + + source.trans_to(reagents, amount, no_react = TRUE, transferred_by = user) + + if(!wet) + set_wet(TRUE, !make_used || shape == TOWEL_USED) + + if(make_used) + make_used(user, silent = TRUE) + + +#undef TOWEL_FOLDED +#undef TOWEL_FULL +#undef TOWEL_WAIST +#undef TOWEL_HEAD +#undef TOWEL_USED +#undef TOWEL_OBJ_ICON +#undef TOWEL_CLOTH_AMOUNT +#undef TOWEL_WRING_LOSS_FACTOR +#undef TOWEL_WRING_AMOUNT +#undef SQUEEZING_DISPERSAL_RATIO diff --git a/modular_doppler/modular_cosmetics/icons/mob/inhands/towel_lefthand.dmi b/modular_doppler/modular_cosmetics/icons/mob/inhands/towel_lefthand.dmi new file mode 100644 index 0000000000000..99fc6a24100c5 Binary files /dev/null and b/modular_doppler/modular_cosmetics/icons/mob/inhands/towel_lefthand.dmi differ diff --git a/modular_doppler/modular_cosmetics/icons/mob/inhands/towel_righthand.dmi b/modular_doppler/modular_cosmetics/icons/mob/inhands/towel_righthand.dmi new file mode 100644 index 0000000000000..fbcde13d6f816 Binary files /dev/null and b/modular_doppler/modular_cosmetics/icons/mob/inhands/towel_righthand.dmi differ diff --git a/modular_doppler/modular_cosmetics/icons/mob/suit/towel.dmi b/modular_doppler/modular_cosmetics/icons/mob/suit/towel.dmi new file mode 100644 index 0000000000000..6cb94724b4991 Binary files /dev/null and b/modular_doppler/modular_cosmetics/icons/mob/suit/towel.dmi differ diff --git a/modular_doppler/modular_cosmetics/icons/mob/suit/towel_digi.dmi b/modular_doppler/modular_cosmetics/icons/mob/suit/towel_digi.dmi new file mode 100644 index 0000000000000..c9919b14af9d0 Binary files /dev/null and b/modular_doppler/modular_cosmetics/icons/mob/suit/towel_digi.dmi differ diff --git a/modular_doppler/modular_cosmetics/icons/obj/suit/towel.dmi b/modular_doppler/modular_cosmetics/icons/obj/suit/towel.dmi new file mode 100644 index 0000000000000..93001ef29bc3f Binary files /dev/null and b/modular_doppler/modular_cosmetics/icons/obj/suit/towel.dmi differ diff --git a/modular_doppler/modular_customization/tri_color/antennae.dm b/modular_doppler/modular_customization/tri_color/antennae.dm new file mode 100644 index 0000000000000..c2f8779aeea9f --- /dev/null +++ b/modular_doppler/modular_customization/tri_color/antennae.dm @@ -0,0 +1,31 @@ +/// Moth antennae colors! +/datum/preference/tri_color/antennae_color + priority = PREFERENCE_PRIORITY_BODY_TYPE + savefile_key = "antennae_color" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES + //relevant_external_organ = /obj/item/organ/external/wings + +/datum/preference/tri_color/antennae_color/create_default_value() + return list(sanitize_hexcolor("[pick("7F", "FF")][pick("7F", "FF")][pick("7F", "FF")]"), + sanitize_hexcolor("[pick("7F", "FF")][pick("7F", "FF")][pick("7F", "FF")]"), + sanitize_hexcolor("[pick("7F", "FF")][pick("7F", "FF")][pick("7F", "FF")]")) + +/datum/preference/tri_color/antennae_color/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["antennae_color_1"] = value[1] + target.dna.features["antennae_color_2"] = value[2] + target.dna.features["antennae_color_3"] = value[3] + +/datum/preference/tri_color/antennae_color/is_valid(value) + if (!..(value)) + return FALSE + + return TRUE + +// Gotta add to the selector too +/datum/preference/choiced/moth_antennae/compile_constant_data() + var/list/data = ..() + + data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/tri_color/antennae_color::savefile_key + + return data diff --git a/modular_doppler/modular_hydroponics/code/honeysuckle.dm b/modular_doppler/modular_hydroponics/code/honeysuckle.dm new file mode 100644 index 0000000000000..3fb80e1c96a54 --- /dev/null +++ b/modular_doppler/modular_hydroponics/code/honeysuckle.dm @@ -0,0 +1,27 @@ +// Honeysuckle +/obj/item/seeds/honeysuckle + name = "honeysuckle seed pack" + desc = "These seeds grow into honeysuckle flowers." + icon = 'modular_doppler/modular_hydroponics/icons/seeds.dmi' + icon_state = "seed-honeysuckle" + species = "honeysuckle" + plantname = "Honeysuckle Bush" + product = /obj/item/food/grown/honeysuckle + lifespan = 50 + endurance = 10 + growthstages = 3 + growing_icon = 'modular_doppler/modular_hydroponics/icons/growing.dmi' + icon_grow = "honeysuckle-grow" + icon_dead = "honeysuckle-dead" + genes = list(/datum/plant_gene/trait/preserved, /datum/plant_gene/trait/repeated_harvest) + reagents_add = list(/datum/reagent/consumable/honey = 0.2, /datum/reagent/consumable/nutriment = 0.05) + +/obj/item/food/grown/honeysuckle + seed = /obj/item/seeds/honeysuckle + name = "honeysuckle" + desc = "The conical end of this flower contains a sweet, honey-like nectar." + icon = 'modular_doppler/modular_hydroponics/icons/harvest.dmi' + icon_state = "honeysuckle" + bite_consumption_mod = 2 + foodtypes = VEGETABLES | SUGAR + distill_reagent = /datum/reagent/consumable/ethanol/mead diff --git a/modular_doppler/modular_hydroponics/code/tea_coffee.dm b/modular_doppler/modular_hydroponics/code/tea_coffee.dm new file mode 100644 index 0000000000000..1e137a4abe4df --- /dev/null +++ b/modular_doppler/modular_hydroponics/code/tea_coffee.dm @@ -0,0 +1,27 @@ +// Modular plants + +// Catnip +/obj/item/seeds/tea/catnip + name = "catnip seed pack" + icon = 'modular_doppler/modular_hydroponics/icons/seeds.dmi' + icon_state = "seed-catnip" + growing_icon = 'modular_doppler/modular_hydroponics/icons/growing.dmi' + desc = "Long stalks with flowering tips, they contain a chemical that attracts felines." + species = "catnip" + plantname = "Catnip Plant" + icon_dead = null + growthstages = 3 + product = /obj/item/food/grown/tea/catnip + reagents_add = list(/datum/reagent/pax/catnip = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.06, /datum/reagent/toxin/teapowder = 0.1) + rarity = 50 + +/obj/item/food/grown/tea/catnip + seed = /obj/item/seeds/tea/catnip + name = "catnip buds" + icon = 'modular_doppler/modular_hydroponics/icons/harvest.dmi' + icon_state = "catnip" + filling_color = "#4582B4" + grind_results = list(/datum/reagent/pax/catnip = 2, /datum/reagent/water = 1) + distill_reagent = /datum/reagent/consumable/pinkmilk //Don't ask, cats speak in poptart + can_distill = TRUE //override for tea's FALSE + diff --git a/modular_doppler/modular_hydroponics/icons/growing.dmi b/modular_doppler/modular_hydroponics/icons/growing.dmi new file mode 100644 index 0000000000000..b7eeaa8cbcdde Binary files /dev/null and b/modular_doppler/modular_hydroponics/icons/growing.dmi differ diff --git a/modular_doppler/modular_hydroponics/icons/harvest.dmi b/modular_doppler/modular_hydroponics/icons/harvest.dmi new file mode 100644 index 0000000000000..15766392e858c Binary files /dev/null and b/modular_doppler/modular_hydroponics/icons/harvest.dmi differ diff --git a/modular_doppler/modular_hydroponics/icons/seeds.dmi b/modular_doppler/modular_hydroponics/icons/seeds.dmi new file mode 100644 index 0000000000000..df8c6d529cd58 Binary files /dev/null and b/modular_doppler/modular_hydroponics/icons/seeds.dmi differ diff --git a/modular_doppler/modular_hydroponics/readme.md b/modular_doppler/modular_hydroponics/readme.md new file mode 100644 index 0000000000000..7f3cff653c556 --- /dev/null +++ b/modular_doppler/modular_hydroponics/readme.md @@ -0,0 +1,23 @@ +## Title: Modular Hydrophonics + +MODULE ID: MODULAR_HYDROPONICS + +### Description: + +Module for Doppler's hydroponics custom content, like plants and related. + +### TG Proc Changes: + +### Defines: + +N/A + +### Master file additions + +N/A + +### Included files that are not contained in this module: + +N/A + +### Credits: diff --git a/modular_doppler/modular_mapping/areas/ruins.dm b/modular_doppler/modular_mapping/areas/ruins.dm new file mode 100644 index 0000000000000..1369264c447f5 --- /dev/null +++ b/modular_doppler/modular_mapping/areas/ruins.dm @@ -0,0 +1,16 @@ +// Doppler Sector area ruins + +/area/ruin/unpowered/magic_hotsprings + name = "Magical Hotsprings" + icon_state = "ruins" + ambientsounds = list('sound/ambience/ambiicemelody2.ogg') + +/area/ruin/unpowered/abandoned_hearth + name = "Abandoned Hearth" + icon_state = "ruins" + ambientsounds = list('sound/ambience/ambiicesting4.ogg', 'sound/ambience/ambiicemelody1.ogg') + +/area/ruin/unpowered/abandoned_sacred_temple + name = "Abandoned Sacred Temple" + icon_state = "ruins" + ambientsounds = list('sound/ambience/ambiholy.ogg') diff --git a/modular_doppler/modular_mapping/readme.md b/modular_doppler/modular_mapping/readme.md new file mode 100644 index 0000000000000..38f7f00ddfcc9 --- /dev/null +++ b/modular_doppler/modular_mapping/readme.md @@ -0,0 +1,23 @@ +## Title: Modular Mapping + +MODULE ID: MODULAR_MAPPING + +### Description: + +Module for Doppler's custom ruins and everything related, like unique ruin items and structures, etc. + +### TG Proc Changes: + +### Defines: + +N/A + +### Master file additions + +N/A + +### Included files that are not contained in this module: + +N/A + +### Credits: diff --git a/modular_doppler/modular_mapping/ruins/icemoon.dm b/modular_doppler/modular_mapping/ruins/icemoon.dm new file mode 100644 index 0000000000000..0d3c5840d5db4 --- /dev/null +++ b/modular_doppler/modular_mapping/ruins/icemoon.dm @@ -0,0 +1,51 @@ +/*----- Template for ruins, prevents needing to re-type the filepath prefix -----*/ +/datum/map_template/ruin/icemoon/underground/doppler/ + prefix = "_maps/RandomRuins/IceRuins/doppler/" + +/datum/map_template/ruin/icemoon/doppler/ + prefix = "_maps/RandomRuins/IceRuins/doppler/" + +/*----- Underground -----*/ + +/datum/map_template/ruin/icemoon/underground/doppler/magic_hotsprings + name = "Magic Hotsprings" + id = "magic-hotsprings" + description = "A beautiful hot springs spot, surrounded by unnatural fairy grass and exotic trees." + prefix = "_maps/RandomRuins/IceRuins/doppler/" + suffix = "icemoon_underground_magical_hotsprings.dmm" + allow_duplicates = FALSE + +/datum/map_template/ruin/icemoon/underground/doppler/abandoned_hearth + name = "Abandoned Hearth" + id = "abandoned-hearth" + description = "Something went terribly wrong in this hearth, if the signs of struggle are anything to go by." + prefix = "_maps/RandomRuins/IceRuins/doppler/" + suffix = "icemoon_underground_abandoned_icewalker_den.dmm" + allow_duplicates = FALSE + +/datum/map_template/ruin/icemoon/underground/doppler/abandoned_sacred_temple + name = "Sacred Temple" + id = "abandoned-sacred-temple" + description = "The dusty remains of a temple, sacred in nature." + prefix = "_maps/RandomRuins/IceRuins/doppler/" + suffix = "icemoon_underground_abandoned_sacred_temple.dmm" + allow_duplicates = FALSE + +//Code for the Abandoned Sacred Temple +/obj/structure/statue/hearthkin/odin + name = "statue of Óðinn" + desc = "A gold statue, representing the All-Father Óðinn. It is strangely in good state." + icon = 'modular_doppler/hearthkin/primitive_catgirls/icons/gods_statue.dmi' + icon_state = "odin_statue" + +/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/sacred_temple/ + name = "moon 34, of the year 2283" + desc = "A note written in Ættmál. It seems to have been ripped from a diary of some sort." + default_raw_text = "I refuse to believe we're reduced to this- to sacrifice our own in hopes of our gods taking pity and rescuing us. We've lost too many already... I regret not joining with the rest. But I won't sit here and wait for my turn to be sacrificed, moping about like some sort of useless bastard. Me, my husband, and my sibling Halko will soon make our move, once the grand priest goes to sleep." + +/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/sacred_temple/ui_status(mob/user, datum/ui_state/state) + if(!user.has_language(/datum/language/primitive_catgirl)) + to_chat(user, span_warning("This seems to be in a language you do not understand!")) + return UI_CLOSE + + . = ..() diff --git a/modular_doppler/modular_quirks/excitable/quirk.dm b/modular_doppler/modular_quirks/excitable/quirk.dm new file mode 100644 index 0000000000000..0f9b9202b8fdf --- /dev/null +++ b/modular_doppler/modular_quirks/excitable/quirk.dm @@ -0,0 +1,9 @@ +/datum/quirk/excitable + name = "Excitable!" + desc = "Head patting makes your tail wag! You're very excitable! WAG WAG." + gain_text = span_notice("You crave for some headpats!") + lose_text = span_notice("You no longer care for headpats all that much...") + medical_record_text = "Patient seems to enjoy getting headpats." + value = 0 + mob_trait = TRAIT_EXCITABLE + icon = FA_ICON_LAUGH_BEAM diff --git a/modular_doppler/objects_and_structures/code/icemoon_tiles.dm b/modular_doppler/objects_and_structures/code/icemoon_tiles.dm new file mode 100644 index 0000000000000..ad7fc53360723 --- /dev/null +++ b/modular_doppler/objects_and_structures/code/icemoon_tiles.dm @@ -0,0 +1,16 @@ +/turf/open/floor/stone/icemoon + initial_gas_mix = "ICEMOON_ATMOS" + +/turf/open/floor/wood/icemoon + initial_gas_mix = "ICEMOON_ATMOS" + +/turf/open/misc/sandy_dirt/icemoon + initial_gas_mix = "ICEMOON_ATMOS" + +/turf/open/floor/grass/fairy/icemoon + initial_gas_mix = "ICEMOON_ATMOS" + baseturfs = /turf/open/misc/asteroid/snow/icemoon + +/turf/open/floor/mineral/gold/icemoon + initial_gas_mix = "ICEMOON_ATMOS" + baseturfs = /turf/open/misc/asteroid/snow/icemoon diff --git a/modular_doppler/objects_and_structures/code/sauna_oven.dm b/modular_doppler/objects_and_structures/code/sauna_oven.dm new file mode 100644 index 0000000000000..3e8fb0a2eea13 --- /dev/null +++ b/modular_doppler/objects_and_structures/code/sauna_oven.dm @@ -0,0 +1,128 @@ +#define SAUNA_H2O_TEMP (T20C + 20) +#define SAUNA_LOG_FUEL 150 +#define SAUNA_PAPER_FUEL 5 +#define SAUNA_MAXIMUM_FUEL 3000 +#define SAUNA_WATER_PER_WATER_UNIT 5 + +/obj/structure/sauna_oven + name = "sauna oven" + desc = "A modest sauna oven with rocks. Add some fuel, pour some water and enjoy the moment." + icon = 'modular_doppler/objects_and_structures/icons/sauna_oven.dmi' + icon_state = "sauna_oven" + density = TRUE + anchored = TRUE + resistance_flags = FIRE_PROOF + var/lit = FALSE + var/fuel_amount = 0 + var/water_amount = 0 + +/obj/structure/sauna_oven/examine(mob/user) + . = ..() + . += span_notice("The rocks are [water_amount ? "moist" : "dry"].") + . += span_notice("There's [fuel_amount ? "some fuel" : "no fuel"] in the oven.") + +/obj/structure/sauna_oven/Destroy() + if(lit) + STOP_PROCESSING(SSobj, src) + QDEL_NULL(particles) + return ..() + +/obj/structure/sauna_oven/attack_hand(mob/user) + . = ..() + if(.) + return + if(lit) + lit = FALSE + STOP_PROCESSING(SSobj, src) + user.visible_message(span_notice("[user] turns off [src]."), span_notice("You turn off [src].")) + else if (fuel_amount) + lit = TRUE + START_PROCESSING(SSobj, src) + user.visible_message(span_notice("[user] turns on [src]."), span_notice("You turn on [src].")) + update_icon() + +/obj/structure/sauna_oven/update_overlays() + . = ..() + if(lit) + . += "sauna_oven_on_overlay" + +/obj/structure/sauna_oven/update_icon() + ..() + icon_state = "[lit ? "sauna_oven_on" : initial(icon_state)]" + +/obj/structure/sauna_oven/attackby(obj/item/used_item, mob/user) + if(used_item.tool_behaviour == TOOL_WRENCH) + balloon_alert(user, "deconstructing...") + if(used_item.use_tool(src, user, 60, volume = 50)) + balloon_alert(user, "deconstructed") + new /obj/item/stack/sheet/mineral/wood(get_turf(src), 30) + qdel(src) + + else if(istype(used_item, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/reagent_container = used_item + if(!reagent_container.is_open_container()) + return ..() + if(reagent_container.reagents.has_reagent(/datum/reagent/water)) + reagent_container.reagents.remove_reagent(/datum/reagent/water, 5) + user.visible_message(span_notice("[user] pours some \ + water into [src]."), span_notice("You pour \ + some water to [src].")) + water_amount += 5 * SAUNA_WATER_PER_WATER_UNIT + else + balloon_alert(user, "no water!") + + else if(istype(used_item, /obj/item/stack/sheet/mineral/wood)) + var/obj/item/stack/sheet/mineral/wood/wood = used_item + if(fuel_amount > SAUNA_MAXIMUM_FUEL) + balloon_alert(user, "it's full!") + return + fuel_amount += SAUNA_LOG_FUEL * wood.amount + wood.use(wood.amount) + user.visible_message(span_notice("[user] tosses some \ + wood into [src]."), span_notice("You add \ + some fuel to [src].")) + else if(istype(used_item, /obj/item/paper_bin)) + var/obj/item/paper_bin/paper_bin = used_item + user.visible_message(span_notice("[user] throws [used_item] into \ + [src]."), span_notice("You add [used_item] to [src].\ + ")) + fuel_amount += SAUNA_PAPER_FUEL * paper_bin.total_paper + qdel(paper_bin) + else if(istype(used_item, /obj/item/paper)) + user.visible_message(span_notice("[user] throws [used_item] into \ + [src]."), span_notice("You throw [used_item] into [src].\ + ")) + fuel_amount += SAUNA_PAPER_FUEL + qdel(used_item) + return ..() + +/obj/structure/sauna_oven/process() + if(water_amount) + water_amount-- + update_steam_particles() + var/turf/open/pos = get_turf(src) + if(istype(pos) && pos.air.return_pressure() < 2*ONE_ATMOSPHERE) + pos.atmos_spawn_air("water_vapor=10;TEMP=[SAUNA_H2O_TEMP]") + fuel_amount-- + if(fuel_amount <= 0) + lit = FALSE + update_steam_particles() + STOP_PROCESSING(SSobj, src) + update_icon() + +/obj/structure/sauna_oven/proc/update_steam_particles() + if(particles) + if(lit && water_amount) + return + QDEL_NULL(particles) + return + + if(lit && water_amount) + particles = new /particles/smoke/steam/mild + particles.position = list(0, 6, 0) + +#undef SAUNA_H2O_TEMP +#undef SAUNA_LOG_FUEL +#undef SAUNA_PAPER_FUEL +#undef SAUNA_MAXIMUM_FUEL +#undef SAUNA_WATER_PER_WATER_UNIT diff --git a/modular_doppler/objects_and_structures/code/towel_bins.dm b/modular_doppler/objects_and_structures/code/towel_bins.dm new file mode 100644 index 0000000000000..e64b346ca6914 --- /dev/null +++ b/modular_doppler/objects_and_structures/code/towel_bins.dm @@ -0,0 +1,181 @@ +/obj/structure/towel_bin + name = "towel bin" + desc = "Seeing this really makes you think of how much worse your life would have been without towels. Seriously, who doesn't use towels?" + icon = 'icons/obj/structures.dmi' + icon_state = "linenbin-full" + base_icon_state = "linenbin" + anchored = TRUE + resistance_flags = FLAMMABLE + max_integrity = 70 + /// How many towels there is in the bin (separate from the towels list because we won't instanciate 10 towels per bin in existance). + var/amount = 10 + /// The list of already-instanciated towels, for when people put them back in it. + var/list/towels + /// An item that might be hidden between some towels in the bin. + var/obj/item/hidden = null + + +/obj/structure/towel_bin/empty + amount = 0 + icon_state = "linenbin-empty" + base_icon_state = "linenbin" + anchored = FALSE + + +/obj/structure/towel_bin/examine(mob/user) + . = ..() + if(amount <= 0) + . += "There are no towels in the [src]." + else + . += "There [amount == 1 ? "is one towel" : "are [amount] towels"] in the [src]." + + +/obj/structure/towel_bin/update_icon_state() + switch(amount) + if(0) + icon_state = "[base_icon_state]-empty" + if(1 to 5) + icon_state = "[base_icon_state]-half" + else + icon_state = "[base_icon_state]-full" + return ..() + + +/obj/structure/towel_bin/fire_act(exposed_temperature, exposed_volume) + if(amount) + amount = 0 + update_appearance() + + return ..() + + +/obj/structure/towel_bin/screwdriver_act(mob/living/user, obj/item/tool) + if(amount) + to_chat(user, span_warning("[src] must be empty first!")) + return ITEM_INTERACT_SUCCESS + + if(tool.use_tool(src, user, 0.5 SECONDS, volume = 50)) + to_chat(user, span_notice("You disassemble [src].")) + if(!(obj_flags & NO_DEBRIS_AFTER_DECONSTRUCTION)) + new /obj/item/stack/rods(loc, 2) + qdel(src) + return ITEM_INTERACT_SUCCESS + + +/obj/structure/towel_bin/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool, time = 0.5 SECONDS) + return ITEM_INTERACT_SUCCESS + + +/obj/structure/towel_bin/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/towel)) + if(!user.transferItemToLoc(attacking_item, src)) + return + LAZYADD(towels, attacking_item) + amount++ + to_chat(user, span_notice("You put [attacking_item] in [src].")) + update_appearance() + + else if(amount && !hidden && attacking_item.w_class < WEIGHT_CLASS_BULKY) //make sure there's sheets to hide it among, make sure nothing else is hidden in there. + if(!user.transferItemToLoc(attacking_item, src)) + to_chat(user, span_warning("[attacking_item] is stuck to your hand, you cannot hide it among the sheets!")) + return + hidden = attacking_item + to_chat(user, span_notice("You hide [attacking_item] among the sheets.")) + + +/obj/structure/towel_bin/attack_paw(mob/user, list/modifiers) + return attack_hand(user, modifiers) + + +/obj/structure/towel_bin/attack_hand(mob/user, list/modifiers) + . = ..() + if(.) + return + + if(isliving(user)) + var/mob/living/living_user = user + if(!(living_user.mobility_flags & MOBILITY_PICKUP)) + return + + take_towel_out(user) + + +/obj/structure/towel_bin/attack_tk(mob/user) + take_towel_out(user, tk = TRUE) + + return COMPONENT_CANCEL_ATTACK_CHAIN + + +/** + * Helper proc for taking a towel out of the bin, to reduce code repetitions. + * Intended to only be called by `attack_hand()` and `attack_tk()`. + * + * Arguments: + * * user - Mob that's trying to take a towel out. + * * tk - Is the user trying to do this using telekinesis? Defaults to `FALSE`. + */ +/obj/structure/towel_bin/proc/take_towel_out(mob/user, tk = FALSE) + if(amount <= 0) + to_chat(user, span_warning("You can't figure out how to take a towel out of [src] when it doesn't contain any!")) + return + + amount-- + + var/obj/item/towel/towel + + if(LAZYLEN(towels)) + towel = towels[LAZYLEN(towels)] + LAZYREMOVE(towels, towel) + + else + towel = new (loc) + + towel.forceMove(drop_location()) + to_chat(user, span_notice("You [tk ? "telekinetically remove" : "take"] \a [towel] out of [src].")) + update_appearance() + + if(hidden) + if(!tk) + to_chat(user, span_notice("\A [hidden] falls out of [towel]!")) + + hidden.forceMove(drop_location()) + hidden = null + + add_fingerprint(user) + + +/obj/structure/towel_bin/basket + name = "towel basket" + icon_state = "linenbasket-full" + base_icon_state = "linenbasket" + +/obj/structure/towel_bin/basket/empty/ + name = "towel basket" + amount = 0 + icon_state = "linenbasket-empty" + base_icon_state = "linenbasket" + anchored = FALSE + +/obj/structure/towel_bin/basket/screwdriver_act(mob/living/user, obj/item/tool) + if(amount) + to_chat(user, span_warning("[src] must be empty first!")) + return ITEM_INTERACT_SUCCESS + + if(tool.use_tool(src, user, 0.5 SECONDS, volume = 50)) + to_chat(user, span_notice("You disassemble [src].")) + if(!(obj_flags & NO_DEBRIS_AFTER_DECONSTRUCTION)) + new /obj/item/food/grown/grass/thatch(loc, 2) + qdel(src) + return ITEM_INTERACT_SUCCESS + +/datum/crafting_recipe/towel_basket + name = "towel basket" + result = /obj/structure/towel_bin/basket/empty/ + time = 0.5 SECONDS + reqs = list( + /obj/item/food/grown/grass/thatch = 2, + ) + crafting_flags = CRAFT_CHECK_DENSITY + category = CAT_CONTAINERS diff --git a/modular_doppler/objects_and_structures/code/watercloset.dm b/modular_doppler/objects_and_structures/code/watercloset.dm new file mode 100644 index 0000000000000..86db72949b6fe --- /dev/null +++ b/modular_doppler/objects_and_structures/code/watercloset.dm @@ -0,0 +1,35 @@ +/obj/structure/sink/attackby(obj/item/attacking_item, mob/living/user, params) + if(busy) + to_chat(user, span_warning("Someone's already washing here!")) + return + + if(istype(attacking_item, /obj/item/towel)) + if(reagents.total_volume <= 0) + to_chat(user, span_notice("\The [src] is dry.")) + return FALSE + + busy = TRUE + user.visible_message(span_notice("[user] starts washing [attacking_item] in [src]."), span_notice("You start washing [attacking_item] in [src].")) + + if(!do_after(user, 2 SECONDS, src)) + busy = FALSE + to_chat(user, span_warning("You take [attacking_item] away from [src] before you're done washing it.")) + return FALSE + + var/obj/item/towel/washed_towel = attacking_item + + washed_towel.reagents.remove_all(washed_towel.reagents.total_volume) + washed_towel.transfer_reagents_to_towel(reagents, washed_towel.reagents.maximum_volume, user) + + washed_towel.set_wet(TRUE) + washed_towel.make_used(user, silent = TRUE) + + begin_reclamation() + user.visible_message(span_notice("[user] finishes washing [attacking_item] in [src]."), span_notice("You finish washing [washed_towel] in [src], leaving it quite wet.")) + playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) + + busy = FALSE + + else + return ..() + diff --git a/modular_doppler/objects_and_structures/icons/sauna_oven.dmi b/modular_doppler/objects_and_structures/icons/sauna_oven.dmi new file mode 100644 index 0000000000000..fb0871ca91967 Binary files /dev/null and b/modular_doppler/objects_and_structures/icons/sauna_oven.dmi differ diff --git a/modular_doppler/objects_and_structures/readme.md b/modular_doppler/objects_and_structures/readme.md new file mode 100644 index 0000000000000..97a20749a4741 --- /dev/null +++ b/modular_doppler/objects_and_structures/readme.md @@ -0,0 +1,23 @@ +## Title: Objects and Structures + +MODULE ID: OBJECTS_AND_STRUCTURES + +### Description: + +Module for all objects and structures used for mapping that don't really have a place to go. + +### TG Proc Changes: + +### Defines: + +N/A + +### Master file additions + +N/A + +### Included files that are not contained in this module: + +N/A + +### Credits: diff --git a/modular_doppler/verbs/code/communication.dm b/modular_doppler/verbs/code/communication.dm new file mode 100644 index 0000000000000..458d603af862d --- /dev/null +++ b/modular_doppler/verbs/code/communication.dm @@ -0,0 +1,55 @@ +/datum/keybinding/client/communication/looc + hotkey_keys = list("CtrlO") + name = LOOC_CHANNEL + full_name = "Local OOC (LOOC)" + keybind_signal = COMSIG_KB_CLIENT_LOOC_DOWN + +/datum/keybinding/client/communication/looc/down(client/user) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(LOOC_CHANNEL)]") + return TRUE + +/datum/keybinding/client/communication/whisper + hotkey_keys = list("CtrlT") + name = WHIS_CHANNEL + full_name = "IC Whisper" + keybind_signal = COMSIG_KB_CLIENT_WHISPER_DOWN + +/datum/keybinding/client/communication/whisper/down(client/user) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(WHIS_CHANNEL)]") + return TRUE + +/datum/keybinding/client/communication/Do + hotkey_keys = list("K") + name = DO_CHANNEL + full_name = "Do" + keybind_signal = COMSIG_KB_CLIENT_DO_DOWN + +/datum/keybinding/client/communication/Do/down(client/user) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(DO_CHANNEL)]") + return TRUE + +/datum/keybinding/client/communication/Do_longer + hotkey_keys = list("CtrlK") + name = "do_longer" + full_name = "Do (Longer)" + keybind_signal = COMSIG_KB_CLIENT_DO_LONGER_DOWN + +/datum/keybinding/client/communication/Do_longer/down(client/user) + . = ..() + if(.) + return + var/message_text = tgui_input_text(user, "Write out your Do action:", "Do (Longer)", null, MAX_MESSAGE_LEN, TRUE) + if (!message_text) + return + + user.mob.do_verb(message_text) + return TRUE diff --git a/modular_doppler/verbs/code/do_checks.dm b/modular_doppler/verbs/code/do_checks.dm new file mode 100644 index 0000000000000..cab5717df4c6e --- /dev/null +++ b/modular_doppler/verbs/code/do_checks.dm @@ -0,0 +1,20 @@ +/mob/living/proc/doverb_checks(message) + if(!length(message)) + return FALSE + + if(GLOB.say_disabled) //This is here to try to identify lag problems + to_chat(usr, span_danger("Speech is currently admin-disabled.")) + return FALSE + + //quickly calc our name stub again: duplicate this in say.dm override + var/name_stub = " ([usr])" + if(length(message) > (MAX_MESSAGE_LEN - length(name_stub))) + to_chat(usr, message) + to_chat(usr, span_warning("^^^----- The preceding message has been DISCARDED for being over the maximum length of [MAX_MESSAGE_LEN]. It has NOT been sent! -----^^^")) + return FALSE + + if(usr.stat != CONSCIOUS) + to_chat(usr, span_notice("You cannot send a Do in your current condition.")) + return FALSE + + return TRUE diff --git a/modular_doppler/verbs/code/do_verbs.dm b/modular_doppler/verbs/code/do_verbs.dm new file mode 100644 index 0000000000000..eae4adf25620d --- /dev/null +++ b/modular_doppler/verbs/code/do_verbs.dm @@ -0,0 +1,48 @@ +/mob/verb/do_verb(message as message) + set name = "Do" + set category = "IC" + set instant = TRUE + + if(GLOB.say_disabled) + to_chat(usr, span_danger("Speech is currently admin-disabled.")) + return + + if(message) + QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, TYPE_VERB_REF(/mob/living, do_actual_verb), message), SSspeech_controller) + +/mob/living/verb/do_actual_verb(message as message) + if (!message || !doverb_checks(message)) + return + + if (!try_speak(message)) // ensure we pass the vibe check (filters, etc) + return + + var/name_stub = " ([usr])" + message = usr.say_emphasis(message) + message = trim(copytext_char(message, 1, (MAX_MESSAGE_LEN - length(name_stub)))) + var/message_with_name = message + name_stub + + usr.log_message(message, LOG_EMOTE) + + var/list/viewers = get_hearers_in_view(DEFAULT_MESSAGE_RANGE, usr) + + if(istype(usr, /mob/living/silicon/ai)) + var/mob/living/silicon/ai/ai = usr + viewers = get_hearers_in_view(DEFAULT_MESSAGE_RANGE, ai.eyeobj) + + var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[usr] + if(hologram) + viewers |= get_hearers_in_view(1, hologram) + + for(var/mob/living/silicon/ai/ai as anything in GLOB.ai_list) + if(ai.client && !(ai in viewers) && (ai.eyeobj in viewers)) + viewers += ai + + for(var/mob/ghost as anything in GLOB.dead_mob_list) + if((ghost.client?.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(ghost in viewers)) + ghost.show_message(span_emote(message_with_name)) + + for(var/mob/receiver in viewers) + receiver.show_message(span_emote(message_with_name), alt_msg = span_emote(message_with_name)) + if (receiver.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) + create_chat_message(usr, null, message, null, EMOTE_MESSAGE) diff --git a/modular_doppler/verbs/code/log_category_game.dm b/modular_doppler/verbs/code/log_category_game.dm new file mode 100644 index 0000000000000..cc00d85f63175 --- /dev/null +++ b/modular_doppler/verbs/code/log_category_game.dm @@ -0,0 +1,3 @@ +/datum/log_category/game_subtle + category = LOG_CATEGORY_GAME_SUBTLE + master_category = /datum/log_category/game diff --git a/modular_doppler/verbs/code/looc.dm b/modular_doppler/verbs/code/looc.dm new file mode 100644 index 0000000000000..b88810c1c9146 --- /dev/null +++ b/modular_doppler/verbs/code/looc.dm @@ -0,0 +1,100 @@ +/client/verb/looc(msg as text) + set name = "LOOC" + set desc = "Local OOC, seen only by those in view." + set category = "OOC" + + looc_message(msg) + +/client/verb/looc_wallpierce(msg as text) + set name = "LOOC (Wallpierce)" + set desc = "Local OOC, seen by anyone within 7 tiles of you." + set category = "OOC" + + looc_message(msg, TRUE) + +/client/proc/looc_message(msg, wall_pierce) + if(GLOB.say_disabled) + to_chat(usr, span_danger("Speech is currently admin-disabled.")) + return + + if(!mob) + return + + msg = copytext_char(sanitize(msg), 1, MAX_MESSAGE_LEN) + if(!msg) + return + + if(!holder) + if(!GLOB.looc_allowed) + to_chat(src, span_danger("LOOC is globally muted.")) + return + if(handle_spam_prevention(msg, MUTE_OOC)) + return + if(findtext(msg, "byond://")) + to_chat(src, span_boldannounce("Advertising other servers is not allowed.")) + log_admin("[key_name(src)] has attempted to advertise in LOOC: [msg]") + return + if(prefs.muted & MUTE_LOOC) + to_chat(src, span_danger("You cannot use LOOC (muted).")) + return + if(is_banned_from(ckey, BAN_LOOC)) + to_chat(src, span_warning("You are LOOC banned!")) + return + if(mob.stat == DEAD) + to_chat(src, span_danger("You cannot use LOOC while dead.")) + return + if(istype(mob, /mob/dead)) + to_chat(src, span_danger("You cannot use LOOC while ghosting.")) + return + + msg = emoji_parse(msg) + + mob.log_talk(msg,LOG_OOC, tag="LOOC") + var/list/heard + if(wall_pierce) + heard = get_hearers_in_looc_range(mob.get_top_level_mob()) + else + heard = get_hearers_in_view(LOOC_RANGE, mob.get_top_level_mob()) + + //so the ai can post looc text + if(istype(mob, /mob/living/silicon/ai)) + var/mob/living/silicon/ai/ai = mob + if(wall_pierce) + heard = get_hearers_in_looc_range(ai.eyeobj) + else + heard = get_hearers_in_view(LOOC_RANGE, ai.eyeobj) + //so the ai can see looc text + for(var/mob/living/silicon/ai/ai as anything in GLOB.ai_list) + if(ai.client && !(ai in heard) && (ai.eyeobj in heard)) + heard += ai + + var/list/admin_seen = list() + for(var/mob/hearing in heard) + if(!hearing.client) + continue + var/client/hearing_client = hearing.client + + var/is_holder = hearing_client.holder + if (is_holder) + admin_seen[hearing_client] = TRUE + // dont continue here, still need to show runechat + + if (isobserver(hearing) && !is_holder) + continue //ghosts dont hear looc, apparantly + + // do the runetext here so admins can still get the runetext + if(mob.runechat_prefs_check(hearing) && hearing.client?.prefs.read_preference(/datum/preference/toggle/enable_looc_runechat)) + // EMOTE is close enough. We don't want it to treat the raw message with languages. + // I wish it didn't include the asterisk but it's modular this way. + hearing.create_chat_message(mob, raw_message = "(LOOC: [msg])", runechat_flags = EMOTE_MESSAGE) + + if (is_holder) + continue //admins are handled afterwards + + to_chat(hearing_client, span_looc(span_prefix("LOOC[wall_pierce ? " (WALL PIERCE)" : ""]: [src.mob.name]: [msg]"))) + + for(var/client/cli_client as anything in GLOB.admins) + if (admin_seen[cli_client]) + to_chat(cli_client, span_looc("[ADMIN_FLW(usr)] LOOC[wall_pierce ? " (WALL PIERCE)" : ""]: [src.key]/[src.mob.name]: [msg]")) + else if (cli_client.prefs.read_preference(/datum/preference/toggle/admin/see_looc)) + to_chat(cli_client, span_rlooc("[ADMIN_FLW(usr)] (R)LOOC[wall_pierce ? " (WALL PIERCE)" : ""]: [src.key]/[src.mob.name]: [msg]")) diff --git a/modular_doppler/verbs/code/preferences.dm b/modular_doppler/verbs/code/preferences.dm new file mode 100644 index 0000000000000..be6618bd8e655 --- /dev/null +++ b/modular_doppler/verbs/code/preferences.dm @@ -0,0 +1,11 @@ +/datum/preference/toggle/admin/see_looc + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + default_value = TRUE + savefile_key = "looc_admin_pref" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/toggle/enable_looc_runechat + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + default_value = FALSE + savefile_key = "enable_looc_runechat" + savefile_identifier = PREFERENCE_PLAYER diff --git a/modular_doppler/verbs/code/say.dm b/modular_doppler/verbs/code/say.dm new file mode 100644 index 0000000000000..935d8d1331ef7 --- /dev/null +++ b/modular_doppler/verbs/code/say.dm @@ -0,0 +1,5 @@ +/mob/proc/get_top_level_mob() + if(ismob(loc) && (loc != src)) + var/mob/M = loc + return M.get_top_level_mob() + return src diff --git a/modular_doppler/verbs/code/subtle.dm b/modular_doppler/verbs/code/subtle.dm new file mode 100644 index 0000000000000..5667d37fab759 --- /dev/null +++ b/modular_doppler/verbs/code/subtle.dm @@ -0,0 +1,116 @@ +#define SUBTLE_DEFAULT_DISTANCE 1 +#define SUBTLE_SAME_TILE_DISTANCE 0 + +#define SUBTLE_ONE_TILE_TEXT "1-Tile Range" +#define SUBTLE_SAME_TILE_TEXT "Same Tile" + +/datum/emote/living/subtle + key = "subtle" + key_third_person = "subtle" + message = null + mob_type_blacklist_typecache = list(/mob/living/brain) + +/datum/emote/living/subtle/run_emote(mob/user, params, type_override = null) + if(!can_run_emote(user)) + to_chat(user, span_warning("You can't emote at this time.")) + return FALSE + var/subtle_message + var/subtle_emote = params + var/target + var/subtle_range = SUBTLE_DEFAULT_DISTANCE + + if(SSdbcore.IsConnected() && is_banned_from(user, "emote")) + to_chat(user, span_warning("You cannot send subtle emotes (banned).")) + return FALSE + else if(user.client?.prefs.muted & MUTE_IC) + to_chat(user, span_warning("You cannot send IC messages (muted).")) + return FALSE + else if(!subtle_emote) + subtle_emote = tgui_input_text(user, "Choose an emote to display.", "Subtle" , null, MAX_MESSAGE_LEN, TRUE) + if(!subtle_emote) + return FALSE + + var/list/in_view = get_hearers_in_view(subtle_range, user) + + var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user] + if(hologram) + in_view |= get_hearers_in_view(1, hologram) + + in_view -= GLOB.dead_mob_list + in_view.Remove(user) + + for(var/mob/camera/ai_eye/ai_eye in in_view) + in_view.Remove(ai_eye) + + var/list/targets = list(SUBTLE_ONE_TILE_TEXT, SUBTLE_SAME_TILE_TEXT) + in_view + target = tgui_input_list(user, "Pick a target", "Target Selection", targets) + if(!target) + return FALSE + + switch(target) + if(SUBTLE_ONE_TILE_TEXT) + target = SUBTLE_DEFAULT_DISTANCE + if(SUBTLE_SAME_TILE_TEXT) + target = SUBTLE_SAME_TILE_DISTANCE + subtle_message = subtle_emote + else + target = SUBTLE_DEFAULT_DISTANCE + subtle_message = subtle_emote + if(type_override) + emote_type = type_override + + if(!can_run_emote(user)) + to_chat(user, span_warning("You can't emote at this time.")) + return FALSE + + user.log_message(subtle_message, LOG_SUBTLE) + + var/space = should_have_space_before_emote(html_decode(subtle_emote)[1]) ? " " : "" + + subtle_message = span_emote("[user][space][user.say_emphasis(subtle_message)]") + + if(istype(target, /mob)) + var/mob/target_mob = target + user.show_message(subtle_message, alt_msg = subtle_message) + var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user] + if((get_dist(user.loc, target_mob.loc) <= subtle_range) || (hologram && get_dist(hologram.loc, target_mob.loc) <= subtle_range)) + target_mob.show_message(subtle_message, alt_msg = subtle_message) + else + to_chat(user, span_warning("Your emote was unable to be sent to your target: Too far away.")) + else if(istype(target, /obj/effect/overlay/holo_pad_hologram)) + var/obj/effect/overlay/holo_pad_hologram/hologram = target + if(hologram.Impersonation?.client) + hologram.Impersonation.show_message(subtle_message, alt_msg = subtle_message) + else + var/ghostless = get_hearers_in_view(target, user) - GLOB.dead_mob_list + + var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user] + if(hologram) + ghostless |= get_hearers_in_view(target, hologram) + + for(var/obj/effect/overlay/holo_pad_hologram/holo in ghostless) + if(holo?.Impersonation?.client) + ghostless |= holo.Impersonation + + for(var/mob/receiver in ghostless) + receiver.show_message(subtle_message, alt_msg = subtle_message) + + return TRUE + +/* +* VERB CODE +*/ + +/mob/living/verb/subtle() + set name = "Subtle (Anti-Ghost)" + set category = "IC" + if(GLOB.say_disabled) // This is here to try to identify lag problems + to_chat(usr, span_danger("Speech is currently admin-disabled.")) + return + usr.emote("subtle") + +#undef SUBTLE_DEFAULT_DISTANCE +#undef SUBTLE_SAME_TILE_DISTANCE + +#undef SUBTLE_ONE_TILE_TEXT +#undef SUBTLE_SAME_TILE_TEXT diff --git a/modular_doppler/verbs/readme.md b/modular_doppler/verbs/readme.md new file mode 100644 index 0000000000000..5d4750fcd11a4 --- /dev/null +++ b/modular_doppler/verbs/readme.md @@ -0,0 +1,58 @@ +## Title: More verbs and subtler. + +MODULE ID: VERBS + +### Description: + +Adds the following new verbs: +- LOOC: OOC with a default range of 7 tiles. +- LOOC (Wallpierce): Like LOOC but a wall piercing version. +- Subtle (Anti-Ghost): Like Me but invisible to ghosts. Range can be 1 tile, choosing a character in this range or same tile. +- Do: Like Me but not centered on character. Perfect for narrations. Default range of 7 tiles. +- Do (Longer): Like Do but in a TGUI format. + +Adds keybinds for LOOC, Do, Do (Longer) and Whisper. + +### TG Proc Changes: + +| proc | file | +| ----------------------------------------------------- | --------------------------------------------- | +| `/proc/cmd_admin_mute(whom, mute_type, automute = 0)` | `code\modules\admin\verbs\admin.dm` | +| `ADMIN_VERB_ONLY_CONTEXT_MENU(..., ..., ..., ...)` | `code\modules\admin\verbs\admingame.dm` | +| `/datum/tgui_say/proc/open(payload)` | `code\modules\tgui_input\say_modal\modal.dm` | +| `/datum/tgui_say/proc/alter_entry(payload)` | `code\modules\tgui_input\say_modal\speech.dm` | + +### Defines: + +- `code\__DEFINES\~doppler_defines\admin.dm` looc mute +- `code\__DEFINES\~doppler_defines\banning.dm` looc ban define +- `code\__DEFINES\~doppler_defines\keybindings.dm` looc, whisper and do keybinds +- `code\__DEFINES\~doppler_defines\logging.dm` subtle log define +- `code\__DEFINES\~doppler_defines\say.dm` looc range define +- `code\__DEFINES\~doppler_defines\span.dm` looc(wallpierce), do, subtle and span defines +- `code\__DEFINES\~doppler_defines\speech_channels.dm` looc, whis and do channel defines + + +### Included files that are not contained in this module: + +- `code\__HELPERS\logging\_logging.dm` subtle logging +- `code\__HELPERS\logging\mob.dm` subtle messages readibility for admins +- `code\__HELPERS\~doppler_helpers\chat.dm` subtle formatting helper +- `code\__HELPERS\~doppler_helpers\logging.dm` subtle helper for logging +- `code\__HELPERS\~doppler_helpers\verbs.dm` looc range hearing helper +- `code\_globalvars\~doppler_globalvars\configuration.dm` looc configuration global var init +- `code\modules\admin\sql_ban_system.dm` looc ban option in admin banning panel +- `code\modules\admin\verbs\admingame.dm` looc mute message +- `modular_doppler\administration\code\preferences.dm` toggle admin preference datum +- `tgui\packages\tgui\interfaces\PreferencesMenu\preferences\features\dopplershift_preferences\looc.tsx` looc preferences visual components +- `tgui\packages\tgui-panel\chat\constants.ts` +- `tgui\packages\tgui-panel\styles\tgchat\chat-dark.scss` multiple font colors for dark theme +- `tgui\packages\tgui-panel\styles\tgchat\chat-light.scss` multiple font colors for light theme +- `tgui\packages\tgui-say\ChannelIterator.test.ts` whis, looc and do channel cycler test +- `tgui\packages\tgui-say\ChannelIterator.ts` whis, looc and do channel types and channel iterators +- `tgui\packages\tgui-say\styles\colors.scss` whis, looc and do font colors + +### Credits: +Gandalf2k15 - porting and refactoring +yooriss - do verb +Kaostico - edition diff --git a/sound/magic/VoidDeflect01.ogg b/sound/magic/VoidDeflect01.ogg new file mode 100644 index 0000000000000..53b96d1ba8daa Binary files /dev/null and b/sound/magic/VoidDeflect01.ogg differ diff --git a/sound/magic/VoidDeflect02.ogg b/sound/magic/VoidDeflect02.ogg new file mode 100644 index 0000000000000..feac14b57220a Binary files /dev/null and b/sound/magic/VoidDeflect02.ogg differ diff --git a/sound/magic/VoidDeflect03.ogg b/sound/magic/VoidDeflect03.ogg new file mode 100644 index 0000000000000..3f55c4bea73d6 Binary files /dev/null and b/sound/magic/VoidDeflect03.ogg differ diff --git a/sound/weapons/gun/general/mountedgun.ogg b/sound/weapons/gun/general/mountedgun.ogg new file mode 100644 index 0000000000000..dfa11134eab34 Binary files /dev/null and b/sound/weapons/gun/general/mountedgun.ogg differ diff --git a/sound/weapons/gun/general/mountedgunend.ogg b/sound/weapons/gun/general/mountedgunend.ogg new file mode 100644 index 0000000000000..dfa11134eab34 Binary files /dev/null and b/sound/weapons/gun/general/mountedgunend.ogg differ diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/looc.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/looc.tsx new file mode 100644 index 0000000000000..1c9c5eb3f436e --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/looc.tsx @@ -0,0 +1,17 @@ +import { CheckboxInput, FeatureToggle } from '../base'; + +export const looc_admin_pref: FeatureToggle = { + name: 'See admin LOOC', + category: 'ADMIN', + description: + 'Toggles whether you want to see LOOC anywhere as an admin or not.', + component: CheckboxInput, +}; + +export const enable_looc_runechat: FeatureToggle = { + name: 'Enable LOOC runechat', + category: 'RUNECHAT', + description: + "If TRUE, LOOC will appear above the speaker's head as well as in the chat.", + component: CheckboxInput, +}; diff --git a/tools/UpdatePaths/Scripts/86550_repaths_access_vending_machines.txt b/tools/UpdatePaths/Scripts/86550_repaths_access_vending_machines.txt new file mode 100644 index 0000000000000..84237a0dc5f43 --- /dev/null +++ b/tools/UpdatePaths/Scripts/86550_repaths_access_vending_machines.txt @@ -0,0 +1,8 @@ +#comment Repaths some access vending machines because access restrictions for vending machines no longer exist + +/obj/machinery/vending/autodrobe/all_access : /obj/machinery/vending/autodrobe{@OLD} +/obj/machinery/vending/boozeomat/all_access : /obj/machinery/vending/boozeomat{@OLD} + +/obj/machinery/vending/boozeomat/syndicate_access : /obj/machinery/vending/boozeomat/syndicate{@OLD} +/obj/machinery/vending/medical/syndicate_access : /obj/machinery/vending/medical/syndicate{@OLD} +/obj/machinery/vending/medical/syndicate_access/@SUBTYPES : /obj/machinery/vending/medical/syndicate/@SUBTYPES{@OLD} diff --git a/tools/ticked_file_enforcement/schemas/modular_doppler.json b/tools/ticked_file_enforcement/schemas/modular_doppler.json new file mode 100644 index 0000000000000..b1b95d301bd40 --- /dev/null +++ b/tools/ticked_file_enforcement/schemas/modular_doppler.json @@ -0,0 +1,7 @@ +{ + "file": "tgstation.dme", + "scannable_directory": "modular_doppler/", + "subdirectories": true, + "excluded_files": [], + "forbidden_includes": [] +}