Merge branch 'Citadel-Station-13:master' into master

This commit is contained in:
WanderingFox95
2021-10-13 21:37:14 +02:00
committed by GitHub
198 changed files with 6538 additions and 6250 deletions
@@ -5,45 +5,45 @@
"c" = (
/obj/structure/healingfountain,
/turf/open/floor/carpet/purple,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"d" = (
/obj/structure/fluff/divine/conduit,
/turf/open/floor/mineral/plasma,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"e" = (
/obj/structure/sacrificealtar,
/turf/open/floor/carpet/purple,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"f" = (
/mob/living/simple_animal/butterfly,
/turf/open/floor/carpet/purple,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"g" = (
/mob/living/simple_animal/butterfly,
/turf/open/floor/carpet/red,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"h" = (
/obj/structure/fans/tiny/invisible,
/turf/open/floor/carpet/red,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"u" = (
/turf/open/floor/carpet/purple,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"G" = (
/turf/closed/wall/mineral/cult{
sheet_amount = 0
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"J" = (
/mob/living/simple_animal/butterfly,
/turf/open/floor/carpet/royalblack,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"T" = (
/turf/open/floor/carpet/royalblack,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"U" = (
/turf/open/floor/carpet/red,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
(1,1,1) = {"
a
+43 -43
View File
@@ -4,7 +4,7 @@
/area/template_noop)
"b" = (
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"c" = (
/obj/structure/closet/crate,
/obj/item/shovel,
@@ -20,7 +20,7 @@
/obj/item/card/id/mining,
/obj/item/gps/mining/off,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"d" = (
/obj/structure/closet/crate,
/obj/item/shovel,
@@ -34,18 +34,18 @@
/obj/item/card/id/mining,
/obj/item/gps/mining/off,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"e" = (
/obj/item/storage/toolbox/mechanical,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"f" = (
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"g" = (
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"h" = (
/obj/structure/shuttle/engine/heater{
dir = 4
@@ -56,7 +56,7 @@
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"i" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8
@@ -64,37 +64,37 @@
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"j" = (
/obj/machinery/door/airlock/titanium,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"k" = (
/obj/machinery/computer/arcade/battle{
dir = 4;
icon_state = "arcade"
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"l" = (
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"m" = (
/obj/effect/mob_spawn/human/golem/adamantine,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"n" = (
/obj/machinery/mineral/equipment_vendor/golem,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"o" = (
/obj/item/resonator,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"p" = (
/obj/machinery/mineral/ore_redemption,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"q" = (
/obj/structure/statue/gold/rd,
/obj/structure/window/reinforced{
@@ -105,24 +105,24 @@
dir = 8
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"r" = (
/obj/machinery/computer/shuttle,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"s" = (
/obj/machinery/computer/arcade/orion_trail{
dir = 4;
icon_state = "arcade"
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"t" = (
/obj/structure/extinguisher_cabinet{
pixel_y = 30
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"u" = (
/obj/structure/table/wood,
/obj/item/bedsheet/rd/royal_cape{
@@ -141,27 +141,27 @@
},
/obj/item/tcg_card/special/golem,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"v" = (
/obj/item/resonator/upgraded,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"w" = (
/obj/machinery/autolathe,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"x" = (
/obj/structure/table/wood,
/obj/machinery/reagentgrinder,
/obj/item/gps/mining,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"z" = (
/obj/structure/extinguisher_cabinet{
pixel_y = -30
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"A" = (
/obj/structure/table/wood,
/obj/item/surgical_drapes{
@@ -170,14 +170,14 @@
/obj/item/storage/firstaid/fire,
/obj/item/storage/firstaid/fire,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"B" = (
/obj/item/storage/firstaid/fire,
/obj/structure/table/wood,
/obj/item/storage/firstaid/fire,
/obj/machinery/light,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"C" = (
/obj/item/storage/firstaid/brute,
/obj/structure/table/wood,
@@ -187,34 +187,34 @@
name = "land claim"
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"D" = (
/obj/item/storage/firstaid/brute,
/obj/structure/table/wood,
/obj/item/storage/firstaid/brute,
/obj/item/disk/design_disk/golem_shell,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"E" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"F" = (
/obj/structure/ore_box,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"G" = (
/turf/closed/wall/mineral/titanium,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"H" = (
/obj/machinery/door/airlock/titanium,
/obj/structure/fans/tiny,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"I" = (
/obj/machinery/light/small,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"K" = (
/obj/machinery/door/airlock/titanium,
/obj/structure/fans/tiny,
@@ -222,59 +222,59 @@
dir = 8
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"L" = (
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"M" = (
/obj/effect/mob_spawn/human/golem/adamantine,
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"N" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"O" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"Q" = (
/obj/machinery/light/small,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"T" = (
/obj/structure/fans/tiny,
/obj/machinery/door/airlock/titanium,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"U" = (
/obj/effect/mob_spawn/human/golem/adamantine,
/obj/machinery/light/small,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"V" = (
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
"Y" = (
/obj/machinery/door/airlock/titanium,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
/area/ruin/lavaland/powered/golem_ship)
(1,1,1) = {"
a
@@ -4,14 +4,14 @@
/area/template_noop)
"b" = (
/turf/closed/wall/ice,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"c" = (
/obj/machinery/shower{
pixel_y = 16
},
/obj/structure/curtain,
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"d" = (
/turf/closed/mineral/random/snow,
/area/icemoon/underground/explored)
@@ -23,40 +23,40 @@
pixel_y = 20
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"f" = (
/obj/structure/table/greyscale,
/obj/item/bikehorn/rubberducky,
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"g" = (
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"h" = (
/obj/item/soap,
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"i" = (
/obj/machinery/door/airlock/freezer{
name = "bath house airlock"
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"j" = (
/turf/closed/wall/mineral/wood,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"k" = (
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"l" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/meatballspaghetti,
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"m" = (
/obj/structure/bookcase/random,
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"n" = (
/turf/open/floor/plating/asteroid/snow/ice/icemoon,
/area/icemoon/underground/explored)
@@ -64,7 +64,7 @@
/obj/structure/bed,
/obj/item/bedsheet,
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
(1,1,1) = {"
b
@@ -7,167 +7,167 @@
/obj/item/documents/syndicate/mining,
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ac" = (
/turf/closed/wall/mineral/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ad" = (
/turf/closed/mineral/random/snow,
/area/icemoon/underground/explored)
"ae" = (
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"af" = (
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ag" = (
/obj/item/feather,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ah" = (
/obj/structure/bookcase/random,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ai" = (
/obj/structure/table/wood/fancy/black,
/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary2,
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ak" = (
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"al" = (
/turf/closed/wall/mineral/iron,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"am" = (
/obj/structure/table/wood/fancy/black,
/obj/item/book_of_babel,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ao" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ap" = (
/obj/item/stack/sheet/mineral/wood,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aq" = (
/obj/structure/fluff/paper{
dir = 1
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ar" = (
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"as" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/paper/fluff/ruins/oldstation/protosing,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"at" = (
/obj/structure/fluff/paper,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"av" = (
/obj/structure/bookcase/random,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aw" = (
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ax" = (
/obj/effect/decal/cleanable/dirt,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ay" = (
/obj/machinery/door/keycard/library,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"az" = (
/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aA" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aC" = (
/obj/item/feather,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aD" = (
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aE" = (
/obj/item/stack/sheet/mineral/wood,
/obj/item/book/manual/random,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aF" = (
/obj/item/book/manual/random,
/obj/effect/decal/cleanable/dirt,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aG" = (
/obj/structure/table/bronze,
/obj/item/stack/ore/slag,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aH" = (
/obj/structure/table/bronze,
/obj/item/statuebust,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aI" = (
/obj/effect/mob_spawn/human/skeleton,
/obj/item/clothing/head/rice_hat,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aJ" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aK" = (
/obj/item/feather,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aL" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/fluff/paper/stack,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aM" = (
/obj/item/stack/sheet/mineral/wood,
/obj/item/book/manual/random,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aN" = (
/obj/structure/statue/sandstone/venus,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aO" = (
/mob/living/simple_animal/pet/fox,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aP" = (
/obj/item/keycard/library,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aQ" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aR" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aS" = (
/obj/structure/table/wood/fancy/black,
/obj/effect/decal/cleanable/dirt,
@@ -176,39 +176,39 @@
on = 1
},
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aT" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/fluff/paper,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aV" = (
/obj/item/stack/sheet/mineral/wood,
/obj/structure/fluff/paper/stack,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aW" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aX" = (
/obj/structure/table/bronze,
/obj/item/statuebust,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aY" = (
/obj/structure/table_frame/wood,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aZ" = (
/obj/structure/fluff/paper/stack,
/obj/structure/fluff/paper,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ba" = (
/obj/structure/barricade/wooden/snowed,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bc" = (
/obj/item/feather,
/obj/structure/fluff/paper,
@@ -216,81 +216,81 @@
dir = 1
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bd" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/fluff/paper{
dir = 1
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"be" = (
/obj/structure/fluff/paper{
dir = 5
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bf" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/fluff/paper{
dir = 4
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bg" = (
/obj/item/paper/fluff/ruins/oldstation/protogun,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bh" = (
/obj/effect/decal/cleanable/dirt,
/mob/living/simple_animal/pet/fox,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bi" = (
/obj/structure/fluff/paper,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bj" = (
/obj/item/book/manual/random,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bk" = (
/obj/structure/fluff/paper{
dir = 10
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bl" = (
/obj/item/storage/box/fountainpens,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bm" = (
/obj/structure/fluff/paper/stack,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bn" = (
/obj/item/book/manual/random,
/obj/item/stack/sheet/mineral/wood,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bo" = (
/obj/item/stack/sheet/mineral/wood,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bp" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/fluff/paper,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bq" = (
/obj/structure/mineral_door/wood,
/obj/structure/barricade/wooden/crude/snow,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"br" = (
/obj/structure/girder,
/turf/closed/mineral/random/snow,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bt" = (
/obj/effect/decal/cleanable/dirt,
/turf/template_noop,
@@ -305,21 +305,21 @@
"by" = (
/obj/item/statuebust,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bz" = (
/obj/item/flashlight/lantern/jade{
on = 1
},
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bA" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bB" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bC" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/fluff/paper{
@@ -327,7 +327,7 @@
},
/mob/living/simple_animal/pet/fox,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
(1,1,1) = {"
aa
@@ -5,14 +5,14 @@
"ad" = (
/obj/structure/flora/ausbushes/leafybush,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ae" = (
/obj/structure/table,
/obj/item/storage/toolbox/mechanical,
/obj/item/stack/cable_coil,
/obj/item/storage/box/lights/mixed,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"af" = (
/obj/structure/table,
/obj/item/clothing/mask/gas,
@@ -23,22 +23,22 @@
/obj/item/clothing/glasses/sunglasses/big,
/obj/item/clothing/glasses/sunglasses/big,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ag" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ah" = (
/obj/effect/mob_spawn/human/bartender/alive,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ai" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aj" = (
/turf/closed/wall/mineral/sandstone,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ak" = (
/obj/structure/toilet,
/obj/effect/turf_decal/sand,
@@ -47,27 +47,27 @@
},
/obj/effect/decal/cleanable/vomit/old,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"al" = (
/obj/structure/urinal{
pixel_y = 32
},
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"am" = (
/obj/structure/urinal{
pixel_y = 32
},
/obj/effect/turf_decal/sand,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"an" = (
/obj/item/flashlight/lantern,
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ao" = (
/obj/structure/sink{
dir = 4;
@@ -78,71 +78,71 @@
pixel_x = 28
},
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ap" = (
/obj/structure/flora/ausbushes/sparsegrass,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aq" = (
/obj/structure/flora/ausbushes/sunnybush,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ar" = (
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"as" = (
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"at" = (
/obj/item/tank/internals/oxygen,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"au" = (
/obj/effect/turf_decal/sand,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"av" = (
/obj/machinery/door/airlock/sandstone{
name = "Lavatory"
},
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aw" = (
/obj/machinery/door/airlock/sandstone{
name = "Bar Storage"
},
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ax" = (
/obj/structure/extinguisher_cabinet,
/turf/closed/wall/mineral/sandstone,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ay" = (
/obj/effect/turf_decal/sand,
/obj/machinery/door/airlock/sandstone{
name = "Restroom"
},
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"az" = (
/obj/item/clothing/neck/necklace/dope,
/obj/item/reagent_containers/spray/spraytan,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aA" = (
/obj/effect/turf_decal/sand,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aB" = (
/obj/effect/turf_decal/stripes/asteroid/line{
dir = 1
},
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aC" = (
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aD" = (
/obj/structure/table,
/obj/machinery/light{
@@ -150,19 +150,19 @@
},
/obj/machinery/chem_dispenser/drinks,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aE" = (
/obj/structure/table,
/obj/machinery/reagentgrinder,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aF" = (
/obj/machinery/vending/boozeomat{
req_access_txt = "0";
set_obj_flags = "EMAGGED"
},
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aH" = (
/obj/structure/table,
/obj/machinery/light{
@@ -173,12 +173,12 @@
/obj/item/reagent_containers/food/drinks/shaker,
/obj/item/reagent_containers/rag,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aI" = (
/obj/structure/table,
/obj/machinery/microwave,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aJ" = (
/obj/structure/closet/crate/bin,
/obj/item/tank/internals/emergency_oxygen,
@@ -189,57 +189,57 @@
},
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aK" = (
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aM" = (
/obj/structure/reagent_dispensers/beerkeg{
reagent_id = /datum/reagent/consumable/ethanol/beer/light
},
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aN" = (
/obj/machinery/vending/cigarette/beach,
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aO" = (
/obj/structure/weightmachine/stacklifter,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aP" = (
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aQ" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aR" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/drinks/bottle/tequila,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aS" = (
/obj/machinery/processor,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aT" = (
/obj/machinery/vending/cola,
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aU" = (
/obj/effect/overlay/palmtree_l,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aV" = (
/obj/effect/mob_spawn/human/beach/alive,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aW" = (
/obj/structure/chair/stool,
/obj/effect/turf_decal/stripes/asteroid/line{
@@ -247,60 +247,60 @@
},
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aX" = (
/obj/structure/closet/secure_closet/freezer/meat,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aY" = (
/obj/machinery/vending/snack,
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"aZ" = (
/obj/effect/overlay/coconut,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bb" = (
/obj/structure/weightmachine/weightlifter,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bc" = (
/obj/machinery/door/airlock/sandstone{
name = "Bar Access"
},
/obj/effect/turf_decal/sand,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bd" = (
/obj/structure/closet/secure_closet/freezer/kitchen{
req_access = null
},
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"be" = (
/obj/vehicle/ridden/scooter/skateboard{
dir = 4
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bg" = (
/obj/structure/sign/barsign,
/turf/closed/wall/mineral/sandstone,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bl" = (
/obj/effect/turf_decal/caution,
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bx" = (
/obj/structure/flora/rock,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bz" = (
/mob/living/simple_animal/crab,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bA" = (
/obj/structure/window/reinforced{
dir = 1
@@ -313,7 +313,7 @@
/obj/item/storage/firstaid,
/obj/item/storage/firstaid/brute,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bB" = (
/obj/structure/window/reinforced{
dir = 4
@@ -324,15 +324,15 @@
},
/obj/structure/chair/stool,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bE" = (
/obj/item/reagent_containers/spray/spraytan,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bF" = (
/obj/item/toy/beach_ball,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bG" = (
/obj/structure/window/reinforced{
dir = 8
@@ -340,22 +340,22 @@
/obj/structure/window/reinforced,
/obj/item/megaphone,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bH" = (
/obj/structure/window/reinforced{
dir = 4
},
/obj/effect/mob_spawn/human/beach/alive/lifeguard,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bJ" = (
/obj/structure/chair,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bK" = (
/obj/item/storage/backpack/duffelbag,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bL" = (
/obj/effect/turf_decal/sand{
density = 1
@@ -364,71 +364,71 @@
/turf/open/floor/pod/light{
density = 1
},
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bM" = (
/turf/open/floor/plasteel/stairs/old,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bN" = (
/obj/structure/flora/ausbushes/reedbush,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bO" = (
/obj/item/camera,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bP" = (
/obj/item/reagent_containers/food/drinks/beer/light,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bQ" = (
/obj/structure/flora/ausbushes/reedbush,
/turf/open/floor/plating/beach/coastline_t,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bR" = (
/turf/open/floor/plating/beach/coastline_t,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bS" = (
/obj/structure/flora/ausbushes/sparsegrass,
/turf/open/floor/plating/beach/coastline_t,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bT" = (
/turf/open/floor/plating/beach/coastline_b,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bU" = (
/turf/open/floor/plating/beach/water,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bV" = (
/obj/structure/flora/ausbushes/stalkybush,
/turf/open/floor/plating/beach/water,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"bW" = (
/turf/closed/wall/r_wall,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"cd" = (
/obj/machinery/light/small{
dir = 1
},
/turf/closed/wall/mineral/sandstone,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ce" = (
/obj/effect/turf_decal/sand,
/obj/machinery/light{
dir = 1
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"cg" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ch" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"cj" = (
/obj/effect/turf_decal/stripes/asteroid/line{
dir = 1
@@ -438,31 +438,31 @@
},
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"cs" = (
/obj/effect/overlay/palmtree_l,
/obj/machinery/light{
dir = 4
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"ct" = (
/obj/machinery/light,
/turf/open/floor/plating/beach/water,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"cR" = (
/obj/structure/table/wood,
/obj/item/tank/internals/oxygen,
/obj/item/pickaxe,
/obj/item/clothing/mask/gas,
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"dw" = (
/obj/machinery/door/airlock/sandstone{
name = "Beach Access"
},
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"gg" = (
/obj/structure/table,
/obj/item/storage/box/drinkingglasses,
@@ -471,23 +471,23 @@
/obj/item/storage/box/donkpockets,
/obj/item/soap,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"hY" = (
/obj/structure/table,
/obj/machinery/chem_dispenser/drinks/beer,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"iw" = (
/obj/machinery/light/small{
brightness = 3;
dir = 8
},
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"jF" = (
/obj/effect/turf_decal/sand,
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"lF" = (
/obj/machinery/light{
dir = 4
@@ -495,55 +495,55 @@
/turf/open/floor/pod/dark{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"lM" = (
/obj/structure/dresser,
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"mh" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"oK" = (
/obj/effect/turf_decal/caution{
dir = 1
},
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"pg" = (
/obj/effect/turf_decal/sand,
/obj/machinery/shower{
dir = 4
},
/turf/open/floor/pod/light,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"pI" = (
/obj/machinery/door/airlock/hatch{
name = "Lava Beach Club"
},
/obj/structure/fans/tiny,
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"pU" = (
/obj/machinery/light/small{
dir = 4
},
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"qa" = (
/obj/effect/turf_decal/sand,
/obj/machinery/light/small{
dir = 4
},
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"qT" = (
/obj/machinery/shower{
dir = 8
},
/turf/open/floor/pod/light,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"rV" = (
/obj/effect/turf_decal/sand,
/obj/item/reagent_containers/food/drinks/beer/light{
@@ -551,79 +551,79 @@
pixel_y = -3
},
/turf/open/floor/plating,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"sy" = (
/obj/effect/turf_decal/caution{
dir = 4
},
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"sO" = (
/obj/machinery/jukebox/disco/indestructible,
/turf/open/floor/light/colour_cycle,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"vl" = (
/obj/structure/closet/athletic_mixed,
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"wY" = (
/turf/open/floor/pod/light,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"yp" = (
/obj/item/reagent_containers/spray/spraytan,
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"zw" = (
/obj/structure/closet/athletic_mixed,
/obj/effect/turf_decal/sand,
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"Bl" = (
/obj/effect/turf_decal/sand,
/obj/machinery/light{
dir = 8
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"Ec" = (
/obj/machinery/door/airlock/sandstone{
name = "Beach Access"
},
/obj/effect/turf_decal/sand,
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"Ga" = (
/obj/effect/turf_decal/caution{
dir = 8
},
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"Gc" = (
/obj/effect/turf_decal/sand,
/turf/open/floor/pod/light,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"Gu" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/drinks/beer/light,
/turf/open/floor/wood,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"HC" = (
/obj/structure/rack,
/obj/item/clothing/shoes/sandal,
/obj/item/clothing/shoes/sandal,
/obj/effect/turf_decal/sand,
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"QS" = (
/obj/effect/turf_decal/sand,
/obj/machinery/light{
dir = 4
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"TP" = (
/obj/machinery/light{
dir = 8
@@ -631,10 +631,10 @@
/turf/open/floor/pod/dark{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"VO" = (
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
"Xp" = (
/obj/effect/turf_decal/sand,
/obj/machinery/light/small{
@@ -642,7 +642,7 @@
dir = 8
},
/turf/open/floor/pod/dark,
/area/ruin/powered/beach)
/area/ruin/lavaland/powered/beach)
(1,1,1) = {"
aa
@@ -7,32 +7,32 @@
dir = 6
},
/turf/closed/wall/r_wall,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"an" = (
/obj/structure/disposalpipe/segment{
dir = 10
},
/turf/closed/wall/r_wall,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"ao" = (
/obj/structure/disposalpipe/segment{
dir = 6
},
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"ap" = (
/obj/structure/disposalpipe/segment{
dir = 10
},
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aq" = (
/obj/structure/disposalpipe/trunk,
/obj/structure/disposaloutlet{
dir = 1
},
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"ar" = (
/obj/structure/disposalpipe/segment{
invisibility = 101
@@ -51,7 +51,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"as" = (
/obj/effect/mob_spawn/human/corpse/damaged,
/obj/effect/decal/cleanable/blood/old,
@@ -72,7 +72,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"at" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -91,27 +91,27 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"au" = (
/obj/structure/disposalpipe/segment{
invisibility = 101
},
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"av" = (
/obj/structure/disposalpipe/sorting/mail/flip{
dir = 1;
sortType = 3
},
/turf/closed/wall/r_wall,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aw" = (
/obj/structure/window/reinforced,
/obj/structure/disposalpipe/segment{
invisibility = 101
},
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"ax" = (
/obj/effect/decal/cleanable/pie_smudge,
/obj/structure/disposalpipe/segment{
@@ -131,7 +131,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"ay" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -151,7 +151,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"az" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -172,7 +172,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aA" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -192,7 +192,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aB" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -211,7 +211,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aC" = (
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
@@ -227,7 +227,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aD" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/yellow,
@@ -244,7 +244,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aE" = (
/obj/effect/decal/cleanable/cobweb{
icon_state = "cobweb2"
@@ -263,7 +263,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aF" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -284,7 +284,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aG" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -303,7 +303,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aH" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -323,7 +323,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aI" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -343,13 +343,13 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aJ" = (
/obj/structure/disposalpipe/segment{
dir = 5
},
/turf/closed/wall/r_wall,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aK" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -370,14 +370,14 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aL" = (
/obj/structure/disposalpipe/segment{
dir = 4;
invisibility = 101
},
/turf/closed/wall/r_wall,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aM" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -396,7 +396,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aO" = (
/obj/item/bikehorn,
/obj/structure/disposalpipe/segment{
@@ -417,20 +417,20 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aP" = (
/obj/structure/disposalpipe/segment{
dir = 4;
invisibility = 101
},
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aS" = (
/obj/structure/disposalpipe/segment{
dir = 9
},
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aT" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/disposalpipe/segment{
@@ -450,11 +450,11 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aU" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aV" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -474,7 +474,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aW" = (
/obj/item/bikehorn,
/obj/effect/decal/cleanable/dirt,
@@ -495,7 +495,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aX" = (
/obj/structure/disposalpipe/trunk{
dir = 4
@@ -504,7 +504,7 @@
dir = 8
},
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aY" = (
/obj/item/bikehorn,
/obj/structure/disposalpipe/segment{
@@ -524,7 +524,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"aZ" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -544,7 +544,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"ba" = (
/obj/effect/decal/cleanable/pie_smudge,
/obj/effect/turf_decal/tile/yellow,
@@ -561,7 +561,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bb" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -570,7 +570,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bc" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -590,7 +590,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bd" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -602,7 +602,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"be" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -613,7 +613,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bf" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -633,7 +633,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bg" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -643,7 +643,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bh" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -651,7 +651,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bi" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -659,7 +659,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bj" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -668,7 +668,7 @@
/turf/open/indestructible{
icon_state = "light_on"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bk" = (
/obj/structure/disposalpipe/segment{
invisibility = 101
@@ -680,12 +680,12 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bl" = (
/turf/open/indestructible{
icon_state = "light_on"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bm" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -693,7 +693,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bn" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -701,21 +701,21 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bp" = (
/turf/closed/mineral/bananium,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bq" = (
/obj/item/pickaxe,
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"br" = (
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bs" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -734,13 +734,13 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bt" = (
/obj/structure/disposalpipe/segment{
dir = 5
},
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bu" = (
/obj/item/bikehorn,
/obj/structure/disposalpipe/segment{
@@ -760,7 +760,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bx" = (
/obj/effect/decal/cleanable/cobweb,
/obj/effect/turf_decal/tile/red,
@@ -777,7 +777,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"by" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/tile/yellow,
@@ -794,7 +794,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bz" = (
/obj/machinery/disposal/deliveryChute{
dir = 1
@@ -803,7 +803,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bA" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -819,7 +819,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bB" = (
/turf/open/indestructible/sound{
icon_state = "bananium";
@@ -827,7 +827,7 @@
sound = 'sound/effects/clownstep1.ogg';
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bC" = (
/obj/structure/disposalpipe/junction/yjunction{
dir = 1;
@@ -848,7 +848,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bD" = (
/obj/structure/mecha_wreckage/honker,
/obj/structure/disposalpipe/segment{
@@ -856,7 +856,7 @@
invisibility = 101
},
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bE" = (
/obj/effect/decal/cleanable/oil,
/obj/structure/disposalpipe/segment{
@@ -864,7 +864,7 @@
},
/obj/item/tcg_card/special/honk,
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bF" = (
/obj/effect/decal/cleanable/cobweb{
icon_state = "cobweb2"
@@ -875,7 +875,7 @@
sound = 'sound/effects/clownstep1.ogg';
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bH" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/indestructible/sound{
@@ -884,7 +884,7 @@
sound = 'sound/effects/clownstep1.ogg';
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bI" = (
/obj/effect/mob_spawn/human/corpse/damaged,
/obj/effect/decal/cleanable/blood/old,
@@ -902,7 +902,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bK" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -921,22 +921,22 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bL" = (
/obj/item/reagent_containers/food/drinks/trophy/gold_cup,
/obj/structure/table/glass,
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bM" = (
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bN" = (
/obj/machinery/disposal/deliveryChute,
/obj/structure/disposalpipe/trunk{
dir = 1
},
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bO" = (
/obj/effect/decal/cleanable/cobweb,
/turf/open/indestructible/sound{
@@ -945,21 +945,21 @@
sound = 'sound/effects/clownstep1.ogg';
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bP" = (
/obj/structure/statue/bananium/clown,
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bQ" = (
/obj/structure/table/glass,
/obj/item/grown/bananapeel/bluespace,
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bR" = (
/obj/structure/table/glass,
/obj/item/clothing/shoes/clown_shoes/banana_shoes,
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bS" = (
/obj/item/coin/bananium,
/obj/item/coin/bananium,
@@ -969,21 +969,21 @@
dir = 8
},
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bT" = (
/obj/structure/table/glass,
/obj/item/reagent_containers/spray/waterflower/superlube,
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bU" = (
/obj/item/bikehorn/airhorn,
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bV" = (
/obj/structure/table/glass,
/obj/item/gun/magic/staff/honk,
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bW" = (
/obj/item/bikehorn,
/turf/open/indestructible/sound{
@@ -992,7 +992,7 @@
sound = 'sound/effects/clownstep1.ogg';
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bY" = (
/obj/effect/mob_spawn/human/corpse/damaged,
/obj/effect/decal/cleanable/blood/old,
@@ -1002,7 +1002,7 @@
sound = 'sound/effects/clownstep1.ogg';
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"bZ" = (
/obj/machinery/door/airlock/bananium,
/turf/open/indestructible/sound{
@@ -1011,7 +1011,7 @@
sound = 'sound/effects/clownstep1.ogg';
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"ca" = (
/obj/item/bikehorn,
/obj/effect/decal/cleanable/dirt,
@@ -1021,19 +1021,19 @@
sound = 'sound/effects/clownstep1.ogg';
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"cc" = (
/turf/closed/wall/r_wall,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"ch" = (
/obj/structure/disposalpipe/segment{
invisibility = 101
},
/turf/closed/wall/r_wall,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"cu" = (
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dB" = (
/obj/structure/disposalpipe/segment{
invisibility = 101
@@ -1055,7 +1055,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dC" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -1078,7 +1078,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dD" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -1100,7 +1100,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dE" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -1123,7 +1123,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dF" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -1136,7 +1136,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dG" = (
/obj/structure/disposalpipe/segment{
dir = 4;
@@ -1148,7 +1148,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dH" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -1159,7 +1159,7 @@
/turf/open/indestructible{
icon_state = "white"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dI" = (
/obj/machinery/light{
dir = 1
@@ -1178,13 +1178,13 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dK" = (
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dL" = (
/obj/item/coin/bananium,
/obj/item/coin/bananium,
@@ -1194,7 +1194,7 @@
dir = 4
},
/turf/open/floor/carpet,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dM" = (
/obj/machinery/light{
dir = 1
@@ -1205,7 +1205,7 @@
sound = 'sound/effects/clownstep1.ogg';
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"dO" = (
/obj/machinery/light,
/turf/open/indestructible/sound{
@@ -1214,7 +1214,7 @@
sound = 'sound/effects/clownstep1.ogg';
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"eX" = (
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/noslip{
@@ -1229,16 +1229,16 @@
/obj/machinery/light,
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"pv" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"ye" = (
/turf/open/lava/smooth,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"CB" = (
/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/hope,
/obj/effect/decal/cleanable/blood/old,
@@ -1263,7 +1263,7 @@
icon_state = "darkfull";
wet = 16
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"KX" = (
/obj/item/grown/bananapeel{
color = "#2F3000";
@@ -1283,7 +1283,7 @@
/turf/open/floor/noslip{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"Mv" = (
/obj/effect/mapping_helpers/no_lava,
/mob/living/simple_animal/hostile/retaliate/clown,
@@ -1295,7 +1295,7 @@
},
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"TD" = (
/obj/structure/disposalpipe/trunk,
/obj/structure/disposaloutlet{
@@ -1305,7 +1305,7 @@
/turf/open/floor/noslip{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"Xm" = (
/obj/item/clothing/head/cone,
/obj/effect/mapping_helpers/no_lava,
@@ -1323,14 +1323,14 @@
},
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
"YI" = (
/obj/machinery/light/small,
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/noslip{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/powered/clownplanet)
/area/ruin/lavaland/powered/clownplanet)
(1,1,1) = {"
aa
@@ -9,31 +9,31 @@
/obj/structure/alien/resin/wall,
/obj/structure/alien/weeds,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ad" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood/gibs,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ae" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/maid,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"af" = (
/obj/structure/alien/weeds,
/obj/structure/alien/egg/burst,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ag" = (
/obj/structure/alien/weeds,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ah" = (
/obj/structure/bed/nest,
/obj/structure/alien/weeds,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aj" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
@@ -41,22 +41,22 @@
/obj/item/storage/backpack/clown,
/obj/item/bikehorn,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ak" = (
/obj/structure/alien/resin/membrane,
/obj/structure/alien/weeds,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"al" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/drone,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"am" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"an" = (
/turf/closed/mineral/volcanic/lava_land_surface,
/area/lavaland/surface/outdoors)
@@ -64,7 +64,7 @@
/obj/structure/alien/weeds/node,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ap" = (
/obj/structure/bed/nest,
/obj/structure/alien/weeds,
@@ -74,73 +74,73 @@
/obj/effect/decal/cleanable/blood/old,
/obj/item/clothing/under/syndicate/tacticool,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aq" = (
/obj/structure/alien/weeds,
/obj/structure/alien/egg/burst,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ar" = (
/obj/structure/alien/weeds/node,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"as" = (
/obj/structure/alien/resin/wall,
/obj/structure/alien/weeds,
/obj/structure/alien/weeds,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"at" = (
/obj/structure/alien/weeds,
/obj/structure/alien/resin/wall,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"au" = (
/obj/structure/alien/weeds,
/obj/item/grown/bananapeel,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"av" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/sentinel,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aw" = (
/obj/structure/alien/weeds,
/obj/structure/alien/resin/membrane,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ax" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood/gibs,
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien/drone,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ay" = (
/obj/structure/stone_tile/slab/cracked,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aA" = (
/obj/structure/alien/weeds,
/obj/item/flamethrower,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aB" = (
/obj/structure/alien/weeds,
/obj/item/ammo_casing/c45,
/obj/effect/decal/cleanable/blood/gibs,
/mob/living/simple_animal/hostile/alien/sentinel,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aC" = (
/obj/structure/alien/weeds,
/obj/item/ammo_casing/c45{
pixel_x = -6
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aD" = (
/obj/structure/stone_tile/surrounding_tile{
dir = 1
@@ -151,37 +151,37 @@
},
/obj/structure/stone_tile/center,
/turf/open/chasm/lavaland,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aE" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/ash,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aF" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aG" = (
/obj/structure/alien/weeds,
/obj/structure/mecha_wreckage/ripley,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aH" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood/tracks,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aI" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/vomit/old,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aJ" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aK" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 4
@@ -194,17 +194,17 @@
},
/obj/structure/stone_tile/center/cracked,
/turf/open/chasm/lavaland,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aL" = (
/obj/structure/alien/weeds,
/obj/item/tank/internals/plasma,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aM" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aN" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -214,17 +214,17 @@
},
/obj/structure/stone_tile/cracked,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aO" = (
/obj/structure/alien/weeds,
/obj/effect/mob_spawn/alien/corpse/humanoid/sentinel,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aP" = (
/obj/structure/alien/weeds,
/obj/effect/mob_spawn/alien/corpse/humanoid/hunter,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aQ" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
@@ -234,18 +234,18 @@
/obj/item/clothing/mask/breath,
/obj/item/flashlight/seclite,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aS" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
/obj/item/clothing/mask/facehugger/impregnated,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aT" = (
/obj/structure/alien/weeds,
/obj/item/chainsaw,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aU" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
@@ -253,30 +253,30 @@
/obj/item/clothing/head/helmet/gladiator,
/obj/item/clothing/mask/facehugger/impregnated,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aV" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
/obj/item/clothing/mask/facehugger/impregnated,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aW" = (
/obj/structure/alien/resin/wall,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aX" = (
/obj/structure/alien/weeds,
/obj/effect/gibspawner/xeno,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"aZ" = (
/turf/closed/indestructible/riveted/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ba" = (
/obj/structure/stone_tile/slab,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bb" = (
/obj/structure/stone_tile/cracked{
dir = 4
@@ -290,7 +290,7 @@
},
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bc" = (
/obj/structure/stone_tile/block,
/obj/structure/stone_tile{
@@ -300,7 +300,7 @@
dir = 4
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bd" = (
/obj/structure/stone_tile/block,
/obj/structure/stone_tile{
@@ -311,7 +311,7 @@
},
/obj/effect/decal/cleanable/blood/xeno,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"be" = (
/obj/structure/stone_tile/block,
/obj/structure/stone_tile{
@@ -321,7 +321,7 @@
dir = 1
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bf" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -335,12 +335,12 @@
},
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bg" = (
/obj/structure/alien/weeds,
/obj/item/clothing/mask/facehugger/dead,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bh" = (
/obj/structure/stone_tile/block/cracked{
dir = 4
@@ -352,7 +352,7 @@
dir = 8
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bi" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
@@ -360,7 +360,7 @@
/obj/item/book_of_babel,
/obj/item/clothing/head/wizard/black,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bj" = (
/obj/structure/stone_tile/surrounding_tile/cracked,
/obj/structure/stone_tile/surrounding_tile{
@@ -371,11 +371,11 @@
},
/obj/structure/stone_tile/center/cracked,
/turf/open/chasm/lavaland,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bk" = (
/obj/structure/stone_tile/block,
/turf/open/chasm/lavaland,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bl" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -385,7 +385,7 @@
},
/obj/structure/stone_tile,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bn" = (
/obj/structure/stone_tile/block{
dir = 4
@@ -397,7 +397,7 @@
dir = 4
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bo" = (
/obj/structure/stone_tile/surrounding_tile{
dir = 8
@@ -408,10 +408,10 @@
/obj/structure/stone_tile/surrounding_tile,
/obj/structure/stone_tile/center,
/turf/open/chasm/lavaland,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bq" = (
/turf/open/chasm/lavaland,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"br" = (
/obj/structure/stone_tile/block/cracked{
dir = 8
@@ -422,13 +422,13 @@
},
/obj/effect/decal/cleanable/blood/xeno,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bs" = (
/obj/structure/stone_tile/block{
dir = 8
},
/turf/open/chasm/lavaland,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bw" = (
/obj/structure/stone_tile/cracked{
dir = 4
@@ -442,7 +442,7 @@
},
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bx" = (
/obj/structure/stone_tile/block{
dir = 1
@@ -453,7 +453,7 @@
},
/obj/effect/decal/cleanable/blood/xeno,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"by" = (
/obj/structure/stone_tile/block{
dir = 1
@@ -463,7 +463,7 @@
dir = 8
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bz" = (
/obj/structure/stone_tile/block/cracked{
dir = 1
@@ -473,7 +473,7 @@
dir = 8
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bA" = (
/obj/structure/stone_tile/cracked{
dir = 1
@@ -487,18 +487,18 @@
/obj/structure/stone_tile,
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bB" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"bC" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
/mob/living/simple_animal/hostile/alien,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"dE" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
@@ -507,13 +507,13 @@
/obj/item/reagent_containers/hypospray/medipen,
/obj/item/clothing/mask/facehugger/impregnated,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"gA" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
/obj/effect/mob_spawn/alien/corpse/humanoid/sentinel,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"iA" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
@@ -521,70 +521,70 @@
/obj/item/weldingtool/largetank,
/obj/item/clothing/mask/facehugger/impregnated,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"lG" = (
/obj/structure/alien/weeds,
/obj/effect/mob_spawn/alien/corpse/humanoid/drone,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"lM" = (
/obj/structure/stone_tile/block{
dir = 4
},
/turf/open/chasm/lavaland,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"nj" = (
/obj/effect/mob_spawn/alien/corpse/humanoid/praetorian,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"tY" = (
/obj/structure/alien/weeds/node,
/obj/effect/mob_spawn/alien/corpse/humanoid/hunter,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"wA" = (
/obj/structure/alien/weeds,
/obj/structure/alien/weeds/node,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"yf" = (
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien/sentinel,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"zj" = (
/obj/structure/stone_tile/block/cracked{
dir = 1
},
/turf/open/chasm/lavaland,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"Dd" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood/gibs,
/obj/item/storage/backpack/duffelbag/sec/surgery,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"Ha" = (
/obj/structure/alien/weeds,
/obj/item/reagent_containers/syringe/alien,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"JM" = (
/obj/structure/alien/weeds/node,
/obj/effect/mob_spawn/alien/corpse/humanoid/drone,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"QG" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
/obj/structure/alien/weeds/node,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"Uh" = (
/obj/structure/alien/weeds,
/obj/item/xenos_claw,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"Vi" = (
/obj/structure/bed/nest,
/obj/structure/alien/weeds,
@@ -593,16 +593,16 @@
/obj/item/radio/headset/headset_cargo/mining,
/obj/item/clothing/mask/facehugger/impregnated,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"VZ" = (
/obj/structure/alien/weeds,
/obj/effect/gibspawner/human,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
"ZT" = (
/obj/effect/mob_spawn/human/corpse/syndicatesoldier,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
/area/ruin/lavaland/unpowered/xenonest)
(1,1,1) = {"
aa
@@ -19,18 +19,18 @@
/area/lavaland/surface/outdoors)
"ae" = (
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"af" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ag" = (
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ah" = (
/obj/structure/toilet,
/obj/effect/turf_decal/tile/bar,
@@ -38,7 +38,7 @@
dir = 1
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ai" = (
/obj/machinery/vending/coffee,
/obj/effect/turf_decal/tile/blue{
@@ -48,7 +48,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aj" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp,
@@ -59,7 +59,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ak" = (
/obj/structure/table/wood,
/obj/item/taperecorder,
@@ -71,7 +71,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"al" = (
/obj/structure/table/wood,
/obj/item/toy/plush/carpplushie,
@@ -82,7 +82,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"am" = (
/obj/machinery/vending/snack,
/obj/effect/turf_decal/tile/blue{
@@ -92,7 +92,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"an" = (
/obj/machinery/sleeper{
dir = 4
@@ -101,10 +101,10 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ao" = (
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ap" = (
/obj/structure/table,
/obj/item/circular_saw,
@@ -112,7 +112,7 @@
pixel_y = 12
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aq" = (
/obj/structure/table,
/obj/item/cautery{
@@ -120,13 +120,13 @@
},
/obj/item/surgicaldrill,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ar" = (
/obj/structure/table,
/obj/item/surgical_drapes,
/obj/item/razor,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"as" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -135,7 +135,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"at" = (
/obj/structure/chair/office/dark{
dir = 1
@@ -147,7 +147,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"au" = (
/obj/structure/chair/office/dark{
dir = 4
@@ -159,7 +159,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"av" = (
/obj/item/reagent_containers/rag,
/obj/item/reagent_containers/spray/cleaner,
@@ -170,14 +170,14 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aw" = (
/obj/structure/bed/roller,
/obj/machinery/light{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ax" = (
/obj/structure/closet/crate/trashcart,
/obj/item/storage/bag/trash,
@@ -203,7 +203,7 @@
dir = 1
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"az" = (
/obj/structure/noticeboard{
dir = 1;
@@ -217,27 +217,27 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aA" = (
/obj/structure/closet/secure_closet/medical2,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aB" = (
/obj/machinery/computer/operating{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aC" = (
/obj/structure/table/optable,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aD" = (
/obj/structure/table,
/obj/item/retractor,
/obj/item/hemostat,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aF" = (
/obj/machinery/door/airlock/shuttle{
name = "Restroom"
@@ -247,11 +247,11 @@
dir = 1
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aG" = (
/obj/structure/extinguisher_cabinet,
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aJ" = (
/turf/open/floor/plasteel/grimy{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
@@ -259,7 +259,7 @@
/area/lavaland/surface/outdoors)
"aK" = (
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aL" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -268,7 +268,7 @@
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aN" = (
/obj/structure/closet/crate/freezer,
/obj/item/reagent_containers/blood/random,
@@ -285,7 +285,7 @@
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aO" = (
/obj/machinery/iv_drip,
/obj/effect/turf_decal/tile/blue{
@@ -295,27 +295,27 @@
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aP" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aQ" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aR" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aS" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -324,7 +324,7 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aT" = (
/obj/structure/closet,
/obj/effect/decal/cleanable/cobweb,
@@ -339,41 +339,41 @@
dir = 8
},
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aU" = (
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aV" = (
/obj/structure/closet/secure_closet/medical1,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aW" = (
/obj/machinery/vending/wallmed{
pixel_y = 28
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aX" = (
/obj/item/stack/cable_coil/random,
/obj/item/stack/sheet/mineral/titanium{
amount = 30
},
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aY" = (
/obj/structure/bodycontainer/morgue,
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"aZ" = (
/obj/effect/decal/cleanable/ash,
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ba" = (
/obj/structure/table/glass,
/obj/item/reagent_containers/glass/beaker,
/obj/item/storage/backpack/duffelbag/med,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bb" = (
/obj/structure/table/reinforced,
/obj/item/laser_pointer,
@@ -381,12 +381,12 @@
dir = 4
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bc" = (
/obj/structure/table/reinforced,
/obj/item/storage/firstaid/regular,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bd" = (
/obj/structure/table/glass,
/obj/item/storage/box/gloves,
@@ -398,43 +398,43 @@
dir = 4
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"be" = (
/obj/effect/decal/cleanable/oil,
/obj/item/storage/toolbox/mechanical,
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bf" = (
/obj/structure/table,
/obj/item/storage/fancy/cigarettes/dromedaryco,
/obj/item/storage/box/matches,
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bg" = (
/mob/living/simple_animal/cockroach,
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bh" = (
/obj/structure/table/glass,
/obj/item/storage/firstaid/brute,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bi" = (
/obj/item/toy/cattoy,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bj" = (
/obj/structure/table/glass,
/obj/item/lazarus_injector,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bk" = (
/obj/structure/reagent_dispensers/fueltank,
/obj/item/flashlight/glowstick/blue,
/obj/item/flashlight/glowstick/blue,
/obj/item/flashlight/glowstick/blue,
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bl" = (
/obj/structure/table,
/obj/item/reagent_containers/food/snacks/cookie{
@@ -465,7 +465,7 @@
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bm" = (
/obj/structure/chair/comfy/teal{
dir = 8
@@ -477,19 +477,19 @@
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bn" = (
/obj/machinery/sleeper{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bo" = (
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bp" = (
/obj/structure/closet/crate/bin,
/obj/item/trash/pistachios,
@@ -502,24 +502,24 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bq" = (
/obj/structure/filingcabinet/chestdrawer/wheeled,
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"br" = (
/obj/structure/chair/office/dark,
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bs" = (
/obj/structure/table/reinforced,
/obj/item/phone,
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bt" = (
/obj/item/kirbyplants,
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bu" = (
/obj/structure/chair/comfy/teal{
dir = 8
@@ -529,19 +529,19 @@
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bv" = (
/obj/effect/mob_spawn/human/doctor/alive/lavaland{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bx" = (
/obj/machinery/door/airlock/medical{
name = "Rejuvenation Pods"
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"by" = (
/obj/structure/table/reinforced,
/obj/item/flashlight/lamp,
@@ -552,23 +552,23 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bz" = (
/obj/structure/table/reinforced,
/obj/item/clothing/glasses/regular,
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bA" = (
/obj/structure/table/reinforced,
/obj/item/paper_bin,
/obj/item/pen/fourcolor,
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bB" = (
/obj/structure/table/reinforced,
/obj/item/storage/box/hug,
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bD" = (
/mob/living/simple_animal/bot/medbot{
desc = "A little medical robot. It's programmed to only act in emergencies.";
@@ -576,7 +576,7 @@
name = "emergency Medibot"
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bE" = (
/obj/structure/closet/crate/critter,
/obj/effect/turf_decal/tile/blue{
@@ -586,7 +586,7 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bF" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -596,7 +596,7 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bG" = (
/obj/structure/chair/comfy/teal{
dir = 8
@@ -609,7 +609,7 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bH" = (
/obj/structure/table,
/obj/item/tank/internals/oxygen,
@@ -621,20 +621,20 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bI" = (
/obj/structure/sign/departments/medbay/alt{
name = "animal hospital"
},
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bJ" = (
/obj/machinery/door/airlock/glass_large{
name = "Ian's Pet Care"
},
/obj/structure/fans/tiny/invisible,
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bL" = (
/obj/vehicle/ridden/scooter/skateboard{
dir = 4
@@ -659,11 +659,11 @@
/obj/structure/table/glass,
/obj/item/storage/firstaid/fire,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bQ" = (
/obj/machinery/light/small,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bR" = (
/obj/structure/table,
/obj/machinery/cell_charger,
@@ -680,7 +680,7 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bS" = (
/obj/structure/closet,
/obj/item/defibrillator/loaded,
@@ -696,7 +696,7 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bT" = (
/obj/item/pickaxe,
/obj/effect/decal/cleanable/blood/old,
@@ -716,7 +716,7 @@
"bW" = (
/obj/structure/fans/tiny/invisible,
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"bX" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 6
@@ -758,25 +758,25 @@
"cc" = (
/obj/machinery/atmospherics/pipe/simple/general/visible,
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cd" = (
/obj/structure/table/reinforced,
/obj/item/clothing/gloves/color/latex,
/obj/item/clothing/mask/surgical,
/obj/item/clothing/suit/apron/surgical,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ce" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1
},
/obj/machinery/portable_atmospherics/pump,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cf" = (
/obj/structure/closet/l3closet,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cg" = (
/obj/machinery/door/airlock/shuttle{
name = "Break Room"
@@ -788,13 +788,13 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ch" = (
/obj/machinery/door/airlock/shuttle{
name = "Operating Theatre"
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ci" = (
/obj/structure/fans/tiny/invisible,
/obj/machinery/door/airlock/shuttle{
@@ -802,31 +802,31 @@
name = "Staff Entrance"
},
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cj" = (
/obj/machinery/door/airlock/shuttle{
name = "Morgue"
},
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"ck" = (
/obj/machinery/door/airlock/shuttle{
name = "Medical Supplies"
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cl" = (
/obj/machinery/door/airlock/shuttle{
name = "Safety Supplies"
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cm" = (
/obj/machinery/door/airlock/shuttle{
name = "Storage"
},
/turf/open/floor/plating,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cn" = (
/obj/machinery/light,
/turf/open/floor/grass{
@@ -849,7 +849,7 @@
dir = 1
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cr" = (
/obj/machinery/light/small{
dir = 8
@@ -861,7 +861,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cs" = (
/obj/machinery/light/small{
dir = 4
@@ -873,7 +873,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cv" = (
/obj/machinery/light/small{
dir = 1
@@ -885,7 +885,7 @@
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cw" = (
/obj/machinery/light/small,
/obj/effect/turf_decal/tile/blue,
@@ -893,7 +893,7 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cx" = (
/obj/machinery/light{
dir = 4
@@ -911,7 +911,7 @@
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cz" = (
/obj/machinery/light{
dir = 1
@@ -923,7 +923,7 @@
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cC" = (
/obj/machinery/light{
dir = 1
@@ -960,7 +960,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cH" = (
/mob/living/simple_animal/bot/cleanbot,
/obj/effect/turf_decal/tile/blue,
@@ -968,12 +968,12 @@
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cI" = (
/obj/structure/table/glass,
/obj/item/storage/firstaid/toxin,
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
"cJ" = (
/obj/machinery/sleeper{
dir = 4
@@ -982,7 +982,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
/area/ruin/lavaland/powered/animal_hospital)
(1,1,1) = {"
aa
@@ -59,7 +59,7 @@
/area/lavaland/surface/outdoors)
"ak" = (
/turf/closed/indestructible/riveted/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"al" = (
/obj/structure/stone_tile/surrounding_tile{
dir = 1
@@ -76,7 +76,7 @@
},
/obj/effect/decal/cleanable/blood,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"an" = (
/obj/structure/stone_tile/surrounding_tile/cracked,
/obj/structure/stone_tile/center,
@@ -89,13 +89,13 @@
/turf/open/lava/smooth{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"ao" = (
/obj/structure/stone_tile/block/cracked,
/turf/open/lava/smooth{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"ap" = (
/obj/structure/stone_tile/surrounding_tile/cracked,
/obj/structure/stone_tile/surrounding_tile/cracked{
@@ -108,7 +108,7 @@
/turf/open/lava/smooth{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aq" = (
/obj/structure/stone_tile/block/cracked{
dir = 8
@@ -129,7 +129,7 @@
/area/lavaland/surface/outdoors)
"as" = (
/turf/closed/wall/mineral/wood,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"at" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -152,7 +152,7 @@
},
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"av" = (
/obj/structure/stone_tile/block,
/obj/structure/stone_tile{
@@ -162,7 +162,7 @@
dir = 4
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aw" = (
/obj/structure/stone_tile/block,
/obj/structure/stone_tile{
@@ -173,7 +173,7 @@
},
/obj/effect/decal/cleanable/blood,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"ax" = (
/obj/structure/stone_tile/block,
/obj/structure/stone_tile/cracked{
@@ -183,7 +183,7 @@
dir = 4
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"ay" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -197,7 +197,7 @@
},
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"az" = (
/obj/structure/stone_tile/block{
dir = 4
@@ -212,7 +212,7 @@
/obj/item/disk/tech_disk/illegal,
/obj/structure/safe,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aB" = (
/obj/structure/stone_tile/block/cracked,
/obj/structure/stone_tile{
@@ -220,12 +220,12 @@
},
/obj/item/t_scanner/adv_mining_scanner/lesser,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aC" = (
/obj/structure/stone_tile/block/cracked,
/obj/item/storage/toolbox/syndicate,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aD" = (
/obj/structure/stone_tile/block/cracked{
dir = 4
@@ -233,7 +233,7 @@
/turf/open/lava/smooth{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aE" = (
/obj/structure/stone_tile{
dir = 4
@@ -246,7 +246,7 @@
/obj/item/reagent_containers/blood/lizard,
/obj/item/stack/sheet/cloth/ten,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aF" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -264,13 +264,13 @@
dir = 8
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aH" = (
/obj/structure/lavaland/ash_walker,
/turf/open/lava/smooth{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aI" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -278,7 +278,7 @@
/turf/open/lava/smooth{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aJ" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 4
@@ -291,7 +291,7 @@
/turf/open/lava/smooth{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aK" = (
/obj/structure/stone_tile/block/cracked{
dir = 8
@@ -302,7 +302,7 @@
/obj/structure/stone_tile,
/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aL" = (
/obj/structure/stone_tile/block{
dir = 1
@@ -310,32 +310,32 @@
/turf/open/lava/smooth{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aM" = (
/obj/structure/stone_tile/cracked{
dir = 4
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aN" = (
/obj/structure/stone_tile{
dir = 1
},
/obj/item/weldingtool/experimental,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aO" = (
/obj/structure/stone_tile/surrounding/cracked{
dir = 1;
icon_state = "cracked_surrounding1"
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aP" = (
/obj/structure/stone_tile,
/obj/item/shard,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aQ" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -343,7 +343,7 @@
/obj/machinery/iv_drip,
/obj/item/reagent_containers/glass/beaker/waterbottle/large,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aR" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -365,7 +365,7 @@
},
/obj/effect/decal/cleanable/blood,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aT" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 8
@@ -380,7 +380,7 @@
/turf/open/lava/smooth{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aW" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -390,7 +390,7 @@
dir = 1
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aY" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -403,7 +403,7 @@
dir = 1
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"aZ" = (
/obj/structure/stone_tile/cracked{
dir = 4
@@ -416,7 +416,7 @@
},
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"ba" = (
/obj/structure/stone_tile/cracked{
dir = 8
@@ -425,7 +425,7 @@
dir = 4
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bc" = (
/obj/structure/stone_tile/block{
dir = 4
@@ -438,7 +438,7 @@
},
/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bg" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -448,7 +448,7 @@
},
/obj/structure/stone_tile,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bh" = (
/obj/structure/stone_tile/block{
dir = 4
@@ -478,7 +478,7 @@
/obj/item/seeds/cotton,
/obj/item/seeds/cotton/durathread,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bk" = (
/obj/structure/stone_tile{
dir = 4
@@ -492,13 +492,13 @@
},
/obj/item/stack/marker_beacon/ten,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bl" = (
/obj/structure/stone_tile/cracked{
dir = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bm" = (
/obj/structure/stone_tile{
dir = 1
@@ -512,7 +512,7 @@
},
/obj/item/construction/rcd/loaded/upgraded,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bn" = (
/obj/structure/closet/crate/radiation,
/obj/item/flashlight/lantern,
@@ -526,7 +526,7 @@
dir = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bo" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -548,7 +548,7 @@
},
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bq" = (
/obj/structure/stone_tile/block{
dir = 1
@@ -558,11 +558,11 @@
dir = 8
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"br" = (
/obj/structure/stone_tile/slab/cracked,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bs" = (
/obj/structure/stone_tile/block/cracked{
dir = 1
@@ -573,7 +573,7 @@
/obj/structure/stone_tile,
/obj/effect/decal/cleanable/blood,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bt" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -587,7 +587,7 @@
},
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bv" = (
/obj/structure/stone_tile/cracked{
dir = 8
@@ -597,7 +597,7 @@
/obj/item/flashlight/lantern,
/obj/item/flashlight/lantern,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bw" = (
/obj/structure/stone_tile/block{
dir = 1
@@ -613,12 +613,12 @@
/obj/item/seeds/tower,
/obj/item/seeds/tower,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bx" = (
/obj/structure/stone_tile/slab/cracked,
/obj/effect/decal/cleanable/blood,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"by" = (
/obj/structure/closet/crate,
/obj/structure/stone_tile/block/cracked{
@@ -632,7 +632,7 @@
/obj/item/flashlight/lantern,
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bz" = (
/obj/structure/stone_tile{
dir = 4
@@ -646,7 +646,7 @@
},
/obj/machinery/the_singularitygen,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bA" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -662,7 +662,7 @@
dir = 8
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bC" = (
/obj/structure/stone_tile/block/cracked{
dir = 4
@@ -674,7 +674,7 @@
dir = 4
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bE" = (
/obj/structure/stone_tile/surrounding_tile{
dir = 8
@@ -690,7 +690,7 @@
/area/lavaland/surface/outdoors)
"bG" = (
/turf/closed/indestructible/riveted/boss/see_through,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"bI" = (
/obj/structure/stone_tile/slab/cracked,
/turf/closed/mineral/volcanic/lava_land_surface,
@@ -994,7 +994,7 @@
dir = 8
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cy" = (
/obj/structure/stone_tile{
dir = 8
@@ -1014,14 +1014,14 @@
},
/obj/item/spear,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cA" = (
/obj/structure/stone_tile/slab/cracked{
dir = 4;
icon_state = "cracked_slab1"
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cB" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -1035,18 +1035,18 @@
},
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cD" = (
/obj/structure/stone_tile/block/cracked{
dir = 4
},
/obj/item/flashlight/lantern,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cE" = (
/obj/structure/stone_tile/surrounding/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cF" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -1059,7 +1059,7 @@
/obj/item/spear,
/obj/item/storage/belt,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cI" = (
/obj/structure/stone_tile/cracked{
dir = 4
@@ -1101,7 +1101,7 @@
/obj/item/spear,
/obj/item/scythe,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cM" = (
/obj/structure/stone_tile/block{
dir = 1
@@ -1113,7 +1113,7 @@
/obj/structure/table/wood,
/obj/item/kitchen/knife/combat/bone,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cN" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -1129,7 +1129,7 @@
/obj/item/spear,
/obj/item/clothing/head/helmet/roman/legionnaire,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cO" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 8
@@ -1169,14 +1169,14 @@
},
/obj/item/surgical_drapes,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cX" = (
/obj/item/storage/box/rxglasses,
/obj/structure/stone_tile{
dir = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cY" = (
/obj/item/seeds/glowshroom,
/obj/item/seeds/glowshroom,
@@ -1184,7 +1184,7 @@
dir = 4
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
/area/ruin/lavaland/unpowered/ash_walkers)
"cZ" = (
/obj/structure/stone_tile/surrounding_tile{
dir = 8
@@ -4,14 +4,14 @@
/area/template_noop)
"b" = (
/turf/closed/wall/mineral/silver,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"c" = (
/obj/machinery/shower{
pixel_y = 16
},
/obj/structure/curtain,
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"e" = (
/obj/structure/mirror{
pixel_y = 28
@@ -20,40 +20,40 @@
pixel_y = 20
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"f" = (
/obj/structure/table/greyscale,
/obj/item/bikehorn/rubberducky,
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"g" = (
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"h" = (
/obj/item/soap,
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"i" = (
/obj/machinery/door/airlock/freezer{
name = "bath house airlock"
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"j" = (
/turf/closed/wall/mineral/wood,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"k" = (
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"l" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/meatballspaghetti,
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"m" = (
/obj/structure/bookcase/random,
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
"n" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
@@ -61,7 +61,7 @@
/obj/structure/bed,
/obj/item/bedsheet,
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
/area/ruin/lavaland/powered/bathhouse)
(1,1,1) = {"
b
@@ -7,7 +7,7 @@
/obj/structure/table,
/obj/item/stack/medical/suture,
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ad" = (
/obj/structure/table,
/obj/item/stack/medical/gauze,
@@ -16,98 +16,98 @@
dir = 1
},
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ae" = (
/obj/machinery/power/smes,
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"af" = (
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ag" = (
/obj/structure/reagent_dispensers/beerkeg,
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ah" = (
/obj/item/reagent_containers/food/drinks/mug,
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ai" = (
/obj/machinery/shower,
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aj" = (
/obj/structure/sink,
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ak" = (
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"al" = (
/obj/effect/decal/cleanable/oil,
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"am" = (
/obj/machinery/door/airlock/hatch,
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"an" = (
/obj/structure/toilet{
dir = 8
},
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ao" = (
/turf/open/floor/plating/ice{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ap" = (
/obj/structure/flora/rock/icy,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aq" = (
/turf/closed/wall/mineral/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ar" = (
/obj/machinery/door/airlock/wood,
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"as" = (
/obj/structure/fans,
/turf/closed/wall/mineral/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"at" = (
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"au" = (
/obj/structure/bed,
/obj/item/bedsheet/blue,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"av" = (
/obj/structure/bookcase/random,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aw" = (
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ax" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/beans,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"ay" = (
/obj/structure/closet/crate/trashcart,
/obj/item/trash/semki,
@@ -115,92 +115,92 @@
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"az" = (
/obj/structure/flora/tree/pine,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aA" = (
/obj/structure/chair/comfy/brown{
dir = 4
},
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aB" = (
/obj/structure/flora/rock/pile/icy,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aC" = (
/obj/structure/flora/tree/dead,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aD" = (
/obj/machinery/door/airlock/wood,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aE" = (
/obj/structure/extinguisher_cabinet,
/turf/closed/wall/mineral/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aF" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/drinks/mug/coco,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aG" = (
/obj/structure/chair/comfy/brown{
dir = 8
},
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aH" = (
/mob/living/simple_animal/hostile/skeleton/eskimo,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aI" = (
/obj/structure/flora/bush,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aJ" = (
/obj/vehicle/ridden/atv,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aL" = (
/obj/structure/displaycase/captain,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aM" = (
/turf/open/floor/carpet,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aN" = (
/obj/structure/bed/dogbed,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aO" = (
/obj/machinery/door/airlock/glass_large,
/obj/structure/fans/tiny,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aP" = (
/obj/structure/fans/tiny,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aQ" = (
/obj/structure/flora/grass/both,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"aR" = (
/obj/structure/flora/tree/pine/xmas,
/obj/item/a_gift{
@@ -212,13 +212,13 @@
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"bl" = (
/turf/open/floor/wood{
initial_gas_mix = "o2=22;n2=82;TEMP=180";
name = "bridge"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"bv" = (
/obj/machinery/light{
dir = 1
@@ -226,20 +226,20 @@
/turf/open/floor/plating/ice{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"bw" = (
/obj/machinery/light/small{
brightness = 3;
dir = 8
},
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"bx" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"by" = (
/obj/machinery/light{
dir = 8
@@ -247,11 +247,11 @@
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"bz" = (
/obj/machinery/light,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"bB" = (
/obj/machinery/light{
dir = 4
@@ -259,7 +259,7 @@
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"bD" = (
/obj/machinery/light{
dir = 1
@@ -267,50 +267,50 @@
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"bM" = (
/obj/machinery/light,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"bN" = (
/obj/machinery/light,
/turf/open/floor/plating/ice{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"dS" = (
/obj/machinery/light/small,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"eb" = (
/obj/machinery/light/small{
dir = 4
},
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"eg" = (
/obj/machinery/vending/coffee,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"gh" = (
/obj/machinery/light/small{
brightness = 3;
dir = 8
},
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"gy" = (
/obj/item/toy/snowball,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"gz" = (
/obj/structure/chair/stool,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"hA" = (
/obj/machinery/light/built{
dir = 1
@@ -319,7 +319,7 @@
/turf/open/floor/pod/dark{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"qt" = (
/obj/machinery/door/airlock/silver,
/obj/structure/fans/tiny,
@@ -327,69 +327,69 @@
dir = 8
},
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"rl" = (
/obj/structure/flora/bush,
/obj/item/toy/snowball,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"tb" = (
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"tl" = (
/turf/open/floor/pod/light,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"xU" = (
/obj/item/storage/toolbox/mechanical,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"zT" = (
/obj/machinery/door/airlock/silver,
/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"AM" = (
/obj/structure/table,
/obj/item/pen,
/obj/item/paper,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"Dd" = (
/obj/structure/rack,
/obj/item/clothing/suit/hooded/wintercoat/science,
/obj/item/clothing/shoes/winterboots,
/obj/item/clothing/gloves/fingerless,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"Ef" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"Ez" = (
/obj/structure/fans/tiny,
/obj/machinery/door/airlock/glass_large,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"HP" = (
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"HR" = (
/obj/structure/closet/secure_closet/freezer/fridge,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"IQ" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/drinks/mug,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"JZ" = (
/obj/structure/table,
/obj/machinery/microwave,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"KS" = (
/obj/item/chainsaw,
/obj/structure/closet,
@@ -397,16 +397,16 @@
dir = 4
},
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"Mp" = (
/obj/item/clothing/mask/balaclava,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"Oj" = (
/obj/structure/table,
/obj/item/reagent_containers/food/drinks/mug,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"PD" = (
/obj/machinery/door/airlock/hatch,
/obj/structure/fans/tiny,
@@ -414,13 +414,13 @@
dir = 4
},
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"PK" = (
/obj/structure/table,
/obj/item/pen,
/obj/item/paper_bin,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"Qa" = (
/obj/effect/mapping_helpers/no_lava,
/obj/effect/mapping_helpers/no_lava,
@@ -434,35 +434,35 @@
/obj/item/storage/fancy/cigarettes/cigpack_carp,
/obj/item/reagent_containers/food/drinks/mug,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"QN" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"Sj" = (
/obj/effect/decal/cleanable/oil,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"SL" = (
/obj/structure/flora/grass/both,
/obj/item/toy/snowball,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"Ub" = (
/obj/structure/filingcabinet,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"UM" = (
/obj/machinery/computer/monitor/secret{
dir = 1
},
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
"Wg" = (
/turf/closed/wall/r_wall,
/area/ruin/powered/snow_biodome)
/area/ruin/lavaland/powered/snow_biodome)
(1,1,1) = {"
aa
@@ -6,41 +6,41 @@
/turf/open/floor/engine/cult{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"c" = (
/turf/open/lava/smooth/lava_land_surface,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"d" = (
/turf/closed/wall/mineral/cult,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"e" = (
/obj/effect/decal/remains/human,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"f" = (
/obj/structure/destructible/cult/pylon,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"g" = (
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/engine/cult{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"i" = (
/obj/effect/decal/remains/human,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/engine/cult{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"k" = (
/obj/effect/decal/remains/human,
/obj/item/melee/cultblade,
/turf/open/floor/engine/cult{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"l" = (
/obj/effect/decal/remains/human,
/obj/item/clothing/shoes/cult,
@@ -48,13 +48,13 @@
/turf/open/floor/engine/cult{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"m" = (
/obj/effect/decal/remains/human,
/turf/open/floor/engine/cult{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"o" = (
/obj/effect/rune/narsie{
color = "#ff0000";
@@ -76,7 +76,7 @@
/turf/open/floor/engine/cult{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"q" = (
/obj/effect/decal/remains/human,
/obj/item/clothing/shoes/cult,
@@ -85,10 +85,10 @@
/turf/open/floor/engine/cult{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"s" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
(1,1,1) = {"
a
@@ -7,74 +7,74 @@
/area/lavaland/surface)
"ac" = (
/turf/closed/mineral/volcanic/lava_land_surface,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ad" = (
/obj/effect/decal/cleanable/cobweb,
/obj/structure/closet/crate/grave/lead_researcher,
/obj/effect/decal/cleanable/blood/gibs/old,
/obj/effect/mob_spawn/human/skeleton,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ae" = (
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"af" = (
/obj/effect/decal/cleanable/blood/drip,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ag" = (
/obj/effect/decal/cleanable/vomit,
/obj/item/shovel,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ah" = (
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ai" = (
/obj/effect/decal/cleanable/blood/tracks{
dir = 4
},
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aj" = (
/obj/effect/decal/cleanable/blood/tracks{
dir = 4
},
/obj/item/paper/fluff/ruins/elephant_graveyard/final_message,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ak" = (
/turf/open/floor/plating/asteroid/basalt/wasteland{
icon_state = "wasteland_dug"
},
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"al" = (
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"am" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"an" = (
/obj/item/reagent_containers/food/snacks/deadmouse,
/obj/item/assembly/mousetrap,
/turf/open/floor/plating/asteroid/basalt/wasteland{
icon_state = "wasteland_dug"
},
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ao" = (
/obj/structure/statue/bone/skull/half,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ap" = (
/obj/structure/statue/bone/skull/half{
dir = 1
},
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aq" = (
/obj/item/reagent_containers/glass/bottle/frostoil{
desc = "A small bottle. Contains cold sauce. There's a label on here: APPLY ON SEVERE BURNS.";
@@ -82,11 +82,11 @@
},
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ar" = (
/obj/structure/flora/rock,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"as" = (
/obj/structure/flora/rock,
/obj/item/pickaxe{
@@ -96,7 +96,7 @@
},
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"at" = (
/turf/closed/mineral/strong/wasteland,
/area/lavaland/surface)
@@ -105,47 +105,47 @@
/obj/item/t_scanner/adv_mining_scanner/lesser,
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"av" = (
/obj/structure/barricade/wooden/crude,
/obj/structure/barricade/wooden,
/obj/effect/decal/cleanable/blood/splatter,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aw" = (
/obj/structure/table,
/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/rnd_notes,
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ax" = (
/obj/structure/statue/bone/rib{
dir = 1
},
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ay" = (
/obj/structure/statue/bone/rib,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"az" = (
/obj/structure/table,
/obj/item/pen,
/obj/item/pen,
/obj/item/pen,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aA" = (
/turf/closed/wall,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aB" = (
/obj/item/chair,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aC" = (
/obj/effect/decal/remains/human,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aD" = (
/obj/structure/table,
/obj/item/reagent_containers/glass/bottle/plasma{
@@ -153,80 +153,80 @@
},
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aE" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aF" = (
/obj/structure/table,
/obj/machinery/power/floodlight,
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aG" = (
/obj/structure/table,
/obj/effect/spawner/lootdrop/glowstick,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aH" = (
/turf/closed/wall/mineral/titanium,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"aI" = (
/obj/effect/spawner/structure/window/shuttle,
/obj/structure/grille,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"aJ" = (
/obj/structure/table,
/obj/item/clipboard,
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aK" = (
/obj/item/cigbutt,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aL" = (
/obj/structure/table,
/obj/item/paper_bin,
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aM" = (
/obj/structure/table,
/obj/item/clothing/gloves/color/black,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aN" = (
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"aO" = (
/obj/effect/decal/cleanable/glass,
/obj/machinery/computer,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"aP" = (
/obj/structure/bed,
/obj/item/flashlight/lantern,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aQ" = (
/obj/machinery/power/floodlight,
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aR" = (
/obj/structure/table,
/obj/item/taperecorder,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aS" = (
/obj/structure/table,
/obj/item/tape/random,
/obj/item/tape/random,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aT" = (
/obj/structure/closet/crate/bin,
/obj/item/trash/candle,
@@ -235,124 +235,124 @@
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/cigbutt,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aU" = (
/obj/structure/bed,
/obj/item/bedsheet/brown,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aV" = (
/obj/structure/bed,
/obj/item/bedsheet/brown,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aW" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/item/clothing/mask/gas/explorer/folded,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"aX" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aY" = (
/obj/structure/sign/warning/nosmoking/circle,
/turf/closed/wall,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"aZ" = (
/obj/item/organ/brain,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ba" = (
/obj/structure/headpike/bone,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bb" = (
/obj/effect/decal/cleanable/oil/streak,
/obj/effect/decal/cleanable/glass,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bc" = (
/obj/structure/sign/poster/ripped,
/turf/closed/wall,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bd" = (
/obj/item/organ/heart,
/obj/item/organ/eyes,
/obj/item/organ/ears,
/obj/effect/decal/cleanable/blood/gibs/old,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"be" = (
/obj/item/organ/lungs,
/obj/item/organ/liver,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bf" = (
/turf/closed/mineral/strong/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bg" = (
/obj/structure/sign/warning/securearea,
/turf/closed/wall/mineral/titanium,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bh" = (
/obj/effect/decal/cleanable/oil,
/obj/structure/chair/office/light,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bi" = (
/obj/effect/turf_decal/delivery/white,
/turf/open/floor/circuit/off,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bj" = (
/obj/structure/barricade/wooden,
/obj/structure/mineral_door/wood,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bk" = (
/obj/item/kitchen/knife/combat/bone,
/obj/item/organ/tongue,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bl" = (
/obj/effect/decal/cleanable/shreds,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bm" = (
/obj/structure/closet/wardrobe/curator,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bn" = (
/obj/structure/sink/oil_well,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bo" = (
/obj/item/stack/medical/gauze/improvised,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bp" = (
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bq" = (
/obj/machinery/iv_drip,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"br" = (
/obj/structure/sign/warning/nosmoking/circle,
/turf/closed/wall/mineral/titanium,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bs" = (
/obj/structure/fence/door,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bt" = (
/obj/structure/table,
/turf/closed/mineral/strong/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bu" = (
/obj/structure/bed,
/obj/item/trash/pistachios,
@@ -360,54 +360,54 @@
/obj/item/bedsheet/brown,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bv" = (
/obj/effect/decal/remains/human,
/obj/item/clothing/under/misc/overalls,
/obj/item/clothing/mask/bandana/green,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bw" = (
/obj/structure/rack,
/obj/item/shovel,
/obj/item/wrench,
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bx" = (
/obj/item/reagent_containers/food/snacks/deadmouse,
/obj/item/assembly/mousetrap,
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"by" = (
/obj/structure/closet/emcloset,
/obj/item/light/bulb,
/obj/effect/turf_decal/box/white,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bz" = (
/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/mutiny,
/obj/item/cigbutt,
/obj/item/cigbutt,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bA" = (
/obj/machinery/suit_storage_unit/mining/eva,
/obj/effect/turf_decal/box/white,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bB" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bC" = (
/obj/structure/barricade/sandbags,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bD" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bE" = (
/obj/structure/shuttle/engine/heater,
/obj/structure/window{
@@ -415,17 +415,17 @@
},
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bF" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bG" = (
/obj/effect/decal/remains/human,
/obj/item/tank/internals/emergency_oxygen/empty,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bH" = (
/obj/item/paper/fluff/ruins/elephant_graveyard,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
@@ -433,70 +433,70 @@
"bI" = (
/obj/structure/shuttle/engine/propulsion,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bJ" = (
/obj/structure/sign/warning/xeno_mining,
/turf/closed/wall,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bK" = (
/obj/structure/sign/warning/explosives,
/turf/closed/wall,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bL" = (
/obj/effect/decal/cleanable/blood/gibs/old,
/obj/effect/decal/cleanable/blood/splatter,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bM" = (
/obj/item/storage/fancy/cigarettes/cigpack_mindbreaker,
/obj/structure/closet/crate/grave,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bN" = (
/obj/structure/sign/warning/securearea,
/obj/structure/sign/warning/securearea,
/turf/closed/mineral/strong/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bO" = (
/obj/item/paper/fluff/ruins/elephant_graveyard,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bP" = (
/obj/structure/barricade/wooden/crude,
/obj/item/paper/fluff/ruins/elephant_graveyard,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bQ" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/effect/decal/cleanable/cobweb,
/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bR" = (
/obj/effect/decal/cleanable/generic,
/obj/item/cigbutt,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bS" = (
/obj/effect/decal/cleanable/oil/slippery,
/obj/machinery/rnd/destructive_analyzer,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bT" = (
/obj/structure/barricade/wooden,
/obj/item/paper/fluff/ruins/elephant_graveyard,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bU" = (
/obj/item/light/bulb/broken,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bV" = (
/obj/effect/decal/cleanable/dirt,
/turf/closed/mineral/volcanic/lava_land_surface,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bW" = (
/obj/effect/decal/cleanable/glass,
/obj/effect/decal/cleanable/dirt/dust,
@@ -504,19 +504,19 @@
name = "archaeology shuttle airlock"
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bX" = (
/obj/effect/decal/remains/human,
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/clothing/head/fedora/curator,
/obj/item/clothing/suit/curator,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"bY" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/cigbutt,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"bZ" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface)
@@ -524,84 +524,84 @@
/obj/structure/table,
/obj/item/storage/firstaid/o2,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cb" = (
/obj/machinery/power/port_gen/pacman,
/obj/effect/mapping_helpers/network_builder/power_cable,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cc" = (
/obj/effect/decal/remains/human,
/obj/effect/decal/cleanable/blood/old,
/obj/effect/decal/cleanable/shreds,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cd" = (
/obj/item/trash/can,
/obj/structure/bedsheetbin/empty,
/obj/structure/table,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ce" = (
/obj/structure/stone_tile/slab/cracked,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cf" = (
/obj/structure/bed,
/obj/item/wirecutters,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cg" = (
/obj/structure/stone_tile/center/cracked,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ch" = (
/obj/effect/decal/remains/human,
/obj/item/restraints/handcuffs/cable/zipties/used,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ci" = (
/obj/structure/stone_tile/surrounding_tile,
/turf/open/floor/plating/asteroid/basalt/wasteland{
icon_state = "wasteland_dug"
},
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cj" = (
/obj/structure/stone_tile/block/cracked,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ck" = (
/obj/structure/reagent_dispensers/water_cooler,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cl" = (
/obj/structure/closet/crate/grave,
/obj/effect/mob_spawn/human/skeleton,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cm" = (
/obj/structure/table/optable,
/obj/item/storage/backpack/explorer,
/obj/item/reagent_containers/food/drinks/soda_cans/cola,
/obj/item/restraints/handcuffs/cable/zipties/used,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"cn" = (
/obj/structure/stone_tile/cracked,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"co" = (
/obj/effect/decal/cleanable/blood/drip,
/obj/structure/stone_tile/cracked,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cq" = (
/obj/structure/stone_tile/block/cracked{
dir = 4
},
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cr" = (
/obj/structure/bonfire/prelit,
/obj/effect/decal/cleanable/ash,
@@ -609,42 +609,42 @@
/obj/effect/decal/cleanable/blood/old,
/obj/structure/stone_tile/slab/cracked,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cs" = (
/obj/structure/ore_box,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"ct" = (
/obj/structure/stone_tile,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cu" = (
/obj/structure/stone_tile{
dir = 8
},
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cv" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"cw" = (
/obj/structure/closet/crate/grave,
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/mob_spawn/human/skeleton,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
"cx" = (
/obj/item/light/bulb/broken,
/obj/effect/turf_decal/caution/stand_clear/white,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/graveyard_shuttle)
/area/ruin/lavaland/powered/graveyard_shuttle)
"cz" = (
/obj/structure/stone_tile,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
/area/ruin/lavaland/unpowered/elephant_graveyard)
(1,1,1) = {"
aa
@@ -10,7 +10,7 @@
/area/lavaland/surface/outdoors)
"d" = (
/turf/closed/wall/rust,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"f" = (
/obj/structure/mirror{
broken = 1;
@@ -21,7 +21,7 @@
/obj/item/clothing/suit/hooded/bloated_human,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"g" = (
/obj/effect/decal/cleanable/blood/tracks,
/obj/structure/mirror{
@@ -31,18 +31,18 @@
pixel_x = -28
},
/turf/open/floor/plating,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"h" = (
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"i" = (
/turf/open/floor/plating,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"j" = (
/obj/effect/decal/cleanable/blood/splatter,
/turf/open/floor/plating,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"k" = (
/obj/structure/mirror{
broken = 1;
@@ -53,7 +53,7 @@
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"l" = (
/obj/structure/mirror{
broken = 1;
@@ -62,7 +62,7 @@
pixel_x = 28
},
/turf/open/floor/plating,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"m" = (
/obj/structure/mirror{
broken = 1;
@@ -71,12 +71,12 @@
pixel_x = -28
},
/turf/open/floor/plating,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"n" = (
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"o" = (
/obj/structure/mirror{
broken = 1;
@@ -87,11 +87,11 @@
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"p" = (
/obj/machinery/door/airlock/hatch,
/turf/open/floor/plating,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"A" = (
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
@@ -105,7 +105,7 @@
},
/obj/item/kitchen/knife/envy,
/turf/open/floor/plating,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
(1,1,1) = {"
a
@@ -10,115 +10,115 @@
/area/lavaland/surface/outdoors)
"e" = (
/turf/open/lava/smooth,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"f" = (
/obj/item/reagent_containers/syringe/gluttony,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"g" = (
/obj/effect/gluttony,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"h" = (
/obj/item/trash/boritos,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"i" = (
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"j" = (
/obj/item/trash/plate,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"l" = (
/obj/item/trash/candy,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"m" = (
/obj/item/trash/raisins,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"n" = (
/obj/item/trash/pistachios,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"o" = (
/obj/item/trash/popcorn,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"p" = (
/obj/item/trash/semki,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"q" = (
/obj/item/trash/syndi_cakes,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"r" = (
/obj/effect/gluttony,
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"t" = (
/obj/machinery/light/small{
dir = 1
},
/obj/item/trash/plate/alt,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"v" = (
/obj/machinery/light/small,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"z" = (
/obj/item/trash/plate,
/obj/machinery/light/small{
dir = 8
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"A" = (
/obj/machinery/light/small{
dir = 4
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"B" = (
/obj/item/veilrender/vealrender,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"E" = (
/obj/machinery/light/small,
/obj/item/trash/cheesie,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"G" = (
/obj/item/trash/waffles,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"L" = (
/obj/machinery/light/small,
/obj/item/trash/plate/alt,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"N" = (
/obj/item/trash/cheesie,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"R" = (
/turf/closed/indestructible/riveted/uranium,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"S" = (
/obj/machinery/door/airlock/uranium,
/obj/structure/fans/tiny/invisible,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
"Z" = (
/obj/item/trash/plate/alt,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
/area/ruin/lavaland/powered/gluttony)
(1,1,1) = {"
a
@@ -17,11 +17,11 @@
/turf/open/floor/carpet{
icon_state = "carpetsymbol"
},
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"f" = (
/obj/structure/cursed_slot_machine,
/turf/open/floor/carpet/black,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"g" = (
/obj/structure/table/wood/poker,
/obj/item/coin/mythril,
@@ -31,48 +31,48 @@
/turf/open/floor/carpet{
icon_state = "carpetsymbol"
},
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"h" = (
/obj/structure/table/wood/poker,
/obj/item/coin/diamond,
/turf/open/floor/carpet{
icon_state = "carpetsymbol"
},
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"j" = (
/obj/structure/table/wood/poker,
/obj/item/coin/adamantine,
/turf/open/floor/carpet{
icon_state = "carpetsymbol"
},
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"k" = (
/obj/machinery/computer/arcade/battle{
set_obj_flags = "EMAGGED"
},
/turf/open/floor/carpet/black,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"l" = (
/obj/item/coin/gold,
/turf/open/floor/carpet/black,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"m" = (
/turf/open/floor/carpet/black,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"n" = (
/obj/structure/table/wood/poker,
/obj/item/stack/spacecash/c1000,
/turf/open/floor/carpet,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"o" = (
/obj/item/storage/bag/money,
/turf/open/floor/carpet/black,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"p" = (
/obj/structure/table/wood/poker,
/obj/item/stack/ore/gold,
/turf/open/floor/carpet,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"q" = (
/obj/structure/table/wood/poker,
/obj/item/stack/spacecash/c20,
@@ -82,19 +82,19 @@
dir = 8
},
/turf/open/floor/carpet,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"r" = (
/obj/structure/table/wood/poker,
/obj/item/stack/spacecash/c500,
/obj/item/stack/spacecash/c100,
/obj/item/stack/spacecash/c1000,
/turf/open/floor/carpet,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"s" = (
/obj/structure/table/wood/poker,
/obj/item/stack/spacecash/c200,
/turf/open/floor/carpet,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"u" = (
/obj/structure/table/wood/poker,
/obj/item/stack/spacecash/c500,
@@ -104,30 +104,30 @@
dir = 4
},
/turf/open/floor/carpet,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"v" = (
/obj/item/coin/gold,
/obj/machinery/light/small,
/turf/open/floor/carpet/black,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"w" = (
/obj/item/storage/bag/money,
/obj/machinery/light/small,
/turf/open/floor/carpet/black,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"H" = (
/turf/open/floor/carpet/purple,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"J" = (
/obj/machinery/door/airlock/gold,
/obj/structure/fans/tiny/invisible,
/turf/open/floor/carpet/purple,
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
"W" = (
/turf/closed/wall/mineral/cult{
sheet_amount = 0
},
/area/ruin/powered/greed)
/area/ruin/lavaland/powered/greed)
(1,1,1) = {"
a
@@ -4,57 +4,57 @@
/area/lavaland/surface/outdoors)
"b" = (
/turf/closed/mineral/volcanic/lava_land_surface,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"c" = (
/turf/closed/wall/mineral/iron,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"d" = (
/obj/item/clothing/head/helmet/space/orange,
/obj/item/clothing/mask/breath,
/turf/open/floor/plating/asteroid/basalt,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"e" = (
/obj/item/clothing/suit/space/orange,
/turf/open/floor/plating/asteroid/basalt,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"f" = (
/turf/open/floor/plating/asteroid/basalt,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"g" = (
/turf/open/floor/plating/asteroid{
name = "dirt"
},
/area/ruin/powered)
/area/ruin/lavaland/powered)
"h" = (
/obj/item/shovel,
/turf/open/floor/plating/asteroid{
name = "dirt"
},
/area/ruin/powered)
/area/ruin/lavaland/powered)
"i" = (
/obj/item/reagent_containers/glass/bucket,
/turf/open/floor/plating/asteroid{
name = "dirt"
},
/area/ruin/powered)
/area/ruin/lavaland/powered)
"j" = (
/obj/structure/sink/puddle,
/turf/open/floor/plating/asteroid{
name = "dirt"
},
/area/ruin/powered)
/area/ruin/lavaland/powered)
"k" = (
/obj/structure/glowshroom/single,
/turf/open/floor/plating/asteroid{
name = "dirt"
},
/area/ruin/powered)
/area/ruin/lavaland/powered)
"l" = (
/obj/item/storage/toolbox/emergency,
/turf/open/floor/plating/asteroid{
name = "dirt"
},
/area/ruin/powered)
/area/ruin/lavaland/powered)
"m" = (
/obj/structure/rack,
/obj/item/seeds/reishi,
@@ -62,79 +62,79 @@
/obj/item/seeds/plump,
/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom,
/turf/open/floor/plating/asteroid/basalt,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"n" = (
/obj/machinery/hydroponics/soil,
/turf/open/floor/plating,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"o" = (
/turf/open/floor/plating,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"p" = (
/obj/structure/rack,
/obj/item/storage/bag/plants/portaseeder,
/obj/item/storage/bag/ore,
/obj/item/storage/firstaid/regular,
/turf/open/floor/plating/asteroid/basalt,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"q" = (
/obj/structure/glowshroom/single,
/turf/open/floor/plating,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"r" = (
/obj/structure/rack,
/obj/item/pickaxe/emergency,
/obj/item/tank/internals/oxygen,
/turf/open/floor/plating/asteroid/basalt,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"s" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"t" = (
/turf/closed/wall/mineral/titanium/survival/pod,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"u" = (
/obj/structure/bed/pod,
/obj/item/bedsheet/black,
/turf/open/floor/plating,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"v" = (
/obj/structure/fans,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"w" = (
/obj/machinery/smartfridge/survival_pod,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"x" = (
/obj/effect/mob_spawn/human/hermit,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"y" = (
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"z" = (
/obj/machinery/light/small{
dir = 4
},
/obj/structure/tubes,
/turf/open/floor/plating,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"A" = (
/obj/structure/table,
/obj/item/kitchen/knife/combat/survival,
/turf/open/floor/plating,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"B" = (
/obj/structure/table/survival_pod,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"C" = (
/obj/structure/tubes,
/obj/item/crowbar,
/obj/effect/decal/cleanable/blood/drip,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"D" = (
/obj/effect/decal/cleanable/blood/footprints{
dir = 1;
@@ -143,37 +143,37 @@
/obj/machinery/door/airlock/survival_pod/glass,
/obj/structure/fans/tiny,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"E" = (
/obj/structure/shuttle/engine/propulsion/burst{
dir = 8
},
/turf/closed/wall/mineral/titanium/interior,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"F" = (
/turf/closed/wall/mineral/titanium,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"G" = (
/turf/closed/wall/mineral/titanium/interior,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"H" = (
/obj/machinery/door/airlock/titanium{
name = "Escape Pod Airlock"
},
/turf/open/floor/mineral/titanium/blue,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"I" = (
/obj/structure/chair{
dir = 4
},
/turf/open/floor/mineral/titanium/blue,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"J" = (
/obj/effect/spawner/structure/window/shuttle,
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/powered)
/area/ruin/lavaland/powered)
(1,1,1) = {"
a
@@ -1,35 +1,35 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted/hierophant,
/area/ruin/unpowered/hierophant)
/area/ruin/lavaland/unpowered/hierophant)
"b" = (
/turf/open/indestructible/hierophant,
/area/ruin/unpowered/hierophant)
/area/ruin/lavaland/unpowered/hierophant)
"c" = (
/obj/effect/light_emitter{
set_cap = 3;
set_luminosity = 5
},
/turf/open/indestructible/hierophant,
/area/ruin/unpowered/hierophant)
/area/ruin/lavaland/unpowered/hierophant)
"d" = (
/mob/living/simple_animal/hostile/megafauna/hierophant,
/turf/open/indestructible/hierophant/two,
/area/ruin/unpowered/hierophant)
/area/ruin/lavaland/unpowered/hierophant)
"e" = (
/turf/open/indestructible/hierophant/two,
/area/ruin/unpowered/hierophant)
/area/ruin/lavaland/unpowered/hierophant)
"f" = (
/obj/effect/light_emitter{
set_cap = 3;
set_luminosity = 5
},
/turf/open/indestructible/hierophant/two,
/area/ruin/unpowered/hierophant)
/area/ruin/lavaland/unpowered/hierophant)
"s" = (
/obj/item/tcg_card/special/hierophant,
/turf/open/indestructible/hierophant,
/area/ruin/unpowered/hierophant)
/area/ruin/lavaland/unpowered/hierophant)
(1,1,1) = {"
a
@@ -7,145 +7,145 @@
/obj/item/documents/syndicate/mining,
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ac" = (
/turf/closed/wall/mineral/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ad" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"ae" = (
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"af" = (
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ag" = (
/obj/item/feather,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ah" = (
/obj/structure/bookcase/random,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ai" = (
/obj/structure/table/wood/fancy/black,
/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary2,
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"al" = (
/turf/closed/wall/mineral/iron,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"am" = (
/obj/structure/table/wood/fancy/black,
/obj/item/book_of_babel,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ao" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ap" = (
/obj/item/stack/sheet/mineral/wood,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aq" = (
/obj/structure/bookcase/random,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ar" = (
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"as" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/paper/fluff/ruins/oldstation/protosing,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aw" = (
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ay" = (
/obj/machinery/door/keycard/library,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"az" = (
/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aA" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aC" = (
/obj/item/feather,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aD" = (
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aE" = (
/obj/item/stack/sheet/mineral/wood,
/obj/item/book/manual/random,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aF" = (
/obj/item/book/manual/random,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aG" = (
/obj/structure/table/bronze,
/obj/item/stack/ore/slag,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aH" = (
/obj/structure/table/bronze,
/obj/item/statuebust,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aI" = (
/obj/effect/mob_spawn/human/skeleton,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aJ" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aK" = (
/obj/item/feather,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aL" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/fluff/paper/stack,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aM" = (
/obj/item/stack/sheet/mineral/wood,
/obj/item/book/manual/random,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aN" = (
/obj/structure/statue/sandstone/venus,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aP" = (
/obj/item/keycard/library,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aQ" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aR" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aS" = (
/obj/structure/table/wood/fancy/black,
/obj/effect/decal/cleanable/dirt,
@@ -154,74 +154,74 @@
on = 1
},
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aV" = (
/obj/item/stack/sheet/mineral/wood,
/obj/structure/fluff/paper/stack,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aW" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aX" = (
/obj/structure/table/bronze,
/obj/item/statuebust,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"aY" = (
/obj/structure/table_frame/wood,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"ba" = (
/obj/structure/barricade/wooden/crude,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bg" = (
/obj/item/paper/fluff/ruins/oldstation/protogun,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bh" = (
/obj/effect/decal/cleanable/dirt,
/mob/living/simple_animal/pet/fox,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bi" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bj" = (
/obj/item/book/manual/random,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bl" = (
/obj/item/storage/box/fountainpens,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bm" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bn" = (
/obj/item/book/manual/random,
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bo" = (
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bp" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bq" = (
/obj/structure/mineral_door/wood,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"br" = (
/obj/structure/girder,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bt" = (
/obj/effect/decal/cleanable/dirt,
/turf/template_noop,
@@ -236,21 +236,21 @@
"by" = (
/obj/item/statuebust,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bz" = (
/obj/item/flashlight/lantern/jade{
on = 1
},
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bA" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
"bB" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
/area/ruin/lavaland/unpowered/buried_library)
(1,1,1) = {"
aa
@@ -1,7 +1,7 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"b" = (
/turf/closed/wall/mineral/wood/nonmetal,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"c" = (
/obj/structure/closet/toolcloset,
/obj/item/wrench,
@@ -11,7 +11,7 @@
/obj/item/wirecutters,
/obj/item/radio/off,
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"d" = (
/turf/open/openspace/icemoon,
/area/template_noop)
@@ -25,14 +25,14 @@
/obj/structure/closet,
/obj/item/clothing/shoes/jackboots,
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"f" = (
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"g" = (
/obj/structure/fireplace,
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"h" = (
/obj/structure/flora/ash/cacti,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
@@ -43,34 +43,34 @@
"j" = (
/obj/structure/sink/kitchen,
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"k" = (
/obj/structure/closet/crate/freezer,
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"l" = (
/obj/machinery/vending/dinnerware,
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"m" = (
/obj/structure/mineral_door/wood,
/obj/effect/decal/cleanable/trail_holder,
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"n" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"o" = (
/obj/item/reagent_containers/food/drinks/beer,
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"p" = (
/obj/machinery/light/broken{
dir = 4
},
/obj/effect/decal/cleanable/trail_holder,
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"q" = (
/obj/structure/table/wood,
/obj/item/pen,
@@ -82,7 +82,7 @@
text = ""
},
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"r" = (
/obj/item/chair/wood,
/obj/effect/decal/cleanable/blood/splatter,
@@ -91,11 +91,11 @@
dir = 8
},
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"s" = (
/obj/effect/decal/cleanable/trail_holder,
/turf/open/floor/wood,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"N" = (
/obj/effect/decal/cleanable/trail_holder,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
@@ -11,13 +11,13 @@
/area/lavaland/surface/outdoors)
"d" = (
/turf/closed/wall,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"e" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"f" = (
/obj/structure/table/wood,
/obj/item/storage/box/cups,
@@ -25,7 +25,7 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"g" = (
/obj/structure/reagent_dispensers/water_cooler{
name = "punch cooler";
@@ -35,27 +35,27 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"h" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"i" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"j" = (
/obj/item/reagent_containers/food/snacks/pizzaslice/mushroom,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"k" = (
/obj/structure/table/wood,
/obj/effect/spawner/lootdrop/pizzaparty,
@@ -63,7 +63,7 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"l" = (
/obj/machinery/light{
dir = 4
@@ -75,42 +75,42 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"m" = (
/obj/item/chair/wood/wings,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"n" = (
/obj/structure/glowshroom/single,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"o" = (
/obj/item/trash/plate,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"p" = (
/obj/effect/decal/remains/human,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"q" = (
/obj/item/chair/wood/wings,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"r" = (
/obj/structure/chair/wood/wings,
/obj/effect/decal/remains/human,
@@ -121,25 +121,25 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"s" = (
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"t" = (
/obj/structure/chair/wood/wings,
/obj/effect/decal/remains/human,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"u" = (
/obj/structure/glowshroom/single,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"v" = (
/obj/structure/lattice,
/obj/item/chair/wood/wings,
@@ -151,21 +151,21 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"x" = (
/obj/structure/table/wood,
/obj/effect/spawner/lootdrop/pizzaparty,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"y" = (
/obj/structure/table/wood,
/obj/item/trash/plate,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"z" = (
/obj/structure/table/wood,
/obj/structure/glowshroom/single,
@@ -173,7 +173,7 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"A" = (
/obj/structure/table/wood,
/obj/item/trash/plate,
@@ -181,14 +181,14 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"B" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/trash/candy,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"C" = (
/obj/structure/chair/wood/wings{
dir = 4
@@ -198,7 +198,7 @@
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"D" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/pizzaslice/margherita,
@@ -206,48 +206,48 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"E" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/pizzaslice/meat,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"F" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/store/cake/birthday,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"G" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/lollipop,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"H" = (
/obj/item/chair/wood/wings,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"I" = (
/obj/item/kitchen/fork,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"J" = (
/obj/structure/glowshroom/single,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"K" = (
/obj/structure/chair/wood/wings{
dir = 1
@@ -257,21 +257,21 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"L" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"M" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/a_gift,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"N" = (
/obj/structure/lattice,
/obj/effect/decal/cleanable/dirt,
@@ -283,7 +283,7 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"P" = (
/obj/machinery/light{
dir = 4
@@ -292,12 +292,12 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"Q" = (
/turf/open/floor/plating{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"R" = (
/obj/structure/table/wood,
/obj/effect/spawner/lootdrop/pizzaparty,
@@ -306,27 +306,27 @@
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"V" = (
/obj/item/reagent_containers/food/snacks/gumball,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"X" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/toy/snappop,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"Z" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/reagent_containers/food/snacks/gumball,
/turf/open/floor/wood{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
(1,1,1) = {"
a
@@ -4,7 +4,7 @@
/area/lavaland/surface/outdoors)
"b" = (
/turf/closed/wall/mineral/diamond,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"c" = (
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
@@ -13,20 +13,20 @@
pixel_x = -32
},
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"f" = (
/obj/structure/mirror{
pixel_x = 32
},
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"g" = (
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"i" = (
/obj/item/clothing/gloves/ring,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"j" = (
/obj/structure/mirror{
pixel_x = -32
@@ -35,11 +35,11 @@
dir = 1
},
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"k" = (
/obj/structure/mirror/magic/pride,
/turf/closed/wall/mineral/diamond,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"l" = (
/obj/structure/mirror{
pixel_x = -32
@@ -49,7 +49,7 @@
dir = 8
},
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"m" = (
/obj/structure/mirror{
pixel_x = 32
@@ -58,43 +58,43 @@
dir = 4
},
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"o" = (
/obj/structure/mirror{
pixel_x = -32
},
/obj/item/lipstick/random,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"q" = (
/obj/structure/mirror{
pixel_x = -32
},
/obj/item/clothing/gloves/ring/silver,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"r" = (
/obj/machinery/light/small,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"u" = (
/obj/structure/mirror{
pixel_x = 32
},
/obj/item/lipstick/random,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"D" = (
/obj/item/clothing/head/wig/random,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"G" = (
/turf/closed/mineral/volcanic/lava_land_surface,
/area/lavaland/surface/outdoors)
"I" = (
/obj/item/clothing/gloves/ring/silver,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"J" = (
/obj/structure/mirror{
pixel_x = 32
@@ -103,25 +103,25 @@
dir = 1
},
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"L" = (
/obj/item/lipstick/random,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"O" = (
/obj/item/clothing/gloves/ring/diamond,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"V" = (
/obj/item/clothing/head/wig,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
"Y" = (
/obj/machinery/door/airlock/silver/glass,
/turf/open/floor/mineral/silver{
blocks_air = 1
},
/area/ruin/powered/pride)
/area/ruin/lavaland/powered/pride)
(1,1,1) = {"
a
@@ -14,29 +14,29 @@
/obj/item/storage/fancy/rollingpapers,
/obj/item/storage/fancy/rollingpapers,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"e" = (
/obj/structure/table/wood,
/obj/item/storage/box/disks_plantgene,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"f" = (
/obj/machinery/plantgenes/seedvault{
pixel_y = 6
},
/obj/structure/table/wood,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"g" = (
/obj/structure/table/wood,
/obj/machinery/smartfridge/disks{
pixel_y = 2
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"h" = (
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"i" = (
/obj/structure/closet/crate/hydroponics,
/obj/structure/beebox,
@@ -48,7 +48,7 @@
/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"j" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8
@@ -59,11 +59,11 @@
/obj/structure/closet/crate,
/obj/effect/spawner/lootdrop/seed_vault,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"l" = (
/obj/machinery/door/airlock,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"m" = (
/obj/machinery/door/airlock/external,
/obj/structure/fans/tiny,
@@ -71,11 +71,11 @@
dir = 8
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"n" = (
/obj/machinery/smartfridge,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"o" = (
/obj/structure/closet/crate/hydroponics,
/obj/item/cultivator,
@@ -91,18 +91,18 @@
/obj/item/hatchet,
/obj/item/hatchet,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"p" = (
/obj/machinery/hydroponics/constructable,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"q" = (
/obj/item/hatchet,
/obj/item/storage/bag/plants,
/obj/item/reagent_containers/glass/bucket,
/obj/structure/table/wood,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"r" = (
/obj/structure/table/wood,
/obj/item/storage/bag/plants,
@@ -110,7 +110,7 @@
/obj/item/storage/bag/plants,
/obj/item/storage/bag/plants,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"s" = (
/obj/structure/table/wood,
/obj/item/gun/energy/floragun,
@@ -119,11 +119,11 @@
/obj/item/gun/energy/floragun,
/obj/item/storage/box/disks_plantgene,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"t" = (
/obj/effect/mob_spawn/human/seed_vault,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"u" = (
/obj/structure/sink{
dir = 8;
@@ -131,15 +131,15 @@
pixel_y = 2
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"v" = (
/obj/machinery/vending/hydronutrients,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"w" = (
/obj/machinery/vending/hydroseeds,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"x" = (
/obj/machinery/reagentgrinder{
pixel_y = 5
@@ -150,42 +150,42 @@
/obj/item/reagent_containers/glass/beaker/bluespace,
/obj/item/reagent_containers/glass/beaker/bluespace,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"y" = (
/obj/structure/sink{
dir = 4;
pixel_x = 11
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"z" = (
/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"B" = (
/obj/structure/disposalpipe/trunk,
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"C" = (
/obj/machinery/seed_extractor,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"D" = (
/obj/machinery/biogenerator,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"E" = (
/obj/machinery/chem_dispenser/mutagensaltpeter,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"F" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"G" = (
/obj/structure/closet/crate/hydroponics,
/obj/item/clothing/under/rank/civilian/hydroponics,
@@ -193,11 +193,11 @@
/obj/item/clothing/under/rank/civilian/hydroponics,
/obj/item/clothing/under/rank/civilian/hydroponics,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"H" = (
/obj/machinery/chem_master/condimaster,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"I" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/glass/bucket,
@@ -205,12 +205,12 @@
/obj/item/reagent_containers/glass/bucket,
/obj/item/reagent_containers/glass/bucket,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"J" = (
/obj/item/storage/toolbox/syndicate,
/obj/structure/table/wood,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"L" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -230,55 +230,55 @@
dir = 1
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"O" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"P" = (
/obj/machinery/hydroponics/constructable,
/obj/machinery/light{
dir = 1
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"Q" = (
/turf/closed/wall/r_wall,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"R" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"S" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"U" = (
/obj/machinery/light,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"V" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall/r_wall,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"X" = (
/obj/machinery/hydroponics/constructable,
/obj/machinery/light,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
"Z" = (
/obj/item/disk/design_disk/plant_disk,
/obj/machinery/autolathe/hacked{
desc = "This autolathe seems to have its safety light off."
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
/area/ruin/lavaland/powered/seedvault)
(1,1,1) = {"
a
@@ -1,30 +1,30 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"b" = (
/turf/open/lava/smooth/lava_land_surface,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"c" = (
/obj/item/paper/fluff/stations/lavaland/sloth/note,
/turf/open/floor/sepia{
blocks_air = 0;
slowdown = 10
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"d" = (
/turf/open/floor/sepia{
blocks_air = 0;
slowdown = 10
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"e" = (
/obj/machinery/door/airlock/wood,
/turf/open/floor/sepia{
blocks_air = 0;
slowdown = 10
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"f" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
@@ -32,7 +32,7 @@
blocks_air = 0;
slowdown = 10
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"g" = (
/obj/structure/bed,
/obj/item/bedsheet/brown,
@@ -40,7 +40,7 @@
blocks_air = 0;
slowdown = 10
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
(1,1,1) = {"
a
@@ -13,7 +13,7 @@
/area/lavaland/surface/outdoors)
"d" = (
/turf/closed/wall/mineral/titanium/survival/pod,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"e" = (
/obj/structure/sign/mining/survival{
dir = 4;
@@ -24,16 +24,16 @@
"f" = (
/obj/structure/fans,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"g" = (
/obj/machinery/smartfridge/survival_pod/empty,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"h" = (
/obj/item/gps/computer,
/obj/structure/tubes,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"i" = (
/obj/structure/sign/mining/survival{
dir = 8;
@@ -48,12 +48,12 @@
"k" = (
/obj/machinery/sleeper/survival_pod,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"l" = (
/obj/item/pickaxe,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"m" = (
/obj/structure/bed/pod,
/obj/item/bedsheet/black,
@@ -62,7 +62,7 @@
dir = 4
},
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"n" = (
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
@@ -78,7 +78,7 @@
/obj/structure/table/survival_pod,
/obj/item/kitchen/knife/combat/survival,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"q" = (
/obj/effect/mob_spawn/human/miner/explorer{
brute_damage = 150;
@@ -91,13 +91,13 @@
icon_state = "blood1"
},
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"r" = (
/obj/structure/tubes,
/obj/item/crowbar,
/obj/effect/decal/cleanable/blood/drip,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"s" = (
/obj/effect/decal/cleanable/blood/footprints{
icon_state = "blood1"
@@ -111,7 +111,7 @@
},
/obj/machinery/door/airlock/survival_pod/glass,
/turf/open/floor/pod/dark,
/area/ruin/powered)
/area/ruin/lavaland/powered)
"u" = (
/obj/effect/decal/cleanable/blood/footprints{
dir = 8;
@@ -7,24 +7,24 @@
/area/template_noop)
"c" = (
/turf/closed/wall/mineral/plastitanium,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"d" = (
/turf/open/floor/mineral/plastitanium/red{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"e" = (
/obj/structure/shuttle/engine/propulsion{
dir = 4
},
/turf/template_noop,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"f" = (
/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon,
/turf/open/floor/mineral/plastitanium/red{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
(1,1,1) = {"
a
File diff suppressed because it is too large Load Diff
@@ -10,14 +10,14 @@
/area/lavaland/surface/outdoors)
"d" = (
/turf/closed/wall/mineral/abductor,
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"h" = (
/obj/structure/closet/abductor,
/obj/item/tcg_card/special/abductor,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"j" = (
/obj/machinery/abductor/experiment{
team_number = 100
@@ -25,12 +25,12 @@
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"k" = (
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"l" = (
/obj/machinery/abductor/pad{
team_number = 100
@@ -38,59 +38,59 @@
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"o" = (
/obj/item/hemostat/alien,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"p" = (
/obj/effect/mob_spawn/human/abductor,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"q" = (
/obj/structure/closet/abductor,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"s" = (
/obj/structure/table/optable/abductor,
/obj/item/cautery/alien,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"t" = (
/obj/structure/table/abductor,
/obj/item/storage/box/alienhandcuffs,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"v" = (
/obj/item/scalpel/alien,
/obj/item/surgical_drapes,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"w" = (
/obj/item/retractor/alien,
/obj/item/paper/guides/antag/abductor,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"y" = (
/obj/machinery/abductor/gland_dispenser,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"z" = (
/obj/structure/table/abductor,
/obj/item/surgicaldrill/alien,
@@ -98,13 +98,13 @@
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
"A" = (
/obj/structure/bed/abductor,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/ruin/unpowered)
/area/ruin/lavaland/unpowered)
(1,1,1) = {"
a
@@ -6417,7 +6417,6 @@
/area/awaymission/research/interior/maint)
"Hs" = (
/obj/structure/table/wood,
/obj/item/book/granter/crafting_recipe/bone_bow,
/turf/open/floor/mineral/plasma,
/area/space/nearstation)
"Km" = (
+115 -43
View File
@@ -5636,6 +5636,7 @@
"akL" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/meter,
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
/area/maintenance/fore)
"akM" = (
@@ -7654,14 +7655,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/power/apc{
areastring = "/area/commons/fitness";
name = "Fitness Room APC";
pixel_y = -24
},
/obj/structure/cable{
icon_state = "0-8"
},
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"apv" = (
@@ -11734,6 +11727,14 @@
/area/commons/dorms)
"aAo" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/power/apc{
areastring = "/area/commons/fitness";
name = "Fitness Room APC";
pixel_y = -24
},
/obj/structure/cable{
icon_state = "0-8"
},
/turf/open/floor/plasteel/dark,
/area/commons/dorms)
"aAp" = (
@@ -11743,6 +11744,9 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
/obj/structure/cable{
icon_state = "2-4"
},
/turf/open/floor/plasteel,
/area/commons/dorms)
"aAr" = (
@@ -13044,6 +13048,10 @@
/obj/machinery/door/firedoor,
/turf/open/floor/mineral/titanium/blue,
/area/commons/toilet)
"aDW" = (
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel,
/area/cargo/warehouse)
"aDZ" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -16620,10 +16628,10 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"aOg" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/stripes/line{
dir = 5
},
/obj/structure/closet/firecloset,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"aOh" = (
@@ -21423,10 +21431,10 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"baF" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/stripes/line{
dir = 9
},
/obj/structure/closet/firecloset,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"baG" = (
@@ -23427,8 +23435,8 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"bgg" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/stripes/line,
/obj/structure/closet/firecloset,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"bgh" = (
@@ -25073,11 +25081,11 @@
/turf/open/floor/plasteel/white,
/area/science/research)
"bkj" = (
/obj/structure/closet/emcloset,
/obj/machinery/airalarm{
pixel_y = 24
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/closet/firecloset,
/turf/open/floor/plasteel,
/area/cargo/storage)
"bkk" = (
@@ -25803,6 +25811,7 @@
/obj/machinery/light/small{
dir = 1
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"blR" = (
@@ -33256,11 +33265,7 @@
/turf/open/floor/engine,
/area/science/storage)
"bDg" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 3;
name = "3maintenance loot spawner"
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/starboard)
"bDh" = (
@@ -35075,6 +35080,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/aft)
"bHp" = (
@@ -46846,8 +46852,7 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"cmo" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance,
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"cmq" = (
@@ -50917,6 +50922,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/aft)
"cBE" = (
@@ -51909,6 +51915,13 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"cPO" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"cQw" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -52419,7 +52432,6 @@
/turf/open/floor/plasteel,
/area/engineering/atmos)
"dbb" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{
dir = 1
},
@@ -52866,6 +52878,7 @@
/obj/machinery/light/small{
dir = 4
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/fore)
"dPs" = (
@@ -55457,6 +55470,10 @@
},
/turf/closed/wall,
/area/commons/dorms)
"hmT" = (
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port)
"hnc" = (
/obj/structure/chair/pew/left{
dir = 4
@@ -55579,6 +55596,10 @@
/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plating,
/area/engineering/atmos)
"hyY" = (
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"hzs" = (
/obj/effect/turf_decal/bot,
/obj/machinery/plate_press,
@@ -56988,6 +57009,13 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
"jNT" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/aft)
"jOB" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -57171,6 +57199,13 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
"kbO" = (
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/structure/closet/firecloset,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"kcx" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/dark/visible,
@@ -59356,6 +59391,7 @@
/obj/structure/sign/poster/official/fruit_bowl{
pixel_y = 32
},
/obj/structure/closet/firecloset,
/turf/open/floor/plasteel/white/corner{
dir = 1
},
@@ -59640,11 +59676,7 @@
/turf/open/floor/plasteel/dark,
/area/security/prison/cells)
"nkP" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 8;
name = "8maintenance loot spawner"
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"nmZ" = (
@@ -59821,6 +59853,14 @@
},
/turf/closed/wall,
/area/maintenance/disposal/incinerator)
"nzX" = (
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 8;
name = "8maintenance loot spawner"
},
/obj/structure/rack,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"nBI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -60155,6 +60195,10 @@
/obj/machinery/vending/kink,
/turf/open/floor/plating,
/area/maintenance/bar)
"odV" = (
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"ofj" = (
/obj/machinery/smartfridge/organ/preloaded,
/turf/closed/wall,
@@ -60729,6 +60773,10 @@
"pgf" = (
/turf/open/floor/mineral/titanium/blue,
/area/commons/dorms)
"pgl" = (
/obj/structure/closet/firecloset,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"pgn" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -62140,6 +62188,11 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/security/processing)
"rla" = (
/obj/effect/turf_decal/stripes/line,
/obj/structure/closet/firecloset,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"rmN" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -64398,6 +64451,9 @@
/obj/structure/disposalpipe/sorting/mail{
sortType = 26
},
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/commons/dorms)
"uys" = (
@@ -65387,6 +65443,10 @@
/obj/machinery/atmospherics/pipe/simple/dark/visible,
/turf/open/space,
/area/space/nearstation)
"vPd" = (
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"vPs" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -65577,6 +65637,13 @@
/obj/item/assembly/signaler,
/turf/open/floor/plating,
/area/maintenance/bar)
"wgo" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
},
/obj/structure/closet/firecloset,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"wgu" = (
/obj/machinery/door/airlock/maintenance{
name = "Permabrig Maintenance";
@@ -65594,6 +65661,11 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness/pool)
"wiR" = (
/obj/effect/landmark/event_spawn,
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"wjd" = (
/obj/effect/turf_decal/stripes/line,
/obj/structure/table,
@@ -77093,7 +77165,7 @@ awW
awZ
aym
azz
aAF
wgo
awW
aaa
aaa
@@ -77326,7 +77398,7 @@ apJ
awZ
aIK
ayl
aAE
rla
awW
aaa
aaa
@@ -82463,7 +82535,7 @@ cCs
ann
ann
hCn
arH
cwS
ayh
azi
aAx
@@ -82481,7 +82553,7 @@ aPz
aPz
aPz
aPz
aSg
hmT
aWj
aXP
aZr
@@ -83485,7 +83557,7 @@ anH
oCF
amC
anJ
aFJ
wiR
alU
axK
azG
@@ -84803,7 +84875,7 @@ aQN
fRe
qSo
aPA
bgt
hmT
bhS
bjk
aPz
@@ -85290,7 +85362,7 @@ alU
alU
alU
alU
ntt
cPO
amC
avW
gYo
@@ -87587,7 +87659,7 @@ aaa
ali
aoo
avY
amC
vPd
gsM
sCa
aoX
@@ -88179,7 +88251,7 @@ bCq
bVE
bWz
bHE
bHE
nkP
bLu
bCq
bLu
@@ -88909,7 +88981,7 @@ aTJ
aPK
aWA
aWC
baS
aDW
aZI
baS
cCn
@@ -89930,7 +90002,7 @@ aKc
aLp
aMV
aOy
aLE
pgl
aPQ
aRV
aSW
@@ -90481,7 +90553,7 @@ bHD
bJe
bCq
nkP
bHE
nzX
bHE
bHE
bHE
@@ -91963,7 +92035,7 @@ nbY
aiX
iRj
anz
aov
kbO
cCi
apU
ajd
@@ -101722,7 +101794,7 @@ uhm
ahn
aiA
ahn
grc
odV
anE
aod
ahn
@@ -107955,7 +108027,7 @@ bFH
bHb
bIw
bBN
bKT
jNT
bMb
bNd
bOt
@@ -110989,7 +111061,7 @@ alP
anf
anf
alP
anf
hyY
anf
apE
anf
@@ -115438,7 +115510,7 @@ clt
cQw
cCt
cOe
cOe
cmo
cNW
aaa
aaS
@@ -116696,7 +116768,7 @@ bKc
cNW
bMB
bNA
cOe
cmo
bSl
bUq
flc
+83 -14
View File
@@ -3715,6 +3715,7 @@
"alM" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel,
/area/maintenance/starboard/fore)
"alN" = (
@@ -8243,6 +8244,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"aCE" = (
@@ -13713,8 +13715,8 @@
},
/turf/open/floor/plating{
initial_gas_mix = "o2=0.01;n2=0.01";
luminosity = 2;
initial_temperature = 2.7
initial_temperature = 2.7;
luminosity = 2
},
/area/security/prison)
"ban" = (
@@ -14376,8 +14378,8 @@
},
/turf/open/floor/plating{
initial_gas_mix = "o2=0.01;n2=0.01";
luminosity = 2;
initial_temperature = 2.7
initial_temperature = 2.7;
luminosity = 2
},
/area/security/prison)
"bdo" = (
@@ -31965,6 +31967,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"clv" = (
@@ -35124,6 +35127,7 @@
"cuI" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/red,
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"cuJ" = (
@@ -36310,6 +36314,12 @@
},
/turf/open/floor/plasteel,
/area/maintenance/port)
"cCK" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"cCM" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -38007,6 +38017,7 @@
/obj/machinery/light/small{
dir = 8
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port)
"cLM" = (
@@ -38752,6 +38763,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel,
/area/maintenance/starboard/aft)
"cNJ" = (
@@ -57355,6 +57367,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port)
"dAv" = (
@@ -59204,6 +59217,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel{
heat_capacity = 1e+006
},
@@ -62652,6 +62666,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel,
/area/maintenance/aft)
"dLj" = (
@@ -62702,6 +62717,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel,
/area/maintenance/starboard/aft)
"dLn" = (
@@ -63084,6 +63100,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel{
heat_capacity = 1e+006
},
@@ -79161,6 +79178,10 @@
"gWu" = (
/turf/closed/wall,
/area/cargo/warehouse)
"gWF" = (
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"gXc" = (
/obj/structure/sign/painting/library{
pixel_y = 32
@@ -95240,6 +95261,11 @@
},
/turf/open/floor/plasteel,
/area/service/library/abandoned)
"mpB" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port)
"mqb" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -97242,6 +97268,17 @@
},
/turf/closed/wall/r_wall,
/area/science/circuit)
"mYR" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel,
/area/maintenance/starboard/aft)
"mYT" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/cardboard,
@@ -109909,6 +109946,7 @@
"rCr" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/cargo/warehouse)
"rCv" = (
@@ -109944,6 +109982,11 @@
},
/turf/open/floor/plasteel,
/area/cargo/storage)
"rCR" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"rDp" = (
/obj/structure/table/glass,
/obj/structure/cable/white{
@@ -114162,6 +114205,13 @@
},
/turf/open/floor/carpet,
/area/commons/vacant_room/office)
"sWQ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"sWY" = (
/obj/machinery/door/firedoor,
/obj/structure/cable/white{
@@ -119197,6 +119247,10 @@
},
/turf/open/floor/plasteel,
/area/command/heads_quarters/hos)
"uIT" = (
/obj/structure/loot_pile/maint,
/turf/open/floor/plating,
/area/maintenance/port)
"uJd" = (
/obj/item/kirbyplants/random,
/obj/item/radio/intercom{
@@ -128561,6 +128615,21 @@
},
/turf/open/floor/plasteel,
/area/cargo/storage)
"yia" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/structure/loot_pile/maint,
/turf/open/floor/plasteel{
heat_capacity = 1e+006
},
/area/maintenance/starboard/aft)
"yiq" = (
/obj/structure/reflector/single/anchored{
dir = 6
@@ -150094,7 +150163,7 @@ opi
xbs
qjg
qjg
ceb
mpB
cLv
cMQ
cOq
@@ -157015,7 +157084,7 @@ caE
cdY
cfR
chI
ceb
mpB
cfU
cmi
cnI
@@ -158117,7 +158186,7 @@ dOl
ean
dLW
dZg
dLW
rCR
ecv
edf
edl
@@ -158756,7 +158825,7 @@ lxH
odN
quN
asF
alg
gWF
avq
awo
axJ
@@ -159295,7 +159364,7 @@ qOV
ary
aKj
bbQ
alg
gWF
beK
bgj
alf
@@ -159345,7 +159414,7 @@ ojB
roP
uhj
cCO
cea
uIT
cJZ
cLI
cNg
@@ -160932,7 +161001,7 @@ dPG
dQz
dRy
dSx
dOS
cCK
dUg
dUX
dVL
@@ -164529,7 +164598,7 @@ dOY
dPR
dfm
dRK
dOl
sWQ
pPz
sBt
vSo
@@ -180428,7 +180497,7 @@ hYQ
jjL
pzu
fzU
cYj
yia
cZV
dbC
ddr
@@ -181206,7 +181275,7 @@ ddt
ddt
aaB
dbD
diW
mYR
aaR
dbA
dnU
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+4
View File
@@ -21,6 +21,10 @@
#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic"
#define COMPONENT_GLOB_BLOCK_CINEMATIC 1
#define COMSIG_GLOB_PRE_RANDOM_EVENT "!pre_random_event"
/// Do not allow this random event to continue.
#define CANCEL_PRE_RANDOM_EVENT (1<<0)
// signals from globally accessible objects
/// from SSsun when the sun changes position : (primary_sun, suns)
#define COMSIG_SUN_MOVED "sun_moved"
+14 -16
View File
@@ -1,19 +1,17 @@
#define CURRENT_LIVING_PLAYERS 1
#define CURRENT_LIVING_ANTAGS 2
#define CURRENT_DEAD_PLAYERS 3
#define CURRENT_OBSERVERS 4
/// This is the only ruleset that should be picked this round, used by admins and should not be on rulesets in code.
#define ONLY_RULESET (1 << 0)
#define NO_ASSASSIN (1<<0)
#define WAROPS_ALWAYS_ALLOWED (1<<1)
#define USE_PREF_WEIGHTS (1<<2)
#define FORCE_IF_WON (1<<3)
#define USE_PREV_ROUND_WEIGHTS (1<<4)
/// Only one ruleset with this flag will be picked.
#define HIGH_IMPACT_RULESET (1 << 1)
#define ONLY_RULESET (1<<0)
#define HIGHLANDER_RULESET (1<<1)
#define TRAITOR_RULESET (1<<2)
#define MINOR_RULESET (1<<3)
#define FAKE_ANTAG_RULESET (1<<4)
#define ALWAYS_MAX_WEIGHT_RULESET (1<<5)
/// This ruleset can only be picked once. Anything that does not have a scaling_cost MUST have this.
#define LONE_RULESET (1 << 2)
#define RULESET_STOP_PROCESSING 1
/// No round event was hijacked this cycle
#define HIJACKED_NOTHING "HIJACKED_NOTHING"
/// This cycle, a round event was hijacked when the last midround event was too recent.
#define HIJACKED_TOO_RECENT "HIJACKED_TOO_RECENT"
/// This cycle, a round event was hijacked when the next midround event is too soon.
#define HIJACKED_TOO_SOON "HIJACKED_TOO_SOON"
+6
View File
@@ -351,3 +351,9 @@
//Gremlins
#define NPC_TAMPER_ACT_FORGET 1 //Don't try to tamper with this again
#define NPC_TAMPER_ACT_NOMSG 2 //Don't produce a visible message
//Game mode list indexes
#define CURRENT_LIVING_PLAYERS "living_players_list"
#define CURRENT_LIVING_ANTAGS "living_antags_list"
#define CURRENT_DEAD_PLAYERS "dead_players_list"
#define CURRENT_OBSERVERS "current_observers_list"
+3
View File
@@ -14,6 +14,7 @@
#define ROLE_MALF "malf AI"
#define ROLE_REV "revolutionary"
#define ROLE_REV_HEAD "Head Revolutionary"
#define ROLE_REV_SUCCESSFUL "Victorious Revolutionary"
#define ROLE_ALIEN "xenomorph"
#define ROLE_PAI "pAI"
#define ROLE_CULTIST "cultist"
@@ -44,6 +45,8 @@
#define ROLE_RESPAWN "respawnsystem"
/// Not an actual antag. Lets players force all antags off.
#define ROLE_NO_ANTAGONISM "NO_ANTAGS"
//Define for disabling individual antagonists for dynamic
#define HAS_ANTAG_PREF(C,ROLE) (!(ROLE_NO_ANTAGONISM in C.prefs.be_special) && (ROLE in C.prefs.be_special))
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
//(in game days played) to play that role
+2
View File
@@ -65,6 +65,8 @@
/// Blocks sprint
#define STATUS_EFFECT_STAGGERED /datum/status_effect/staggered
#define STATUS_EFFECT_TASED_WEAK_NODMG /datum/status_effect/electrode/no_damage // no damage
#define STATUS_EFFECT_TASED_WEAK /datum/status_effect/electrode //not as crippling, just slows down
#define STATUS_EFFECT_TASED /datum/status_effect/electrode/no_combat_mode //the affected has been tased, preventing fine muscle control
+17
View File
@@ -26,6 +26,7 @@
#define reverseList(L) reverseRange(L.Copy())
#define LAZYADDASSOC(L, K, V) if(!L) { L = list(); } L[K] += list(V);
#define LAZYREMOVEASSOC(L, K, V) if(L) { if(L[K]) { L[K] -= V; if(!length(L[K])) L -= K; } if(!length(L)) L = null; }
#define LAZYACCESSASSOC(L, I, K) L ? L[I] ? L[I][K] ? L[I][K] : null : null : null
/// Passed into BINARY_INSERT to compare keys
#define COMPARE_KEY __BIN_LIST[__BIN_MID]
@@ -294,6 +295,22 @@
if (total <= 0)
return item
/proc/pickweightAllowZero(list/L) //The original pickweight proc will sometimes pick entries with zero weight. I'm not sure if changing the original will break anything, so I left it be.
var/total = 0
var/item
for (item in L)
if (!L[item])
L[item] = 0
total += L[item]
total = rand(0, total)
for (item in L)
total -=L [item]
if (total <= 0 && L[item])
return item
return null
//Picks a number of elements from a list based on weight.
//This is highly optimised and good for things like grabbing 200 items from a list of 40,000
//Much more efficient than many pickweight calls
+2
View File
@@ -0,0 +1,2 @@
/proc/get_policy(keyword)
return global.config.policy[keyword]
+4
View File
@@ -457,3 +457,7 @@ GLOBAL_LIST_EMPTY(species_datums)
REMOVE_TRAIT(L, TRAIT_PASSTABLE, source)
if(!HAS_TRAIT(L, TRAIT_PASSTABLE))
L.pass_flags &= ~PASSTABLE
/// Gets the client of the mob, allowing for mocking of the client.
/// You only need to use this if you know you're going to be mocking clients somewhere else.
#define GET_CLIENT(mob) (##mob.client || ##mob.mock_client)
+5 -17
View File
@@ -351,6 +351,7 @@
/datum/controller/subsystem/ticker/proc/survivor_report(popcount)
var/list/parts = list()
var/station_evacuated = EMERGENCY_ESCAPED_OR_ENDGAMED
var/datum/game_mode/dynamic/mode = SSticker.mode
if(GLOB.round_id)
var/statspage = CONFIG_GET(string/roundstatsurl)
@@ -383,27 +384,14 @@
//ignore this comment, it fixes the broken sytax parsing caused by the " above
else
parts += "[FOURSPACES]<i>Nobody died this shift!</i>"
var/avg_threat = SSactivity.get_average_threat()
var/max_threat = SSactivity.get_max_threat()
parts += "[FOURSPACES]Threat at round end: [SSactivity.current_threat]"
parts += "[FOURSPACES]Average threat: [avg_threat]"
parts += "[FOURSPACES]Max threat: [max_threat]"
if(istype(SSticker.mode, /datum/game_mode/dynamic))
var/datum/game_mode/dynamic/mode = SSticker.mode
mode.update_playercounts() // ?
parts += "[FOURSPACES]Target threat: [mode.threat_level]"
parts += "[FOURSPACES]Initial threat level: [mode.threat_level]"
parts += "[FOURSPACES]Initial roundstart threat: [mode.initial_round_start_budget]"
parts += "[FOURSPACES]Roundstart budget after antags: [mode.round_start_budget]"
parts += "[FOURSPACES]Midround budget at round end: [mode.mid_round_budget]"
parts += "[FOURSPACES]Executed rules:"
for(var/datum/dynamic_ruleset/rule in mode.executed_rules)
parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - <b>[rule.name]</b>: -[rule.cost + rule.scaled_times * rule.scaling_cost] threat"
parts += "[FOURSPACES]Other threat changes:"
for(var/str in mode.threat_log)
parts += "[FOURSPACES][FOURSPACES][str]"
for(var/entry in mode.threat_tallies)
parts += "[FOURSPACES][FOURSPACES][entry] added [mode.threat_tallies[entry]]"
SSblackbox.record_feedback("tally","threat",mode.threat_level,"Target threat")
SSblackbox.record_feedback("tally","threat",SSactivity.current_threat,"Final Threat")
SSblackbox.record_feedback("tally","threat",avg_threat,"Average Threat")
SSblackbox.record_feedback("tally","threat",max_threat,"Max Threat")
return parts.Join("<br>")
/client/proc/roundend_report_file()
+2 -2
View File
@@ -1,5 +1,5 @@
GLOBAL_VAR_INIT(master_mode, "traitor") //"extended"
GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret", the secret rotation will forceably choose this mode
GLOBAL_VAR_INIT(master_mode, "dynamic") //"extended"
GLOBAL_VAR_INIT(secret_force_mode, "dynamic") // if this is anything but "secret", the secret rotation will forceably choose this mode
GLOBAL_VAR(common_report) //Contains common part of roundend report
GLOBAL_VAR(survivor_report) //Contains shared survivor report for roundend report (part of personal report)
+9
View File
@@ -44,6 +44,15 @@ GLOBAL_LIST_EMPTY(mob_config_movespeed_type_lookup_floating)
GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traitor-target purposes.
/// All alive antags with clients.
GLOBAL_LIST_EMPTY(current_living_antags)
/// All observers with clients that joined as observers.
GLOBAL_LIST_EMPTY(current_observers_list)
//Dynamic Port
GLOBAL_LIST_EMPTY(new_player_list) //all /mob/dead/new_player, in theory all should have clients and those that don't are in the process of spawning and get deleted when done.
/proc/update_config_movespeed_type_lookup(update_mobs = TRUE)
// NOTE: This is entirely based on the fact that byond typesof/subtypesof gets longer/deeper paths before shallower ones.
// If that ever breaks this entire proc breaks.
@@ -20,7 +20,7 @@
var/list/mode_false_report_weight
var/motd
// var/policy
var/policy
var/static/regex/ic_filter_regex
@@ -41,7 +41,6 @@
CRASH("/datum/controller/configuration/Load() called more than once!")
InitEntries()
LoadModes()
storyteller_cache = typecacheof(/datum/dynamic_storyteller, TRUE)
if(fexists("[directory]/config.txt") && LoadEntries("config.txt") <= 1)
var/list/legacy_configs = list("game_options.txt", "dbconfig.txt", "comms.txt")
for(var/I in legacy_configs)
@@ -52,7 +51,7 @@
break
loadmaplist(CONFIG_MAPS_FILE)
LoadMOTD()
// LoadPolicy()
LoadPolicy()
LoadChatFilter()
if (Master)
@@ -266,7 +265,7 @@
if(M.votable)
votable_modes += M.config_tag
qdel(M)
votable_modes += "secret"
votable_modes += "dynamic"
/datum/controller/configuration/proc/LoadMOTD()
motd = file2text("[directory]/motd.txt")
@@ -292,7 +291,7 @@ Example config:
}
*/
/*
/datum/controller/configuration/proc/LoadPolicy()
policy = list()
var/rawpolicy = file2text("[directory]/policy.json")
@@ -303,7 +302,7 @@ Example config:
DelayedMessageAdmins("JSON parsing failure for policy.json")
else
policy = parsed
*/
/datum/controller/configuration/proc/loadmaplist(filename)
log_config("Loading config file [filename]...")
filename = "[directory]/[filename]"
@@ -371,53 +370,7 @@ Example config:
var/ct = initial(M.config_tag)
if(ct && ct == mode_name)
return new T
return new /datum/game_mode/extended()
/// For dynamic.
/datum/controller/configuration/proc/pick_storyteller(storyteller_name)
for(var/T in storyteller_cache)
var/datum/dynamic_storyteller/S = T
var/name = initial(S.name)
if(name && name == storyteller_name)
return T
return /datum/dynamic_storyteller/classic
/// Same with this
/datum/controller/configuration/proc/get_runnable_storytellers()
var/list/datum/dynamic_storyteller/runnable_storytellers = new
var/list/probabilities = Get(/datum/config_entry/keyed_list/storyteller_weight)
var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust)
var/list/min_player_counts = Get(/datum/config_entry/keyed_list/storyteller_min_players)
var/list/storyteller_min_chaos = Get(/datum/config_entry/keyed_list/storyteller_min_chaos)
var/list/storyteller_max_chaos = Get(/datum/config_entry/keyed_list/storyteller_max_chaos)
for(var/T in storyteller_cache)
var/datum/dynamic_storyteller/S = T
var/config_tag = initial(S.config_tag)
if(!config_tag)
continue
var/probability = (config_tag in probabilities) ? probabilities[config_tag] : initial(S.weight)
var/min_players = (config_tag in min_player_counts) ? min_player_counts[config_tag] : initial(S.min_players)
if(probability <= 0)
continue
if(length(GLOB.player_list) < min_players)
continue
if(!Get(/datum/config_entry/flag/no_storyteller_threat_removal))
var/min_chaos = (probabilities in storyteller_min_chaos) ? storyteller_min_chaos[config_tag] : initial(S.min_chaos)
var/max_chaos = (probabilities in storyteller_max_chaos) ? storyteller_max_chaos[config_tag] : initial(S.max_chaos)
if(SSpersistence.average_threat + 50 < min_chaos)
continue
if(SSpersistence.average_threat + 50 > max_chaos)
continue
if(SSpersistence.saved_storytellers.len == repeated_mode_adjust.len)
var/name = initial(S.name)
var/recent_round = min(SSpersistence.saved_storytellers.Find(name),3)
var/adjustment = 0
while(recent_round)
adjustment += repeated_mode_adjust[recent_round]
recent_round = SSpersistence.saved_modes.Find(name,recent_round+1,0)
probability *= max(0,((100-adjustment)/100))
runnable_storytellers[S] = probability
return runnable_storytellers
return new /datum/game_mode/dynamic
/datum/controller/configuration/proc/get_runnable_modes()
var/list/datum/game_mode/runnable_modes = new
@@ -1,6 +1,12 @@
/datum/config_entry/flag/panic_bunker // prevents people the server hasn't seen before from connecting
/datum/config_entry/number/panic_bunker_living // living time in minutes that a player needs to pass the panic bunker
/datum/config_entry/number/panic_bunker_living // living time in minutes that a player needs to pass the panic bunker. they pass **if they are above this amount**
config_entry_value = 0 // default: <= 0 meaning any playtime works. -1 to disable criteria.
integer = TRUE
/datum/config_entry/number/panic_bunker_living_vpn
config_entry_value = 0 // default: <= 0 meaning anytime works. -1 to disable criteria.
integer = TRUE
/datum/config_entry/string/panic_bunker_message
config_entry_value = "Sorry but the server is currently not accepting connections from never before seen players."
@@ -345,3 +345,5 @@
/datum/config_entry/flag/atmos_equalize_enabled
default = FALSE
/datum/config_entry/flag/dynamic_config_enabled
+4 -4
View File
@@ -33,7 +33,7 @@ SUBSYSTEM_DEF(fail2topic)
while(i <= length(rate_limiting))
var/ip = rate_limiting[i]
var/last_attempt = rate_limiting[ip]
if(world.time - last_attempt > rate_limit)
if(REALTIMEOFDAY - last_attempt > rate_limit)
rate_limiting -= ip
fail_counts -= ip
else //if we remove that, and the next element is in its place. check that instead of incrementing.
@@ -58,12 +58,12 @@ SUBSYSTEM_DEF(fail2topic)
if (active_bans[ip])
return TRUE
rate_limiting[ip] = world.time
rate_limiting[ip] = REALTIMEOFDAY
if (isnull(last_attempt))
return FALSE
if (world.time - last_attempt > rate_limit)
if (REALTIMEOFDAY - last_attempt > rate_limit)
fail_counts -= ip
return FALSE
else
@@ -83,7 +83,7 @@ SUBSYSTEM_DEF(fail2topic)
if (!enabled)
return
active_bans[ip] = world.time
active_bans[ip] = REALTIMEOFDAY
fail_counts -= ip
rate_limiting -= ip
+3 -1
View File
@@ -30,11 +30,13 @@ SUBSYSTEM_DEF(job)
var/datum/job/new_overflow = GetJob(new_overflow_role)
var/cap = CONFIG_GET(number/overflow_cap)
new_overflow.allow_bureaucratic_error = FALSE
new_overflow.spawn_positions = cap
new_overflow.total_positions = cap
if(new_overflow_role != overflow_role)
var/datum/job/old_overflow = GetJob(overflow_role)
old_overflow.allow_bureaucratic_error = initial(old_overflow.allow_bureaucratic_error)
old_overflow.spawn_positions = initial(old_overflow.spawn_positions)
old_overflow.total_positions = initial(old_overflow.total_positions)
overflow_role = new_overflow_role
@@ -719,7 +721,7 @@ SUBSYSTEM_DEF(job)
if(length(i[LOADOUT_COLOR])) //handle loadout colors
//handle polychromic items
if((G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) && length(G.loadout_initial_colors))
var/datum/element/polychromic/polychromic = I.comp_lookup["item_worn_overlays"] //stupid way to do it but GetElement does not work for this
var/datum/element/polychromic/polychromic = LAZYACCESS(I.comp_lookup, "item_worn_overlays") //stupid way to do it but GetElement does not work for this
if(polychromic && istype(polychromic))
var/list/polychromic_entry = polychromic.colors_by_atom[I]
if(polychromic_entry)
@@ -5,24 +5,18 @@
var/list/saved_modes = list(1,2,3)
var/list/saved_chaos = list(5,5,5)
var/list/saved_dynamic_rules = list(list(),list(),list())
var/list/saved_storytellers = list("foo","bar","baz")
var/average_threat = 50
var/list/saved_maps
/datum/controller/subsystem/persistence/SaveServerPersistence()
. = ..()
CollectRoundtype()
if(istype(SSticker.mode, /datum/game_mode/dynamic))
var/datum/game_mode/dynamic/mode = SSticker.mode
CollectStoryteller(mode)
CollectRulesets(mode)
RecordMaps()
/datum/controller/subsystem/persistence/LoadServerPersistence()
. = ..()
LoadRecentModes()
LoadRecentChaos()
LoadRecentStorytellers()
LoadRecentRulesets()
LoadRecentMaps()
@@ -45,30 +39,6 @@
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
/datum/controller/subsystem/persistence/proc/CollectStoryteller(var/datum/game_mode/dynamic/mode)
saved_storytellers.len = 3
saved_storytellers[3] = saved_storytellers[2]
saved_storytellers[2] = saved_storytellers[1]
saved_storytellers[1] = mode.storyteller.name
var/json_file = file("data/RecentStorytellers.json")
var/list/file_data = list()
file_data["data"] = saved_storytellers
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
/datum/controller/subsystem/persistence/proc/CollectRulesets(var/datum/game_mode/dynamic/mode)
saved_dynamic_rules[3] = saved_dynamic_rules[2]
saved_dynamic_rules[2] = saved_dynamic_rules[1]
saved_dynamic_rules[1] = list()
for(var/r in mode.executed_rules)
var/datum/dynamic_ruleset/rule = r
saved_dynamic_rules[1] += rule.config_tag
var/json_file = file("data/RecentRulesets.json")
var/list/file_data = list()
file_data["data"] = saved_dynamic_rules
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
/datum/controller/subsystem/persistence/proc/RecordMaps()
saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]")
var/json_file = file("data/RecentMaps.json")
@@ -107,15 +77,6 @@
return
saved_dynamic_rules = json["data"]
/datum/controller/subsystem/persistence/proc/LoadRecentStorytellers()
var/json_file = file("data/RecentStorytellers.json")
if(!fexists(json_file))
return
var/list/json = json_decode(file2text(json_file))
if(!json)
return
saved_storytellers = json["data"]
/datum/controller/subsystem/persistence/proc/LoadRecentMaps()
var/json_file = file("data/RecentMaps.json")
if(!fexists(json_file))
+10 -32
View File
@@ -227,36 +227,14 @@ SUBSYSTEM_DEF(ticker)
/datum/controller/subsystem/ticker/proc/setup()
to_chat(world, "<span class='boldannounce'>Starting game...</span>")
var/init_start = world.timeofday
//Create and announce mode
var/list/datum/game_mode/runnable_modes
if(GLOB.master_mode == "random" || GLOB.master_mode == "secret")
runnable_modes = config.get_runnable_modes()
if(GLOB.master_mode == "secret")
hide_mode = 1
if(GLOB.secret_force_mode != "secret")
var/datum/game_mode/smode = config.pick_mode(GLOB.secret_force_mode)
if(!smode.can_start())
message_admins("<span class='notice'>Unable to force secret [GLOB.secret_force_mode]. [smode.required_players] players and [smode.required_enemies] eligible antagonists needed.</span>")
else
mode = smode
if(!mode)
if(!runnable_modes.len)
to_chat(world, "<B>Unable to choose playable game mode.</B> Reverting to pre-game lobby.")
return 0
mode = pickweight(runnable_modes)
if(!mode) //too few roundtypes all run too recently
mode = pick(runnable_modes)
else
mode = config.pick_mode(GLOB.master_mode)
if(!mode.can_start())
to_chat(world, "<B>Unable to start [mode.name].</B> Not enough players, [mode.required_players] players and [mode.required_enemies] eligible antagonists needed. Reverting to pre-game lobby.")
qdel(mode)
mode = null
SSjob.ResetOccupations()
return 0
GLOB.master_mode = "dynamic"
mode = config.pick_mode(GLOB.master_mode)
if(!mode.can_start())
to_chat(world, "<B>Unable to start [mode.name].</B> Not enough players, [mode.required_players] players and [mode.required_enemies] eligible antagonists needed. Reverting to pre-game lobby.")
qdel(mode)
mode = null
SSjob.ResetOccupations()
return 0
CHECK_TICK
//Configure mode and assign player to special mode stuff
@@ -640,9 +618,9 @@ SUBSYSTEM_DEF(ticker)
/datum/controller/subsystem/ticker/proc/load_mode()
var/mode = trim(file2text("data/mode.txt"))
if(mode)
GLOB.master_mode = mode
GLOB.master_mode = "dynamic"
else
GLOB.master_mode = "extended"
GLOB.master_mode = GLOB.dynamic_forced_extended
log_game("Saved mode is '[GLOB.master_mode]'")
/datum/controller/subsystem/ticker/proc/save_mode(the_mode)
+5 -57
View File
@@ -104,7 +104,6 @@ SUBSYSTEM_DEF(vote)
return .
/datum/controller/subsystem/vote/proc/calculate_condorcet_votes(var/blackbox_text)
// https://en.wikipedia.org/wiki/Schulze_method#Implementation
if((mode == "gamemode" || mode == "dynamic" || mode == "roundtype") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode))
for(var/mob/dead/new_player/P in GLOB.player_list)
if(P.ready != PLAYER_READY_TO_PLAY && voted[P.ckey])
@@ -322,51 +321,17 @@ SUBSYSTEM_DEF(vote)
var/restart = 0
if(.)
switch(mode)
if("roundtype") //CIT CHANGE - adds the roundstart extended/secret vote
if("roundtype") //CIT CHANGE - adds the roundstart extended/dynamic vote
if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started.
return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.")
GLOB.master_mode = .
SSticker.save_mode(.)
GLOB.master_mode = "dynamic"
if(. == "extended")
GLOB.dynamic_forced_extended = TRUE
message_admins("The gamemode has been voted for, and has been changed to: [GLOB.master_mode]")
log_admin("Gamemode has been voted for and switched to: [GLOB.master_mode].")
if(CONFIG_GET(flag/modetier_voting))
reset()
started_time = 0
initiate_vote("mode tiers","server", votesystem=SCORE_VOTING, forced=TRUE, vote_time = 30 MINUTES)
to_chat(world,"<b>The vote will end right as the round starts.</b>")
return .
if("restart")
if(. == "Restart Round")
restart = 1
if("gamemode")
if(GLOB.master_mode != .)
SSticker.save_mode(.)
if(SSticker.HasRoundStarted())
restart = 1
else
GLOB.master_mode = .
if("mode tiers")
var/list/raw_score_numbers = list()
for(var/score_name in scores)
sorted_insert(raw_score_numbers,scores[score_name],/proc/cmp_numeric_asc)
stored_modetier_results = scores.Copy()
for(var/score_name in stored_modetier_results)
if(stored_modetier_results[score_name] <= raw_score_numbers[CONFIG_GET(number/dropped_modes)])
stored_modetier_results -= score_name
stored_modetier_results += "traitor"
if("dynamic")
if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started.
return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.")
var/list/runnable_storytellers = config.get_runnable_storytellers()
var/datum/dynamic_storyteller/picked
for(var/T in runnable_storytellers)
var/datum/dynamic_storyteller/S = T
if(stored_gamemode_votes[initial(S.name)] == 1 && CHECK_BITFIELD(initial(S.flags), FORCE_IF_WON))
picked = S
runnable_storytellers[S] *= round(stored_gamemode_votes[initial(S.name)]*100000,1)
if(!picked)
picked = pickweight(runnable_storytellers, 0)
GLOB.dynamic_storyteller_type = picked
if("map")
var/datum/map_config/VM = config.maplist[.]
message_admins("The map has been voted for and will change to: [VM.map_name]")
@@ -483,24 +448,7 @@ SUBSYSTEM_DEF(vote)
if("transfer") // austation begin -- Crew autotranfer vote
choices.Add("Initiate Crew Transfer","Continue Playing") // austation end
if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote
choices.Add("secret", "extended")
if("mode tiers")
var/list/modes_to_add = config.votable_modes
var/list/probabilities = CONFIG_GET(keyed_list/probability)
for(var/tag in modes_to_add)
if(probabilities[tag] <= 0)
modes_to_add -= tag
modes_to_add -= "traitor" // makes it so that traitor is always available
choices.Add(modes_to_add)
if("dynamic")
GLOB.master_mode = "dynamic"
var/list/probabilities = CONFIG_GET(keyed_list/storyteller_weight)
for(var/T in config.get_runnable_storytellers())
var/datum/dynamic_storyteller/S = T
var/probability = ((initial(S.config_tag) in probabilities) ? probabilities[initial(S.config_tag)] : initial(S.weight))
if(probability > 0)
choices.Add(initial(S.name))
choice_descs.Add(initial(S.desc))
choices.Add("dynamic", "extended")
if("custom")
question = stripped_input(usr,"What is the vote for?")
if(!question)
+5
View File
@@ -16,6 +16,9 @@
/datum/atmosphere/New()
generate_gas_string()
/datum/atmosphere/proc/check_for_sanity(datum/gas_mixture/mix)
return
/datum/atmosphere/proc/generate_gas_string()
var/list/spicy_gas = restricted_gases.Copy()
var/target_pressure = rand(minimum_pressure, maximum_pressure)
@@ -52,6 +55,8 @@
gasmix.adjust_moles(gastype, -moles_to_remove)
gasmix.set_moles(gastype, FLOOR(gasmix.get_moles(gastype), 0.1))
check_for_sanity(gasmix)
// Now finally lets make that string
var/list/gas_string_builder = list()
for(var/id in gasmix.get_gases())
+6
View File
@@ -23,6 +23,12 @@
minimum_temp = 270
maximum_temp = 320
/datum/atmosphere/lavaland/check_for_sanity(datum/gas_mixture/mix)
var/datum/breathing_class/o2_class = GLOB.gas_data.breathing_classes[BREATH_OXY]
while(o2_class.get_effective_pp(mix) < 10)
mix.adjust_moles(GAS_CO2, -0.5)
mix.adjust_moles(GAS_O2, 0.5)
/datum/atmosphere/icemoon
id = ICEMOON_DEFAULT_ATMOS
+10 -4
View File
@@ -83,13 +83,19 @@
return
if(HAS_TRAIT(owner, TRAIT_FEARLESS))
return
var/matches = FALSE
var/mainsource
for(var/word in trigger_words)
var/regex/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i")
var/regex/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "ig")
if(findtext(hearing_args[HEARING_RAW_MESSAGE], reg))
addtimer(CALLBACK(src, .proc/freak_out, null, word), 10) //to react AFTER the chat message
hearing_args[HEARING_RAW_MESSAGE] = reg.Replace(hearing_args[HEARING_RAW_MESSAGE], "<span class='phobia'>$1</span>")
break
hearing_args[HEARING_RAW_MESSAGE] = reg.Replace(hearing_args[HEARING_RAW_MESSAGE], "<span class='phobia'>$0</span>")
matches = TRUE
mainsource = word
if(matches)
addtimer(CALLBACK(src, .proc/freak_out, null, mainsource), 10) //to react AFTER the chat message
/datum/brain_trauma/mild/phobia/handle_speech(datum/source, list/speech_args)
if(HAS_TRAIT(owner, TRAIT_FEARLESS))
@@ -93,7 +93,6 @@
/datum/crafting_recipe/quiver
name = "Quiver"
always_availible = FALSE
result = /obj/item/storage/belt/quiver
time = 80
reqs = list(/obj/item/stack/sheet/leather = 3,
@@ -104,19 +103,18 @@
name = "Bone Bow"
result = /obj/item/gun/ballistic/bow/ashen
time = 120 // 80+120 = 200
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 8,
/obj/item/stack/sheet/sinew = 4)
category = CAT_PRIMAL
/datum/crafting_recipe/bow_tablet
/*/datum/crafting_recipe/bow_tablet
name = "Sandstone Bow Making Manual"
result = /obj/item/book/granter/crafting_recipe/bone_bow
time = 200 //Scribing // don't care
always_availible = FALSE
reqs = list(/obj/item/stack/rods = 1,
/obj/item/stack/sheet/mineral/sandstone = 4)
category = CAT_PRIMAL
category = CAT_PRIMAL*/
/datum/crafting_recipe/rib
name = "Collosal Rib"
@@ -154,3 +152,158 @@
/obj/item/shovel/spade = 1)
result = /obj/item/shovel/serrated
category = CAT_PRIMAL
/datum/crafting_recipe/bone_screwdriver
name = "Bone Screwdriver"
result = /obj/item/screwdriver/ashwalker
time = 80
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bone_crowbar
name = "Bone Crowbar"
result = /obj/item/crowbar/ashwalker
time = 80
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bone_cutters
name = "Bone Wirecutters"
result = /obj/item/wirecutters/ashwalker
time = 80
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 2)
category = CAT_PRIMAL
/datum/crafting_recipe/bone_wrench
name = "Bone Wrench"
result = /obj/item/wrench/ashwalker
time = 80
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/necropolis_welding
name = "Necropolis Welding Torch"
result = /obj/item/weldingtool/experimental/ashwalker
time = 120
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 2,
/obj/item/organ/regenerative_core = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/tribalbelt
name = "Hunter's Belt"
result = /obj/item/storage/belt/mining/primitive
time = 80
reqs = list(/obj/item/stack/sheet/sinew = 4)
category = CAT_PRIMAL
/datum/crafting_recipe/goliath_gloves
name = "Goliath Gloves"
result = /obj/item/clothing/gloves/tackler/combat/goliath
time = 80
reqs = list(/obj/item/stack/sheet/sinew = 2,
/obj/item/stack/sheet/animalhide/goliath_hide = 2,
/obj/item/stack/sheet/cloth = 2,
/obj/item/stack/sheet/leather = 2)
category = CAT_PRIMAL
/datum/crafting_recipe/goliath_drapes
name = "Goliath Drapes"
result = /obj/item/surgical_drapes/goliath
time = 80
reqs = list(/obj/item/stack/sheet/sinew = 1,
/obj/item/stack/sheet/animalhide/goliath_hide = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/diamond_scalpel
name = "Diamond Scalpel"
result = /obj/item/scalpel/ashwalker
time = 80
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1,
/obj/item/stack/sheet/mineral/diamond = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bone_retractor
name = "Bone Retractor"
result = /obj/item/retractor/ashwalker
time = 80
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/diamond_bonesaw
name = "Diamond Bonesaw"
result = /obj/item/circular_saw/ashwalker
time = 80
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1,
/obj/item/organ/regenerative_core = 1,
/obj/item/stack/sheet/mineral/diamond = 2)
category = CAT_PRIMAL
/datum/crafting_recipe/femurstat
name = "Bone Hemostat"
result = /obj/item/hemostat/ashwalker
time = 80
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bone_bonesetter
name = "Bone Bonersetter"
result = /obj/item/bonesetter/bone
time = 80
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/coretery
name = "Necropolis Cautery"
result = /obj/item/cautery/ashwalker
time = 80
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/animalhide/goliath_hide = 1,
/obj/item/organ/regenerative_core = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bone_spade
name = "Bone Spade"
result = /obj/item/shovel/spade/bone
time = 80
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bone_hatchet
name = "Bone Hatchet"
result = /obj/item/hatchet/bone
time = 80
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bone_cultivator
name = "Bone Cultivator"
result = /obj/item/cultivator/bone
time = 80
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bone_glaive
name = "Necropolis Glaive"
result = /obj/item/kinetic_crusher/glaive/bone
time = 120
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/mineral/wood = 4,
/obj/item/stack/sheet/sinew = 4,
/obj/item/organ/regenerative_core = 2,
/obj/item/stack/sheet/mineral/diamond = 2,
/obj/item/stack/sheet/animalhide/goliath_hide = 2,
/obj/item/stack/sheet/leather = 2)
category = CAT_PRIMAL
@@ -335,7 +335,6 @@
name = "Bone Arrow"
result = /obj/item/ammo_casing/caseless/arrow/bone
time = 5
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/sinew = 1,
/obj/item/ammo_casing/caseless/arrow/ash = 1)
@@ -347,7 +346,6 @@
result = /obj/item/ammo_casing/caseless/arrow/ash
tools = list(TOOL_WELDER)
time = 10 // 1.5 seconds minimum per actually worthwhile arrow excluding interface lag
always_availible = FALSE
reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
+3
View File
@@ -206,6 +206,9 @@ GLOBAL_LIST_EMPTY(uplinks)
return data
/datum/component/uplink/ui_act(action, params)
. = ..()
if(.)
return
if(!active)
return
switch(action)
+2
View File
@@ -71,6 +71,8 @@
///What character we spawned in as- either at roundstart or latejoin, so we know for persistent scars if we ended as the same person or not
var/mob/original_character
/// A lazy list of statuses to add next to this mind in the traitor panel
var/list/special_statuses
/datum/mind/New(var/key)
skill_holder = new(src)
+7
View File
@@ -0,0 +1,7 @@
/// This should match the interface of /client wherever necessary.
/datum/client_interface
/// Player preferences datum for the client
var/datum/preferences/prefs
/// The view of the client, similar to /client/var/view.
var/view = "15x15"
+3
View File
@@ -194,6 +194,9 @@
C.adjustStaminaLoss(max(0, stamdmg_per_ds * diff)) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing.
last_tick = world.time
/datum/status_effect/electrode/no_damage
stamdmg_per_ds = 0
/datum/status_effect/electrode/no_combat_mode
id = "tased_strong"
movespeed_mod = /datum/movespeed_modifier/status_effect/tased/no_combat_mode
@@ -18,7 +18,7 @@
area_type = /area
protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer,
/area/ai_monitored/turret_protected/ai, /area/commons/storage/emergency/starboard, /area/commons/storage/emergency/port, /area/shuttle)
/area/ai_monitored/turret_protected/ai, /area/commons/storage/emergency/starboard, /area/commons/storage/emergency/port, /area/shuttle, /area/ruin/lavaland)
target_trait = ZTRAIT_STATION
immunity_type = "rad"
+2 -2
View File
@@ -1,9 +1,9 @@
// Icemoon Ruins
/area/ruin/unpowered/buried_library
/area/ruin/lavaland/unpowered/buried_library
name = "Buried Library"
icon_state = "dk_yellow"
/area/ruin/powered/bathhouse
/area/ruin/lavaland/powered/bathhouse
name = "Bath House"
icon_state = "dk_yellow"
+36 -27
View File
@@ -1,90 +1,99 @@
//Lavaland Ruins
/area/ruin/powered/beach
/area/ruin/lavaland/unpowered
always_unpowered = FALSE
/area/ruin/lavaland/unpowered/no_grav
has_gravity = FALSE
/area/ruin/lavaland/powered
requires_power = FALSE
/area/ruin/lavaland/powered/beach
icon_state = "dk_yellow"
/area/ruin/powered/clownplanet
/area/ruin/lavaland/powered/clownplanet
icon_state = "dk_yellow"
/area/ruin/powered/animal_hospital
/area/ruin/lavaland/powered/animal_hospital
icon_state = "dk_yellow"
/area/ruin/powered/snow_biodome
/area/ruin/lavaland/powered/snow_biodome
icon_state = "dk_yellow"
/area/ruin/powered/gluttony
/area/ruin/lavaland/powered/gluttony
icon_state = "dk_yellow"
/area/ruin/powered/golem_ship
/area/ruin/lavaland/powered/golem_ship
name = "Free Golem Ship"
icon_state = "dk_yellow"
/area/ruin/powered/greed
/area/ruin/lavaland/powered/greed
icon_state = "dk_yellow"
/area/ruin/unpowered/hierophant
/area/ruin/lavaland/unpowered/hierophant
name = "Hierophant's Arena"
icon_state = "dk_yellow"
/area/ruin/powered/pride
/area/ruin/lavaland/powered/pride
icon_state = "dk_yellow"
/area/ruin/powered/seedvault
/area/ruin/lavaland/powered/seedvault
icon_state = "dk_yellow"
/area/ruin/unpowered/elephant_graveyard
/area/ruin/lavaland/unpowered/elephant_graveyard
name = "Elephant Graveyard"
icon_state = "dk_yellow"
/area/ruin/powered/graveyard_shuttle
/area/ruin/lavaland/powered/graveyard_shuttle
name = "Elephant Graveyard"
icon_state = "green"
/area/ruin/unpowered/syndicate_lava_base
/area/ruin/lavaland/unpowered/syndicate_lava_base
name = "Secret Base"
icon_state = "dk_yellow"
ambientsounds = HIGHSEC
/area/ruin/unpowered/syndicate_lava_base/engineering
/area/ruin/lavaland/unpowered/syndicate_lava_base/engineering
name = "Syndicate Lavaland Engineering"
/area/ruin/unpowered/syndicate_lava_base/medbay
/area/ruin/lavaland/unpowered/syndicate_lava_base/medbay
name = "Syndicate Lavaland Medbay"
/area/ruin/unpowered/syndicate_lava_base/arrivals
/area/ruin/lavaland/unpowered/syndicate_lava_base/arrivals
name = "Syndicate Lavaland Arrivals"
/area/ruin/unpowered/syndicate_lava_base/bar
/area/ruin/lavaland/unpowered/syndicate_lava_base/bar
name = "Syndicate Lavaland Bar"
/area/ruin/unpowered/syndicate_lava_base/main
/area/ruin/lavaland/unpowered/syndicate_lava_base/main
name = "Syndicate Lavaland Primary Hallway"
/area/ruin/unpowered/syndicate_lava_base/cargo
/area/ruin/lavaland/unpowered/syndicate_lava_base/cargo
name = "Syndicate Lavaland Cargo Bay"
/area/ruin/unpowered/syndicate_lava_base/chemistry
/area/ruin/lavaland/unpowered/syndicate_lava_base/chemistry
name = "Syndicate Lavaland Chemistry"
/area/ruin/unpowered/syndicate_lava_base/virology
/area/ruin/lavaland/unpowered/syndicate_lava_base/virology
name = "Syndicate Lavaland Virology"
/area/ruin/unpowered/syndicate_lava_base/testlab
/area/ruin/lavaland/unpowered/syndicate_lava_base/testlab
name = "Syndicate Lavaland Experimentation Lab"
/area/ruin/unpowered/syndicate_lava_base/dormitories
/area/ruin/lavaland/unpowered/syndicate_lava_base/dormitories
name = "Syndicate Lavaland Dormitories"
/area/ruin/unpowered/syndicate_lava_base/telecomms
/area/ruin/lavaland/unpowered/syndicate_lava_base/telecomms
name = "Syndicate Lavaland Telecommunications"
/area/ruin/unpowered/syndicate_lava_base/circuits
/area/ruin/lavaland/unpowered/syndicate_lava_base/circuits
name = "Syndicate Lavaland Circuit Lab"
//Xeno Nest
/area/ruin/unpowered/xenonest
/area/ruin/lavaland/unpowered/xenonest
name = "The Hive"
always_unpowered = TRUE
power_environ = FALSE
@@ -93,5 +102,5 @@
poweralm = FALSE
//ash walker nest
/area/ruin/unpowered/ash_walkers
/area/ruin/lavaland/unpowered/ash_walkers
icon_state = "red"
+1 -1
View File
@@ -196,7 +196,7 @@ Credit where due:
..()
return 1
/datum/game_mode/clockwork_cult/proc/greet_servant(mob/M) //Description of their role
/datum/game_mode/proc/greet_servant(mob/M) //Description of their role
if(!M)
return 0
to_chat(M, "<span class='bold large_brass'>You are a servant of Ratvar, the Clockwork Justiciar!</span>")
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,27 @@
/datum/game_mode/dynamic/proc/setup_hijacking()
RegisterSignal(SSdcs, COMSIG_GLOB_PRE_RANDOM_EVENT, .proc/on_pre_random_event)
/datum/game_mode/dynamic/proc/on_pre_random_event(datum/source, datum/round_event_control/round_event_control)
SIGNAL_HANDLER
if (!round_event_control.dynamic_should_hijack)
return
if (random_event_hijacked != HIJACKED_NOTHING)
dynamic_log("Random event [round_event_control.name] tried to roll, but Dynamic vetoed it (random event has already ran).")
SSevents.spawnEvent()
SSevents.reschedule()
return CANCEL_PRE_RANDOM_EVENT
var/time_range = rand(random_event_hijack_minimum, random_event_hijack_maximum)
if (world.time - last_midround_injection_attempt < time_range)
random_event_hijacked = HIJACKED_TOO_RECENT
dynamic_log("Random event [round_event_control.name] tried to roll, but the last midround injection \
was too recent. Injection chance has been raised to [get_midround_injection_chance(dry_run = TRUE)]%.")
return CANCEL_PRE_RANDOM_EVENT
if (midround_injection_cooldown - world.time < time_range)
random_event_hijacked = HIJACKED_TOO_SOON
dynamic_log("Random event [round_event_control.name] tried to roll, but the next midround injection \
is too soon. Injection chance has been raised to [get_midround_injection_chance(dry_run = TRUE)]%.")
return CANCEL_PRE_RANDOM_EVENT
@@ -0,0 +1,101 @@
/// A "snapshot" of dynamic at an important point in time.
/// Exported to JSON in the dynamic.json log file.
/datum/dynamic_snapshot
/// The remaining midround threat
var/remaining_threat
/// The world.time when the snapshot was taken
var/time
/// The total number of players in the server
var/total_players
/// The number of alive players
var/alive_players
/// The number of dead players
var/dead_players
/// The number of observers
var/observers
/// The number of alive antags
var/alive_antags
/// The rulesets chosen this snapshot
var/datum/dynamic_snapshot_ruleset/ruleset_chosen
/// The cached serialization of this snapshot
var/serialization
/// A ruleset chosen during a snapshot
/datum/dynamic_snapshot_ruleset
/// The name of the ruleset chosen
var/name
/// If it is a round start ruleset, how much it was scaled by
var/scaled
/// The number of assigned antags
var/assigned
/datum/dynamic_snapshot_ruleset/New(datum/dynamic_ruleset/ruleset)
name = ruleset.name
assigned = ruleset.assigned.len
if (istype(ruleset, /datum/dynamic_ruleset/roundstart))
scaled = ruleset.scaled_times
/// Convert the snapshot to an associative list
/datum/dynamic_snapshot/proc/to_list()
if (!isnull(serialization))
return serialization
serialization = list(
"remaining_threat" = remaining_threat,
"time" = time,
"total_players" = total_players,
"alive_players" = alive_players,
"dead_players" = dead_players,
"observers" = observers,
"alive_antags" = alive_antags,
"ruleset_chosen" = list(
"name" = ruleset_chosen.name,
"scaled" = ruleset_chosen.scaled,
"assigned" = ruleset_chosen.assigned,
),
)
return serialization
/// Updates the log for the current snapshots.
/datum/game_mode/dynamic/proc/update_log()
var/list/serialized = list()
serialized["threat_level"] = threat_level
serialized["round_start_budget"] = initial_round_start_budget
serialized["mid_round_budget"] = threat_level - initial_round_start_budget
serialized["shown_threat"] = shown_threat
var/list/serialized_snapshots = list()
for (var/datum/dynamic_snapshot/snapshot as anything in snapshots)
serialized_snapshots += list(snapshot.to_list())
serialized["snapshots"] = serialized_snapshots
rustg_file_write(json_encode(serialized), "[GLOB.log_directory]/dynamic.json")
/// Creates a new snapshot with the given rulesets chosen, and writes to the JSON output.
/datum/game_mode/dynamic/proc/new_snapshot(datum/dynamic_ruleset/ruleset_chosen)
var/datum/dynamic_snapshot/new_snapshot = new
new_snapshot.remaining_threat = mid_round_budget
new_snapshot.time = world.time
new_snapshot.alive_players = current_players[CURRENT_LIVING_PLAYERS].len
new_snapshot.dead_players = current_players[CURRENT_DEAD_PLAYERS].len
new_snapshot.observers = current_players[CURRENT_OBSERVERS].len
new_snapshot.total_players = new_snapshot.alive_players + new_snapshot.dead_players + new_snapshot.observers
new_snapshot.alive_antags = current_players[CURRENT_LIVING_ANTAGS].len
new_snapshot.ruleset_chosen = new /datum/dynamic_snapshot_ruleset(ruleset_chosen)
LAZYADD(snapshots, new_snapshot)
update_log()
+88 -128
View File
@@ -1,16 +1,13 @@
#define EXTRA_RULESET_PENALTY 20 // Changes how likely a gamemode is to scale based on how many other roundstart rulesets are waiting to be rolled.
#define POP_SCALING_PENALTY 50 // Discourages scaling up rulesets if ratio of antags to crew is high.
#define REVOLUTION_VICTORY 1
#define STATION_VICTORY 2
/datum/dynamic_ruleset
/// For admin logging and round end screen.
// If you want to change this variable name, the force latejoin/midround rulesets
// to not use sortNames.
var/name = ""
/// For admin logging and round end screen, do not change this unless making a new rule type.
var/ruletype = ""
/// For config purposes, similar to config_tag for secret game modes.
var/config_tag = null
/// If set to TRUE, the rule won't be discarded after being executed, and dynamic will call rule_process() every time it ticks.
var/persistent = FALSE
/// If set to TRUE, dynamic mode will be able to draft this ruleset again later on. (doesn't apply for roundstart rules)
@@ -31,7 +28,7 @@
var/list/protected_roles = list()
/// If set, rule will deny candidates from those roles always.
var/list/restricted_roles = list()
/// If set, rule will only accept candidates from those roles, IMPORTANT: DOES NOT WORK ON ROUNDSTART RULESETS.
/// If set, rule will only accept candidates from those roles. If on a roundstart ruleset, requires the player to have the correct antag pref enabled and any of the possible roles enabled.
var/list/exclusive_roles = list()
/// If set, there needs to be a certain amount of players doing those roles (among the players who won't be drafted) for the rule to be drafted IMPORTANT: DOES NOT WORK ON ROUNDSTART RULESETS.
var/list/enemy_roles = list()
@@ -39,7 +36,7 @@
var/required_enemies = list(1,1,0,0,0,0,0,0,0,0)
/// The rule needs this many candidates (post-trimming) to be executed (example: Cult needs 4 players at round start)
var/required_candidates = 0
/// 1 -> 9, probability for this rule to be picked against other rules
/// 0 -> 9, probability for this rule to be picked against other rules. If zero this will effectively disable the rule.
var/weight = 5
/// Threat cost for this rule, this is decreased from the mode's threat when the rule is executed.
var/cost = 0
@@ -49,21 +46,13 @@
var/scaled_times = 0
/// Used for the roundend report
var/total_cost = 0
/// A flag that determines how the ruleset is handled
/// ONLY_RULESET are rulesets that prevent ALL other rulesets from rolling.
/// HIGHLANDER_RULESET are rulesets can end the round.
/// TRAITOR_RULESET are the "default" ruleset--they should always be addable to a round, if the round type allows antags and dynamic thinks there should be another.
/// MINOR_RULESET is for rulesets whose antags can have multiple instances without causing too much issue. As roundstarts, they have their weights reduced based on the storyteller's minor-antag-round chance.
/// FAKE_ANTAG_RULESET is for rulesets whose antags aren't actually antagonistic--essentially just flavor meant to spice the round up.
/// ALWAYS_MAX_WEIGHT_RULESET means that the ruleset doesn't have its weight reduced based on recency.
var/flags = 0
/// A flag that determines how the ruleset is handled. Check __DEFINES/dynamic.dm for an explanation of the accepted values.
var/flags = NONE
/// Pop range per requirement. If zero defaults to mode's pop_per_requirement.
var/pop_per_requirement = 0
/// Requirements are the threat level requirements per pop range.
/// With the default values, The rule will never get drafted below 10 threat level (aka: "peaceful extended"), and it requires a higher threat level at lower pops.
var/list/requirements = list(40,30,20,10,10,10,10,10,10,10)
/// An alternative, static requirement used instead when pop is over mode's high_pop_limit.
var/high_population_requirement = 10
/// Reference to the mode, use this instead of SSticker.mode.
var/datum/game_mode/dynamic/mode = null
/// If a role is to be considered another for the purpose of banning.
@@ -77,53 +66,31 @@
var/maximum_players = 0
/// Calculated during acceptable(), used in scaling and team sizes.
var/indice_pop = 0
/// Population scaling. Used by team antags and scaling for solo antags.
var/list/antag_cap = list()
/// Base probability used in scaling. The higher it is, the more likely to scale. Kept as a var to allow for config editing._SendSignal(sigtype, list/arguments)
var/base_prob = 60
/// Delay for when execute will get called from the time of post_setup (roundstart) or process (midround/latejoin).
/// Make sure your ruleset works with execute being called during the game when using this, and that the clean_up proc reverts it properly in case of faliure.
var/delay = 0
/// List of tags for use in storytellers.
var/list/property_weights = list()
/// Weight reduction by recent-rounds. Saved on new.
var/weight_mult = 1
/// Judges the amount of antagonists to apply, for both solo and teams.
/// Note that some antagonists (such as traitors, lings, heretics, etc) will add more based on how many times they've been scaled.
/// Written as a linear equation--ceil(x/denominator) + offset, or as a fixed constant.
/// If written as a linear equation, will be in the form of `list("denominator" = denominator, "offset" = offset).
var/antag_cap = 0
/datum/dynamic_ruleset/New()
// Rulesets can be instantiated more than once, such as when an admin clicks
// "Execute Midround Ruleset". Thus, it would be wrong to perform any
// side effects here. Dynamic rulesets should be stateless anyway.
SHOULD_NOT_OVERRIDE(TRUE)
mode = SSticker.mode
..()
if(CONFIG_GET(flag/protect_roles_from_antagonist))
restricted_roles += protected_roles
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
restricted_roles += "Assistant"
var/weights = CONFIG_GET(keyed_list/dynamic_weight)
var/costs = CONFIG_GET(keyed_list/dynamic_cost)
var/requirementses = CONFIG_GET(keyed_list/dynamic_requirements) // can't damn well use requirements
var/high_population_requirements = CONFIG_GET(keyed_list/dynamic_high_population_requirement)
var/list/repeated_mode_adjust = CONFIG_GET(number_list/repeated_mode_adjust)
if(config_tag in weights)
if(!(flags & ALWAYS_MAX_WEIGHT_RULESET) && SSpersistence.saved_dynamic_rules.len == 3 && repeated_mode_adjust.len == 3)
var/saved_dynamic_rules = SSpersistence.saved_dynamic_rules
for(var/i in 1 to 3)
if(config_tag in saved_dynamic_rules[i])
weight_mult -= (repeated_mode_adjust[i]/100)
weight_mult = max(0,weight_mult)
if(config_tag in costs)
cost = costs[config_tag]
if(config_tag in requirementses)
requirements = requirementses[config_tag]
if(config_tag in high_population_requirements)
high_population_requirement = high_population_requirements[config_tag]
if (istype(SSticker.mode, /datum/game_mode/dynamic))
mode = SSticker.mode
else if (GLOB.master_mode != "dynamic") // This is here to make roundstart forced ruleset function.
qdel(src)
/datum/dynamic_ruleset/roundstart // One or more of those drafted at roundstart
ruletype = "Roundstart"
/datum/dynamic_ruleset/minor // drafted at roundstart in minor rounds, one antag at a time, for a "mixed" round
ruletype = "Minor"
// Can be drafted when a player joins the server
/datum/dynamic_ruleset/latejoin
ruletype = "Latejoin"
@@ -131,55 +98,47 @@
/// By default, a rule is acceptable if it satisfies the threat level/population requirements.
/// If your rule has extra checks, such as counting security officers, do that in ready() instead
/datum/dynamic_ruleset/proc/acceptable(population = 0, threat_level = 0)
pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : mode.pop_per_requirement
indice_pop = min(requirements.len,round(population/pop_per_requirement)+1)
if(minimum_players > population)
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to low pop")
return FALSE
if(maximum_players > 0 && population > maximum_players)
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to high pop")
return FALSE
if (population >= GLOB.dynamic_high_pop_limit)
indice_pop = 10
if(threat_level < high_population_requirement)
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat level")
log_game("DYNAMIC: [name] did not reach threat level threshold: [threat_level]/[high_population_requirement]")
return FALSE
else
return TRUE
else
pop_per_requirement = pop_per_requirement > 0 ? pop_per_requirement : mode.pop_per_requirement
if(antag_cap.len && requirements.len != antag_cap.len)
message_admins("DYNAMIC: requirements and antag_cap lists have different lengths in ruleset [name]. Likely config issue, report this.")
log_game("DYNAMIC: requirements and antag_cap lists have different lengths in ruleset [name]. Likely config issue, report this.")
indice_pop = min(requirements.len,round(population/pop_per_requirement)+1)
if(threat_level < requirements[indice_pop])
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat level")
log_game("DYNAMIC: [name] did not reach threat level threshold: [threat_level]/[requirements[indice_pop]]")
return FALSE
else
return TRUE
return (threat_level >= requirements[indice_pop])
/// Called when a suitable rule is picked during roundstart(). Will some times attempt to scale a rule up when there is threat remaining. Returns the amount of scaled steps.
/datum/dynamic_ruleset/proc/scale_up(extra_rulesets = 0, remaining_threat_level = 0)
remaining_threat_level -= cost
if(scaling_cost && scaling_cost <= remaining_threat_level) // Only attempts to scale the modes with a scaling cost explicitly set.
var/new_prob
var/pop_to_antags = (mode.antags_rolled + (antag_cap[indice_pop] * (scaled_times + 1))) / mode.roundstart_pop_ready
log_game("DYNAMIC: [name] roundstart ruleset attempting to scale up with [extra_rulesets] rulesets waiting and [remaining_threat_level] threat remaining.")
for(var/i in 1 to 3) //Can scale a max of 3 times
if(remaining_threat_level >= scaling_cost && pop_to_antags < 0.25)
new_prob = base_prob + (remaining_threat_level) - (scaled_times * scaling_cost) - (extra_rulesets * EXTRA_RULESET_PENALTY) - (pop_to_antags * POP_SCALING_PENALTY)
if (!prob(new_prob))
break
remaining_threat_level -= scaling_cost
scaled_times++
pop_to_antags = (mode.antags_rolled + (antag_cap[indice_pop] * (scaled_times + 1))) / mode.roundstart_pop_ready
log_game("DYNAMIC: [name] roundstart ruleset failed scaling up at [new_prob ? new_prob : 0]% chance after [scaled_times]/3 successful scaleups. [remaining_threat_level] threat remaining, antag to crew ratio: [pop_to_antags*100]%.")
mode.antags_rolled += (1 + scaled_times) * antag_cap[indice_pop]
return scaled_times * scaling_cost
/// When picking rulesets, if dynamic picks the same one multiple times, it will "scale up".
/// However, doing this blindly would result in lowpop rounds (think under 10 people) where over 80% of the crew is antags!
/// This function is here to ensure the antag ratio is kept under control while scaling up.
/// Returns how much threat to actually spend in the end.
/datum/dynamic_ruleset/proc/scale_up(population, max_scale)
if (!scaling_cost)
return 0
var/antag_fraction = 0
for(var/_ruleset in (mode.executed_rules + list(src))) // we care about the antags we *will* assign, too
var/datum/dynamic_ruleset/ruleset = _ruleset
antag_fraction += ((1 + ruleset.scaled_times) * ruleset.get_antag_cap(population)) / mode.roundstart_pop_ready
for(var/i in 1 to max_scale)
if(antag_fraction < 0.25)
scaled_times += 1
antag_fraction += get_antag_cap(population) / mode.roundstart_pop_ready // we added new antags, gotta update the %
return scaled_times * scaling_cost
/// Returns what the antag cap with the given population is.
/datum/dynamic_ruleset/proc/get_antag_cap(population)
if (isnum(antag_cap))
return antag_cap
return CEILING(population / antag_cap["denominator"], 1) + (antag_cap["offset"] || 0)
/// This is called if persistent variable is true everytime SSTicker ticks.
/datum/dynamic_ruleset/proc/rule_process()
return TRUE
return
/// Called on game mode pre_setup for roundstart rulesets.
/// Do everything you need to do before job is assigned here.
@@ -206,7 +165,8 @@
/// Runs from gamemode process() if ruleset fails to start, like delayed rulesets not getting valid candidates.
/// This one only handles refunding the threat, override in ruleset to clean up the rest.
/datum/dynamic_ruleset/proc/clean_up()
return
mode.refund_threat(cost + (scaled_times * scaling_cost))
mode.threat_log += "[worldtime2text()]: [ruletype] [name] refunded [cost + (scaled_times * scaling_cost)]. Failed to execute."
/// Gets weight of the ruleset
/// Note that this decreases weight if repeatable is TRUE and repeatable_weight_decrease is higher than 0
@@ -225,32 +185,9 @@
return
/// Set mode result and news report here.
/// Only called if ruleset is flagged as HIGHLANDER_RULESET
/// Only called if ruleset is flagged as HIGH_IMPACT_RULESET
/datum/dynamic_ruleset/proc/round_result()
/// Checks if round is finished, return true to end the round.
/// Only called if ruleset is flagged as HIGHLANDER_RULESET
/datum/dynamic_ruleset/proc/check_finished()
return FALSE
/// Returns a list to be displayed on statbus.
/datum/dynamic_ruleset/proc/get_blackbox_info()
var/list/ruleset_data = list()
ruleset_data["name"] = name
ruleset_data["rule_type"] = ruletype
ruleset_data["cost"] = total_cost
ruleset_data["weight"] = weight
ruleset_data["scaled_times"] = scaled_times
ruleset_data["antagonist_type"] = antag_datum
ruleset_data["population_tier"] = indice_pop
ruleset_data["assigned"] = list()
for (var/datum/mind/M in assigned)
var/assigned_data = list()
assigned_data["key"] = M.key
assigned_data["name"] = M.name
ruleset_data["assigned"] += list(assigned_data)
return ruleset_data
//////////////////////////////////////////////
// //
// ROUNDSTART RULESETS //
@@ -259,26 +196,49 @@
/// Checks if candidates are connected and if they are banned or don't want to be the antagonist.
/datum/dynamic_ruleset/roundstart/trim_candidates()
for(var/mob/dead/new_player/P in candidates)
if (!P.client || !P.mind) // Are they connected?
candidates.Remove(P)
for(var/mob/dead/new_player/candidate_player in candidates)
var/client/candidate_client = GET_CLIENT(candidate_player)
if (!candidate_client || !candidate_player.mind) // Are they connected?
candidates.Remove(candidate_player)
continue
if(!mode.check_age(P.client, minimum_required_age))
candidates.Remove(P)
else if(!mode.check_age(candidate_client, minimum_required_age))
candidates.Remove(candidate_player)
continue
if(P.mind.special_role) // We really don't want to give antag to an antag.
candidates.Remove(P)
if(candidate_player.mind.special_role) // We really don't want to give antag to an antag.
candidates.Remove(candidate_player)
continue
if(ROLE_NO_ANTAGONISM in candidate_player.client.prefs.be_special)
candidates.Remove(candidate_player)
continue
if(antag_flag_override)
if(!(antag_flag_override in P.client.prefs.be_special) || jobban_isbanned(P.ckey, antag_flag_override))
candidates.Remove(P)
if(!(HAS_ANTAG_PREF(candidate_player.client, antag_flag_override)))
candidates.Remove(candidate_player)
continue
else
if(!(antag_flag in P.client.prefs.be_special) || jobban_isbanned(P.ckey, antag_flag))
candidates.Remove(P)
if(!(HAS_ANTAG_PREF(candidate_player.client, antag_flag)))
candidates.Remove(candidate_player)
continue
// If this ruleset has exclusive_roles set, we want to only consider players who have those
// job prefs enabled and are eligible to play that job. Otherwise, continue as before.
if(length(exclusive_roles))
var/exclusive_candidate = FALSE
for(var/role in exclusive_roles)
var/datum/job/job = SSjob.GetJob(role)
if((role in candidate_client.prefs.job_preferences) && !jobban_isbanned(candidate_player.ckey, role) && !job.required_playtime_remaining(candidate_client))
exclusive_candidate = TRUE
break
// If they didn't have any of the required job prefs enabled or were banned from all enabled prefs,
// they're not eligible for this antag type.
if(!exclusive_candidate)
candidates.Remove(candidate_player)
/// Do your checks if the ruleset is ready to be executed here.
/// Should ignore certain checks if forced is TRUE
/datum/dynamic_ruleset/roundstart/ready(forced = FALSE)
/datum/dynamic_ruleset/roundstart/ready(population, forced = FALSE)
return ..()
@@ -6,26 +6,22 @@
/datum/dynamic_ruleset/latejoin/trim_candidates()
for(var/mob/P in candidates)
if (!P.client || !P.mind || !P.mind.assigned_role) // Are they connected?
if(!P.client || !P.mind || !P.mind.assigned_role) // Are they connected?
candidates.Remove(P)
continue
if(!mode.check_age(P.client, minimum_required_age))
else if(!mode.check_age(P.client, minimum_required_age))
candidates.Remove(P)
continue
if(antag_flag_override)
if(!(antag_flag_override in P.client.prefs.be_special) || jobban_isbanned(P.ckey, list(antag_flag_override)))
else if(P.mind.assigned_role in restricted_roles) // Does their job allow for it?
candidates.Remove(P)
else if((exclusive_roles.len > 0) && !(P.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job?
candidates.Remove(P)
else if(ROLE_NO_ANTAGONISM in P.client.prefs.be_special)
candidates.Remove(P)
else if(antag_flag_override)
if(!(HAS_ANTAG_PREF(P.client, antag_flag_override)))
candidates.Remove(P)
continue
else
if(!(antag_flag in P.client.prefs.be_special) || jobban_isbanned(P.ckey, list(antag_flag, ROLE_SYNDICATE)))
if(!(HAS_ANTAG_PREF(P.client, antag_flag)))
candidates.Remove(P)
continue
if (P.mind.assigned_role in restricted_roles) // Does their job allow for it?
candidates.Remove(P)
continue
if ((exclusive_roles.len > 0) && !(P.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job?
candidates.Remove(P)
continue
/datum/dynamic_ruleset/latejoin/ready(forced = 0)
if (!forced)
@@ -34,8 +30,9 @@
for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS])
if (M.stat == DEAD)
continue // Dead players cannot count as opponents
if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
if (M.mind && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it
var/threat = round(mode.threat_level/10)
if (job_check < required_enemies[threat])
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles")
@@ -48,7 +45,6 @@
M.mind.special_role = antag_flag
M.mind.add_antag_datum(antag_datum)
log_admin("[M.name] was made into a [name] by dynamic.")
message_admins("[M.name] was made into a [name] by dynamic.")
return TRUE
//////////////////////////////////////////////
@@ -59,19 +55,16 @@
/datum/dynamic_ruleset/latejoin/infiltrator
name = "Syndicate Infiltrator"
config_tag = "latejoin_traitor"
antag_datum = /datum/antagonist/traitor
antag_flag = ROLE_TRAITOR
restricted_roles = list("AI", "Cyborg")
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
antag_flag = "traitor late"
antag_flag_override = ROLE_TRAITOR
protected_roles = list("Security Officer", "Warden", "Head of Personnel", "Detective", "Head of Security", "Captain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
restricted_roles = list("AI","Cyborg")
required_candidates = 1
weight = 7
cost = 5
requirements = list(40,30,20,15,15,15,15,15,15,15)
high_population_requirement = 15
requirements = list(40,30,20,10,10,10,10,10,10,10)
repeatable = TRUE
flags = TRAITOR_RULESET | MINOR_RULESET | ALWAYS_MAX_WEIGHT_RULESET
property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1)
//////////////////////////////////////////////
// //
@@ -82,23 +75,23 @@
/datum/dynamic_ruleset/latejoin/provocateur
name = "Provocateur"
persistent = TRUE
config_tag = "latejoin_revolution"
antag_datum = /datum/antagonist/rev/head
antag_flag = ROLE_REV_HEAD
antag_flag = "rev head late"
antag_flag_override = ROLE_REV
restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director")
enemy_roles = list("AI", "Cyborg", "Security Officer","Detective","Head of Security", "Captain", "Warden")
required_enemies = list(4,4,3,3,3,3,3,2,2,1)
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 2
delay = 1 MINUTES // Prevents rule start while head is offstation.
delay = 1 MINUTES // Prevents rule start while head is offstation.
cost = 20
requirements = list(101,101,70,40,40,40,40,40,40,40)
high_population_requirement = 40
flags = HIGHLANDER_RULESET
property_weights = list("trust" = -2, "chaos" = 2, "extended" = -2, "valid" = 2, "conversion" = 1)
requirements = list(101,101,101,101,50,20,20,20,20,20)
flags = HIGH_IMPACT_RULESET
blocking_rules = list(/datum/dynamic_ruleset/roundstart/revs)
var/required_heads_of_staff = 3
var/finished = FALSE
/// How much threat should be injected when the revolution wins?
var/revs_win_threat_injection = 20
var/datum/team/revolution/revolution
/datum/dynamic_ruleset/latejoin/provocateur/ready(forced=FALSE)
@@ -113,8 +106,8 @@
return (head_check >= required_heads_of_staff)
/datum/dynamic_ruleset/latejoin/provocateur/execute()
var/mob/M = pick(candidates) // This should contain a single player, but in case.
if(check_eligible(M.mind)) // Didnt die/run off z-level/get implanted since leaving shuttle.
var/mob/M = pick(candidates) // This should contain a single player, but in case.
if(check_eligible(M.mind)) // Didnt die/run off z-level/get implanted since leaving shuttle.
assigned += M.mind
M.mind.special_role = antag_flag
revolution = new()
@@ -125,9 +118,7 @@
new_head = M.mind.add_antag_datum(new_head, revolution)
revolution.update_objectives()
revolution.update_heads()
SSshuttle.registerHostileEnvironment(src)
log_admin("[M.name] was made into a revolutionary by dynamic.")
message_admins("[M.name] was made into a revolutionary by dynamic.")
SSshuttle.registerHostileEnvironment(revolution)
return TRUE
else
log_game("DYNAMIC: [ruletype] [name] discarded [M.name] from head revolutionary due to ineligibility.")
@@ -135,153 +126,38 @@
return FALSE
/datum/dynamic_ruleset/latejoin/provocateur/rule_process()
if(check_rev_victory())
finished = REVOLUTION_VICTORY
return RULESET_STOP_PROCESSING
else if (check_heads_victory())
finished = STATION_VICTORY
SSshuttle.clearHostileEnvironment(src)
priority_announce("It appears the mutiny has been quelled. Please return yourself and your colleagues to work. \
We have remotely blacklisted the head revolutionaries from your cloning software to prevent accidental cloning.", null, "attention", null, "Central Command Loyalty Monitoring Division")
for(var/datum/mind/M in revolution.members) // Remove antag datums and prevent headrev cloning then restarting rebellions.
if(M.has_antag_datum(/datum/antagonist/rev/head))
var/datum/antagonist/rev/head/R = M.has_antag_datum(/datum/antagonist/rev/head)
R.remove_revolutionary(FALSE, "gamemode")
var/mob/living/carbon/C = M.current
if(C.stat == DEAD)
C.makeUncloneable()
if(M.has_antag_datum(/datum/antagonist/rev))
var/datum/antagonist/rev/R = M.has_antag_datum(/datum/antagonist/rev)
R.remove_revolutionary(FALSE, "gamemode")
return RULESET_STOP_PROCESSING
var/winner = revolution.process_victory(revs_win_threat_injection)
if (isnull(winner))
return
finished = winner
return RULESET_STOP_PROCESSING
/// Checks for revhead loss conditions and other antag datums.
/datum/dynamic_ruleset/latejoin/provocateur/proc/check_eligible(var/datum/mind/M)
/datum/dynamic_ruleset/latejoin/provocateur/proc/check_eligible(datum/mind/M)
var/turf/T = get_turf(M.current)
if(!considered_afk(M) && considered_alive(M) && is_station_level(T.z) && !M.antag_datums?.len && !HAS_TRAIT(M, TRAIT_MINDSHIELD))
return TRUE
return FALSE
/datum/dynamic_ruleset/latejoin/provocateur/check_finished()
if(finished == REVOLUTION_VICTORY)
return TRUE
else
return ..()
/datum/dynamic_ruleset/latejoin/provocateur/proc/check_rev_victory()
for(var/datum/objective/mutiny/objective in revolution.objectives)
if(!(objective.check_completion()))
return FALSE
return TRUE
/datum/dynamic_ruleset/latejoin/provocateur/proc/check_heads_victory()
for(var/datum/mind/rev_mind in revolution.head_revolutionaries())
var/turf/T = get_turf(rev_mind.current)
if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z))
if(ishuman(rev_mind.current) || ismonkey(rev_mind.current))
return FALSE
return TRUE
/datum/dynamic_ruleset/latejoin/provocateur/round_result()
if(finished == REVOLUTION_VICTORY)
SSticker.mode_result = "win - heads killed"
SSticker.news_report = REVS_WIN
else if(finished == STATION_VICTORY)
SSticker.mode_result = "loss - rev heads killed"
SSticker.news_report = REVS_LOSE
revolution.round_result(finished)
//////////////////////////////////////////////
// //
// HERETIC SMUGGLER //
// HERETIC SMUGGLER //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/latejoin/heretic_smuggler
name = "Heretic Smuggler"
antag_datum = /datum/antagonist/heretic
antag_flag = "latejoin_heretic"
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
antag_flag = "heretic late"
antag_flag_override = ROLE_HERETIC
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain","Prisoner", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
restricted_roles = list("AI","Cyborg")
required_candidates = 1
weight = 4
cost = 25
requirements = list(60,60,60,55,50,50,50,50,50,50)
flags = MINOR_RULESET
high_population_requirement = 50
property_weights = list("story_potential" = 1, "trust" = -1, "chaos" = 2, "extended" = -1, "valid" = 2)
repeatable = TRUE
//////////////////////////////////////////////
// //
// BLOODSUCKERS //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/latejoin/bloodsucker
name = "Bloodsucker Infiltrator"
config_tag = "latejoin_bloodsucker"
antag_datum = ANTAG_DATUM_BLOODSUCKER
antag_flag = ROLE_TRAITOR
restricted_roles = list("AI", "Cyborg")
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
required_candidates = 1
weight = 3
cost = 10
property_weights = list("story_potential" = 2, "extended" = 2, "trust" = -2, "valid" = 1)
requirements = list(70,65,60,55,50,45,40,35,30,30)
flags = MINOR_RULESET
high_population_requirement = 30
requirements = list(101,101,101,50,40,10,10,10,10,10)
repeatable = TRUE
/datum/dynamic_ruleset/latejoin/bloodsucker/execute()
var/mob/M = pick(candidates)
assigned += M.mind
M.mind.special_role = antag_flag
if(mode.make_bloodsucker(M.mind))
mode.bloodsuckers += M
log_admin("[M.name] was made into a bloodsucker by dynamic.")
message_admins("[M.name] was made into a bloodsucker by dynamic.")
return TRUE
//////////////////////////////////////////////
// //
// CHANGELINGS //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/latejoin/changeling
name = "Changeling Infiltrator"
config_tag = "latejoin_changeling"
antag_flag = ROLE_CHANGELING
antag_datum = /datum/antagonist/changeling
restricted_roles = list("AI", "Cyborg")
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
required_candidates = 1
weight = 3
cost = 15
flags = MINOR_RULESET
requirements = list(101,101,101,101,101,101,101,101,101,101)
property_weights = list("trust" = -2, "valid" = 2)
high_population_requirement = 101
//////////////////////////////////////////////
// //
// COLLECTOR //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/latejoin/collector
name = "Contraband Collector"
config_tag = "latejoin_collector"
antag_datum = /datum/antagonist/collector
antag_flag = ROLE_MINOR_ANTAG
restricted_roles = list("AI", "Cyborg")
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
required_candidates = 1
weight = 5
cost = 1
requirements = list(10,10,10,10,10,10,10,10,10,10)
high_population_requirement = 10
repeatable = TRUE
flags = TRAITOR_RULESET | MINOR_RULESET | FAKE_ANTAG_RULESET
property_weights = list("story_potential" = 1, "trust" = -1, "extended" = 2)
@@ -1,5 +1,7 @@
#define REVENANT_SPAWN_THRESHOLD 20
#define ABDUCTOR_MAX_TEAMS 4 // blame TG for not using the defines files
/// Probability the AI going malf will be accompanied by an ion storm announcement and some ion laws.
#define MALF_ION_PROB 33
/// The probability to replace an existing law with an ion law instead of adding a new ion law.
#define REPLACE_LAW_WITH_ION_PROB 10
//////////////////////////////////////////////
// //
@@ -17,24 +19,20 @@
var/list/living_antags = list()
var/list/dead_players = list()
var/list/list_observers = list()
var/list/ghost_eligible = list()
/datum/dynamic_ruleset/midround/from_ghosts
weight = 0
required_type = /mob/dead/observer
/// Whether the ruleset should call generate_ruleset_body or not.
var/makeBody = TRUE
/// The rule needs this many applicants to be properly executed.
var/required_applicants = 1
/datum/dynamic_ruleset/midround/trim_candidates()
//
// All you need to know is that here, the candidates list contains 4 lists itself, indexed with the following defines:
// Candidates = list(CURRENT_LIVING_PLAYERS, CURRENT_LIVING_ANTAGS, CURRENT_DEAD_PLAYERS, CURRENT_OBSERVERS)
// So for example you can get the list of all current dead players with var/list/dead_players = candidates[CURRENT_DEAD_PLAYERS]
// Make sure to properly typecheck the mobs in those lists, as the dead_players list could contain ghosts, or dead players still in their bodies.
// We're still gonna trim the obvious (mobs without clients, jobbanned players, etc)
living_players = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS])
living_antags = trim_list(mode.current_players[CURRENT_LIVING_ANTAGS])
dead_players = trim_list(mode.current_players[CURRENT_DEAD_PLAYERS])
list_observers = trim_list(mode.current_players[CURRENT_OBSERVERS])
ghost_eligible = trim_list(get_all_ghost_role_eligible())
/datum/dynamic_ruleset/midround/proc/trim_list(list/L = list())
var/list/trimmed_list = L.Copy()
@@ -42,24 +40,21 @@
if (!istype(M, required_type))
trimmed_list.Remove(M)
continue
if (HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG))
trimmed_list.Remove(M)
continue
if (!M.client) // Are they connected?
trimmed_list.Remove(M)
continue
if(M.client.prefs && M.client.prefs.toggles & MIDROUND_ANTAG)
trimmed_list.Remove(M)
continue
if(!mode.check_age(M.client, minimum_required_age))
trimmed_list.Remove(M)
continue
if(ROLE_NO_ANTAGONISM in M.client.prefs.be_special)
trimmed_list.Remove(M)
continue
if(antag_flag_override)
if(!(antag_flag_override in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag_override))
if(!(HAS_ANTAG_PREF(M.client, antag_flag_override)))
trimmed_list.Remove(M)
continue
else
if(!(antag_flag in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag))
if(!(HAS_ANTAG_PREF(M.client, antag_flag)))
trimmed_list.Remove(M)
continue
if (M.mind)
@@ -74,56 +69,35 @@
continue
return trimmed_list
/datum/dynamic_ruleset/midround/from_ghosts/trim_list(list/L = list())
var/list/trimmed_list = L.Copy()
for(var/mob/M in trimmed_list)
if (!M.client) // Are they connected?
trimmed_list.Remove(M)
continue
if(!mode.check_age(M.client, minimum_required_age))
trimmed_list.Remove(M)
continue
if(antag_flag_override)
if(!(antag_flag_override in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag_override))
trimmed_list.Remove(M)
continue
else
if(!(antag_flag in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag))
trimmed_list.Remove(M)
continue
return trimmed_list
// You can then for example prompt dead players in execute() to join as strike teams or whatever
// Or autotator someone
// IMPORTANT, since /datum/dynamic_ruleset/midround may accept candidates from both living, dead, and even antag players, you need to manually check whether there are enough candidates
// (see /datum/dynamic_ruleset/midround/autotraitor/ready(var/forced = FALSE) for example)
// (see /datum/dynamic_ruleset/midround/autotraitor/ready(forced = FALSE) for example)
/datum/dynamic_ruleset/midround/ready(forced = FALSE)
if (!forced)
var/job_check = 0
if (enemy_roles.len > 0)
for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS])
if (M.stat == DEAD)
continue // Dead players cannot count as opponents
if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
if (M.stat == DEAD || !M.client)
continue // Dead/disconnected players cannot count as opponents
if (M.mind && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it
var/threat = clamp(round(mode.threat_level/10),1,10)
var/threat = round(mode.threat_level/10)
if (job_check < required_enemies[threat])
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles")
return FALSE
return TRUE
/datum/dynamic_ruleset/midround/from_ghosts/ready(forced = FALSE)
if (required_candidates > ghost_eligible.len)
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
return FALSE
return ..()
/datum/dynamic_ruleset/midround/from_ghosts/execute()
var/application_successful = send_applications(ghost_eligible)
return assigned.len > 0 && application_successful
var/list/possible_candidates = list()
possible_candidates.Add(dead_players)
possible_candidates.Add(list_observers)
send_applications(possible_candidates)
if(assigned.len > 0)
return TRUE
else
return FALSE
/// This sends a poll to ghosts if they want to be a ghost spawn from a ruleset.
/datum/dynamic_ruleset/midround/from_ghosts/proc/send_applications(list/possible_volunteers = list())
@@ -133,25 +107,24 @@
message_admins("Polling [possible_volunteers.len] players to apply for the [name] ruleset.")
log_game("DYNAMIC: Polling [possible_volunteers.len] players to apply for the [name] ruleset.")
candidates = pollGhostCandidates("The mode is looking for volunteers to become a [name]", antag_flag, SSticker.mode, antag_flag, poll_time = 300)
candidates = pollGhostCandidates("The mode is looking for volunteers to become [antag_flag] for [name]", antag_flag, be_special_flag = antag_flag_override ? antag_flag_override : antag_flag, poll_time = 300)
if(!candidates || candidates.len < required_candidates)
message_admins("The ruleset [name] did not receive enough applications.")
if(candidates)
message_admins("Only received [candidates.len], needed [required_candidates].")
else
message_admins("There were no candidates.")
log_game("DYNAMIC: The ruleset [name] did not receive enough applications.")
return FALSE
if(!candidates || candidates.len <= 0)
mode.dynamic_log("The ruleset [name] received no applications.")
mode.executed_rules -= src
attempt_replacement()
return
message_admins("[candidates.len] players volunteered for the ruleset [name].")
log_game("DYNAMIC: [candidates.len] players volunteered for [name].")
review_applications()
return TRUE
/// Here is where you can check if your ghost applicants are valid for the ruleset.
/// Called by send_applications().
/datum/dynamic_ruleset/midround/from_ghosts/proc/review_applications()
if(candidates.len < required_applicants)
mode.executed_rules -= src
return
for (var/i = 1, i <= required_candidates, i++)
if(candidates.len <= 0)
break
@@ -175,7 +148,7 @@
finish_setup(new_character, i)
assigned += applicant
notify_ghosts("[new_character] has been picked for the ruleset [name]!", source = new_character, action = NOTIFY_ORBIT)
notify_ghosts("[new_character] has been picked for the ruleset [name]!", source = new_character, action = NOTIFY_ORBIT, header="Something Interesting!")
/datum/dynamic_ruleset/midround/from_ghosts/proc/generate_ruleset_body(mob/applicant)
var/mob/living/carbon/human/new_character = makeBody(applicant)
@@ -191,6 +164,20 @@
/datum/dynamic_ruleset/midround/from_ghosts/proc/setup_role(datum/antagonist/new_role)
return
/// Fired when there are no valid candidates. Will spawn a sleeper agent or latejoin traitor.
/datum/dynamic_ruleset/midround/from_ghosts/proc/attempt_replacement()
var/datum/dynamic_ruleset/midround/autotraitor/sleeper_agent = new
// Otherwise, it has a chance to fail. We don't want that, since this is already pretty unlikely.
sleeper_agent.has_failure_chance = FALSE
mode.configure_ruleset(sleeper_agent)
if (!mode.picking_specific_rule(sleeper_agent))
return
mode.picking_specific_rule(/datum/dynamic_ruleset/latejoin/infiltrator)
//////////////////////////////////////////////
// //
// SYNDICATE TRAITORS //
@@ -199,39 +186,45 @@
/datum/dynamic_ruleset/midround/autotraitor
name = "Syndicate Sleeper Agent"
config_tag = "midround_traitor"
antag_datum = /datum/antagonist/traitor
antag_flag = ROLE_TRAITOR
restricted_roles = list("AI", "Cyborg", "Positronic Brain")
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
antag_flag = "traitor mid"
protected_roles = list("Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
restricted_roles = list("Cyborg", "AI", "Positronic Brain")
required_candidates = 1
weight = 7
cost = 10
requirements = list(30,25,20,15,15,15,15,15,15,15)
requirements = list(101,40,30,20,10,10,10,10,10,10)
repeatable = TRUE
high_population_requirement = 15
flags = TRAITOR_RULESET | MINOR_RULESET | ALWAYS_MAX_WEIGHT_RULESET
property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1)
/// Whether or not this instance of sleeper agent should be randomly acceptable.
/// If TRUE, then this has a threat level% chance to succeed.
var/has_failure_chance = TRUE
/datum/dynamic_ruleset/midround/autotraitor/acceptable(population = 0, threat = 0)
var/player_count = mode.current_players[CURRENT_LIVING_PLAYERS].len
var/antag_count = mode.current_players[CURRENT_LIVING_ANTAGS].len
var/max_traitors = round(player_count / 10) + 1
if ((antag_count < max_traitors) && prob(min(100,mode.threat_level)))//adding traitors if the antag population is getting low
return ..()
else
// adding traitors if the antag population is getting low
var/too_little_antags = antag_count < max_traitors
if (!too_little_antags)
log_game("DYNAMIC: Too many living antags compared to living players ([antag_count] living antags, [player_count] living players, [max_traitors] max traitors)")
return FALSE
if (has_failure_chance && !prob(mode.threat_level))
log_game("DYNAMIC: Random chance to roll autotraitor failed, it was a [mode.threat_level]% chance.")
return FALSE
return ..()
/datum/dynamic_ruleset/midround/autotraitor/trim_candidates()
..()
for(var/mob/living/player in living_players)
if(issilicon(player)) // Your assigned role doesn't change when you are turned into a silicon.
living_players -= player
continue
if(is_centcom_level(player.z))
else if(is_centcom_level(player.z))
living_players -= player // We don't autotator people in CentCom
continue
if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0))
else if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0))
living_players -= player // We don't autotator people with roles already
/datum/dynamic_ruleset/midround/autotraitor/ready(forced = FALSE)
@@ -245,63 +238,55 @@
living_players -= M
var/datum/antagonist/traitor/newTraitor = new
M.mind.add_antag_datum(newTraitor)
log_admin("[M] was made into a traitor by dynamic.")
message_admins("[M] was made into a traitor by dynamic.")
message_admins("[ADMIN_LOOKUPFLW(M)] was selected by the [name] ruleset and has been made into a midround traitor.")
log_game("DYNAMIC: [key_name(M)] was selected by the [name] ruleset and has been made into a midround traitor.")
return TRUE
//////////////////////////////////////////////
// //
// Malfunctioning AI //
// //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/midround/malf
name = "Malfunctioning AI"
config_tag = "midround_malf_ai"
antag_datum = /datum/antagonist/traitor
antag_flag = ROLE_MALF
enemy_roles = list("Security Officer", "Warden","Detective","Head of Security", "Captain", "Scientist", "Chemist", "Research Director", "Chief Engineer")
exclusive_roles = list("AI")
required_enemies = list(6,6,6,4,4,4,2,2,2,1)
required_enemies = list(4,4,4,4,4,4,2,2,2,0)
required_candidates = 1
weight = 2
weight = 3
cost = 35
requirements = list(101,101,70,50,50,50,40,30,30,30)
high_population_requirement = 30
requirements = list(101,101,80,70,60,60,50,50,40,40)
required_type = /mob/living/silicon/ai
property_weights = list("story_potential" = 2, "trust" = 1, "chaos" = 2)
var/ion_announce = 33
var/removeDontImproveChance = 10
/datum/dynamic_ruleset/midround/malf/ready()
if(!candidates || !candidates.len)
return FALSE
return ..()
/datum/dynamic_ruleset/midround/malf/trim_candidates()
..()
for(var/mob/living/player in living_players)
candidates = living_players
for(var/mob/living/player in candidates)
if(!isAI(player))
candidates -= player
continue
if(is_centcom_level(player.z))
candidates -= player
continue
if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0))
candidates -= player
/datum/dynamic_ruleset/midround/malf/execute()
if(!candidates || !candidates.len)
return FALSE
var/mob/living/silicon/ai/M = pick_n_take(candidates)
assigned += M.mind
var/datum/antagonist/traitor/AI = new
M.mind.special_role = antag_flag
M.mind.add_antag_datum(AI)
log_admin("[M] was made into a malf AI by dynamic.")
message_admins("[M] was made into a malf AI by dynamic.")
if(prob(ion_announce))
if(prob(MALF_ION_PROB))
priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", "ionstorm")
if(prob(removeDontImproveChance))
if(prob(REPLACE_LAW_WITH_ION_PROB))
M.replace_random_law(generate_ion_law(), list(LAW_INHERENT, LAW_SUPPLIED, LAW_ION))
else
M.add_ion_law(generate_ion_law())
@@ -315,21 +300,21 @@
/datum/dynamic_ruleset/midround/from_ghosts/wizard
name = "Wizard"
config_tag = "midround_wizard"
antag_datum = /datum/antagonist/wizard
antag_flag = ROLE_WIZARD
antag_flag = "wizard mid"
antag_flag_override = ROLE_WIZARD
enemy_roles = list("Security Officer","Detective","Head of Security", "Captain")
required_enemies = list(4,4,3,2,2,1,1,0,0,0)
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 1
weight = 2
cost = 20
requirements = list(90,90,70,50,50,50,50,40,30,30)
high_population_requirement = 30
requirements = list(101,101,100,80,50,30,20,10,10,10)
repeatable = TRUE
property_weights = list("story_potential" = 2, "trust" = 1, "chaos" = 2, "extended" = -2)
var/datum/mind/wizard
/datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE)
if (required_candidates > (dead_players.len + list_observers.len))
return FALSE
if(GLOB.wizardstart.len == 0)
log_admin("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.")
message_admins("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.")
@@ -341,7 +326,7 @@
new_character.forceMove(pick(GLOB.wizardstart))
wizard = new_character.mind
/datum/dynamic_ruleset/midround/from_ghosts/wizard/rule_process() // i can literally copy this from are_special_antags_dead it's great
/datum/dynamic_ruleset/midround/from_ghosts/wizard/rule_process()
if(isliving(wizard.current) && wizard.current.stat!=DEAD)
return FALSE
for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead()
@@ -362,34 +347,31 @@
/datum/dynamic_ruleset/midround/from_ghosts/nuclear
name = "Nuclear Assault"
config_tag = "midround_nuclear"
antag_flag = ROLE_OPERATIVE
antag_flag = "nukie mid"
antag_datum = /datum/antagonist/nukeop
antag_flag_override = ROLE_OPERATIVE
enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain")
required_enemies = list(5,5,4,3,3,2,2,2,1,1)
required_enemies = list(3,3,3,3,3,2,1,1,0,0)
required_candidates = 5
weight = 5
weight = 3
cost = 35
requirements = list(90,90,90,80,70,60,50,40,40,40)
high_population_requirement = 40
property_weights = list("story_potential" = 2, "trust" = 2, "chaos" = 2, "extended" = -2, "valid" = 2)
var/operative_cap = list(2,2,3,3,4,5,5,5,5,5)
requirements = list(101,101,101,80,50,40,30,15,10,10)
var/list/operative_cap = list(2,2,3,3,3,4,5,5,5,5)
var/datum/team/nuclear/nuke_team
flags = HIGHLANDER_RULESET
flags = HIGH_IMPACT_RULESET
/datum/dynamic_ruleset/midround/from_ghosts/nuclear/acceptable(population=0, threat=0)
if (locate(/datum/dynamic_ruleset/roundstart/nuclear) in mode.executed_rules)
return FALSE // Unavailable if nuke ops were already sent at roundstart
indice_pop = min(10, round(living_players.len/5)+1)
/* NOTE: The above line's magic value of "10" is a hack due to the fact that byond was
not recognizing operative_cap as a defined variable. It should be operative_cap.len--
and yes, this means that if the len is changed, this variable must be changed along with it.
One day, once the mystery of why this issue was occuring is figured out,
we may change it back, but until this day comes, we must make it simply 10.
*/
indice_pop = min(operative_cap.len, round(living_players.len/5)+1)
required_candidates = operative_cap[indice_pop]
return ..()
/datum/dynamic_ruleset/midround/from_ghosts/nuclear/ready(forced = FALSE)
if (required_candidates > (dead_players.len + list_observers.len))
return FALSE
return ..()
/datum/dynamic_ruleset/midround/from_ghosts/nuclear/finish_setup(mob/new_character, index)
new_character.mind.special_role = "Nuclear Operative"
new_character.mind.assigned_role = "Nuclear Operative"
@@ -408,24 +390,55 @@
/datum/dynamic_ruleset/midround/from_ghosts/blob
name = "Blob"
config_tag = "blob"
antag_datum = /datum/antagonist/blob
antag_flag = ROLE_BLOB
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(3,3,2,2,2,1,1,1,1,0)
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
blocking_rules = list(/datum/dynamic_ruleset/roundstart/clockcult)
weight = 4
cost = 20
requirements = list(101,101,101,80,60,50,50,50,50,50)
high_population_requirement = 50
weight = 2
cost = 10
requirements = list(101,101,101,101,70,40,25,20,10,10)
repeatable = TRUE
property_weights = list("story_potential" = -1, "trust" = 2, "chaos" = 2, "extended" = -2, "valid" = 2)
/datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant)
var/body = applicant.become_overmind()
return body
/// Infects a random player, making them explode into a blob.
/datum/dynamic_ruleset/midround/blob_infection
name = "Blob Infection"
antag_datum = /datum/antagonist/blob
antag_flag = "blob mid"
protected_roles = list("Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
restricted_roles = list("Cyborg", "AI", "Positronic Brain")
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 2
cost = 10
requirements = list(101,101,101,101,70,40,25,20,10,10)
repeatable = TRUE
/datum/dynamic_ruleset/midround/blob_infection/trim_candidates()
..()
candidates = living_players
for(var/mob/living/player as anything in candidates)
var/turf/player_turf = get_turf(player)
if(!player_turf || !is_station_level(player_turf.z))
candidates -= player
continue
if(player.mind && (player.mind.special_role || length(player.mind.antag_datums) > 0))
candidates -= player
/datum/dynamic_ruleset/midround/blob_infection/execute()
if(!candidates || !candidates.len)
return FALSE
var/mob/living/carbon/human/blob_antag = pick_n_take(candidates)
assigned += blob_antag.mind
blob_antag.mind.special_role = antag_flag
return ..()
//////////////////////////////////////////////
// //
// XENOMORPH (GHOST) //
@@ -434,22 +447,20 @@
/datum/dynamic_ruleset/midround/from_ghosts/xenomorph
name = "Alien Infestation"
config_tag = "xenos"
antag_datum = /datum/antagonist/xeno
antag_flag = ROLE_ALIEN
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(3,3,2,2,1,1,1,1,1,0)
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 3
cost = 10
requirements = list(101,101,101,70,50,50,50,50,50,50)
high_population_requirement = 50
repeatable_weight_decrease = 2
requirements = list(101,101,101,101,60,50,30,20,10,10)
repeatable = TRUE
property_weights = list("story_potential" = -1, "trust" = 1, "chaos" = 2, "extended" = -2, "valid" = 2)
var/list/vents = list()
/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/ready()
/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute()
// 50% chance of being incremented by one
required_candidates += prob(50)
for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in GLOB.machines)
if(QDELETED(temp_vent))
continue
@@ -463,18 +474,12 @@
vents += temp_vent
if(!vents.len)
return FALSE
return ..()
/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute()
// 50% chance of being incremented by one
required_candidates += prob(50)
. = ..()
/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/generate_ruleset_body(mob/applicant)
var/obj/vent = pick_n_take(vents)
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
applicant.transfer_ckey(new_xeno, FALSE)
new_xeno.key = applicant.key
message_admins("[ADMIN_LOOKUPFLW(new_xeno)] has been made into an alien by the midround ruleset.")
log_game("DYNAMIC: [key_name(new_xeno)] was spawned as an alien by the midround ruleset.")
return new_xeno
@@ -487,24 +492,19 @@
/datum/dynamic_ruleset/midround/from_ghosts/nightmare
name = "Nightmare"
config_tag = "nightmare"
antag_datum = /datum/antagonist/nightmare
antag_flag = "Nightmare"
antag_flag_override = ROLE_ALIEN
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 3
weight = 4
cost = 10
flags = MINOR_RULESET
requirements = list(101,101,101,70,50,40,20,15,15,15)
high_population_requirement = 50
repeatable_weight_decrease = 2
requirements = list(101,101,101,40,30,20,10,10,10,10)
repeatable = TRUE
property_weights = list("story_potential" = 1, "trust" = 1, "extended" = 1, "valid" = 2, "integrity" = 1)
var/list/spawn_locs = list()
/datum/dynamic_ruleset/midround/from_ghosts/nightmare/ready()
/datum/dynamic_ruleset/midround/from_ghosts/nightmare/execute()
for(var/X in GLOB.xeno_spawn)
var/turf/T = X
var/light_amount = T.get_lumcount()
@@ -512,7 +512,7 @@
spawn_locs += T
if(!spawn_locs.len)
return FALSE
return ..()
. = ..()
/datum/dynamic_ruleset/midround/from_ghosts/nightmare/generate_ruleset_body(mob/applicant)
var/datum/mind/player_mind = new /datum/mind(applicant.key)
@@ -525,161 +525,263 @@
player_mind.add_antag_datum(/datum/antagonist/nightmare)
S.set_species(/datum/species/shadow/nightmare)
playsound(S, 'sound/magic/ethereal_exit.ogg', 50, 1, -1)
playsound(S, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1)
message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Nightmare by the midround ruleset.")
log_game("DYNAMIC: [key_name(S)] was spawned as a Nightmare by the midround ruleset.")
return S
//////////////////////////////////////////////
// //
// SLAUGHTER DEMON //
// SPACE DRAGON (GHOST) //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/midround/from_ghosts/slaughter_demon
name = "Slaughter Demon"
config_tag = "slaughter_demon"
antag_flag = ROLE_ALIEN
enemy_roles = list("Security Officer","Shaft Miner","Head of Security","Captain","Janitor","AI","Cyborg","Bartender")
required_enemies = list(3,2,2,2,2,1,1,1,1,0)
/datum/dynamic_ruleset/midround/from_ghosts/space_dragon
name = "Space Dragon"
antag_datum = /datum/antagonist/space_dragon
antag_flag = ROLE_SPACE_DRAGON
antag_flag_override = ROLE_SPACE_DRAGON
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 4
cost = 15
requirements = list(101,101,101,90,80,70,60,50,40,30)
property_weights = list("story_potential" = -2, "extended" = -2, "integrity" = 2, "valid" = 2, "trust" = 2)
high_population_requirement = 30
weight = 3
cost = 10
requirements = list(101,101,101,101,60,50,30,20,10,10)
repeatable = TRUE
var/list/spawn_locs = list()
/datum/dynamic_ruleset/midround/from_ghosts/slaughter_demon/ready(forced = FALSE)
for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list)
if(isturf(L.loc))
spawn_locs += L.loc
/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/execute()
for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
spawn_locs += (C.loc)
if(!spawn_locs.len)
return FALSE
return ..()
message_admins("No valid spawn locations found, aborting...")
return MAP_ERROR
. = ..()
/datum/dynamic_ruleset/midround/from_ghosts/slaughter_demon/generate_ruleset_body(mob/applicant)
/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/generate_ruleset_body(mob/applicant)
var/datum/mind/player_mind = new /datum/mind(applicant.key)
player_mind.active = 1
var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter((pick(spawn_locs)))
var/mob/living/simple_animal/slaughter/S = new (holder)
S.holder = holder
player_mind.active = TRUE
var/mob/living/simple_animal/hostile/space_dragon/S = new (pick(spawn_locs))
player_mind.transfer_to(S)
player_mind.assigned_role = "Slaughter Demon"
player_mind.special_role = "Slaughter Demon"
player_mind.add_antag_datum(/datum/antagonist/slaughter)
to_chat(S, S.playstyle_string)
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.</B>")
SEND_SOUND(S, 'sound/magic/demon_dies.ogg')
message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a slaughter demon by dynamic.")
log_game("[key_name(S)] was spawned as a slaughter demon by dynamic.")
player_mind.assigned_role = "Space Dragon"
player_mind.special_role = ROLE_SPACE_DRAGON
player_mind.add_antag_datum(/datum/antagonist/space_dragon)
playsound(S, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1)
message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Space Dragon by the midround ruleset.")
log_game("DYNAMIC: [key_name(S)] was spawned as a Space Dragon by the midround ruleset.")
priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert")
return S
//////////////////////////////////////////////
// //
// ABDUCTORS //
// ABDUCTORS (GHOST) //
// //
//////////////////////////////////////////////
#define ABDUCTOR_MAX_TEAMS 4
/datum/dynamic_ruleset/midround/from_ghosts/abductors
name = "Abductors"
config_tag = "abductors"
antag_flag = ROLE_ABDUCTOR
// Has two antagonist flags, in fact
enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain")
required_enemies = list(3,3,2,2,1,1,0,0,0,0)
antag_flag = "Abductor"
antag_flag_override = ROLE_ABDUCTOR
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 2
weight = 8
required_applicants = 2
weight = 3
cost = 10
requirements = list(101,101,70,50,40,30,30,30,30,30)
blocking_rules = list(/datum/dynamic_ruleset/roundstart/nuclear,/datum/dynamic_ruleset/midround/from_ghosts/nuclear)
high_population_requirement = 15
var/datum/team/abductor_team/team
property_weights = list("extended" = -2, "valid" = 1, "trust" = -1, "chaos" = 2)
repeatable_weight_decrease = 4
requirements = list(101,101,101,101,101,40,25,20,10,10)
repeatable = TRUE
var/datum/team/abductor_team/new_team
/datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE)
team = new /datum/team/abductor_team
if(team.team_number > ABDUCTOR_MAX_TEAMS)
if (required_candidates > (dead_players.len + list_observers.len))
return FALSE
return ..()
/datum/dynamic_ruleset/midround/from_ghosts/abductors/finish_setup(mob/new_character, index)
switch(index)
if(1) // yeah this seems like a baffling anti-pattern but it's actually the best way to do this, shit you not
var/mob/living/carbon/human/agent = new_character
agent.mind.add_antag_datum(/datum/antagonist/abductor/agent, team)
log_game("[key_name(agent)] has been selected as [team.name] abductor agent.")
if(2)
var/mob/living/carbon/human/scientist = new_character
scientist.mind.add_antag_datum(/datum/antagonist/abductor/scientist, team)
log_game("[key_name(scientist)] has been selected as [team.name] abductor scientist.")
if (index == 1) // Our first guy is the scientist. We also initialize the team here as well since this should only happen once per pair of abductors.
new_team = new
if(new_team.team_number > ABDUCTOR_MAX_TEAMS)
return MAP_ERROR
var/datum/antagonist/abductor/scientist/new_role = new
new_character.mind.add_antag_datum(new_role, new_team)
else // Our second guy is the agent, team is already created, don't need to make another one.
var/datum/antagonist/abductor/agent/new_role = new
new_character.mind.add_antag_datum(new_role, new_team)
#undef ABDUCTOR_MAX_TEAMS
//////////////////////////////////////////////
// //
// SPACE NINJA //
// SWARMERS (GHOST) //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/midround/from_ghosts/ninja
/datum/dynamic_ruleset/midround/swarmers
name = "Swarmers"
antag_flag = "Swarmer"
antag_flag_override = ROLE_ALIEN
required_type = /mob/dead/observer
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 0
weight = 3
cost = 10
requirements = list(101,101,101,101,60,50,30,20,10,10)
repeatable = TRUE
/datum/dynamic_ruleset/midround/swarmers/execute()
var/list/spawn_locs = list()
for(var/x in GLOB.xeno_spawn)
var/turf/spawn_turf = x
var/light_amount = spawn_turf.get_lumcount()
if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
spawn_locs += spawn_turf
if(!spawn_locs.len)
message_admins("No valid spawn locations found in GLOB.xeno_spawn, aborting swarmer spawning...")
return MAP_ERROR
new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway))
log_game("A Swarmer was spawned via Dynamic Mode.")
return ..()
//////////////////////////////////////////////
// //
// SPACE NINJA (GHOST) //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/midround/from_ghosts/space_ninja
name = "Space Ninja"
config_tag = "ninja"
antag_flag = ROLE_NINJA
enemy_roles = list("Security Officer","Head of Security","Captain","AI","Cyborg")
required_enemies = list(3,2,2,2,2,1,1,1,1,0)
antag_datum = /datum/antagonist/ninja
antag_flag = "Space Ninja"
antag_flag_override = ROLE_NINJA
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 4
cost = 15
flags = MINOR_RULESET
requirements = list(101,101,101,90,80,70,60,50,40,30)
high_population_requirement = 30
property_weights = list("story_potential" = 1, "extended" = -2, "valid" = 2)
cost = 10
requirements = list(101,101,101,80,60,50,30,20,10,10)
repeatable = TRUE
var/list/spawn_locs = list()
var/spawn_loc
/datum/dynamic_ruleset/midround/from_ghosts/ninja/ready(forced = FALSE)
if(!spawn_loc)
var/list/spawn_locs = list()
for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list)
if(isturf(L.loc))
spawn_locs += L.loc
for(var/obj/effect/landmark/loneopspawn/L in GLOB.landmarks_list)
if(isturf(L.loc))
spawn_locs += L.loc
if(!spawn_locs.len)
return FALSE
spawn_loc = pick(spawn_locs)
if(!spawn_loc)
/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/execute()
for(var/obj/effect/landmark/carpspawn/carp_spawn in GLOB.landmarks_list)
if(!isturf(carp_spawn.loc))
stack_trace("Carp spawn found not on a turf: [carp_spawn.type] on [isnull(carp_spawn.loc) ? "null" : carp_spawn.loc.type]")
continue
spawn_locs += carp_spawn.loc
if(!spawn_locs.len)
message_admins("No valid spawn locations found, aborting...")
return MAP_ERROR
return ..()
/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/generate_ruleset_body(mob/applicant)
var/mob/living/carbon/human/ninja = create_space_ninja(pick(spawn_locs))
ninja.key = applicant.key
ninja.mind.add_antag_datum(/datum/antagonist/ninja)
message_admins("[ADMIN_LOOKUPFLW(ninja)] has been made into a Space Ninja by the midround ruleset.")
log_game("DYNAMIC: [key_name(ninja)] was spawned as a Space Ninja by the midround ruleset.")
return ninja
//////////////////////////////////////////////
// //
// Revenant (GHOST) //
// //
//////////////////////////////////////////////
/// Revenant ruleset
/datum/dynamic_ruleset/midround/from_ghosts/revenant
name = "Revenant"
antag_datum = /datum/antagonist/revenant
antag_flag = "Revenant"
antag_flag_override = ROLE_REVENANT
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 4
cost = 10
requirements = list(101,101,101,70,50,40,20,15,10,10)
repeatable = TRUE
var/dead_mobs_required = 20
var/need_extra_spawns_value = 15
var/list/spawn_locs = list()
/datum/dynamic_ruleset/midround/from_ghosts/revenant/acceptable(population=0, threat=0)
if(GLOB.dead_mob_list.len < dead_mobs_required)
return FALSE
return ..()
/datum/dynamic_ruleset/midround/from_ghosts/ninja/generate_ruleset_body(mob/applicant)
var/key = applicant.key
/datum/dynamic_ruleset/midround/from_ghosts/revenant/execute()
for(var/mob/living/corpse in GLOB.dead_mob_list) //look for any dead bodies
var/turf/corpse_turf = get_turf(corpse)
if(corpse_turf && is_station_level(corpse_turf.z))
spawn_locs += corpse_turf
if(!spawn_locs.len || spawn_locs.len < need_extra_spawns_value) //look for any morgue trays, crematoriums, ect if there weren't alot of dead bodies on the station to pick from
for(var/obj/structure/bodycontainer/corpse_container in GLOB.bodycontainers)
var/turf/container_turf = get_turf(corpse_container)
if(container_turf && is_station_level(container_turf.z))
spawn_locs += container_turf
if(!spawn_locs.len) //If we can't find any valid spawnpoints, try the carp spawns
for(var/obj/effect/landmark/carpspawn/carp_spawnpoint in GLOB.landmarks_list)
if(isturf(carp_spawnpoint.loc))
spawn_locs += carp_spawnpoint.loc
if(!spawn_locs.len) //If we can't find THAT, then just give up and cry
return FALSE
. = ..()
//Prepare ninja player mind
var/datum/mind/Mind = new /datum/mind(key)
Mind.assigned_role = ROLE_NINJA
Mind.special_role = ROLE_NINJA
Mind.active = 1
/datum/dynamic_ruleset/midround/from_ghosts/revenant/generate_ruleset_body(mob/applicant)
var/mob/living/simple_animal/revenant/revenant = new(pick(spawn_locs))
revenant.key = applicant.key
message_admins("[ADMIN_LOOKUPFLW(revenant)] has been made into a revenant by the midround ruleset.")
log_game("[key_name(revenant)] was spawned as a revenant by the midround ruleset.")
return revenant
//spawn the ninja and assign the candidate
var/mob/living/carbon/human/Ninja = create_space_ninja(spawn_loc)
Mind.transfer_to(Ninja)
var/datum/antagonist/ninja/ninjadatum = new
Mind.add_antag_datum(ninjadatum)
/// Sentient Disease ruleset
/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease
name = "Sentient Disease"
antag_datum = /datum/antagonist/disease
antag_flag = "Sentient Disease"
antag_flag_override = ROLE_ALIEN
required_candidates = 1
weight = 4
cost = 10
requirements = list(101,101,101,70,50,40,20,15,10,10)
repeatable = TRUE
if(Ninja.mind != Mind) //something has gone wrong!
stack_trace("Ninja created with incorrect mind")
/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/generate_ruleset_body(mob/applicant)
var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center())
virus.key = applicant.key
INVOKE_ASYNC(virus, /mob/camera/disease/proc/pick_name)
message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by the midround ruleset.")
log_game("[key_name(virus)] was spawned as a sentient disease by the midround ruleset.")
return virus
message_admins("[ADMIN_LOOKUPFLW(Ninja)] has been made into a ninja by dynamic.")
log_game("[key_name(Ninja)] was spawned as a ninja by dynamic.")
return Ninja
/// Space Pirates ruleset
/datum/dynamic_ruleset/midround/pirates
name = "Space Pirates"
antag_flag = "Space Pirates"
required_type = /mob/dead/observer
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 0
weight = 4
cost = 10
requirements = list(101,101,101,50,40,25,10,10,10,10)
repeatable = TRUE
/datum/dynamic_ruleset/midround/from_ghosts/ninja/finish_setup(mob/new_character, index)
return
/datum/dynamic_ruleset/midround/pirates/acceptable(population=0, threat=0)
if (!SSmapping.empty_space)
return FALSE
return ..()
#undef ABDUCTOR_MAX_TEAMS
#undef REVENANT_SPAWN_THRESHOLD
/datum/dynamic_ruleset/midround/pirates/execute()
send_pirate_threat()
return ..()
/// Probability the AI going malf will be accompanied by an ion storm announcement and some ion laws.
#undef MALF_ION_PROB
/// The probability to replace an existing law with an ion law instead of adding a new ion law.
#undef REPLACE_LAW_WITH_ION_PROB
@@ -1,255 +0,0 @@
/datum/dynamic_ruleset/minor/proc/trim_list(list/L = list())
var/list/trimmed_list = L.Copy()
for(var/mob/M in trimmed_list)
if (!ishuman(M))
trimmed_list.Remove(M)
continue
if (HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG))
trimmed_list.Remove(M)
continue
if (!M.client) // Are they connected?
trimmed_list.Remove(M)
continue
if(!mode.check_age(M.client, minimum_required_age))
trimmed_list.Remove(M)
continue
if(antag_flag_override)
if(!(antag_flag_override in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag_override))
trimmed_list.Remove(M)
continue
else
if(!(antag_flag in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag))
trimmed_list.Remove(M)
continue
if (M.mind)
if ((M.mind.assigned_role in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role?
trimmed_list.Remove(M)
continue
if (M.mind.assigned_role in restricted_roles) // Does their job allow it?
trimmed_list.Remove(M)
continue
if ((exclusive_roles.len > 0) && !(M.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job?
trimmed_list.Remove(M)
continue
return trimmed_list
/datum/dynamic_ruleset/minor/trim_candidates()
//
// All you need to know is that here, the candidates list contains 4 lists itself, indexed with the following defines:
// Candidates = list(CURRENT_LIVING_PLAYERS, CURRENT_LIVING_ANTAGS, CURRENT_DEAD_PLAYERS, CURRENT_OBSERVERS)
// So for example you can get the list of all current dead players with var/list/dead_players = candidates[CURRENT_DEAD_PLAYERS]
// Make sure to properly typecheck the mobs in those lists, as the dead_players list could contain ghosts, or dead players still in their bodies.
// We're still gonna trim the obvious (mobs without clients, jobbanned players, etc)
candidates = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS])
//////////////////////////////////////////////
// //
// SYNDICATE TRAITORS //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/minor/traitor
name = "Traitors"
config_tag = "traitor" // these having identical config tags to the roundstart modes is 100% intentional, so that config edits are simpler
persistent = TRUE
antag_flag = ROLE_TRAITOR
antag_datum = /datum/antagonist/traitor/
minimum_required_age = 0
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Cyborg")
restricted_roles = list("Cyborg", "AI")
required_candidates = 1
weight = 5
flags = TRAITOR_RULESET | ALWAYS_MAX_WEIGHT_RULESET
cost = 10 // Avoid raising traitor threat above 10, as it is the default low cost ruleset.
requirements = list(50,50,50,50,50,50,50,50,50,50)
high_population_requirement = 40
property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1, "valid" = 1)
/datum/dynamic_ruleset/minor/traitor/execute()
var/mob/M = pick_n_take(candidates)
assigned += M
var/datum/antagonist/traitor/newTraitor = new
M.mind.add_antag_datum(newTraitor)
log_admin("[M] was made into a traitor by dynamic.")
message_admins("[M] was made into a traitor by dynamic.")
return TRUE
//////////////////////////////////////////
// //
// BLOOD BROTHERS //
// //
//////////////////////////////////////////
/datum/dynamic_ruleset/minor/traitorbro
name = "Blood Brothers"
config_tag = "traitorbro"
antag_flag = ROLE_BROTHER
antag_datum = /datum/antagonist/brother
restricted_roles = list("AI", "Cyborg")
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
required_candidates = 2
weight = 4
cost = 10
requirements = list(101,101,101,101,101,101,101,101,101,101)
high_population_requirement = 101
antag_cap = list(2,2,2,2,2,2,2,2,2,2) // Can pick 3 per team, but rare enough it doesn't matter.
property_weights = list("story_potential" = 1, "trust" = -1, "extended" = 1, "valid" = 1)
var/list/datum/team/brother_team/pre_brother_teams = list()
var/const/min_team_size = 2
/datum/dynamic_ruleset/minor/traitorbro/execute()
if(candidates.len < min_team_size || candidates.len < required_candidates)
return FALSE
var/datum/team/brother_team/team = new
var/team_size = prob(10) ? min(3, candidates.len) : 2
for(var/k = 1 to team_size)
var/mob/bro = pick_n_take(candidates)
assigned += bro.mind
team.add_member(bro.mind)
bro.mind.special_role = "brother"
bro.mind.restricted_roles = restricted_roles
team.pick_meeting_area()
team.forge_brother_objectives()
for(var/datum/mind/M in team.members)
M.add_antag_datum(/datum/antagonist/brother, team)
team.update_name()
mode.brother_teams += team
//////////////////////////////////////////////
// //
// CHANGELINGS //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/minor/changeling
name = "Changelings"
config_tag = "changeling"
antag_flag = ROLE_CHANGELING
antag_datum = /datum/antagonist/changeling
restricted_roles = list("AI", "Cyborg")
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
required_candidates = 1
weight = 3
cost = 15
scaling_cost = 15
requirements = list(101,101,101,101,101,101,101,101,101,101)
property_weights = list("trust" = -2, "valid" = 2)
high_population_requirement = 10
antag_cap = list(1,1,1,1,1,2,2,2,2,3)
var/team_mode_probability = 30
/datum/dynamic_ruleset/minor/changeling/execute()
var/mob/M = pick_n_take(candidates)
assigned += M.mind
M.mind.restricted_roles = restricted_roles
M.mind.special_role = ROLE_CHANGELING
var/datum/antagonist/changeling/new_antag = new antag_datum()
M.mind.add_antag_datum(new_antag)
return TRUE
//////////////////////////////////////////////
// //
// ELDRITCH CULT //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/minor/heretics
name = "Heretic"
antag_flag = "heretic"
antag_datum = /datum/antagonist/heretic
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain")
restricted_roles = list("AI", "Cyborg")
required_candidates = 1
weight = 3
cost = 25
scaling_cost = 15
requirements = list(60,60,60,55,50,50,50,50,50,50)
property_weights = list("story_potential" = 1, "trust" = -1, "chaos" = 2, "extended" = -1, "valid" = 2)
antag_cap = list(1,1,1,1,2,2,2,2,3,3)
high_population_requirement = 50
/datum/dynamic_ruleset/minor/heretics/pre_execute()
var/mob/picked_candidate = pick_n_take(candidates)
assigned += picked_candidate.mind
picked_candidate.mind.restricted_roles = restricted_roles
picked_candidate.mind.special_role = ROLE_HERETIC
var/datum/antagonist/heretic/new_antag = new antag_datum()
picked_candidate.mind.add_antag_datum(new_antag)
return TRUE
//////////////////////////////////////////////
// //
// DEVIL //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/minor/devil
name = "Devil"
config_tag = "devil"
antag_flag = ROLE_DEVIL
antag_datum = /datum/antagonist/devil
restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI")
required_candidates = 1
weight = 3
cost = 0
requirements = list(101,101,101,101,101,101,101,101,101,101)
high_population_requirement = 101
antag_cap = list(1,1,1,2,2,2,3,3,3,4)
property_weights = list("extended" = 1)
/datum/dynamic_ruleset/minor/devil/pre_execute()
var/mob/devil = pick_n_take(candidates)
assigned += devil.mind
devil.mind.special_role = ROLE_DEVIL
devil.mind.restricted_roles = restricted_roles
log_game("[key_name(devil)] has been selected as a devil")
add_devil(devil, ascendable = TRUE)
add_devil_objectives(devil.mind,2)
return TRUE
/datum/dynamic_ruleset/minor/devil/proc/add_devil_objectives(datum/mind/devil_mind, quantity)
var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target)
var/datum/antagonist/devil/D = devil_mind.has_antag_datum(/datum/antagonist/devil)
for(var/i = 1 to quantity)
var/type = pick(validtypes)
var/datum/objective/devil/objective = new type(null)
objective.owner = devil_mind
D.objectives += objective
if(!istype(objective, /datum/objective/devil/buy_target))
validtypes -= type
else
objective.find_target()
//////////////////////////////////////////////
// //
// BLOODSUCKERS //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/minor/bloodsucker
name = "Bloodsuckers"
config_tag = "bloodsucker"
antag_flag = ROLE_BLOODSUCKER
antag_datum = ANTAG_DATUM_BLOODSUCKER
minimum_required_age = 0
protected_roles = list("Chaplain", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
restricted_roles = list("Cyborg", "AI")
required_candidates = 1
weight = 2
cost = 15
scaling_cost = 10
property_weights = list("story_potential" = 1, "extended" = 1, "trust" = -2, "valid" = 1)
requirements = list(70,65,60,55,50,50,50,50,50,50)
high_population_requirement = 50
/datum/dynamic_ruleset/minor/bloodsucker/execute()
var/mob/M = pick_n_take(candidates)
assigned += M.mind
M.mind.special_role = ROLE_BLOODSUCKER
M.mind.restricted_roles = restricted_roles
mode.check_start_sunlight()
if(mode.make_bloodsucker(M.mind))
mode.bloodsuckers += M.mind
return TRUE
@@ -7,25 +7,25 @@
/datum/dynamic_ruleset/roundstart/traitor
name = "Traitors"
config_tag = "traitor"
persistent = TRUE
antag_flag = ROLE_TRAITOR
antag_datum = /datum/antagonist/traitor/
antag_datum = /datum/antagonist/traitor
minimum_required_age = 0
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Cyborg")
restricted_roles = list("Cyborg", "AI")
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
restricted_roles = list("AI", "Cyborg")
required_candidates = 1
flags = TRAITOR_RULESET | MINOR_RULESET | ALWAYS_MAX_WEIGHT_RULESET
weight = 5
cost = 10 // Avoid raising traitor threat above 10, as it is the default low cost ruleset.
scaling_cost = 10
requirements = list(50,50,50,50,50,50,50,50,50,50)
high_population_requirement = 40
antag_cap = list(1,1,1,1,2,2,2,2,3,3)
property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1, "valid" = 1)
var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec)
cost = 8 // Avoid raising traitor threat above 10, as it is the default low cost ruleset.
scaling_cost = 9
requirements = list(101,10,10,10,10,10,10,10,10,10)
antag_cap = list("denominator" = 24)
var/autotraitor_cooldown = (15 MINUTES)
COOLDOWN_DECLARE(autotraitor_cooldown_check)
/datum/dynamic_ruleset/roundstart/traitor/pre_execute()
var/num_traitors = antag_cap[indice_pop] * (scaled_times + 1)
/datum/dynamic_ruleset/roundstart/traitor/pre_execute(population)
. = ..()
COOLDOWN_START(src, autotraitor_cooldown_check, autotraitor_cooldown)
var/num_traitors = get_antag_cap(population) * (scaled_times + 1)
for (var/i = 1 to num_traitors)
var/mob/M = pick_n_take(candidates)
assigned += M.mind
@@ -33,6 +33,12 @@
M.mind.restricted_roles = restricted_roles
return TRUE
/datum/dynamic_ruleset/roundstart/traitor/rule_process()
if (COOLDOWN_FINISHED(src, autotraitor_cooldown_check))
COOLDOWN_START(src, autotraitor_cooldown_check, autotraitor_cooldown)
log_game("DYNAMIC: Checking if we can turn someone into a traitor.")
mode.picking_specific_rule(/datum/dynamic_ruleset/midround/autotraitor)
//////////////////////////////////////////
// //
// BLOOD BROTHERS //
@@ -41,24 +47,22 @@
/datum/dynamic_ruleset/roundstart/traitorbro
name = "Blood Brothers"
config_tag = "traitorbro"
antag_flag = ROLE_BROTHER
antag_datum = /datum/antagonist/brother
restricted_roles = list("AI", "Cyborg")
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
antag_datum = /datum/antagonist/brother/
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain")
restricted_roles = list("Cyborg", "AI")
required_candidates = 2
flags = MINOR_RULESET
weight = 4
cost = 10
requirements = list(101,101,101,101,101,101,101,101,101,101)
high_population_requirement = 101
antag_cap = list(2,2,2,2,2,2,2,2,2,2) // Can pick 3 per team, but rare enough it doesn't matter.
property_weights = list("story_potential" = 1, "trust" = -1, "extended" = 1, "valid" = 1)
cost = 15
scaling_cost = 15
requirements = list(101,101,101,101,101,101,101,101,101,101)//disabled for now
antag_cap = 2 // Can pick 3 per team, but rare enough it doesn't matter.
var/list/datum/team/brother_team/pre_brother_teams = list()
var/const/min_team_size = 2
/datum/dynamic_ruleset/roundstart/traitorbro/pre_execute()
var/num_teams = (antag_cap[indice_pop]/min_team_size) * (scaled_times + 1) // 1 team per scaling
/datum/dynamic_ruleset/roundstart/traitorbro/pre_execute(population)
. = ..()
var/num_teams = (get_antag_cap(population)/min_team_size) * (scaled_times + 1) // 1 team per scaling
for(var/j = 1 to num_teams)
if(candidates.len < min_team_size || candidates.len < required_candidates)
break
@@ -91,24 +95,20 @@
/datum/dynamic_ruleset/roundstart/changeling
name = "Changelings"
config_tag = "changeling"
antag_flag = ROLE_CHANGELING
antag_datum = /datum/antagonist/changeling
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
restricted_roles = list("AI", "Cyborg")
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
required_candidates = 1
flags = MINOR_RULESET
weight = 3
cost = 15
scaling_cost = 15
requirements = list(101,101,101,101,101,101,101,101,101,101)
property_weights = list("trust" = -2, "valid" = 2)
high_population_requirement = 10
antag_cap = list(1,1,1,1,1,2,2,2,2,3)
var/team_mode_probability = 30
cost = 16
scaling_cost = 10
requirements = list(101,70,60,50,40,20,20,10,10,10)
antag_cap = list("denominator" = 29)
/datum/dynamic_ruleset/roundstart/changeling/pre_execute()
var/num_changelings = antag_cap[indice_pop] * (scaled_times + 1)
/datum/dynamic_ruleset/roundstart/changeling/pre_execute(population)
. = ..()
var/num_changelings = get_antag_cap(population) * (scaled_times + 1)
for (var/i = 1 to num_changelings)
var/mob/M = pick_n_take(candidates)
assigned += M.mind
@@ -117,21 +117,8 @@
return TRUE
/datum/dynamic_ruleset/roundstart/changeling/execute()
var/team_mode = FALSE
if(prob(team_mode_probability))
team_mode = TRUE
var/list/team_objectives = subtypesof(/datum/objective/changeling_team_objective)
var/list/possible_team_objectives = list()
for(var/T in team_objectives)
var/datum/objective/changeling_team_objective/CTO = T
if(assigned.len >= initial(CTO.min_lings))
possible_team_objectives += T
if(possible_team_objectives.len && prob(20*assigned.len))
GLOB.changeling_team_objective_type = pick(possible_team_objectives)
for(var/datum/mind/changeling in assigned)
var/datum/antagonist/changeling/new_antag = new antag_datum()
new_antag.team_mode = team_mode
changeling.add_antag_datum(new_antag)
return TRUE
@@ -143,24 +130,21 @@
/datum/dynamic_ruleset/roundstart/heretics
name = "Heretics"
antag_flag = "heretic"
antag_flag = ROLE_HERETIC
antag_datum = /datum/antagonist/heretic
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain")
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
restricted_roles = list("AI", "Cyborg")
required_candidates = 1
flags = MINOR_RULESET
weight = 3
cost = 25
scaling_cost = 15
requirements = list(60,60,60,55,50,50,50,50,50,50)
property_weights = list("story_potential" = 1, "trust" = -1, "chaos" = 2, "extended" = -1, "valid" = 2)
antag_cap = list(1,1,1,1,2,2,2,2,3,3)
high_population_requirement = 50
cost = 15
scaling_cost = 9
requirements = list(101,101,101,55,40,25,20,15,10,10)//higher because of 'round end'
antag_cap = list("denominator" = 24)
/datum/dynamic_ruleset/roundstart/heretics/pre_execute()
/datum/dynamic_ruleset/roundstart/heretics/pre_execute(population)
. = ..()
var/num_ecult = antag_cap[indice_pop] * (scaled_times + 1)
var/num_ecult = get_antag_cap(population) * (scaled_times + 1)
for (var/i = 1 to num_ecult)
var/mob/picked_candidate = pick_n_take(candidates)
@@ -175,9 +159,9 @@
var/datum/mind/cultie = c
var/datum/antagonist/heretic/new_antag = new antag_datum()
cultie.add_antag_datum(new_antag)
return TRUE
//////////////////////////////////////////////
// //
// WIZARDS //
@@ -187,18 +171,15 @@
// Dynamic is a wonderful thing that adds wizards to every round and then adds even more wizards during the round.
/datum/dynamic_ruleset/roundstart/wizard
name = "Wizard"
config_tag = "wizard"
persistent = TRUE
antag_flag = ROLE_WIZARD
antag_datum = /datum/antagonist/wizard
flags = LONE_RULESET
minimum_required_age = 14
restricted_roles = list("Head of Security", "Captain") // Just to be sure that a wizard getting picked won't ever imply a Captain or HoS not getting drafted
required_candidates = 1
weight = 1
cost = 30
requirements = list(101,101,101,60,50,50,50,50,50,50)
high_population_requirement = 50
property_weights = list("story_potential" = 2, "trust" = 1, "chaos" = 2, "extended" = -2, "valid" = 2)
weight = 3
cost = 20
requirements = list(101,101,100,80,50,40,30,20,10,10)//100 because of configt, otherwise equal to nukies
var/list/roundstart_wizards = list()
/datum/dynamic_ruleset/roundstart/wizard/acceptable(population=0, threat=0)
@@ -209,9 +190,9 @@
return ..()
/datum/dynamic_ruleset/roundstart/wizard/pre_execute()
. = ..()
if(GLOB.wizardstart.len == 0)
return FALSE
mode.antags_rolled += 1
var/mob/M = pick_n_take(candidates)
if (M)
assigned += M.mind
@@ -224,25 +205,8 @@
for(var/datum/mind/M in assigned)
M.current.forceMove(pick(GLOB.wizardstart))
M.add_antag_datum(new antag_datum())
roundstart_wizards += M
return TRUE
/datum/dynamic_ruleset/roundstart/wizard/rule_process() // i can literally copy this from are_special_antags_dead it's great
for(var/datum/mind/wizard in roundstart_wizards)
if(isliving(wizard.current) && wizard.current.stat!=DEAD)
return FALSE
for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead()
if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard))
return FALSE
if(SSevents.wizardmode) //If summon events was active, turn it off
SSevents.toggleWizardmode()
SSevents.resetFrequency()
return RULESET_STOP_PROCESSING
//////////////////////////////////////////////
// //
// BLOOD CULT //
@@ -251,29 +215,26 @@
/datum/dynamic_ruleset/roundstart/bloodcult
name = "Blood Cult"
config_tag = "cult"
antag_flag = ROLE_CULTIST
antag_datum = /datum/antagonist/cult
minimum_required_age = 14
restricted_roles = list("AI", "Cyborg")
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
required_candidates = 2
weight = 3
cost = 30
requirements = list(101,101,101,80,70,60,50,50,50,50)
property_weights = list("story_potential" = -1, "trust" = -1, "chaos" = 1, "conversion" = 1, "extended" = -2, "valid" = 2)
high_population_requirement = 50
flags = HIGHLANDER_RULESET
antag_cap = list(2,2,2,3,3,4,4,4,4,4)
weight = 2 //lower weight because of easy steamroll potential
cost = 20
//requirements = list(100,90,80,60,40,30,10,10,10,10)
requirements = list(101,101,101,101,60,40,20,10,10,10)
flags = HIGH_IMPACT_RULESET
antag_cap = list("denominator" = 20, "offset" = 1)
var/datum/team/cult/main_cult
/datum/dynamic_ruleset/roundstart/bloodcult/ready(forced = FALSE)
required_candidates = antag_cap[indice_pop]
/datum/dynamic_ruleset/roundstart/bloodcult/ready(population, forced = FALSE)
required_candidates = get_antag_cap(population)
. = ..()
/datum/dynamic_ruleset/roundstart/bloodcult/pre_execute()
var/cultists = antag_cap[indice_pop]
mode.antags_rolled += cultists
/datum/dynamic_ruleset/roundstart/bloodcult/pre_execute(population)
. = ..()
var/cultists = get_antag_cap(population)
for(var/cultists_number = 1 to cultists)
if(candidates.len <= 0)
break
@@ -310,7 +271,6 @@
/datum/dynamic_ruleset/roundstart/nuclear
name = "Nuclear Emergency"
config_tag = "nuclear"
antag_flag = ROLE_OPERATIVE
antag_datum = /datum/antagonist/nukeop
var/datum/antagonist/antag_leader_datum = /datum/antagonist/nukeop/leader
@@ -318,22 +278,20 @@
restricted_roles = list("Head of Security", "Captain") // Just to be sure that a nukie getting picked won't ever imply a Captain or HoS not getting drafted
required_candidates = 5
weight = 3
cost = 40
requirements = list(100,90,80,70,60,50,50,50,50,50)
high_population_requirement = 50
flags = HIGHLANDER_RULESET
antag_cap = list(1,1,2,3,4,5,5,5,5,5)
property_weights = list("story_potential" = 2, "trust" = 2, "chaos" = 2, "extended" = -2, "valid" = 2)
cost = 20
requirements = list(101,101,101,80,50,40,30,15,10,10)
flags = HIGH_IMPACT_RULESET
antag_cap = list("denominator" = 18, "offset" = 1)
var/datum/team/nuclear/nuke_team
/datum/dynamic_ruleset/roundstart/nuclear/ready(forced = FALSE)
required_candidates = antag_cap[indice_pop]
/datum/dynamic_ruleset/roundstart/nuclear/ready(population, forced = FALSE)
required_candidates = get_antag_cap(population)
. = ..()
/datum/dynamic_ruleset/roundstart/nuclear/pre_execute()
/datum/dynamic_ruleset/roundstart/nuclear/pre_execute(population)
. = ..()
// If ready() did its job, candidates should have 5 or more members in it
var/operatives = antag_cap[indice_pop]
mode.antags_rolled += operatives
var/operatives = get_antag_cap(population)
for(var/operatives_number = 1 to operatives)
if(candidates.len <= 0)
break
@@ -356,7 +314,7 @@
return TRUE
/datum/dynamic_ruleset/roundstart/nuclear/round_result()
var result = nuke_team.get_result()
var/result = nuke_team.get_result()
switch(result)
if(NUKE_RESULT_FLUKE)
SSticker.mode_result = "loss - syndicate nuked - disk secured"
@@ -391,36 +349,36 @@
//////////////////////////////////////////////
// //
// REVS //
// REVS //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/roundstart/revs
name = "Revolution"
config_tag = "revolution"
persistent = TRUE
antag_flag = ROLE_REV_HEAD
antag_flag_override = ROLE_REV
antag_datum = /datum/antagonist/rev/head
minimum_required_age = 14
restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director")
required_candidates = 3
weight = 2
delay = 7 MINUTES
cost = 35
requirements = list(101,101,101,60,50,50,50,50,50,50)
high_population_requirement = 50
antag_cap = list(3,3,3,3,3,3,3,3,3,3)
flags = HIGHLANDER_RULESET
cost = 20
requirements = list(101,101,101,101,60,40,20,10,10,10)
antag_cap = 3
flags = HIGH_IMPACT_RULESET
blocking_rules = list(/datum/dynamic_ruleset/latejoin/provocateur)
// I give up, just there should be enough heads with 35 players...
minimum_players = 35
property_weights = list("trust" = -2, "chaos" = 2, "extended" = -2, "valid" = 2, "conversion" = 1)
/// How much threat should be injected when the revolution wins?
var/revs_win_threat_injection = 20
var/datum/team/revolution/revolution
var/finished = FALSE
/datum/dynamic_ruleset/roundstart/revs/pre_execute()
var/max_candidates = antag_cap[indice_pop]
mode.antags_rolled += max_candidates
/datum/dynamic_ruleset/roundstart/revs/pre_execute(population)
. = ..()
var/max_candidates = get_antag_cap(population)
for(var/i = 1 to max_candidates)
if(candidates.len <= 0)
break
@@ -431,7 +389,6 @@
return TRUE
/datum/dynamic_ruleset/roundstart/revs/execute()
var/success = TRUE
revolution = new()
for(var/datum/mind/M in assigned)
if(check_eligible(M))
@@ -443,14 +400,12 @@
else
assigned -= M
log_game("DYNAMIC: [ruletype] [name] discarded [M.name] from head revolutionary due to ineligibility.")
if(!revolution.members.len)
success = FALSE
log_game("DYNAMIC: [ruletype] [name] failed to get any eligible headrevs. Refunding [cost] threat.")
if(success)
if(revolution.members.len)
revolution.update_objectives()
revolution.update_heads()
SSshuttle.registerHostileEnvironment(src)
SSshuttle.registerHostileEnvironment(revolution)
return TRUE
log_game("DYNAMIC: [ruletype] [name] failed to get any eligible headrevs. Refunding [cost] threat.")
return FALSE
/datum/dynamic_ruleset/roundstart/revs/clean_up()
@@ -458,61 +413,77 @@
..()
/datum/dynamic_ruleset/roundstart/revs/rule_process()
if(check_rev_victory())
finished = REVOLUTION_VICTORY
return RULESET_STOP_PROCESSING
else if (check_heads_victory())
finished = STATION_VICTORY
SSshuttle.clearHostileEnvironment(src)
priority_announce("It appears the mutiny has been quelled. Please return yourself and your incapacitated colleagues to work. \
We have remotely blacklisted the head revolutionaries from your cloning software to prevent accidental cloning.", null, "attention", null, "Central Command Loyalty Monitoring Division")
var/winner = revolution.process_victory(revs_win_threat_injection)
if (isnull(winner))
return
for(var/datum/mind/M in revolution.members) // Remove antag datums and prevents podcloned or exiled headrevs restarting rebellions.
if(M.has_antag_datum(/datum/antagonist/rev/head))
var/datum/antagonist/rev/head/R = M.has_antag_datum(/datum/antagonist/rev/head)
R.remove_revolutionary(FALSE, "gamemode")
var/mob/living/carbon/C = M.current
if(C.stat == DEAD)
C.makeUncloneable()
if(M.has_antag_datum(/datum/antagonist/rev))
var/datum/antagonist/rev/R = M.has_antag_datum(/datum/antagonist/rev)
R.remove_revolutionary(FALSE, "gamemode")
return RULESET_STOP_PROCESSING
finished = winner
return RULESET_STOP_PROCESSING
/// Checks for revhead loss conditions and other antag datums.
/datum/dynamic_ruleset/roundstart/revs/proc/check_eligible(var/datum/mind/M)
/datum/dynamic_ruleset/roundstart/revs/proc/check_eligible(datum/mind/M)
var/turf/T = get_turf(M.current)
if(!considered_afk(M) && considered_alive(M) && is_station_level(T.z) && !M.antag_datums?.len && !HAS_TRAIT(M, TRAIT_MINDSHIELD))
return TRUE
return FALSE
/datum/dynamic_ruleset/roundstart/revs/check_finished()
if(finished == REVOLUTION_VICTORY)
return TRUE
else
return ..()
/datum/dynamic_ruleset/roundstart/revs/proc/check_rev_victory()
for(var/datum/objective/mutiny/objective in revolution.objectives)
if(!(objective.check_completion()))
return FALSE
return TRUE
/datum/dynamic_ruleset/roundstart/revs/proc/check_heads_victory()
for(var/datum/mind/rev_mind in revolution.head_revolutionaries())
var/turf/T = get_turf(rev_mind.current)
if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z))
if(ishuman(rev_mind.current) || ismonkey(rev_mind.current))
return FALSE
return TRUE
/datum/dynamic_ruleset/roundstart/revs/round_result()
if(finished == REVOLUTION_VICTORY)
SSticker.mode_result = "win - heads killed"
SSticker.news_report = REVS_WIN
else if(finished == STATION_VICTORY)
SSticker.mode_result = "loss - rev heads killed"
SSticker.news_report = REVS_LOSE
revolution.round_result(finished)
//////////////////////////////////////////////
// //
// Clock Cult //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/roundstart/clockcult
name = "Clock Cult"
antag_flag = ROLE_SERVANT_OF_RATVAR
antag_datum = /datum/antagonist/clockcult
minimum_required_age = 14
restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Chief Medical Officer", "Research Director")
required_candidates = 2
weight = 3 //higher weight than blood cult and revs because it's more balanced
cost = 20
requirements = list(101,101,101,101,60,40,20,10,10,10) //slightly higher than nukies
flags = HIGH_IMPACT_RULESET
antag_cap = list("denominator" = 20, "offset" = 1)
var/datum/team/clockcult/main_clockcult
/datum/dynamic_ruleset/roundstart/clockcult/ready(population, forced = FALSE)
required_candidates = get_antag_cap(population)
. = ..()
/datum/dynamic_ruleset/roundstart/clockcult/pre_execute(population)
. = ..()
var/cultists = get_antag_cap(population)
for(var/cultists_number = 1 to cultists)
if(candidates.len <= 0)
break
var/mob/M = pick_n_take(candidates)
assigned += M.mind
M.mind.special_role = ROLE_SERVANT_OF_RATVAR
M.mind.restricted_roles = restricted_roles
return TRUE
/datum/dynamic_ruleset/roundstart/clockcult/execute()
main_clockcult = new
for(var/datum/mind/M in assigned)
var/datum/antagonist/clockcult/new_cultist = new antag_datum()
new_cultist.clock_team = main_clockcult
SSticker.mode.equip_servant(new_cultist)
SSticker.mode.greet_servant(new_cultist)
M.add_antag_datum(new_cultist)
return TRUE
/datum/dynamic_ruleset/roundstart/clockcult/round_result()
..()
if(main_clockcult.check_clockwork_victory())
SSticker.mode_result = "win - servants completed their objective (summon ratvar)"
SSticker.news_report = CLOCK_SUMMON
else
SSticker.mode_result = "loss - servants failed their objective (summon ratvar)"
SSticker.news_report = CULT_FAILURE
// Admin only rulesets. The threat requirement is 101 so it is not possible to roll them.
@@ -524,7 +495,6 @@
/datum/dynamic_ruleset/roundstart/extended
name = "Extended"
config_tag = "extended"
antag_flag = null
antag_datum = null
restricted_roles = list()
@@ -532,121 +502,17 @@
weight = 3
cost = 0
requirements = list(101,101,101,101,101,101,101,101,101,101)
property_weights = list("extended" = 2)
high_population_requirement = 101
flags = LONE_RULESET
/datum/dynamic_ruleset/roundstart/extended/pre_execute()
. = ..()
message_admins("Starting a round of extended.")
log_game("Starting a round of extended.")
mode.spend_threat(mode.threat)
mode.spend_roundstart_budget(mode.round_start_budget)
mode.spend_midround_budget(mode.mid_round_budget)
mode.threat_log += "[worldtime2text()]: Extended ruleset set threat to 0."
return TRUE
//////////////////////////////////////////////
// //
// CLOCKCULT //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/roundstart/clockcult
name = "Clockcult"
config_tag = "clockwork_cult"
antag_flag = ROLE_SERVANT_OF_RATVAR
antag_datum = /datum/antagonist/clockcult
restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
required_candidates = 4
weight = 3
cost = 35
requirements = list(101,101,101,80,70,60,50,50,50,50)
high_population_requirement = 50
flags = HIGHLANDER_RULESET
antag_cap = list(2,3,3,4,4,4,4,4,4,4)
property_weights = list("trust" = 2, "chaos" = 2, "extended" = -2, "conversion" = 1, "valid" = 2)
var/ark_time
/datum/dynamic_ruleset/roundstart/clockcult/pre_execute()
var/list/errorList = list()
var/list/reebes = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
if(errorList.len)
message_admins("Reebe failed to load!")
log_game("Reebe failed to load!")
return FALSE
for(var/datum/parsed_map/PM in reebes)
PM.initTemplateBounds()
var/starter_servants = antag_cap[indice_pop]
var/number_players = mode.roundstart_pop_ready
if(number_players > 30)
number_players -= 30
starter_servants += min(round(number_players / 10), 5)
mode.antags_rolled += starter_servants
GLOB.clockwork_vitality += 50 * starter_servants
for (var/i in 1 to starter_servants)
var/mob/servant = pick_n_take(candidates)
assigned += servant.mind
servant.mind.assigned_role = ROLE_SERVANT_OF_RATVAR
servant.mind.special_role = ROLE_SERVANT_OF_RATVAR
ark_time = 30 + round((number_players / 5))
ark_time = min(ark_time, 35)
return TRUE
/datum/dynamic_ruleset/roundstart/clockcult/execute()
var/list/spread_out_spawns = GLOB.servant_spawns.Copy()
for(var/datum/mind/servant in assigned)
var/mob/S = servant.current
if(!spread_out_spawns.len)
spread_out_spawns = GLOB.servant_spawns.Copy()
log_game("[key_name(servant)] was made an initial servant of Ratvar")
var/turf/T = pick_n_take(spread_out_spawns)
S.forceMove(T)
greet_servant(S)
equip_servant(S)
add_servant_of_ratvar(S, TRUE)
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar //that's a mouthful
G.final_countdown(ark_time)
return TRUE
/datum/dynamic_ruleset/roundstart/clockcult/proc/greet_servant(mob/M) //Description of their role
if(!M)
return 0
to_chat(M, "<span class='bold large_brass'>You are a servant of Ratvar, the Clockwork Justiciar!</span>")
to_chat(M, "<span class='brass'>You have approximately <b>[ark_time]</b> minutes until the Ark activates.</span>")
to_chat(M, "<span class='brass'>Unlock <b>Script</b> scripture by converting a new servant.</span>")
to_chat(M, "<span class='brass'><b>Application</b> scripture will be unlocked halfway until the Ark's activation.</span>")
M.playsound_local(get_turf(M), 'sound/ambience/antag/clockcultalr.ogg', 100, FALSE, pressure_affected = FALSE)
return 1
/datum/dynamic_ruleset/roundstart/clockcult/proc/equip_servant(mob/living/M) //Grants a clockwork slab to the mob, with one of each component
if(!M || !ishuman(M))
return FALSE
var/mob/living/carbon/human/L = M
L.equipOutfit(/datum/outfit/servant_of_ratvar)
var/obj/item/clockwork/slab/S = new
var/slot = "At your feet"
var/list/slots = list("In your left pocket" = SLOT_L_STORE, "In your right pocket" = SLOT_R_STORE, "In your backpack" = SLOT_IN_BACKPACK, "On your belt" = SLOT_BELT)
if(ishuman(L))
var/mob/living/carbon/human/H = L
slot = H.equip_in_one_of_slots(S, slots)
if(slot == "In your backpack")
slot = "In your [H.back.name]"
if(slot == "At your feet")
if(!S.forceMove(get_turf(L)))
qdel(S)
if(S && !QDELETED(S))
to_chat(L, "<span class='bold large_brass'>There is a paper in your backpack! It'll tell you if anything's changed, as well as what to expect.</span>")
to_chat(L, "<span class='alloy'>[slot] is a <b>clockwork slab</b>, a multipurpose tool used to construct machines and invoke ancient words of power. If this is your first time \
as a servant, you can find a concise tutorial in the Recollection category of its interface.</span>")
to_chat(L, "<span class='alloy italics'>If you want more information, you can read <a href=\"https://tgstation13.org/wiki/Clockwork_Cult\">the wiki page</a> to learn more.</span>")
return TRUE
return FALSE
/datum/dynamic_ruleset/roundstart/clockcult/round_result()
if(GLOB.clockwork_gateway_activated)
SSticker.news_report = CLOCK_SUMMON
SSticker.mode_result = "win - servants completed their objective (summon ratvar)"
else
SSticker.news_report = CULT_FAILURE
SSticker.mode_result = "loss - servants failed their objective (summon ratvar)"
//////////////////////////////////////////////
// //
// CLOWN OPS //
@@ -655,12 +521,10 @@
/datum/dynamic_ruleset/roundstart/nuclear/clown_ops
name = "Clown Ops"
config_tag = "clownops"
antag_flag = "clown ops"
antag_datum = /datum/antagonist/nukeop/clownop
antag_leader_datum = /datum/antagonist/nukeop/leader/clownop
weight = 1
property_weights = list("trust" = 2, "chaos" = 2, "extended" = -2, "story_potential" = 2, "valid" = 2)
requirements = list(101,101,101,101,101,101,101,101,101,101)
/datum/dynamic_ruleset/roundstart/nuclear/clown_ops/pre_execute()
. = ..()
@@ -674,59 +538,6 @@
V.assigned_role = "Clown Operative"
V.special_role = "Clown Operative"
//////////////////////////////////////////////
// //
// DEVIL //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/roundstart/devil
name = "Devil"
config_tag = "devil"
antag_flag = ROLE_DEVIL
antag_datum = /datum/antagonist/devil
restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI")
required_candidates = 1
flags = MINOR_RULESET
weight = 3
cost = 0
requirements = list(101,101,101,101,101,101,101,101,101,101)
high_population_requirement = 101
antag_cap = list(1,1,1,2,2,2,3,3,3,4)
property_weights = list("extended" = 1)
/datum/dynamic_ruleset/roundstart/devil/pre_execute()
var/num_devils = antag_cap[indice_pop]
mode.antags_rolled += num_devils
for(var/j = 0, j < num_devils, j++)
if (!candidates.len)
break
var/mob/devil = pick_n_take(candidates)
assigned += devil.mind
devil.mind.special_role = ROLE_DEVIL
devil.mind.restricted_roles = restricted_roles
log_game("[key_name(devil)] has been selected as a devil")
return TRUE
/datum/dynamic_ruleset/roundstart/devil/execute()
for(var/datum/mind/devil in assigned)
add_devil(devil.current, ascendable = TRUE)
add_devil_objectives(devil,2)
return TRUE
/datum/dynamic_ruleset/roundstart/devil/proc/add_devil_objectives(datum/mind/devil_mind, quantity)
var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target)
var/datum/antagonist/devil/D = devil_mind.has_antag_datum(/datum/antagonist/devil)
for(var/i = 1 to quantity)
var/type = pick(validtypes)
var/datum/objective/devil/objective = new type(null)
objective.owner = devil_mind
D.objectives += objective
if(!istype(objective, /datum/objective/devil/buy_target))
validtypes -= type
else
objective.find_target()
//////////////////////////////////////////////
// //
@@ -736,24 +547,22 @@
/datum/dynamic_ruleset/roundstart/monkey
name = "Monkey"
config_tag = "monkey"
antag_flag = ROLE_MONKEY
antag_datum = /datum/antagonist/monkey/leader
restricted_roles = list("Cyborg", "AI")
restricted_roles = list("Cyborg", "AI", "Prisoner")
required_candidates = 1
weight = 3
cost = 0
requirements = list(101,101,101,101,101,101,101,101,101,101)
high_population_requirement = 101
property_weights = list("extended" = -2, "chaos" = 2, "conversion" = 1, "valid" = 2)
flags = LONE_RULESET
var/players_per_carrier = 30
var/monkeys_to_win = 1
var/escaped_monkeys = 0
var/datum/team/monkey/monkey_team
/datum/dynamic_ruleset/roundstart/monkey/pre_execute()
. = ..()
var/carriers_to_make = max(round(mode.roundstart_pop_ready / players_per_carrier, 1), 1)
mode.antags_rolled += carriers_to_make
for(var/j = 0, j < carriers_to_make, j++)
if (!candidates.len)
@@ -767,7 +576,7 @@
/datum/dynamic_ruleset/roundstart/monkey/execute()
for(var/datum/mind/carrier in assigned)
var/datum/antagonist/monkey/M = add_monkey_leader(carrier)
var/datum/antagonist/monkey/M = carrier.add_antag_datum(/datum/antagonist/monkey/leader)
if(M)
monkey_team = M.monkey_team
return TRUE
@@ -776,7 +585,9 @@
if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME)
return FALSE
var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
if(!ismonkey(M))
continue
if (M.HasDisease(D))
if(M.onCentCom() || M.onSyndieBase())
escaped_monkeys++
@@ -800,16 +611,14 @@
/datum/dynamic_ruleset/roundstart/meteor
name = "Meteor"
config_tag = "meteor"
persistent = TRUE
required_candidates = 0
weight = 3
cost = 0
requirements = list(101,101,101,101,101,101,101,101,101,101)
high_population_requirement = 101
property_weights = list("extended" = -2, "chaos" = 2, "trust" = 2)
flags = LONE_RULESET
var/meteordelay = 2000
var/nometeors = 0
var/nometeors = FALSE
var/rampupdelta = 5
/datum/dynamic_ruleset/roundstart/meteor/rule_process()
@@ -828,43 +637,3 @@
var/ramp_up_final = clamp(round(meteorminutes/rampupdelta), 1, 10)
spawn_meteors(ramp_up_final, wavetype)
//////////////////////////////////////////////
// //
// BLOODSUCKERS //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/roundstart/bloodsucker
name = "Bloodsuckers"
config_tag = "bloodsucker"
antag_flag = ROLE_BLOODSUCKER
antag_datum = ANTAG_DATUM_BLOODSUCKER
minimum_required_age = 0
protected_roles = list("Chaplain", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
restricted_roles = list("Cyborg", "AI")
required_candidates = 1
flags = MINOR_RULESET
weight = 2
cost = 15
scaling_cost = 10
property_weights = list("story_potential" = 1, "extended" = 1, "trust" = -2, "valid" = 1)
requirements = list(70,65,60,55,50,50,50,50,50,50)
high_population_requirement = 50
antag_cap = list(1,1,1,1,1,2,2,2,2,2)
/datum/dynamic_ruleset/roundstart/bloodsucker/pre_execute()
var/num_bloodsuckers = antag_cap[indice_pop] * (scaled_times + 1)
for (var/i = 1 to num_bloodsuckers)
var/mob/M = pick_n_take(candidates)
assigned += M.mind
M.mind.special_role = ROLE_BLOODSUCKER
M.mind.restricted_roles = restricted_roles
return TRUE
/datum/dynamic_ruleset/roundstart/bloodsucker/execute()
mode.check_start_sunlight()
for(var/datum/mind/M in assigned)
if(mode.make_bloodsucker(M))
mode.bloodsuckers += M
return TRUE
@@ -0,0 +1,122 @@
#ifdef TESTING
/datum/dynamic_simulation
var/datum/game_mode/dynamic/gamemode
var/datum/dynamic_simulation_config/config
var/list/mock_candidates = list()
/datum/dynamic_simulation/proc/initialize_gamemode(forced_threat)
gamemode = new
if (forced_threat)
gamemode.create_threat(forced_threat)
else
gamemode.generate_threat()
gamemode.generate_budgets()
gamemode.set_cooldowns()
/datum/dynamic_simulation/proc/create_candidates(players)
GLOB.new_player_list.Cut()
for (var/_ in 1 to players)
var/mob/dead/new_player/mock_new_player = new
mock_new_player.ready = PLAYER_READY_TO_PLAY
var/datum/mind/mock_mind = new
mock_new_player.mind = mock_mind
var/datum/client_interface/mock_client = new
var/datum/preferences/prefs = new
var/list/be_special = list()
for (var/special_role in GLOB.special_roles)
be_special += special_role
prefs.be_special = be_special
mock_client.prefs = prefs
mock_new_player.mock_client = mock_client
mock_candidates += mock_new_player
/datum/dynamic_simulation/proc/simulate(datum/dynamic_simulation_config/config)
src.config = config
initialize_gamemode(config.forced_threat_level)
create_candidates(config.roundstart_players)
gamemode.pre_setup()
var/total_antags = 0
for (var/_ruleset in gamemode.executed_rules)
var/datum/dynamic_ruleset/ruleset = _ruleset
total_antags += ruleset.assigned.len
return list(
"roundstart_players" = config.roundstart_players,
"threat_level" = gamemode.threat_level,
"snapshot" = list(
"antag_percent" = total_antags / config.roundstart_players,
"remaining_threat" = gamemode.mid_round_budget,
"rulesets" = gamemode.executed_rules.Copy(),
),
)
/datum/dynamic_simulation_config
/// How many players round start should there be?
var/roundstart_players
/// Optional, force this threat level instead of picking randomly through the lorentz distribution
var/forced_threat_level
/client/proc/run_dynamic_simulations()
set name = "Run Dynamic Simulations"
set category = "Debug"
var/simulations = input(usr, "Enter number of simulations") as num
var/roundstart_players = input(usr, "Enter number of round start players") as num
var/forced_threat_level = input(usr, "Enter forced threat level, if you want one") as num | null
SSticker.mode = new /datum/game_mode/dynamic
message_admins("Running dynamic simulations...")
var/list/outputs = list()
var/datum/dynamic_simulation_config/dynamic_config = new
if (roundstart_players)
dynamic_config.roundstart_players = roundstart_players
if (forced_threat_level)
dynamic_config.forced_threat_level = forced_threat_level
for (var/count in 1 to simulations)
var/datum/dynamic_simulation/simulator = new
var/output = simulator.simulate(dynamic_config)
outputs += list(output)
if (CHECK_TICK)
log_world("[count]/[simulations]")
message_admins("Writing file...")
WRITE_FILE(file("[GLOB.log_directory]/dynamic_simulations.json"), json_encode(outputs))
message_admins("Writing complete.")
/proc/export_dynamic_json_of(ruleset_list)
var/list/export = list()
for (var/_ruleset in ruleset_list)
var/datum/dynamic_ruleset/ruleset = _ruleset
export[ruleset.name] = list(
"repeatable_weight_decrease" = ruleset.repeatable_weight_decrease,
"weight" = ruleset.weight,
"cost" = ruleset.cost,
"scaling_cost" = ruleset.scaling_cost,
"antag_cap" = ruleset.antag_cap,
"pop_per_requirement" = ruleset.pop_per_requirement,
"requirements" = ruleset.requirements,
"base_prob" = ruleset.base_prob,
)
return export
#endif
@@ -1,388 +0,0 @@
/datum/dynamic_storyteller
var/name = "none" // Name for voting.
var/config_tag = null // Config tag for config weights.
var/desc = "A coder's idiocy." // Description for voting.
var/list/property_weights = list() // See below.
var/curve_centre = 0 // As GLOB.dynamic_curve_centre.
var/curve_width = 1.8 // As GLOB.dynamic_curve_width.
var/forced_threat_level = -1 // As GLOB.dynamic_forced_threat_level
/*
NO_ASSASSIN: Will not have permanent assassination targets.
WAROPS_ALWAYS_ALLOWED: Can always do warops, regardless of threat level.
USE_PREF_WEIGHTS: Will use peoples' preferences to change the threat centre.
FORCE_IF_WON: If this mode won the vote, forces it
USE_PREV_ROUND_WEIGHTS: Changes its threat centre based on the average chaos of previous rounds.
*/
var/flags = 0
var/dead_player_weight = 1 // How much dead players matter for threat calculation
var/weight = 0 // Weights for randomly picking storyteller. Multiplied by score after voting.
var/min_chaos = -1000 // Won't show up if recent rounds have been below this chaotic on average
var/max_chaos = 1000 // Won't show up if recent rounds have been above this chaotic on average
var/event_frequency_lower = 6 MINUTES // How rare events will be, at least.
var/event_frequency_upper = 20 MINUTES // How rare events will be, at most.
var/min_players = -1 // How many players are required for this one to start.
var/soft_antag_ratio_cap = 4 // how many players-per-antag there should be
var/datum/game_mode/dynamic/mode = null // Cached as soon as it's made, by dynamic.
/**
Property weights are added to the config weight of the ruleset. They are:
"story_potential" -- essentially how many different ways the antag can be played.
"trust" -- How much it makes the crew trust each other. Negative values means they're suspicious. Team antags are like this.
"chaos" -- How chaotic it makes the round. Has some overlap with "valid" and somewhat contradicts "extended".
"valid" -- How likely the non-antag-enemy crew are to get involved, e.g. nukies encouraging the warden to
let everyone into the armory, wizard moving around and being a nuisance, nightmare busting lights.
"extended" -- How much the antag is conducive to a long round. Nukies and cults are bad for this; Wizard is less bad; and so on.
"conversion" -- Basically a bool. Conversion antags, well, convert. It's in its own class 'cause people kinda hate conversion.
*/
/datum/dynamic_storyteller/proc/minor_start_chance()
return clamp(60 - mode.threat_level,0,100) // by default higher threat = lower chance of minor round
/datum/dynamic_storyteller/proc/start_injection_cooldowns()
var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_latejoin_delay_max + GLOB.dynamic_first_latejoin_delay_min)
mode.latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_first_latejoin_delay_min, GLOB.dynamic_first_latejoin_delay_max)) + world.time
var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_midround_delay_min + GLOB.dynamic_first_midround_delay_max)
mode.midround_injection_cooldown = round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_first_midround_delay_min, GLOB.dynamic_first_midround_delay_max)) + world.time
/datum/dynamic_storyteller/proc/do_process()
return
/datum/dynamic_storyteller/proc/on_start()
if (istype(SSticker.mode, /datum/game_mode/dynamic))
mode = SSticker.mode
GLOB.dynamic_curve_centre = curve_centre
GLOB.dynamic_curve_width = curve_width
if(flags & USE_PREF_WEIGHTS)
var/voters = 0
var/mean = 0
for(var/client/c in GLOB.clients)
var/vote = c.prefs.preferred_chaos
if(vote)
voters += 1
switch(vote)
if(CHAOS_NONE)
mean -= 5
if(CHAOS_LOW)
mean -= 2.5
if(CHAOS_HIGH)
mean += 2.5
if(CHAOS_MAX)
mean += 5
else
voters += 0.5
if(voters)
GLOB.dynamic_curve_centre += (mean/voters)
if(flags & USE_PREV_ROUND_WEIGHTS)
GLOB.dynamic_curve_centre += (SSpersistence.average_threat) / 10
GLOB.dynamic_forced_threat_level = forced_threat_level
/datum/dynamic_storyteller/proc/get_midround_cooldown()
var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min)
return round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max))
/datum/dynamic_storyteller/proc/should_inject_antag(dry_run = FALSE)
if(mode.forced_injection)
mode.forced_injection = dry_run
return TRUE
if(mode.current_players[CURRENT_LIVING_PLAYERS].len < (mode.current_players[CURRENT_LIVING_ANTAGS].len * soft_antag_ratio_cap))
return FALSE
return mode.threat < mode.threat_level
/datum/dynamic_storyteller/proc/roundstart_draft()
var/list/drafted_rules = list()
var/minor_round_weight_mult = (100-minor_start_chance()) / 100
for (var/datum/dynamic_ruleset/roundstart/rule in mode.roundstart_rules)
if (rule.acceptable(mode.roundstart_pop_ready, mode.threat_level)) // If we got the population and threat required
rule.candidates = mode.candidates.Copy()
rule.trim_candidates()
if (rule.ready() && rule.candidates.len > 0)
var/property_weight = 0
for(var/property in property_weights)
if(property in rule.property_weights) // just treat it as 0 if it's not in there
property_weight += rule.property_weights[property] * property_weights[property]
var/calced_weight = (rule.get_weight() + property_weight) * rule.weight_mult
if(CHECK_BITFIELD(rule.flags, MINOR_RULESET))
calced_weight *= minor_round_weight_mult
if(calced_weight > 0) // negatives in the list might cause problems
drafted_rules[rule] = calced_weight
return drafted_rules
/datum/dynamic_storyteller/proc/minor_rule_draft()
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/rule in mode.minor_rules)
if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level))
rule.trim_candidates()
if (rule.ready())
var/property_weight = 0
for(var/property in property_weights)
if(property in rule.property_weights) // just treat it as 0 if it's not in there
property_weight += rule.property_weights[property] * property_weights[property]
var/calced_weight = (rule.get_weight() + property_weight) * rule.weight_mult
if(calced_weight > 0) // negatives in the list might cause problems
drafted_rules[rule] = calced_weight
return drafted_rules
/datum/dynamic_storyteller/proc/midround_draft()
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/midround/rule in mode.midround_rules)
// if there are antags OR the rule is an antag rule, antag_acceptable will be true.
if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level))
// Classic secret : only autotraitor/minor roles
if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET)))
continue
rule.trim_candidates()
if (rule.ready())
var/property_weight = 0
for(var/property in property_weights)
if(property in rule.property_weights) // just treat it as 0 if it's not in there
property_weight += rule.property_weights[property] * property_weights[property]
var/threat_weight = 1
if(!(rule.flags & TRAITOR_RULESET)) // makes the traitor rulesets always possible anyway
var/cost_difference = rule.cost-(mode.threat_level-mode.threat)
/* Basically, the closer the cost is to the current threat-level-away-from-threat, the more likely it is to
pick this particular ruleset.
Let's use a toy example: there's 60 threat level and 10 threat spent.
We want to pick a ruleset that's close to that, so we run the below equation, on two rulesets.
Ruleset 1 has 30 cost, ruleset 2 has 5 cost.
When we do the math, ruleset 1's threat_weight is 0.538, and ruleset 2's is 0.238, meaning ruleset 1
is 2.26 times as likely to be picked, all other things considered.
Of course, we don't want it to GUARANTEE the closest, that's no fun, so it's just a weight.
*/
threat_weight = abs(1-abs(1-LOGISTIC_FUNCTION(2,0.05,abs(cost_difference),0)))
if(cost_difference > 0)
threat_weight /= (1+(cost_difference*0.1))
var/calced_weight = (rule.get_weight() + property_weight) * rule.weight_mult * threat_weight
if(calced_weight > 0)
drafted_rules[rule] = calced_weight
return drafted_rules
/datum/dynamic_storyteller/proc/latejoin_draft(mob/living/carbon/human/newPlayer)
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/latejoin/rule in mode.latejoin_rules)
if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level - mode.threat))
// Classic secret : only autotraitor/minor roles
if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET)))
continue
// No stacking : only one round-ender, unless threat level > stacking_limit.
if (mode.threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking)
if(rule.flags & HIGHLANDER_RULESET && mode.highlander_executed)
continue
rule.candidates = list(newPlayer)
rule.trim_candidates()
if (rule.ready())
var/property_weight = 0
for(var/property in property_weights)
if(property in rule.property_weights)
property_weight += rule.property_weights[property] * property_weights[property]
var/threat_weight = 1
if(!(rule.flags & TRAITOR_RULESET))
var/cost_difference = rule.cost-(mode.threat_level-mode.threat)
threat_weight = 1-abs(1-(LOGISTIC_FUNCTION(2,0.05,abs(cost_difference),0)))
if(cost_difference > 0)
threat_weight /= (1+(cost_difference*0.1))
var/calced_weight = (rule.get_weight() + property_weight) * rule.weight_mult * threat_weight
if(calced_weight > 0)
drafted_rules[rule] = calced_weight
return drafted_rules
/datum/dynamic_storyteller/chaotic
name = "Chaotic"
config_tag = "chaotic"
curve_centre = 10
desc = "High chaos modes. Revs, wizard, clock cult. Multiple antags at once. Chaos is kept up all round."
property_weights = list("extended" = -1, "chaos" = 1)
weight = 1
event_frequency_lower = 2 MINUTES
event_frequency_upper = 10 MINUTES
max_chaos = 50
soft_antag_ratio_cap = 1
flags = WAROPS_ALWAYS_ALLOWED | FORCE_IF_WON
min_players = 30
var/refund_cooldown = 0
/datum/dynamic_storyteller/chaotic/minor_start_chance()
return 0
/datum/dynamic_storyteller/chaotic/do_process()
if(refund_cooldown < world.time)
mode.create_threat(20)
mode.log_threat("Chaotic storyteller ramped up the chaos. Threat level is now [mode.threat_level].")
refund_cooldown = world.time + 20 MINUTES
/datum/dynamic_storyteller/chaotic/get_midround_cooldown()
return ..() / 4
/datum/dynamic_storyteller/team
name = "Teamwork"
config_tag = "teamwork"
desc = "Modes where the crew must band together. Nukies, xenos, blob. Only one antag threat at once."
curve_centre = 2
curve_width = 1.5
weight = 4
max_chaos = 75
min_players = 20
flags = WAROPS_ALWAYS_ALLOWED | USE_PREV_ROUND_WEIGHTS
property_weights = list("valid" = 3, "trust" = 5)
/datum/dynamic_storyteller/team/minor_start_chance()
return 0
/datum/dynamic_storyteller/team/should_inject_antag(dry_run = FALSE)
return (mode.current_players[CURRENT_LIVING_ANTAGS].len ? FALSE : ..())
/datum/dynamic_storyteller/conversion
name = "Conversion"
config_tag = "conversion"
desc = "Conversion antags. Cults, revs."
curve_centre = 3
curve_width = 1
weight = 0
flags = WAROPS_ALWAYS_ALLOWED
property_weights = list("valid" = 1, "conversion" = 20)
/datum/dynamic_storyteller/conversion/minor_start_chance()
return 0
/datum/dynamic_storyteller/random
name = "Random"
config_tag = "random"
weight = 1
max_chaos = 60
soft_antag_ratio_cap = 1
desc = "No weighting at all; every ruleset has the same chance of happening. Cooldowns vary wildly. As random as it gets."
/datum/dynamic_storyteller/random/on_start()
..()
GLOB.dynamic_forced_threat_level = rand(0,100)
/datum/dynamic_storyteller/random/get_midround_cooldown()
return rand(GLOB.dynamic_midround_delay_min/2, GLOB.dynamic_midround_delay_max*2)
/datum/dynamic_storyteller/random/should_inject_antag()
return prob(50)
/datum/dynamic_storyteller/random/minor_start_chance()
return 20
/datum/dynamic_storyteller/random/roundstart_draft()
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/roundstart/rule in mode.roundstart_rules)
if (rule.acceptable(mode.roundstart_pop_ready, mode.threat_level)) // If we got the population and threat required
rule.candidates = mode.candidates.Copy()
rule.trim_candidates()
if (rule.ready() && rule.candidates.len > 0)
drafted_rules[rule] = 1
return drafted_rules
/datum/dynamic_storyteller/random/minor_rule_draft()
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/minor/rule in mode.minor_rules)
if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level))
rule.candidates = mode.candidates.Copy()
rule.trim_candidates()
if (rule.ready() && rule.candidates.len > 0)
drafted_rules[rule] = 1
return drafted_rules
/datum/dynamic_storyteller/random/midround_draft()
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/midround/rule in mode.midround_rules)
if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level))
// Classic secret : only autotraitor/minor roles
if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET)))
continue
rule.trim_candidates()
if (rule.ready())
drafted_rules[rule] = 1
return drafted_rules
/datum/dynamic_storyteller/random/latejoin_draft(mob/living/carbon/human/newPlayer)
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/latejoin/rule in mode.latejoin_rules)
if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level))
// Classic secret : only autotraitor/minor roles
if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET)))
continue
// No stacking : only one round-ender, unless threat level > stacking_limit.
if (mode.threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking)
if(rule.flags & HIGHLANDER_RULESET && mode.highlander_executed)
continue
rule.candidates = list(newPlayer)
rule.trim_candidates()
if (rule.ready())
drafted_rules[rule] = 1
return drafted_rules
/datum/dynamic_storyteller/story
name = "Story"
config_tag = "story"
desc = "Antags with options for loadouts and gimmicks. Traitor, wizard, nukies."
weight = 4
curve_width = 2
flags = USE_PREV_ROUND_WEIGHTS
property_weights = list("story_potential" = 2)
/datum/dynamic_storyteller/classic
name = "Classic"
config_tag = "classic"
weight = 8
desc = "No special antagonist weights. Good variety, but not like random. Uses your chaos preference to weight."
flags = USE_PREF_WEIGHTS | USE_PREV_ROUND_WEIGHTS
/datum/dynamic_storyteller/suspicion
name = "Intrigue"
config_tag = "intrigue"
desc = "Antags that instill distrust in the crew. Traitors, bloodsuckers."
weight = 4
curve_width = 2
dead_player_weight = 2
flags = USE_PREV_ROUND_WEIGHTS
property_weights = list("trust" = -2)
/datum/dynamic_storyteller/intrigue/minor_start_chance()
return 100 - mode.threat_level
/datum/dynamic_storyteller/grabbag
name = "Grab Bag"
config_tag = "grabbag"
desc = "Crew antags (e.g. traitor, changeling, bloodsucker, heretic) only at round start, all mixed together."
weight = 4
flags = USE_PREF_WEIGHTS | USE_PREV_ROUND_WEIGHTS
/datum/dynamic_storyteller/grabbag/minor_start_chance()
return 100
/datum/dynamic_storyteller/liteextended
name = "Calm"
config_tag = "calm"
desc = "Low-chaos round. Few antags. No conversion."
curve_centre = -3
curve_width = 0.5
flags = NO_ASSASSIN
min_chaos = 30
weight = 3
dead_player_weight = 5
soft_antag_ratio_cap = 8
property_weights = list("extended" = 2, "chaos" = -1, "valid" = -1, "conversion" = -10)
/datum/dynamic_storyteller/liteextended/minor_start_chance()
return 90
/datum/dynamic_storyteller/no_antag
name = "Extended"
config_tag = "semiextended"
desc = "No standard antags."
curve_centre = -5
curve_width = 0.5
min_chaos = 40
flags = NO_ASSASSIN | FORCE_IF_WON
weight = 1
property_weights = list("extended" = 2)
/datum/dynamic_storyteller/no_antag/roundstart_draft()
return list()
/datum/dynamic_storyteller/no_antag/should_inject_antag(dry_run)
return FALSE
+147 -19
View File
@@ -1,56 +1,184 @@
# DYNAMIC
# Dynamic Mode
Tries to keep the round at a certain level of action, based on the round's "threat level".
## ROUNDSTART
## Roundstart
Dynamic rolls threat based on a special sauce formula:
"dynamic_curve_width \* tan((rand() - 0.5) \* 180) + dynamic_curve_centre"
Midround injection cooldowns are set using exponential distribution between 15 minutes and 35 minutes. This value is then added to world.time and assigned to the injection cooldown variables.
> [dynamic_curve_width][/datum/controller/global_vars/var/dynamic_curve_width] \* tan((3.1416 \* (rand() - 0.5) \* 57.2957795)) + [dynamic_curve_centre][/datum/controller/global_vars/var/dynamic_curve_centre]
Latejoins are aggressively assigned whenever possible, to keep the round at a certain threat level.
This threat is split into two separate budgets--`round_start_budget` and `mid_round_budget`. For example, a round with 50 threat might be split into a 30 roundstart budget, and a 20 midround budget. The roundstart budget is used to apply antagonists applied on readied players when the roundstarts (`/datum/dynamic_ruleset/roundstart`). The midround budget is used for two types of rulesets:
- `/datum/dynamic_ruleset/midround` - Rulesets that apply to either existing alive players, or to ghosts. Think Blob or Space Ninja, which poll ghosts asking if they want to play as these roles.
- `/datum/dynamic_ruleset/latejoin` - Rulesets that apply to the next player that joins. Think Syndicate Infiltrator, which converts a player just joining an existing round into traitor.
rigged_roundstart() is called instead if there are forced rules (an admin set the mode)
This split is done with a similar method, known as the ["lorentz distribution"](https://en.wikipedia.org/wiki/Cauchy_distribution), exists to create a bell curve that ensures that while most rounds will have a threat level around ~50, chaotic and tame rounds still exist for variety.
can_start() -> pre_setup() -> roundstart() OR rigged_roundstart() -> picking_roundstart_rule(drafted_rules) -> post_setup()
The process of creating these numbers occurs in `/datum/game_mode/dynamic/proc/generate_threat` (for creating the threat level) and `/datum/game_mode/dynamic/proc/generate_budgets` (for splitting the threat level into budgets).
## PROCESS
## Deciding roundstart threats
In `/datum/game_mode/dynamic/proc/roundstart()` (called when no admin chooses the rulesets explicitly), Dynamic uses the available roundstart budget to pick threats. This is done through the following system:
Calls rule_process on every rule which is in the current_rules list.
- All roundstart rulesets (remember, `/datum/dynamic_ruleset/roundstart`) are put into an associative list with their weight as the values (`drafted_rules`).
- Until there is either no roundstart budget left, or until there is no ruleset we can choose from with the available threat, a `pickweight` is done based on the drafted_rules. If the same threat is picked twice, it will "scale up". The meaning of this depends on the ruleset itself, using the `scaled_times` variable; traitors for instance will create more the higher they scale.
- If a ruleset is chosen with the `HIGH_IMPACT_RULESET` in its `flags`, then all other `HIGH_IMPACT_RULESET`s will be removed from `drafted_rules`. This is so that only one can ever be chosen.
- If a ruleset has `LONE_RULESET` in its `flags`, then it will be removed from `drafted_rules`. This is to ensure it will only ever be picked once. An example of this in use is Wizard, to avoid creating multiple wizards.
- After all roundstart threats are chosen, `/datum/dynamic_ruleset/proc/picking_roundstart_rule` is called for each, passing in the ruleset and the number of times it is scaled.
- In this stage, `pre_execute` is called, which is the function that will determine what players get what antagonists. If this function returns FALSE for whatever reason (in the case of an error), then its threat is refunded.
After this process is done, any leftover roundstart threat will be given to the existing midround budget (done in `/datum/game_mode/dynamic/pre_setup()`).
## Deciding midround threats
Latejoin and midround injection cooldowns are set using exponential distribution between
- 5 minutes and 25 for latejoin (configurable as latejoin_delay_min and latejoin_delay_max)
- 15 minutes and 35 for midround (configurable as midround_delay_min and midround_delay_max)
this value is then added to `world.time` and assigned to the injection cooldown variables.
[rigged_roundstart][/datum/game_mode/dynamic/proc/rigged_roundstart] is called instead if there are forced rules (an admin set the mode)
1. [setup_parameters][/datum/game_mode/proc/setup_parameters]\()
2. [pre_setup][/datum/game_mode/proc/pre_setup]\()
3. [roundstart][/datum/game_mode/dynamic/proc/roundstart]\() OR [rigged_roundstart][/datum/game_mode/dynamic/proc/rigged_roundstart]\()
4. [picking_roundstart_rule][/datum/game_mode/dynamic/proc/picking_roundstart_rule]\(drafted_rules)
5. [post_setup][/datum/game_mode/proc/post_setup]\()
## Rule Processing
Calls [rule_process][/datum/dynamic_ruleset/proc/rule_process] on every rule which is in the current_rules list.
Every sixty seconds, update_playercounts()
Midround injection time is checked against world.time to see if an injection should happen.
If midround injection time is lower than world.time, it updates playercounts again, then tries to inject and generates a new cooldown regardless of whether a rule is picked.
## LATEJOIN
## Latejoin
make_antag_chance(newPlayer) -> [For each latespawn rule...]
make_antag_chance(newPlayer) -> (For each latespawn rule...)
-> acceptable(living players, threat_level) -> trim_candidates() -> ready(forced=FALSE)
**If true, add to drafted rules
**NOTE that acceptable uses threat_level not threat!
**NOTE Latejoin timer is ONLY reset if at least one rule was drafted.
**NOTE the new_player.dm AttemptLateSpawn() calls OnPostSetup for all roles (unless assigned role is MODE)
[After collecting all draftble rules...]
(After collecting all draftble rules...)
-> picking_latejoin_ruleset(drafted_rules) -> spend threat -> ruleset.execute()
## MIDROUND
process() -> [For each midround rule...]
## Midround
process() -> (For each midround rule...
-> acceptable(living players, threat_level) -> trim_candidates() -> ready(forced=FALSE)
[After collecting all draftble rules...]
(After collecting all draftble rules...)
-> picking_midround_ruleset(drafted_rules) -> spend threat -> ruleset.execute()
## FORCED
## Forced
For latejoin, it simply sets forced_latejoin_rule
make_antag_chance(newPlayer) -> trim_candidates() -> ready(forced=TRUE) **NOTE no acceptable() call
For midround, calls the below proc with forced = TRUE
picking_specific_rule(ruletype,forced) -> forced OR acceptable(living_players, threat_level) -> trim_candidates() -> ready(forced) -> spend threat -> execute()
**NOTE specific rule can be called by RS traitor->MR autotraitor w/ forced=FALSE
**NOTE that due to short circuiting acceptable() need not be called if forced.
## RULESET
## Ruleset
acceptable(population,threat) just checks if enough threat_level for population indice.
**NOTE that we currently only send threat_level as the second arg, not threat.
ready(forced) checks if enough candidates and calls the map's map_ruleset(dynamic_ruleset) at the parent level
trim_candidates() varies significantly according to the ruleset type
Roundstart: All candidates are new_player mobs. Check them for standard stuff: connected, desire role, not banned, etc.
**NOTE Roundstart deals with both candidates (trimmed list of valid players) and mode.candidates (everyone readied up). Don't confuse them!
Latejoin: Only one candidate, the latejoiner. Standard checks.
Midround: Instead of building a single list candidates, candidates contains four lists: living, dead, observing, and living antags. Standard checks in trim_list(list).
Midround - Rulesets have additional types
/from_ghosts: execute() -> send_applications() -> review_applications() -> finish_setup(mob/newcharacter, index) -> setup_role(role)
**NOTE: execute() here adds dead players and observers to candidates list
## Configuration and variables
### Configuration
Configuration can be done through a `config/dynamic.json` file. One is provided as example in the codebase. This config file, loaded in `/datum/game_mode/dynamic/pre_setup()`, directly overrides the values in the codebase, and so is perfect for making some rulesets harder/easier to get, turning them off completely, changing how much they cost, etc.
The format of this file is:
```json
{
"Dynamic": {
/* Configuration in here will directly override `/datum/game_mode/dynamic` itself. */
/* Keys are variable names, values are their new values. */
},
"Roundstart": {
/* Configuration in here will apply to `/datum/dynamic_ruleset/roundstart` instances. */
/* Keys are the ruleset names, values are another associative list with keys being variable names and values being new values. */
"Wizard": {
/* I, a head admin, have died to wizard, and so I made it cost a lot more threat than it does in the codebase. */
"cost": 80
}
},
"Midround": {
/* Same as "Roundstart", but for `/datum/dynamic_ruleset/midround` instead. */
},
"Latejoin": {
/* Same as "Roundstart", but for `/datum/dynamic_ruleset/latejoin` instead. */
}
}
```
Note: Comments are not possible in this format, and are just in this document for the sake of readability.
### Rulesets
Rulesets have the following variables notable to developers and those interested in tuning.
- `required_candidates` - The number of people that *must be willing* (in their preferences) to be an antagonist with this ruleset. If the candidates do not meet this requirement, then the ruleset will not bother to be drafted.
- `antag_cap` - Judges the amount of antagonists to apply, for both solo and teams. Note that some antagonists (such as traitors, lings, heretics, etc) will add more based on how many times they've been scaled. Written as a linear equation--ceil(x/denominator) + offset, or as a fixed constant. If written as a linear equation, will be in the form of `list("denominator" = denominator, "offset" = offset)`.
- Examples include:
- Traitor: `antag_cap = list("denominator" = 24)`. This means that for every 24 players, 1 traitor will be added (assuming no scaling).
- Nuclear Emergency: `antag_cap = list("denominator" = 18, "offset" = 1)`. For every 18 players, 1 nuke op will be added. Starts at 1, meaning at 30 players, 3 nuke ops will be created, rather than 2.
- Revolution: `antag_cap = 3`. There will always be 3 rev-heads, no matter what.
- `minimum_required_age` - The minimum age in order to apply for the ruleset.
- `weight` - How likely this ruleset is to be picked. A higher weight results in a higher chance of drafting.
- `cost` - The initial cost of the ruleset. This cost is taken from either the roundstart or midround budget, depending on the ruleset.
- `scaling_cost` - Cost for every *additional* application of this ruleset.
- Suppose traitors has a `cost` of 8, and a `scaling_cost` of 5. This means that buying 1 application of the traitor ruleset costs 8 threat, but buying two costs 13 (8 + 5). Buying it a third time is 18 (8 + 5 + 5), etc.
- `pop_per_requirement` - The range of population each value in `requirements` represents. By default, this is 6.
- If the value is five the range is 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-54, 45+.
- If it is six the range is 0-5, 6-11, 12-17, 18-23, 24-29, 30-35, 36-41, 42-47, 48-53, 54+.
- If it is seven the range is 0-6, 7-13, 14-20, 21-27, 28-34, 35-41, 42-48, 49-55, 56-62, 63+.
- `requirements` - A list that represents, per population range (see: `pop_per_requirement`), how much threat is required to *consider* this ruleset. This is independent of how much it'll actually cost. This uses *threat level*, not the budget--meaning if a round has 50 threat level, but only 10 points of round start threat, a ruleset with a requirement of 40 can still be picked if it can be bought.
- Suppose wizard has a `requirements` of `list(90,90,70,40,30,20,10,10,10,10)`. This means that, at 0-5 and 6-11 players, A station must have 90 threat in order for a wizard to be possible. At 12-17, 70 threat is required instead, etc.
- `restricted_roles` - A list of jobs that *can't* be drafted by this ruleset. For example, cyborgs cannot be changelings, and so are in the `restricted_roles`.
- `protected_roles` - Serves the same purpose of `restricted_roles`, except it can be turned off through configuration (`protect_roles_from_antagonist`). For example, security officers *shouldn't* be made traitor, so they are in Traitor's `protected_roles`.
- When considering putting a role in `protected_roles` or `restricted_roles`, the rule of thumb is if it is *technically infeasible* to support that job in that role. There's no *technical* reason a security officer can't be a traitor, and so they are simply in `protected_roles`. There *are* technical reasons a cyborg can't be a changeling, so they are in `restricted_roles` instead.
### Dynamic
The "Dynamic" key has the following configurable values:
- `pop_per_requirement` - The default value of `pop_per_requirement` for any ruleset that does not explicitly set it. Defaults to 6.
- `latejoin_delay_min`, `latejoin_delay_max` - The time range, in deciseconds (take your seconds, and multiply by 10), for a latejoin to attempt rolling. Once this timer is finished, a new one will be created within the same range.
- Suppose you have a `latejoin_delay_min` of 600 (60 seconds, 1 minute) and a `latejoin_delay_max` of 1800 (180 seconds, 3 minutes). Once the round starts, a random number in this range will be picked--let's suppose 1.5 minutes. After 1.5 minutes, Dynamic will decide if a latejoin threat should be created (a probability of `/datum/game_mode/dynamic/proc/get_injection_chance()`). Regardless of its decision, a new timer will be started within the range of 1 to 3 minutes, repeatedly.
- `midround_delay_min`, `midround_delay_max` - Same as `latejoin_delay_min` and `latejoin_delay_max`, except for midround threats instead of latejoin ones.
- `higher_injection_chance`, `higher_injection_chance_minimum_threat` - Manipulates the injection chance (`/datum/game_mode/dynamic/proc/get_injection_chance()`). If the *current midround budget* is above `higher_injection_chance_minimum_threat`, then this chance will be increased by `higher_injection_chance`.
- For example: suppose you have a `higher_injection_chance_minimum_threat` of 70, and a `higher_injection_chance` of 15. This means that, if when a midround threat is trying to roll, there is 75 midround budget left, then the injection chance will go up 15%.
- `lower_injection_chance`, `lower_injection_chance_minimum_threat` - The inverse of the `higher_injection_chance` variables. If the *current midround budget* is *below* `lower_injection_chance`, then the chance is lowered by `lower_injection_chance_minimum_threat`.
- For example: suppose you have a `lower_injection_chance_minimum_threat` of 30, and a `lower_injection_chance` of 15. This means if there is 20 midround budget left, then the chance will lower by 15%.
- `threat_curve_centre` - A number between -5 and +5. A negative value will give a more peaceful round and a positive value will give a round with higher threat.
- `threat_curve_width` - A number between 0.5 and 4. Higher value will favour extreme rounds and lower value rounds closer to the average.
- `roundstart_split_curve_centre` - A number between -5 and +5. Equivalent to threat_curve_centre, but for the budget split. A negative value will weigh towards midround rulesets, and a positive value will weight towards roundstart ones.
- `roundstart_split_curve_width` - A number between 0.5 and 4. Equivalent to threat_curve_width, but for the budget split. Higher value will favour more variance in splits and lower value rounds closer to the average.
- `random_event_hijack_minimum` - The minimum amount of time for antag random events to be hijacked. (See [Random Event Hijacking](#random-event-hijacking))
- `random_event_hijack_maximum` - The maximum amount of time for antag random events to be hijacked. (See [Random Event Hijacking](#random-event-hijacking))
- `hijacked_random_event_injection_chance` - The amount of injection chance to give to Dynamic when a random event is hijacked. (See [Random Event Hijacking](#random-event-hijacking))
## Random Event "Hijacking"
Random events have the potential to be hijacked by Dynamic to keep the pace of midround injections, while also allowing greenshifts to contain some antagonists.
`/datum/round_event_control/dynamic_should_hijack` is a variable to random events to allow Dynamic to hijack them, and defaults to FALSE. This is set to TRUE for random events that spawn antagonists.
In `/datum/game_mode/dynamic/on_pre_random_event` (in `dynamic_hijacking.dm`), Dynamic hooks to random events. If the `dynamic_should_hijack` variable is TRUE, the following sequence of events occurs:
![Flow chart to describe the chain of events for Dynamic 2021 to take](https://user-images.githubusercontent.com/35135081/109071468-9cab7e00-76a8-11eb-8f9f-2b920c602ef4.png)
`n` is a random value between `random_event_hijack_minimum` and `random_event_hijack_maximum`. Injection chance, should it need to be raised, is increased by `hijacked_random_event_injection_chance`.
@@ -0,0 +1,122 @@
#define ADMIN_CANCEL_MIDROUND_TIME (10 SECONDS)
/// From a list of rulesets, returns one based on weight and availability.
/// Mutates the list that is passed into it to remove invalid rules.
/datum/game_mode/dynamic/proc/pick_ruleset(list/drafted_rules)
if (only_ruleset_executed)
return null
while (TRUE)
var/datum/dynamic_ruleset/rule = pickweight(drafted_rules)
if (!rule)
return null
if (check_blocking(rule.blocking_rules, executed_rules))
drafted_rules -= rule
if(drafted_rules.len <= 0)
return null
continue
else if (
rule.flags & HIGH_IMPACT_RULESET \
&& threat_level < GLOB.dynamic_stacking_limit \
&& GLOB.dynamic_no_stacking \
&& high_impact_ruleset_executed \
)
drafted_rules -= rule
if(drafted_rules.len <= 0)
return null
continue
return rule
/// Executes a random midround ruleset from the list of drafted rules.
/datum/game_mode/dynamic/proc/pick_midround_rule(list/drafted_rules)
var/datum/dynamic_ruleset/rule = pick_ruleset(drafted_rules)
if (isnull(rule))
return
current_midround_rulesets = drafted_rules - rule
midround_injection_timer_id = addtimer(
CALLBACK(src, .proc/execute_midround_rule, rule), \
ADMIN_CANCEL_MIDROUND_TIME, \
TIMER_STOPPABLE, \
)
log_game("DYNAMIC: [rule] ruleset executing...")
message_admins("DYNAMIC: Executing midround ruleset [rule] in [DisplayTimeText(ADMIN_CANCEL_MIDROUND_TIME)]. \
<a href='?src=[REF(src)];cancelmidround=[midround_injection_timer_id]'>CANCEL</a> | \
<a href='?src=[REF(src)];differentmidround=[midround_injection_timer_id]'>SOMETHING ELSE</a>")
/// Fired after admins do not cancel a midround injection.
/datum/game_mode/dynamic/proc/execute_midround_rule(datum/dynamic_ruleset/rule)
current_midround_rulesets = null
midround_injection_timer_id = null
if (!rule.repeatable)
midround_rules = remove_from_list(midround_rules, rule.type)
addtimer(CALLBACK(src, .proc/execute_midround_latejoin_rule, rule), rule.delay)
/// Executes a random latejoin ruleset from the list of drafted rules.
/datum/game_mode/dynamic/proc/pick_latejoin_rule(list/drafted_rules)
var/datum/dynamic_ruleset/rule = pick_ruleset(drafted_rules)
if (isnull(rule))
return
if (!rule.repeatable)
latejoin_rules = remove_from_list(latejoin_rules, rule.type)
addtimer(CALLBACK(src, .proc/execute_midround_latejoin_rule, rule), rule.delay)
return TRUE
/// Mainly here to facilitate delayed rulesets. All midround/latejoin rulesets are executed with a timered callback to this proc.
/datum/game_mode/dynamic/proc/execute_midround_latejoin_rule(sent_rule)
var/datum/dynamic_ruleset/rule = sent_rule
spend_midround_budget(rule.cost)
threat_log += "[worldtime2text()]: [rule.ruletype] [rule.name] spent [rule.cost]"
rule.pre_execute(current_players[CURRENT_LIVING_PLAYERS].len)
if (rule.execute())
log_game("DYNAMIC: Injected a [rule.ruletype == "latejoin" ? "latejoin" : "midround"] ruleset [rule.name].")
if(rule.flags & HIGH_IMPACT_RULESET)
high_impact_ruleset_executed = TRUE
else if(rule.flags & ONLY_RULESET)
only_ruleset_executed = TRUE
if(rule.ruletype == "Latejoin")
var/mob/M = pick(rule.candidates)
message_admins("[key_name(M)] joined the station, and was selected by the [rule.name] ruleset.")
log_game("DYNAMIC: [key_name(M)] joined the station, and was selected by the [rule.name] ruleset.")
executed_rules += rule
rule.candidates.Cut()
if (rule.persistent)
current_rules += rule
new_snapshot(rule)
return TRUE
rule.clean_up()
stack_trace("The [rule.ruletype] rule \"[rule.name]\" failed to execute.")
return FALSE
/// Fired when an admin cancels the current midround injection.
/datum/game_mode/dynamic/proc/admin_cancel_midround(mob/user, timer_id)
if (midround_injection_timer_id != timer_id || !deltimer(midround_injection_timer_id))
to_chat(user, span_notice("Too late!"))
return
log_admin("[key_name(user)] cancelled the next midround injection.")
message_admins("[key_name(user)] cancelled the next midround injection.")
midround_injection_timer_id = null
current_midround_rulesets = null
/// Fired when an admin requests a different midround injection.
/datum/game_mode/dynamic/proc/admin_different_midround(mob/user, timer_id)
if (midround_injection_timer_id != timer_id || !deltimer(midround_injection_timer_id))
to_chat(user, span_notice("Too late!"))
return
midround_injection_timer_id = null
if (isnull(current_midround_rulesets) || current_midround_rulesets.len == 0)
log_admin("[key_name(user)] asked for a different midround injection, but there were none left.")
message_admins("[key_name(user)] asked for a different midround injection, but there were none left.")
return
log_admin("[key_name(user)] asked for a different midround injection.")
message_admins("[key_name(user)] asked for a different midround injection.")
pick_midround_rule(current_midround_rulesets)
#undef ADMIN_CANCEL_MIDROUND_TIME
+5
View File
@@ -52,6 +52,9 @@
var/setup_error //What stopepd setting up the mode.
var/flipseclevel = FALSE //CIT CHANGE - adds a 10% chance for the alert level to be the opposite of what the gamemode is supposed to have
/// Associative list of current players, in order: living players, living antagonists, dead players and observers.
var/list/list/current_players = list(CURRENT_LIVING_PLAYERS = list(), CURRENT_LIVING_ANTAGS = list(), CURRENT_DEAD_PLAYERS = list(), CURRENT_OBSERVERS = list())
/datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description.
to_chat(world, "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>")
to_chat(world, "<b>[announce_text]</b>")
@@ -76,6 +79,8 @@
return 1
///Attempts to select players for special roles the mode might have.
/datum/game_mode/proc/pre_setup()
return 1
+145 -116
View File
@@ -23,6 +23,8 @@
/obj/item/storage/backpack,
/obj/item/storage/belt
)
/// Temporary messages
var/temp
/obj/machinery/gear_painter/Initialize(mapload)
. = ..()
@@ -69,6 +71,8 @@
if(!QDELETED(H))
H.release()
insert_mob(victim, user)
temp = "[victim] has been inserted."
SStgui.update_uis(src)
if(is_type_in_list(I, allowed_types) && is_operational())
if(!user.transferItemToLoc(I, src))
@@ -80,6 +84,9 @@
inserted = I
update_icon()
temp = "[I] has been inserted."
SStgui.update_uis(src)
else
return ..()
@@ -101,137 +108,159 @@
/obj/machinery/gear_painter/AltClick(mob/user)
. = ..()
if(!user.CanReach(src))
drop_item()
/obj/machinery/gear_painter/proc/drop_item()
if(!usr.CanReach(src))
return
if(!inserted)
return
to_chat(user, "<span class='notice'>You remove [inserted] from [src]")
to_chat(usr, "<span class='notice'>You remove [inserted] from [src]")
inserted.forceMove(drop_location())
var/mob/living/user = usr
if(istype(user))
user.put_in_hands(inserted)
inserted = null
update_icon()
updateUsrDialog()
SStgui.update_uis(src)
/obj/machinery/gear_painter/ui_interact(mob/user)
if(!is_operational())
return
user.set_machine(src)
var/list/dat = list("<TITLE>Color Mate Control Panel</TITLE><BR>")
if(!inserted)
dat += "No item inserted."
/obj/machinery/gear_painter/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Colormate", src.name)
ui.set_autoupdate(FALSE) //This might be a bit intensive, better to not update it every few ticks
ui.open()
/obj/machinery/gear_painter/ui_data(mob/user)
. = list()
.["matrixactive"] = matrix_mode
.["matrixcolors"] = list(
"rr" = color_matrix_last[1],
"rg" = color_matrix_last[2],
"rb" = color_matrix_last[3],
"gr" = color_matrix_last[4],
"gg" = color_matrix_last[5],
"gb" = color_matrix_last[6],
"br" = color_matrix_last[7],
"bg" = color_matrix_last[8],
"bb" = color_matrix_last[9],
"cr" = color_matrix_last[10],
"cg" = color_matrix_last[11],
"cb" = color_matrix_last[12]
)
if(temp)
.["temp"] = temp
if(inserted)
.["item"] = list()
.["item"]["name"] = inserted.name
.["item"]["sprite"] = icon2base64(getFlatIcon(inserted,defdir=SOUTH,no_anim=TRUE))
.["item"]["preview"] = icon2base64(build_preview())
else
dat += "Item inserted: [inserted]<HR>"
dat += "<a href='?src=[REF(src)];toggle_matrix_mode=1'>Matrix mode: [matrix_mode? "On" : "Off"]</a>"
if(!matrix_mode)
dat += "<A href='?src=\ref[src];select=1'>Select new color.</A><BR>"
dat += "Color: <font color='[activecolor]'>&#9899;</font>"
dat += "<A href='?src=\ref[src];paint=1'>Apply new color.</A><BR><BR>"
.["item"] = null
/obj/machinery/gear_painter/ui_act(action, params)
. = ..()
if(.)
return
if(inserted)
switch(action)
if("switch_modes")
matrix_mode = text2num(params["mode"])
return TRUE
if("choose_color")
var/chosen_color = input(usr, "Choose a color: ", "Colormate color picking", activecolor) as color|null
if(chosen_color)
activecolor = chosen_color
return TRUE
if("paint")
if(!check_valid_color(activecolor, usr))
return TRUE
inserted.add_atom_colour(activecolor, FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
temp = "Painted Successfully!"
return TRUE
if("drop")
temp = "Ejected \the [inserted]!"
drop_item()
return TRUE
if("clear")
inserted.remove_atom_colour(FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
temp = "Cleared Successfully!"
return TRUE
if("set_matrix_color")
color_matrix_last[params["color"]] = params["value"]
return TRUE
if("matrix_paint")
var/list/cm = rgb_construct_color_matrix(
text2num(color_matrix_last[1]),
text2num(color_matrix_last[2]),
text2num(color_matrix_last[3]),
text2num(color_matrix_last[4]),
text2num(color_matrix_last[5]),
text2num(color_matrix_last[6]),
text2num(color_matrix_last[7]),
text2num(color_matrix_last[8]),
text2num(color_matrix_last[9]),
text2num(color_matrix_last[10]),
text2num(color_matrix_last[11]),
text2num(color_matrix_last[12])
)
if(!check_valid_color(cm, usr))
return TRUE
inserted.add_atom_colour(cm, FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
temp = "Matrix Painted Successfully!"
return TRUE
/// Produces the preview image of the item, used in the UI, the way the color is not stacking is a sin.
/obj/machinery/gear_painter/proc/build_preview()
if(inserted) //sanity
if(matrix_mode)
var/list/cm = rgb_construct_color_matrix(
text2num(color_matrix_last[1]),
text2num(color_matrix_last[2]),
text2num(color_matrix_last[3]),
text2num(color_matrix_last[4]),
text2num(color_matrix_last[5]),
text2num(color_matrix_last[6]),
text2num(color_matrix_last[7]),
text2num(color_matrix_last[8]),
text2num(color_matrix_last[9]),
text2num(color_matrix_last[10]),
text2num(color_matrix_last[11]),
text2num(color_matrix_last[12])
)
if(!check_valid_color(cm, usr))
temp = "Failed to generate preview: Invalid color!"
return getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE)
var/cur_color = inserted.color
inserted.color = null
inserted.color = cm
var/icon/preview = getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE)
inserted.color = cur_color
. = preview
else
// POGGERS
#define MATRIX_FIELD(field, default) "<b><label for='[##field]'>[##field]</label></b> <input type='number' step='0.001' name='[field]' value='[default]'>"
dat += "<br><form name='matrix paint' action='?src=[REF(src)]'>"
dat += "<input type='hidden' name='src' value='[REF(src)]'>"
dat += "<input type='hidden' name='matrix_paint' value='1'"
dat += "<br><br>"
dat += MATRIX_FIELD("rr", color_matrix_last[1])
dat += MATRIX_FIELD("gr", color_matrix_last[4])
dat += MATRIX_FIELD("br", color_matrix_last[7])
dat += "<br><br>"
dat += MATRIX_FIELD("rg", color_matrix_last[2])
dat += MATRIX_FIELD("gg", color_matrix_last[5])
dat += MATRIX_FIELD("bg", color_matrix_last[8])
dat += "<br><br>"
dat += MATRIX_FIELD("rb", color_matrix_last[3])
dat += MATRIX_FIELD("gb", color_matrix_last[6])
dat += MATRIX_FIELD("bb", color_matrix_last[9])
dat += "<br><br>"
dat += MATRIX_FIELD("cr", color_matrix_last[10])
dat += MATRIX_FIELD("cg", color_matrix_last[11])
dat += MATRIX_FIELD("cb", color_matrix_last[12])
dat += "<br><br>"
dat += "<input type='submit' value='Matrix Paint'>"
dat += "</form><br>"
#undef MATRIX_FIELD
dat += "<A href='?src=\ref[src];clear=1'>Remove paintjob.</A><BR><BR>"
dat += "<A href='?src=\ref[src];eject=1'>Eject item.</A><BR><BR>"
if(!check_valid_color(activecolor, usr))
temp = "Failed to generate preview: Invalid color!"
return getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE)
var/datum/browser/menu = new(user, "colormate","Color Mate Control Panel", 800, 600, src)
menu.set_content(dat.Join(""))
menu.open()
var/cur_color = inserted.color
inserted.color = null
inserted.color = activecolor
var/icon/preview = getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE)
inserted.color = cur_color
/obj/machinery/gear_painter/Topic(href, href_list)
if((. = ..()))
return
add_fingerprint(usr)
if(href_list["close"])
usr << browse(null, "window=colormate")
return
if(href_list["select"])
var/newcolor = input(usr, "Choose a color.", "", activecolor) as color|null
if(newcolor)
activecolor = newcolor
updateUsrDialog()
if(href_list["paint"])
if(!inserted)
return
if(!check_valid_color(activecolor, usr))
return
inserted.add_atom_colour(activecolor, FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
updateUsrDialog()
if(href_list["toggle_matrix_mode"])
matrix_mode = !matrix_mode
updateUsrDialog()
if(href_list["matrix_paint"])
if(!inserted)
return
// assemble matrix
var/list/cm = rgb_construct_color_matrix(
text2num(href_list["rr"]),
text2num(href_list["rg"]),
text2num(href_list["rb"]),
text2num(href_list["gr"]),
text2num(href_list["gg"]),
text2num(href_list["gb"]),
text2num(href_list["br"]),
text2num(href_list["bg"]),
text2num(href_list["bb"]),
text2num(href_list["cr"]),
text2num(href_list["cg"]),
text2num(href_list["cb"])
)
color_matrix_last = cm.Copy()
if(!check_valid_color(cm, usr))
return
inserted.add_atom_colour(cm, FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
updateUsrDialog()
if(href_list["clear"])
if(!inserted)
return
inserted.remove_atom_colour(FIXED_COLOUR_PRIORITY)
playsound(src, 'sound/effects/spray3.ogg', 50, 1)
updateUsrDialog()
if(href_list["eject"])
if(!inserted)
return
inserted.forceMove(drop_location())
inserted = null
update_icon()
updateUsrDialog()
. = preview
/obj/machinery/gear_painter/proc/check_valid_color(list/cm, mob/user)
if(!islist(cm)) // normal
var/list/HSV = ReadHSV(RGBtoHSV(cm))
if(HSV[3] < minimum_normal_lightness)
to_chat(user, "<span class='warning'>[cm] is far too dark (min lightness [minimum_normal_lightness]!</span>")
temp = "[cm] is far too dark (min lightness [minimum_normal_lightness]!"
return FALSE
return TRUE
else // matrix
@@ -245,6 +274,6 @@
COLORTEST("FFFFFF", cm)
#undef COLORTEST
if(passed < minimum_matrix_tests)
to_chat(user, "<span class='warning'>[english_list(color)] is not allowed (pased [passed] out of 4, minimum [minimum_matrix_tests], minimum lightness [minimum_matrix_lightness]).</span>")
temp = "[english_list(color)] is not allowed (passed [passed] out of 4, minimum [minimum_matrix_tests], minimum lightness [minimum_matrix_lightness])."
return FALSE
return TRUE
+3 -4
View File
@@ -17,12 +17,8 @@
/obj/machinery/computer/Initialize(mapload, obj/item/circuitboard/C)
. = ..()
power_change()
/obj/machinery/computer/Destroy()
. = ..()
/obj/machinery/computer/process()
if(stat & (NOPOWER|BROKEN))
return FALSE
@@ -119,6 +115,9 @@
A.circuit = circuit
// Circuit removal code is handled in /obj/machinery/Exited()
circuit.forceMove(A)
// no it's not 4head the circuit's in nullspace which means this won't be called!!
circuit = null
component_parts -= circuit
A.set_anchored(TRUE)
if(stat & BROKEN)
if(user)
@@ -151,6 +151,7 @@
new_computer.RefreshParts()
new_computer.on_construction()
new_computer.circuit.moveToNullspace()
qdel(src)
return
+3
View File
@@ -200,6 +200,9 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
return b["totaldam"] - a["totaldam"]
/datum/crewmonitor/ui_act(action,params)
. = ..()
if(.)
return
var/mob/living/silicon/ai/AI = usr
if(!istype(AI))
return
@@ -86,6 +86,9 @@
.["machine"]["chang_freq_value"] = change_freq_value
/obj/machinery/telecomms/ui_act(action, params, datum/tgui/ui)
. = ..()
if(.)
return
if(!canInteract(usr))
if(ui)
ui.close() //haha no.
+35 -2
View File
@@ -169,14 +169,21 @@
/obj/item/clothing/mask/gas/mime/sexy,
/obj/item/clothing/under/rank/civilian/mime/sexy)
/obj/effect/spawner/bundle/crate
var/pickone = FALSE
/obj/effect/spawner/bundle/crate/Initialize(mapload)
SHOULD_CALL_PARENT(FALSE)
if(items && items.len)
var/turf/T = get_turf(src)
var/obj/structure/closet/LC = locate(/obj/structure/closet) in T
if(LC)
for(var/path in items)
new path(LC)
if(pickone)
var/tospawn = pick(items)
new tospawn(LC)
else
for(var/path in items)
new path(LC)
return INITIALIZE_HINT_QDEL
/obj/effect/spawner/bundle/crate/mosin
@@ -192,3 +199,29 @@
/obj/item/gun/ballistic/automatic/surplus,
/obj/item/ammo_box/magazine/m10mm/rifle
)
/obj/effect/spawner/bundle/crate/levergun
name = "lever-action rifle spawner"
items = list(
/obj/item/gun/ballistic/shotgun/leveraction,
/obj/item/ammo_box/c38/pouch
)
/obj/effect/spawner/bundle/crate/cowboyhat
name = "cowboy hat spawner"
pickone = TRUE
items = list(
/obj/item/clothing/head/cowboyhat,
/obj/item/clothing/head/cowboyhat/black,
/obj/item/clothing/head/cowboyhat/white,
/obj/item/clothing/head/cowboyhat/pink,
/obj/item/clothing/head/cowboyhat/sec
)
/obj/effect/spawner/bundle/crate/cowboyboots
name = "cowboy boots spawner"
pickone = TRUE
items = list(
/obj/item/clothing/shoes/cowboyboots,
/obj/item/clothing/shoes/cowboyboots/black
)
+7 -7
View File
@@ -131,7 +131,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
//Tooltip vars
var/force_string //string form of an item's force. Edit this var only to set a custom force string
var/last_force_string_check = 0
var/tip_timer
var/trigger_guard = TRIGGER_GUARD_NONE
@@ -451,7 +450,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
A.Remove(user)
if(item_flags & DROPDEL)
qdel(src)
item_flags &= ~IN_INVENTORY
DISABLE_BITFIELD(item_flags, IN_INVENTORY)
DISABLE_BITFIELD(item_flags, IN_STORAGE)
SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user)
remove_outline()
// if(!silent)
@@ -529,6 +529,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot.
A.Grant(user)
item_flags |= IN_INVENTORY
if(CHECK_BITFIELD(item_flags, IN_STORAGE)) // Left storage item but somehow has the bitfield active still.
DISABLE_BITFIELD(item_flags, IN_STORAGE)
// if(!initial)
// if(equip_sound && (slot_flags & slot))
// playsound(src, equip_sound, EQUIP_SOUND_VOLUME, TRUE, ignore_walls = FALSE)
@@ -885,10 +887,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/MouseEntered(location, control, params)
SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_ENTER, location, control, params)
if((item_flags & IN_INVENTORY || item_flags & IN_STORAGE) && usr.client.prefs.enable_tips && !QDELETED(src))
var/timedelay = usr.client.prefs.tip_delay/100
var/user = usr
tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), timedelay, TIMER_STOPPABLE)//timer takes delay in deciseconds, but the pref is in milliseconds. dividing by 100 converts it.
if((item_flags & IN_INVENTORY || item_flags & IN_STORAGE) && usr?.client.prefs.enable_tips && !QDELETED(src))
var/timedelay = max(usr.client.prefs.tip_delay * 0.01, 0.01) // I heard multiplying is faster, also runtimes from very low/negative numbers
usr.client.tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, usr), timedelay, TIMER_STOPPABLE)//timer takes delay in deciseconds, but the pref is in milliseconds. dividing by 100 converts it.
var/mob/living/L = usr
if(istype(L) && (L.incapacitated() || (current_equipped_slot in L.check_obscured_slots()) || !L.canUnEquip(src)))
apply_outline(_size = 3)
@@ -901,7 +902,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/MouseExited(location,control,params)
SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_EXIT, location, control, params)
deltimer(tip_timer)//delete any in-progress timer if the mouse is moved off the item before it finishes
closeToolTip(usr)
remove_outline()
@@ -269,6 +269,10 @@ GLOBAL_LIST_INIT(channel_tokens, list(
. = ..()
AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES)
/obj/item/radio/headset/silicon/pai/emp_act(severity)
. = ..()
return EMP_PROTECT_SELF
/obj/item/radio/headset/silicon/ai
name = "\proper Integrated Subspace Transceiver "
keyslot2 = new /obj/item/encryptionkey/ai
+2 -2
View File
@@ -535,13 +535,13 @@
oneuse = FALSE
remarks = list("Looks like these would sell much better in a plasma fire...", "Using glass bowls rather then cones?", "Mixing soda and ice-cream?", "Tall glasses with of liquids and solids...", "Just add a bit of icecream and cherry on top?")
/obj/item/book/granter/crafting_recipe/bone_bow //Bow crafting for non-ashwalkers
/*/obj/item/book/granter/crafting_recipe/bone_bow //Bow crafting for non-ashwalkers
name = "bowyery sandstone slab" // this is an actual word
desc = "A sandstone slab with inscriptions describing the Ash Walkers of Lavaland's bowyery."
crafting_recipe_types = list(/datum/crafting_recipe/bone_arrow, /datum/crafting_recipe/bone_bow, /datum/crafting_recipe/ashen_arrow, /datum/crafting_recipe/quiver, /datum/crafting_recipe/bow_tablet)
icon_state = "stone_tablet"
oneuse = FALSE
remarks = list("Sticking burning arrows into the sand makes them stronger...", "Breaking the bone apart to get shards, not sharpening the bone...", "Sinew is just like rope...")
remarks = list("Sticking burning arrows into the sand makes them stronger...", "Breaking the bone apart to get shards, not sharpening the bone...", "Sinew is just like rope...")*/
/obj/item/book/granter/crafting_recipe/under_the_oven //Illegal cook book
name = "Under The Oven"
+23 -2
View File
@@ -769,12 +769,33 @@
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/nullrod/tribal_knife/pickup(mob/user)
. = ..()
reroll()
/obj/item/nullrod/tribal_knife/process()
slowdown = rand(-2, 2)
reroll()
/obj/item/nullrod/tribal_knife/proc/reroll()
if(iscarbon(loc))
var/mob/living/carbon/wielder = loc
if(wielder.is_holding(src))
wielder.update_equipment_speed_mods()
var/current_tiles = 10 / max(wielder.cached_multiplicative_slowdown, world.tick_lag)
var/datum/movespeed_modifier/M = wielder.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/item/arrhythmic_knife, update = FALSE, multiplicative_slowdown = pick(-10, -10, 0, (current_tiles - 2) / 10, (current_tiles - 4) / 10))
M.max_tiles_per_second_boost = pick(3, 6)
wielder.update_movespeed() // update movespeed manually
/obj/item/nullrod/tribal_knife/dropped(mob/user)
user.remove_movespeed_modifier(/datum/movespeed_modifier/item/arrhythmic_knife)
return ..()
/datum/movespeed_modifier/item/arrhythmic_knife
variable = TRUE
flags = IGNORE_NOSLOW
movetypes = ~FLOATING
priority = 750
absolute_max_tiles_per_second = 20
max_tiles_per_second_boost = 6
/obj/item/nullrod/pitchfork
icon_state = "pitchfork0"
@@ -457,6 +457,10 @@ as performing this in action() will cause the upgrade to end up in the borg inst
desc = "An upgrade to a cyborg's hypospray, allowing it to \
pierce armor and thick material."
icon_state = "cyborg_upgrade3"
module_type = list(/obj/item/robot_module/medical,
/obj/item/robot_module/syndicate_medical)
var/list/additional_reagents = list()
module_flags = BORG_MODULE_MEDICAL
/obj/item/borg/upgrade/piercing_hypospray/action(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -514,6 +518,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst
module_type = list(
/obj/item/robot_module/medical,
/obj/item/robot_module/syndicate_medical)
module_flags = BORG_MODULE_MEDICAL
/obj/item/borg/upgrade/advhealth/action(mob/living/silicon/robot/R, user = usr)
. = ..()
+1 -1
View File
@@ -78,7 +78,7 @@
animate(effect, alpha = 0, pixel_x = px * 1.5, pixel_y = py * 1.5, time = 3, flags = ANIMATION_PARALLEL | ANIMATION_RELATIVE)
/obj/item/shield/proc/bash_target(mob/living/user, mob/living/target, bashdir, harmful)
if(!(target.status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)) // should probably add stun absorption check at some point I guess..
if(!(HAS_TRAIT(target, CANKNOCKDOWN)) || HAS_TRAIT(target, TRAIT_STUNIMMUNE)) // should probably add stun absorption check at some point I guess..
// unified stun absorption system when lol
target.visible_message("<span class='warning'>[user] slams [target] with [src], but [target] doesn't falter!</span>", "<span class='userdanger'>[user] slams you with [src], but it barely fazes you!</span>")
return FALSE
+1 -1
View File
@@ -312,7 +312,7 @@
/obj/item/storage/belt/mining/primitive/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 5
STR.max_items = 8
/obj/item/storage/belt/soulstone
name = "soul stone belt"
+8 -16
View File
@@ -16,8 +16,9 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
attack_speed = CLICK_CD_MELEE
var/stamina_loss_amount = 40
var/stamina_loss_amount = 35
var/turned_on = FALSE
var/armor_pen = 100
var/knockdown = TRUE
/// block percent needed to prevent knockdown/disarm
var/block_percent_to_counter = 50
@@ -25,8 +26,8 @@
var/hitcost = 750
var/throw_hit_chance = 35
var/preload_cell_type //if not empty the baton starts with this type of cell
var/cooldown_duration = 3.5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown
var/status_duration = 5 SECONDS //how long our status effects last for otherwise
var/cooldown_duration = 2.5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown
var/status_duration = 3 SECONDS //how long our status effects last for otherwise
COOLDOWN_DECLARE(shove_cooldown)
/obj/item/melee/baton/examine(mob/user)
@@ -80,16 +81,6 @@
//we're below minimum, turn off
switch_status(FALSE)
///Check for our cell to determine how much penetration our weapon does.
/obj/item/melee/baton/proc/get_cell_zap_pen()
var/obj/item/stock_parts/cell/copper_top = get_cell()
if(copper_top)
var/chargepower = copper_top.maxcharge
var/zap_penetration = (chargepower/1000) //This is our effective penetration. Every 1000 max charge, we get 1 pen power. A high capacity cell is equal to 10 armor pen, as an example.
return zap_penetration
else
return 0
/obj/item/melee/baton/proc/switch_status(new_status = FALSE, silent = FALSE)
if(turned_on != new_status)
turned_on = new_status
@@ -198,7 +189,7 @@
return FALSE
var/final_stamina_loss_amount = stamina_loss_amount //Our stunning power for the baton
var/shoved = FALSE //Did we succeed on knocking our target over?
var/zap_penetration = get_cell_zap_pen() //Find out what kind of cell we have, and calculating the resultant armor pen we get from it
var/zap_penetration = armor_pen
var/zap_block = L.run_armor_check(BODY_ZONE_CHEST, "melee", null, null, zap_penetration) //armor check, including calculation for armor penetration, for our attack
final_stamina_loss_amount = block_calculate_resultant_damage(final_stamina_loss_amount, return_list)
@@ -223,7 +214,7 @@
if(shoving && COOLDOWN_FINISHED(src, shove_cooldown) && !HAS_TRAIT(L, TRAIT_IWASBATONED)) //Rightclicking applies a knockdown, but only once every couple of seconds, based on the cooldown_duration var. If they were recently knocked down, they can't be knocked down again by a baton.
L.DefaultCombatKnockdown(50, override_stamdmg = 0)
L.apply_status_effect(STATUS_EFFECT_TASED_WEAK, status_duration) //Even if they shove themselves up, they're still slowed.
L.apply_status_effect(STATUS_EFFECT_TASED_WEAK_NODMG, status_duration) //Even if they shove themselves up, they're still slowed.
L.apply_status_effect(STATUS_EFFECT_OFF_BALANCE, status_duration) //They're very likely to drop items if shoved briefly after a knockdown.
shoved = TRUE
COOLDOWN_START(src, shove_cooldown, cooldown_duration)
@@ -333,7 +324,8 @@
w_class = WEIGHT_CLASS_BULKY
force = 3
throwforce = 5
stamina_loss_amount = 25
stamina_loss_amount = 30
armor_pen = 35
hitcost = 1000
throw_hit_chance = 10
slot_flags = ITEM_SLOT_BACK
+7
View File
@@ -41,6 +41,13 @@
/obj/item/crowbar/brass/family
toolspeed = 1
/obj/item/crowbar/ashwalker
name = "bone crowbar"
desc = "A rudimentary crowbar made of bones."
icon = 'icons/obj/mining.dmi'
icon_state = "crowbar_bone"
toolspeed = 0.75
/obj/item/crowbar/bronze
name = "bronze plated crowbar"
desc = "A bronze plated crowbar."
@@ -93,6 +93,14 @@
/obj/item/screwdriver/brass/family
toolspeed = 1
/obj/item/screwdriver/ashwalker
name = "bone screwdriver"
desc = "A rudimentary screwdriver made of carved bones."
icon = 'icons/obj/mining.dmi'
icon_state = "screwdriver_bone"
toolspeed = 0.75
random_color = FALSE
/obj/item/screwdriver/bronze
name = "bronze screwdriver"
desc = "A screwdriver plated with bronze."
@@ -385,6 +385,16 @@
icon_state = "clockwelder"
item_state = "brasswelder"
/obj/item/weldingtool/experimental/ashwalker
name = "necropolis welding torch"
desc = "A mysterious welding tool with its origins in the depths of the necropolis. A mysterious force keeps replenishing its fuel."
resistance_flags = FIRE_PROOF | ACID_PROOF
refueling_interval = 5
toolspeed = 0.75
max_fuel = 20
icon = 'icons/obj/mining.dmi'
icon_state = "ashwelder"
/obj/item/weldingtool/abductor
name = "alien welding tool"
desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
@@ -90,6 +90,14 @@
/obj/item/wirecutters/brass/family
toolspeed = 1
/obj/item/wirecutters/ashwalker
name = "bone wirecutters"
desc = "Rudimentary wirecutters made out of sharpened bones and sinew."
icon = 'icons/obj/mining.dmi'
icon_state = "cutters_bone"
toolspeed = 0.75
random_color = FALSE
/obj/item/wirecutters/bronze
name = "bronze plated wirecutters"
desc = "A pair of wirecutters plated with bronze."
+7
View File
@@ -44,6 +44,13 @@
/obj/item/wrench/brass/family
toolspeed = 1
/obj/item/wrench/ashwalker
name = "bone wrench"
desc = "A shoddy wrench made out of bent bones and sinew."
icon = 'icons/obj/mining.dmi'
icon_state = "wrench_bone"
toolspeed = 0.75
/obj/item/wrench/bronze
name = "bronze plated wrench"
desc = "A bronze plated wrench."
@@ -540,18 +540,19 @@
if (!(. & EMP_PROTECT_CONTENTS))
for(var/obj/O in src)
O.emp_act(severity)
if(secure && !broken && !(. & EMP_PROTECT_SELF))
if(prob(50 / severity))
locked = !locked
update_icon()
if(prob(20 / severity) && !opened)
if(!locked)
open()
else
req_access = list()
req_access += pick(get_all_accesses())
if(!QDELETED(lockerelectronics))
lockerelectronics.accesses = req_access
if(!secure || broken)
return
if(prob(severity/2))
locked = !locked
update_icon()
if(prob(severity/5) && !opened)
if(!locked)
open()
else
req_access = list()
req_access += pick(get_all_accesses())
if(!QDELETED(lockerelectronics))
lockerelectronics.accesses = req_access
/obj/structure/closet/contents_explosion(severity, target)
for(var/atom/A in contents)
@@ -66,12 +66,6 @@
//Ash walkers on birth understand how to make bone bows, bone arrows and ashen arrows
new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/bone_arrow)
new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/bone_bow)
new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/ashen_arrow)
new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/quiver)
new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/bow_tablet)
if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn
H.underwear = "Nude"
@@ -634,9 +628,9 @@
log_game("[key_name(user)] has successfully pried open [src] and disabled a space pirate spawner.")
W.play_tool_sound(src)
playsound(src.loc, 'modular_citadel/sound/voice/scream_skeleton.ogg', 50, 1, 4, 1.2)
if(rank == "Captain")
if(rank == "Captain")
new /obj/effect/mob_spawn/human/pirate/corpse/captain(get_turf(src))
else
else
new /obj/effect/mob_spawn/human/pirate/corpse(get_turf(src))
qdel(src)
else

Some files were not shown because too many files have changed in this diff Show More