ports all the tg junk for icemoon, not yet changed to make it all compile

This commit is contained in:
Detective Google
2020-04-24 00:02:03 -05:00
parent f714403d6e
commit 71be8ed2fc
85 changed files with 267915 additions and 105 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,160 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"b" = (
/turf/closed/mineral/random/snow/no_caves,
/area/icemoon/surface/outdoors)
"c" = (
/turf/open/water/cursed_spring,
/area/icemoon/surface/outdoors)
"d" = (
/obj/item/paper/crumpled{
info = "When one falls into this hot spring, they shall forever be turned into..."
},
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
(1,1,1) = {"
b
b
b
b
b
b
b
b
b
b
b
"}
(2,1,1) = {"
b
b
b
a
a
a
a
a
b
b
b
"}
(3,1,1) = {"
b
b
a
a
a
a
a
a
a
b
b
"}
(4,1,1) = {"
b
a
a
a
c
c
c
a
a
a
b
"}
(5,1,1) = {"
b
a
a
c
c
c
c
c
a
a
b
"}
(6,1,1) = {"
b
a
a
c
c
c
c
c
a
a
b
"}
(7,1,1) = {"
b
a
a
c
c
c
c
c
a
a
b
"}
(8,1,1) = {"
b
a
a
a
c
c
c
a
a
a
b
"}
(9,1,1) = {"
b
b
a
a
a
d
a
a
a
b
b
"}
(10,1,1) = {"
b
b
b
a
a
a
a
a
b
b
b
"}
(11,1,1) = {"
b
b
b
b
b
b
b
b
b
b
b
"}
@@ -0,0 +1,172 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/mineral/random/snow/no_caves,
/area/icemoon/surface/outdoors)
"b" = (
/obj/structure/sign/poster/contraband/lusty_xenomorph,
/turf/closed/indestructible/syndicate,
/area/icemoon/surface/outdoors)
"c" = (
/turf/open/floor/mineral/diamond,
/area/icemoon/surface/outdoors)
"d" = (
/obj/item/reagent_containers/food/drinks/trophy/gold_cup,
/turf/open/floor/mineral/diamond,
/area/icemoon/surface/outdoors)
"e" = (
/obj/item/greentext{
light_color = "#64C864";
light_range = 1
},
/turf/open/floor/mineral/diamond,
/area/icemoon/surface/outdoors)
"f" = (
/obj/structure/falsewall/plastitanium,
/obj/structure/sign/poster/contraband/lusty_xenomorph,
This conversation was marked as resolved by Whoneedspacee
/turf/open/floor/mineral/diamond,
/area/icemoon/surface/outdoors)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
"}
(3,1,1) = {"
a
a
a
a
b
b
b
a
a
a
a
"}
(4,1,1) = {"
a
a
a
b
c
c
c
b
a
a
a
"}
(5,1,1) = {"
a
a
b
c
c
d
c
c
b
a
a
"}
(6,1,1) = {"
a
a
b
c
d
e
d
c
f
a
a
"}
(7,1,1) = {"
a
a
b
c
c
d
c
c
b
a
a
"}
(8,1,1) = {"
a
a
a
b
c
c
c
b
a
a
a
"}
(9,1,1) = {"
a
a
a
a
b
b
b
a
a
a
a
"}
(10,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
"}
(11,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
"}
@@ -0,0 +1,886 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/mineral/random/snow/no_caves,
/area/icemoon/surface/outdoors)
"b" = (
/turf/closed/wall/mineral/wood/nonmetal,
/area/ruin/unpowered)
"c" = (
/obj/structure/closet/toolcloset,
/obj/item/wrench,
/obj/item/screwdriver,
/obj/item/crowbar,
/obj/item/weldingtool/largetank,
/obj/item/wirecutters,
/obj/item/radio/off,
/turf/open/floor/wood,
/area/ruin/unpowered)
"d" = (
/turf/open/openspace/icemoon,
/area/icemoon/surface/outdoors)
"e" = (
/obj/item/clothing/suit/hooded/explorer,
/obj/item/clothing/mask/gas/explorer,
/obj/item/clothing/gloves/color/black,
/obj/item/storage/backpack/explorer,
/obj/item/flashlight/lantern,
/obj/item/storage/bag/ore,
/obj/structure/closet,
/obj/item/clothing/shoes/winterboots/ice_boots,
/turf/open/floor/wood,
/area/ruin/unpowered)
"f" = (
/turf/open/floor/wood,
/area/ruin/unpowered)
"g" = (
/obj/structure/fireplace,
/turf/open/floor/wood,
/area/ruin/unpowered)
"h" = (
/obj/structure/flora/rock/icy,
/turf/closed/mineral/random/snow/no_caves,
/area/icemoon/surface/outdoors)
"i" = (
/turf/template_noop,
/area/template_noop)
"j" = (
/obj/structure/sink/kitchen,
/turf/open/floor/wood,
/area/ruin/unpowered)
"k" = (
/obj/structure/closet/crate/freezer,
/turf/open/floor/wood,
/area/ruin/unpowered)
"l" = (
/obj/machinery/vending/dinnerware,
/turf/open/floor/wood,
/area/ruin/unpowered)
"m" = (
/obj/structure/barricade/wooden/crude/snow,
/turf/open/floor/wood,
/area/ruin/unpowered)
"n" = (
/obj/structure/mineral_door/wood,
/turf/open/floor/wood,
/area/ruin/unpowered)
"o" = (
/obj/item/reagent_containers/food/drinks/beer,
/turf/open/floor/wood,
/area/ruin/unpowered)
"p" = (
/obj/machinery/light/broken{
dir = 4
},
/turf/open/floor/wood,
/area/ruin/unpowered)
"q" = (
/obj/structure/table/wood,
/obj/item/pen,
/obj/machinery/light/broken{
dir = 8
},
/obj/item/paper/crumpled/bloody{
info = "help...";
text = ""
},
/turf/open/floor/wood,
/area/ruin/unpowered)
"r" = (
/obj/item/chair/wood,
/obj/effect/decal/cleanable/blood/splatter,
/obj/effect/mob_spawn/human/miner/explorer,
/obj/effect/decal/cleanable/blood/drip,
/turf/open/floor/wood,
/area/ruin/unpowered)
"s" = (
/obj/effect/decal/cleanable/trail_holder,
/turf/open/floor/wood,
/area/ruin/unpowered)
"u" = (
/obj/structure/ladder,
/turf/open/floor/wood,
/area/ruin/unpowered)
(1,1,1) = {"
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
"}
(2,1,1) = {"
i
i
i
i
i
i
i
i
d
d
d
d
d
d
d
d
i
i
i
i
i
i
i
i
i
"}
(3,1,1) = {"
i
i
i
i
i
d
d
d
d
d
d
d
d
d
d
d
d
d
d
i
i
i
i
i
i
"}
(4,1,1) = {"
i
i
i
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
i
i
i
i
i
"}
(5,1,1) = {"
i
i
i
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
i
i
i
i
"}
(6,1,1) = {"
i
i
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
i
i
i
"}
(7,1,1) = {"
i
i
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
i
i
i
"}
(8,1,1) = {"
i
i
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
i
i
i
"}
(9,1,1) = {"
i
d
d
d
d
d
d
d
d
b
b
b
b
b
b
b
d
d
d
d
d
d
d
i
i
"}
(10,1,1) = {"
i
d
d
d
d
d
d
d
b
b
b
b
b
b
b
b
b
d
d
d
d
d
d
i
i
"}
(11,1,1) = {"
i
d
d
d
d
d
d
d
b
b
c
f
f
o
q
b
b
d
d
d
d
d
d
d
i
"}
(12,1,1) = {"
i
d
d
d
d
d
d
d
b
b
e
f
f
f
r
b
b
d
d
d
d
d
d
d
i
"}
(13,1,1) = {"
i
d
d
d
d
d
d
d
b
b
f
f
f
f
s
b
b
d
d
d
d
d
d
d
i
"}
(14,1,1) = {"
i
d
d
d
d
d
d
d
b
b
g
f
f
f
s
b
b
d
d
d
d
d
d
d
i
"}
(15,1,1) = {"
i
d
d
d
d
d
d
d
b
b
f
f
f
f
s
b
b
d
d
d
d
d
d
d
i
"}
(16,1,1) = {"
i
d
d
d
d
d
d
d
b
b
j
f
f
f
s
b
b
d
d
d
d
d
d
d
i
"}
(17,1,1) = {"
i
d
d
d
d
d
d
d
b
b
k
f
f
f
s
b
b
d
d
d
d
d
d
d
i
"}
(18,1,1) = {"
i
d
d
d
d
d
d
d
b
b
l
f
f
f
u
b
b
d
d
d
d
d
d
d
i
"}
(19,1,1) = {"
i
d
d
d
d
d
d
d
b
b
b
f
f
p
b
b
b
d
d
d
d
d
d
d
i
"}
(20,1,1) = {"
i
i
d
d
d
d
d
d
d
b
b
b
f
b
b
b
d
d
d
d
d
d
d
d
i
"}
(21,1,1) = {"
i
i
d
d
d
d
d
d
d
d
d
b
f
b
d
d
d
d
d
d
d
d
d
d
i
"}
(22,1,1) = {"
i
i
d
d
d
d
d
d
d
d
d
b
f
b
d
d
d
d
d
d
d
d
d
d
i
"}
(23,1,1) = {"
i
i
d
d
d
d
d
d
d
d
d
b
f
b
d
d
d
d
d
d
d
d
d
i
i
"}
(24,1,1) = {"
i
i
d
d
d
d
d
d
d
d
d
b
m
b
d
d
d
d
d
d
d
d
d
i
i
"}
(25,1,1) = {"
i
i
i
d
d
d
d
d
d
d
a
h
n
h
a
d
d
d
d
d
d
d
i
i
i
"}
(26,1,1) = {"
i
i
i
d
d
d
d
d
d
a
a
a
h
a
a
a
d
d
d
d
d
d
i
i
i
"}
(27,1,1) = {"
i
i
i
i
d
d
d
d
a
a
a
a
a
a
a
a
a
d
d
d
d
i
i
i
i
"}
(28,1,1) = {"
i
i
i
i
i
d
d
a
a
a
a
a
a
a
a
a
a
a
d
d
i
i
i
i
i
"}
(29,1,1) = {"
i
i
i
i
i
i
i
a
a
a
a
a
a
a
a
a
a
a
i
i
i
i
i
i
i
"}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,185 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/turf/closed/wall{
icon = 'icons/turf/shuttleold.dmi';
icon_state = "block"
},
/area/ruin/powered/bathhouse)
"c" = (
/obj/machinery/shower{
pixel_y = 16
},
/obj/structure/curtain,
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
"d" = (
/turf/closed/mineral/random/snow/no_caves,
/area/icemoon/underground/explored)
"e" = (
/obj/structure/mirror{
pixel_y = 28
},
/obj/structure/sink{
pixel_y = 20
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
"f" = (
/obj/structure/table/greyscale,
/obj/item/bikehorn/rubberducky,
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
"g" = (
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
"h" = (
/obj/item/soap,
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
"i" = (
/obj/machinery/door/airlock/freezer{
name = "bath house airlock"
},
/turf/open/floor/plasteel/white,
/area/ruin/powered/bathhouse)
"j" = (
/turf/closed/wall/mineral/wood,
/area/ruin/powered/bathhouse)
"k" = (
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
"l" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/spaghetti/pastatomato{
desc = "Just how mom used to make it.";
name = "soul food";
tastes = list("nostalgia" = 1)
},
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
"m" = (
/obj/structure/bookcase/random,
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
"n" = (
/turf/open/floor/plating/asteroid/snow/ice/icemoon,
/area/icemoon/underground/explored)
"o" = (
/obj/structure/bed,
/obj/item/bedsheet,
/turf/open/floor/wood,
/area/ruin/powered/bathhouse)
(1,1,1) = {"
b
b
b
b
b
d
a
a
"}
(2,1,1) = {"
b
c
g
g
b
j
j
j
"}
(3,1,1) = {"
b
b
g
g
i
k
k
j
"}
(4,1,1) = {"
b
c
g
g
b
l
k
j
"}
(5,1,1) = {"
b
b
g
g
b
m
o
j
"}
(6,1,1) = {"
b
c
g
g
b
j
j
j
"}
(7,1,1) = {"
b
b
g
h
b
n
n
d
"}
(8,1,1) = {"
b
e
g
g
b
n
n
d
"}
(9,1,1) = {"
b
e
g
g
i
n
n
d
"}
(10,1,1) = {"
b
f
g
g
b
n
d
a
"}
(11,1,1) = {"
b
b
b
b
b
d
a
a
"}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,847 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
/turf/template_noop,
/area/template_noop)
"ab" = (
/obj/structure/table/wood/fancy/black,
/obj/item/documents/syndicate/mining,
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
"ac" = (
/turf/closed/wall/mineral/wood,
/area/ruin/unpowered/buried_library)
"ad" = (
/turf/closed/mineral/random/snow/no_caves,
/area/icemoon/underground/explored)
"ae" = (
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"af" = (
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"ag" = (
/obj/item/feather,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"ah" = (
/obj/structure/bookcase/random,
/turf/open/floor/wood,
/area/ruin/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)
"aj" = (
/obj/structure/bookcase/random,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
"ak" = (
/turf/closed/mineral/random/snow/no_caves,
/area/ruin/unpowered/buried_library)
"al" = (
/turf/closed/wall/mineral/iron,
/area/ruin/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)
"an" = (
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"ao" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"ap" = (
/obj/item/stack/sheet/mineral/wood,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"aq" = (
/obj/structure/fluff/paper{
icon_state = "paper";
dir = 1
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"ar" = (
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
"as" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/paper/fluff/ruins/oldstation/protosing,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"at" = (
/obj/structure/fluff/paper,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"au" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"av" = (
/obj/structure/bookcase/random,
/turf/closed/mineral/random/snow/no_caves,
/area/ruin/unpowered/buried_library)
"aw" = (
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
"ax" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"ay" = (
/obj/machinery/door/keycard/library,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
"az" = (
/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"aA" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
"aB" = (
/obj/structure/girder,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/buried_library)
"aC" = (
/obj/item/feather,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"aD" = (
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
"aE" = (
/obj/item/stack/sheet/mineral/wood,
/obj/item/book/manual/random,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"aF" = (
/obj/item/book/manual/random,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"aG" = (
/obj/structure/table/bronze,
/obj/item/stack/ore/slag,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
"aH" = (
/obj/structure/table/bronze,
/obj/item/statuebust/hippocratic,
/turf/open/floor/carpet/black,
/area/ruin/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)
"aJ" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
"aK" = (
/obj/item/feather,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
"aL" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/fluff/paper/stack,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"aM" = (
/obj/item/stack/sheet/mineral/wood,
/obj/item/book/manual/random,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"aN" = (
/obj/structure/statue/sandstone/venus,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
"aO" = (
/mob/living/simple_animal/pet/fox,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"aP" = (
/obj/item/keycard/library,
/turf/closed/mineral/random/snow/no_caves,
/area/ruin/unpowered/buried_library)
"aQ" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"aR" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"aS" = (
/obj/structure/table/wood/fancy/black,
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/paper/secretrecipe,
/obj/item/flashlight/lantern/jade{
on = 1
},
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
"aT" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/fluff/paper,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"aU" = (
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"aV" = (
/obj/item/stack/sheet/mineral/wood,
/obj/structure/fluff/paper/stack,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"aW" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
"aX" = (
/obj/structure/table/bronze,
/obj/item/statuebust,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
"aY" = (
/obj/structure/table_frame/wood,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
"aZ" = (
/obj/structure/fluff/paper/stack,
/obj/structure/fluff/paper,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"ba" = (
/obj/structure/barricade/wooden/snowed,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"bb" = (
/obj/item/book/manual/random,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"bc" = (
/obj/item/feather,
/obj/structure/fluff/paper,
/obj/structure/fluff/paper{
icon_state = "paper";
dir = 1
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"bd" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/fluff/paper{
icon_state = "paper";
dir = 1
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"be" = (
/obj/structure/fluff/paper{
icon_state = "paper";
dir = 5
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"bf" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/fluff/paper{
icon_state = "paper";
dir = 4
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"bg" = (
/obj/item/paper/fluff/ruins/oldstation/protogun,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"bh" = (
/obj/effect/decal/cleanable/dirt/dust,
/mob/living/simple_animal/pet/fox,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"bi" = (
/obj/structure/fluff/paper,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"bj" = (
/obj/item/book/manual/random,
/turf/closed/mineral/random/snow/no_caves,
/area/ruin/unpowered/buried_library)
"bk" = (
/obj/structure/fluff/paper{
icon_state = "paper";
dir = 10
},
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"bl" = (
/obj/item/storage/box/fountainpens,
/turf/closed/mineral/random/snow/no_caves,
/area/ruin/unpowered/buried_library)
"bm" = (
/obj/structure/fluff/paper/stack,
/turf/closed/mineral/random/snow/no_caves,
/area/ruin/unpowered/buried_library)
"bn" = (
/obj/item/book/manual/random,
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"bo" = (
/obj/item/stack/sheet/mineral/wood,
/turf/closed/mineral/random/snow/no_caves,
/area/ruin/unpowered/buried_library)
"bp" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/fluff/paper,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"bq" = (
/obj/structure/mineral_door/wood,
/obj/structure/barricade/wooden/crude/snow,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
"br" = (
/obj/structure/girder,
/turf/closed/mineral/random/snow/no_caves,
/area/ruin/unpowered/buried_library)
"bs" = (
/obj/structure/girder,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/ruin/unpowered/buried_library)
"bt" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/template_noop,
/area/template_noop)
"bu" = (
/obj/item/stack/sheet/mineral/wood,
/turf/closed/mineral/random/snow/no_caves,
/area/icemoon/underground/explored)
"bv" = (
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
"bw" = (
/turf/open/floor/wood,
/area/icemoon/underground/explored)
"bx" = (
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
"by" = (
/obj/structure/statue/bronze/marx,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
"bz" = (
/obj/item/flashlight/lantern/jade{
on = 1
},
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
"bA" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
"bB" = (
/obj/structure/fluff/paper/stack,
/turf/open/floor/carpet/black,
/area/ruin/unpowered/buried_library)
"bC" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/fluff/paper{
icon_state = "paper";
dir = 1
},
/mob/living/simple_animal/pet/fox,
/turf/open/floor/wood,
/area/ruin/unpowered/buried_library)
(1,1,1) = {"
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
ad
ad
ad
ad
ad
ad
ad
bt
aa
"}
(2,1,1) = {"
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
ak
ak
ak
ak
ak
ac
ba
ac
ac
ac
ad
ad
aa
"}
(3,1,1) = {"
aa
aa
aa
aa
aa
aa
aa
ak
ak
ak
ak
aU
ak
ak
an
au
ae
af
bk
ac
ad
ad
aa
"}
(4,1,1) = {"
aa
aa
aa
aa
aa
aa
ak
ak
aR
an
an
ae
bb
av
ak
ah
aL
ah
aT
ac
ad
aa
aa
"}
(5,1,1) = {"
aa
aa
aa
aa
aa
ak
ak
an
aC
ae
aQ
ah
ak
av
bg
ah
aT
ah
ak
ac
ad
ad
aa
"}
(6,1,1) = {"
aa
aa
aa
aa
ad
ac
an
ae
an
aM
aO
ah
au
ah
aA
ah
ao
ah
aq
ac
ad
ad
ad
"}
(7,1,1) = {"
aa
aa
aa
aa
ad
ac
ak
au
ak
ao
aR
ao
aA
ao
ae
ah
aZ
ah
bC
ac
ad
ad
ad
"}
(8,1,1) = {"
aa
aa
aa
aa
ad
ak
ak
av
aA
an
aG
aD
aX
an
ao
ae
ao
ah
ae
ac
bs
bv
ad
"}
(9,1,1) = {"
aa
aa
aa
aa
ad
ac
as
av
aF
aD
aD
bz
aD
bB
ak
ae
ao
ae
ao
ac
ax
bw
bv
"}
(10,1,1) = {"
aa
aa
aa
ad
ad
ac
ap
ax
ak
aD
aD
aN
an
aw
ak
ao
af
aR
ae
bq
ae
bx
ad
"}
(11,1,1) = {"
aa
al
al
al
al
al
ae
ah
aR
aD
an
aD
aD
by
ao
aw
ao
ae
bm
ac
ae
bv
ad
"}
(12,1,1) = {"
ad
al
ab
aI
ar
al
aR
aE
af
aD
aH
bA
aY
aD
ak
ae
au
ah
ag
br
ac
ad
ad
"}
(13,1,1) = {"
ad
al
am
aJ
aW
ay
ae
ah
ao
ae
ao
ae
af
ax
bi
ah
ak
ah
bp
ac
ad
ad
ad
"}
(14,1,1) = {"
ad
al
aS
aW
aK
al
at
ah
an
ah
bh
aj
az
ah
ak
ah
ak
bn
aT
ac
ad
aa
aa
"}
(15,1,1) = {"
ad
al
al
ai
ar
al
bc
aj
aL
ah
aA
ah
ao
ah
ak
ak
bl
ak
ak
ak
ad
aa
aa
"}
(16,1,1) = {"
ad
ad
al
al
al
al
bd
ah
ao
ah
ao
aV
ak
ah
ax
ak
bm
bo
ak
br
bu
aa
aa
"}
(17,1,1) = {"
aa
ad
ad
ad
ad
ac
be
bf
ae
aP
ae
aR
ae
ax
ak
bj
ak
ad
ad
ad
aa
aa
aa
"}
(18,1,1) = {"
aa
aa
aa
aa
ad
ac
ac
ac
ac
ac
ac
ba
ac
ac
aB
ad
aa
ad
aa
aa
aa
aa
aa
"}
(19,1,1) = {"
aa
aa
aa
aa
aa
ad
ad
ad
ad
ad
ad
aa
ad
ad
aa
aa
aa
aa
aa
aa
aa
aa
aa
"}
@@ -0,0 +1,818 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/open/floor/plating/ice/icemoon,
/area/icemoon/underground/explored)
"c" = (
/obj/structure/ladder,
/turf/open/floor/plating/ice/icemoon,
/area/icemoon/underground/explored)
"d" = (
/turf/template_noop,
/area/template_noop)
"f" = (
/obj/item/flashlight/lantern{
on = 1
},
/turf/open/floor/plating/ice/icemoon,
/area/icemoon/underground/explored)
"g" = (
/obj/item/clothing/suit/hooded/explorer,
/obj/effect/decal/cleanable/blood/gibs/up,
/turf/open/floor/plating/ice/icemoon,
/area/icemoon/underground/explored)
"h" = (
/obj/item/clothing/shoes/winterboots/ice_boots,
/turf/open/floor/plating/ice/icemoon,
/area/icemoon/underground/explored)
"i" = (
/obj/item/kitchen/knife/combat/survival,
/turf/open/floor/plating/ice/icemoon,
/area/icemoon/underground/explored)
"T" = (
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner,
/turf/open/floor/plating/ice/icemoon,
/area/icemoon/underground/explored)
(1,1,1) = {"
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
"}
(2,1,1) = {"
d
d
d
d
d
d
d
a
a
a
a
a
a
a
a
a
a
a
d
d
d
d
d
d
d
"}
(3,1,1) = {"
d
d
d
d
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
d
d
d
d
d
"}
(4,1,1) = {"
d
d
d
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
d
d
d
d
"}
(5,1,1) = {"
d
d
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
d
d
d
"}
(6,1,1) = {"
d
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
d
d
"}
(7,1,1) = {"
d
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
d
"}
(8,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
d
"}
(9,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(10,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(11,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(12,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(13,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(14,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
T
a
a
a
a
a
a
a
a
a
a
a
d
"}
(15,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(16,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(17,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(18,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
c
a
a
a
a
a
a
a
a
a
d
"}
(19,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(20,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(21,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(22,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
"}
(23,1,1) = {"
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
d
"}
(24,1,1) = {"
d
d
a
a
a
a
f
i
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
d
d
"}
(25,1,1) = {"
d
d
d
a
a
a
a
g
a
a
a
a
a
a
a
a
a
a
a
a
a
d
d
d
d
"}
(26,1,1) = {"
d
d
d
d
a
a
a
h
a
a
a
a
a
a
a
a
a
a
a
a
d
d
d
d
d
"}
(27,1,1) = {"
d
d
d
d
d
a
a
a
a
a
a
a
a
a
a
a
a
a
a
d
d
d
d
d
d
"}
(28,1,1) = {"
d
d
d
d
d
d
d
a
a
a
a
a
a
a
a
a
a
a
d
d
d
d
d
d
d
"}
(29,1,1) = {"
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
"}
@@ -0,0 +1,47 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/icemoon/underground/explored)
"b" = (
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
"c" = (
/obj/effect/sliding_puzzle/lavaland,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
(1,1,1) = {"
a
a
a
a
a
"}
(2,1,1) = {"
a
b
b
b
a
"}
(3,1,1) = {"
a
b
c
b
a
"}
(4,1,1) = {"
a
b
b
b
a
"}
(5,1,1) = {"
a
a
a
a
a
"}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,267 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
"b" = (
/turf/closed/mineral/random/snow/no_caves,
/area/icemoon/underground/explored)
"e" = (
/obj/structure/spawner/nether,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
(1,1,1) = {"
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
"}
(2,1,1) = {"
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
"}
(3,1,1) = {"
b
b
b
b
b
a
a
a
a
a
b
b
b
b
b
"}
(4,1,1) = {"
b
b
b
a
a
a
a
a
a
a
a
a
b
b
b
"}
(5,1,1) = {"
b
b
b
a
a
a
a
a
a
a
a
a
b
b
b
"}
(6,1,1) = {"
b
b
a
a
a
a
a
a
a
a
a
a
a
b
b
"}
(7,1,1) = {"
b
b
a
a
a
a
a
a
a
a
a
a
a
b
b
"}
(8,1,1) = {"
b
b
a
a
a
a
a
e
a
a
a
a
a
b
b
"}
(9,1,1) = {"
b
b
a
a
a
a
a
a
a
a
a
a
a
b
b
"}
(10,1,1) = {"
b
b
a
a
a
a
a
a
a
a
a
a
a
b
b
"}
(11,1,1) = {"
b
b
b
a
a
a
a
a
a
a
a
a
b
b
b
"}
(12,1,1) = {"
b
b
b
a
a
a
a
a
a
a
a
a
b
b
b
"}
(13,1,1) = {"
b
b
b
b
b
a
a
a
a
a
b
b
b
b
b
"}
(14,1,1) = {"
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
"}
(15,1,1) = {"
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
"}
+46
View File
@@ -0,0 +1,46 @@
{
"map_name":"Ice Box Station",
"map_path":"map_files/IceBoxStation",
"map_file":[
"IcemoonUnderground_Below.dmm",
"IcemoonUnderground_Above.dmm",
"IceBoxStation.dmm"
],
"space_ruin_levels":0,
"space_empty_levels":0,
"shuttles":{
"cargo":"cargo_box",
"ferry":"ferry_fancy",
"whiteship":"whiteship_box",
"emergency":"emergency_box"
},
"traits":[
{
"Up":1,
"Mining":true,
"Linkage":null,
"Gravity":true,
"Ice Ruins Underground":true,
"Baseturf":"/turf/open/lava/plasma/ice_moon"
},
{
"Down":-1,
"Up":1,
"Mining":true,
"Linkage":null,
"Gravity":true,
"Ice Ruins Underground":true,
"Baseturf":"/turf/open/openspace/icemoon"
},
{
"Down":-1,
"Mining":true,
"Linkage":null,
"Gravity":true,
"Ice Ruins":true,
"Weather_Snowstorm":true,
"Baseturf":"/turf/open/floor/plating/asteroid/snow/icemoon"
}
],
"minetype":"none"
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+4
View File
@@ -161,10 +161,14 @@
#define ATMOS_TANK_O2 "o2=100000;TEMP=293.15"
#define ATMOS_TANK_N2 "n2=100000;TEMP=293.15"
#define ATMOS_TANK_AIRMIX "o2=2644;n2=10580;TEMP=293.15"
//LAVALAND
#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
#define LAVALAND_DEFAULT_ATMOS "o2=14;n2=23;TEMP=300"
//SNOSTATION
#define ICEMOON_DEFAULT_ATMOS "o2=14;n2=23;TEMP=80"
//ATMOSIA GAS MONITOR TAGS
#define ATMOS_GAS_MONITOR_INPUT_O2 "o2_in"
#define ATMOS_GAS_MONITOR_OUTPUT_O2 "o2_out"
+9 -1
View File
@@ -37,8 +37,15 @@ require only minor tweaks.
#define ZTRAIT_AWAY "Away Mission"
#define ZTRAIT_SPACE_RUINS "Space Ruins"
#define ZTRAIT_LAVA_RUINS "Lava Ruins"
#define ZTRAIT_ICE_RUINS "Ice Ruins"
#define ZTRAIT_ICE_RUINS_UNDERGROUND "Ice Ruins Underground"
#define ZTRAIT_ISOLATED_RUINS "Isolated Ruins" //Placing ruins on z levels with this trait will use turf reservation instead of usual placement.
//boolean - weather types that occur on the level
#define ZTRAIT_SNOWSTORM "Weather_Snowstorm"
#define ZTRAIT_ASHSTORM "Weather_Ashstorm"
#define ZTRAIT_ACIDRAIN "Weather_Acidrain"
// number - bombcap is multiplied by this before being applied to bombs
#define ZTRAIT_BOMBCAP_MULTIPLIER "Bombcap Multiplier"
@@ -67,6 +74,7 @@ require only minor tweaks.
#define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE)
#define ZTRAITS_LAVALAND list(\
ZTRAIT_MINING = TRUE, \
ZTRAIT_ASHSTORM = TRUE, \
ZTRAIT_LAVA_RUINS = TRUE, \
ZTRAIT_BOMBCAP_MULTIPLIER = 5, \
ZTRAIT_BASETURF = /turf/open/lava/smooth/lava_land_surface)
@@ -101,4 +109,4 @@ require only minor tweaks.
#define PLACE_BELOW "below" //On z levl below - centered on same tile
#define PLACE_ISOLATED "isolated" //On isolated ruin z level
//Map type stuff.
#define MAP_TYPE_STATION "station"
#define MAP_TYPE_STATION "station"
+1
View File
@@ -265,6 +265,7 @@
#define WIZARD_AGE_MIN 30 //youngest a wizard can be
#define APPRENTICE_AGE_MIN 29 //youngest an apprentice can be
#define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up
#define SHOES_SPEED_SLIGHT SHOES_SLOWDOWN - 1 // slightest speed boost to movement
#define POCKET_STRIP_DELAY 40 //time taken (in deciseconds) to search somebody's pockets
#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you
+6 -5
View File
@@ -38,11 +38,12 @@
#define BLOCK_GAS_SMOKE_EFFECT (1<<2) //blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
#define ALLOWINTERNALS (1<<3) //mask allows internals
#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc
#define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
#define VOICEBOX_TOGGLABLE (1<<6) //The voicebox in this clothing can be toggled.
#define VOICEBOX_DISABLED (1<<7) //The voicebox is currently turned off.
#define IGNORE_HAT_TOSS (1<<8) //Hats with negative effects when worn (i.e the tinfoil hat).
#define SCAN_REAGENTS (1<<9) // Allows helmets and glasses to scan reagents.
#define NOSLIP_ICE (1<<5) //prevents from slipping on frozen floors
#define THICKMATERIAL (1<<6) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
#define VOICEBOX_TOGGLABLE (1<<7) //The voicebox in this clothing can be toggled.
#define VOICEBOX_DISABLED (1<<8) //The voicebox is currently turned off.
#define IGNORE_HAT_TOSS (1<<9) //Hats with negative effects when worn (i.e the tinfoil hat).
#define SCAN_REAGENTS (1<<10) // Allows helmets and glasses to scan reagents.
// Flags for the organ_flags var on /obj/item/organ
+23
View File
@@ -434,6 +434,29 @@ Turf and target are separate in case you want to teleport some distance from a t
return locate(x,y,A.z)
/**
* Get ranged target turf, but with direct targets as opposed to directions
*
* Starts at atom A and gets the exact angle between A and target
* Moves from A with that angle, Range amount of times, until it stops, bound to map size
* Arguments:
* * A - Initial Firer / Position
* * target - Target to aim towards
* * range - Distance of returned target turf from A
* * offset - Angle offset, 180 input would make the returned target turf be in the opposite direction
*/
/proc/get_ranged_target_turf_direct(atom/A, atom/target, range, offset)
var/angle = ATAN2(target.x - A.x, target.y - A.y)
if(offset)
angle += offset
var/turf/T = get_turf(A)
for(var/i in 1 to range)
var/turf/check = locate(A.x + cos(angle) * i, A.y + sin(angle) * i, A.z)
if(!check)
break
T = check
return T
// returns turf relative to A offset in dx and dy tiles
// bound to map limits
@@ -335,6 +335,11 @@
config_entry_value = 16
min_val = 0
/datum/config_entry/number/icemoon_budget
config_entry_value = 90
integer = FALSE
min_val = 0
/datum/config_entry/number/station_space_budget
config_entry_value = 10
min_val = 0
+25 -3
View File
@@ -14,6 +14,8 @@ SUBSYSTEM_DEF(mapping)
var/list/ruins_templates = list()
var/list/space_ruins_templates = list()
var/list/lava_ruins_templates = list()
var/list/ice_ruins_templates = list()
var/list/ice_ruins_underground_templates = list()
var/list/station_ruins_templates = list()
var/datum/space_level/isolated_ruins_z //Created on demand during ruin loading.
@@ -87,14 +89,27 @@ SUBSYSTEM_DEF(mapping)
loading_ruins = TRUE
var/list/lava_ruins = levels_by_trait(ZTRAIT_LAVA_RUINS)
if (lava_ruins.len)
seedRuins(lava_ruins, CONFIG_GET(number/lavaland_budget), /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates)
seedRuins(lava_ruins, CONFIG_GET(number/lavaland_budget), list(/area/lavaland/surface/outdoors/unexplored), lava_ruins_templates)
for (var/lava_z in lava_ruins)
spawn_rivers(lava_z)
var/list/ice_ruins = levels_by_trait(ZTRAIT_ICE_RUINS)
if (ice_ruins.len)
// needs to be whitelisted for underground too so place_below ruins work
seedRuins(ice_ruins, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/surface/outdoors/unexplored, /area/icemoon/underground/unexplored), ice_ruins_templates)
for (var/ice_z in ice_ruins)
spawn_rivers(ice_z, 4, /turf/open/openspace/icemoon, /area/icemoon/surface/outdoors/unexplored/rivers)
var/list/ice_ruins_underground = levels_by_trait(ZTRAIT_ICE_RUINS_UNDERGROUND)
if (ice_ruins_underground.len)
seedRuins(ice_ruins_underground, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/underground/unexplored), ice_ruins_underground_templates)
for (var/ice_z in ice_ruins_underground)
spawn_rivers(ice_z, 4, level_trait(ice_z, ZTRAIT_BASETURF), /area/icemoon/underground/unexplored/rivers)
// Generate deep space ruins
var/list/space_ruins = levels_by_trait(ZTRAIT_SPACE_RUINS)
if (space_ruins.len)
seedRuins(space_ruins, CONFIG_GET(number/space_budget), /area/space, space_ruins_templates)
seedRuins(space_ruins, CONFIG_GET(number/space_budget), list(/area/space), space_ruins_templates)
// Generate station space ruins
var/list/station_ruins = levels_by_trait(ZTRAIT_STATION)
@@ -167,6 +182,8 @@ SUBSYSTEM_DEF(mapping)
ruins_templates = SSmapping.ruins_templates
space_ruins_templates = SSmapping.space_ruins_templates
lava_ruins_templates = SSmapping.lava_ruins_templates
ice_ruins_templates = SSmapping.ice_ruins_templates
ice_ruins_underground_templates = SSmapping.ice_ruins_underground_templates
station_ruins_templates = SSmapping.station_ruins_templates
shuttle_templates = SSmapping.shuttle_templates
shelter_templates = SSmapping.shelter_templates
@@ -254,7 +271,7 @@ SUBSYSTEM_DEF(mapping)
// load mining
if(config.minetype == "lavaland")
LoadGroup(FailedZs, "Lavaland", "map_files/Mining", "Lavaland.dmm", default_traits = ZTRAITS_LAVALAND)
else if (!isnull(config.minetype))
else if (!isnull(config.minetype) && config.minetype != "none")
INIT_ANNOUNCE("WARNING: An unknown minetype '[config.minetype]' was set! This is being ignored! Update the maploader code!")
#endif
@@ -359,6 +376,7 @@ GLOBAL_LIST_EMPTY(the_station_areas)
// Still supporting bans by filename
var/list/banned = generateMapList("[global.config.directory]/lavaruinblacklist.txt")
banned += generateMapList("[global.config.directory]/spaceruinblacklist.txt")
banned += generateMapList("[global.config.directory]/iceruinblacklist.txt")
banned += generateMapList("[global.config.directory]/stationruinblacklist.txt")
for(var/item in sortList(subtypesof(/datum/map_template/ruin), /proc/cmp_ruincost_priority))
@@ -376,6 +394,10 @@ GLOBAL_LIST_EMPTY(the_station_areas)
if(istype(R, /datum/map_template/ruin/lavaland))
lava_ruins_templates[R.name] = R
else if(istype(R, /datum/map_template/ruin/icemoon/underground))
ice_ruins_underground_templates[R.name] = R
else if(istype(R, /datum/map_template/ruin/icemoon))
ice_ruins_templates[R.name] = R
else if(istype(R, /datum/map_template/ruin/space))
space_ruins_templates[R.name] = R
else if(istype(R, /datum/map_template/ruin/station))
+19 -2
View File
@@ -1,13 +1,18 @@
/datum/component/knockback
/// distance the atom will be thrown
var/throw_distance
/// whether this can throw anchored targets (tables, etc)
var/throw_anchored
/// whether this is a gentle throw (default false means people thrown into walls are stunned / take damage)
var/throw_gentle
/datum/component/knockback/Initialize(throw_distance=1)
/datum/component/knockback/Initialize(throw_distance=1, throw_gentle=FALSE)
if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent))
return COMPONENT_INCOMPATIBLE
src.throw_distance = throw_distance
src.throw_anchored = throw_anchored
src.throw_gentle = throw_gentle
/datum/component/knockback/RegisterWithParent()
. = ..()
@@ -22,17 +27,29 @@
. = ..()
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
/// triggered after an item attacks something
/datum/component/knockback/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
if(!proximity_flag)
return
do_knockback(target, user, get_dir(source, target))
/// triggered after a hostile simplemob attacks something
/datum/component/knockback/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target)
do_knockback(target, attacker, get_dir(attacker, target))
/// triggered after a projectile hits something
/datum/component/knockback/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
do_knockback(target, null, angle2dir(Angle))
/**
* Throw a target in a direction
*
* Arguments:
* * target - Target atom to throw
* * thrower - Thing that caused this atom to be thrown
* * throw_dir - Direction to throw the atom
*/
/datum/component/knockback/proc/do_knockback(atom/target, mob/thrower, throw_dir)
if(!ismovableatom(target) || throw_dir == null)
return
@@ -43,4 +60,4 @@
throw_dir = turn(throw_dir, 180)
throw_distance *= -1
var/atom/throw_target = get_edge_target_turf(throwee, throw_dir)
throwee.safe_throw_at(throw_target, throw_distance, 1, thrower)
throwee.safe_throw_at(throw_target, throw_distance, 1, thrower, gentle = throw_gentle)
+106
View File
@@ -0,0 +1,106 @@
// Hey! Listen! Update \config\iceruinblacklist.txt with your new ruins!
/datum/map_template/ruin/icemoon
prefix = "_maps/RandomRuins/IceRuins/"
allow_duplicates = FALSE
cost = 5
// above ground only
/datum/map_template/ruin/icemoon/lust
name = "Ruin of Lust"
id = "lust"
description = "Not exactly what you expected."
suffix = "icemoon_surface_lust.dmm"
/datum/map_template/ruin/icemoon/asteroid
name = "Asteroid Site"
id = "asteroidsite"
description = "Surprised to see us here?"
suffix = "icemoon_surface_asteroid.dmm"
/datum/map_template/ruin/icemoon/hotsprings
name = "Hot Springs"
id = "hotsprings"
description = "Just relax and take a dip, nothing will go wrong, I swear!"
suffix = "icemoon_surface_hotsprings.dmm"
/datum/map_template/ruin/icemoon/fountain
name = "Fountain Hall"
id = "fountain"
description = "The fountain has a warning on the side. DANGER: May have undeclared side effects that only become obvious when implemented."
prefix = "_maps/RandomRuins/AnywhereRuins/"
suffix = "fountain_hall.dmm"
// above and below ground together
/datum/map_template/ruin/icemoon/mining_site
name = "Mining Site"
id = "miningsite"
description = "Ruins of a site where people once mined with primitive tools for ore."
suffix = "icemoon_surface_mining_site.dmm"
always_place = TRUE
always_spawn_with = list(/datum/map_template/ruin/icemoon/underground/mining_site_below = PLACE_BELOW)
/datum/map_template/ruin/icemoon/underground/mining_site_below
name = "Mining Site Underground"
id = "miningsite-underground"
description = "Who knew ladders could be so useful?"
suffix = "icemoon_underground_mining_site.dmm"
unpickable = TRUE
// below ground only
/datum/map_template/ruin/icemoon/underground
name = "underground ruin"
/datum/map_template/ruin/icemoon/underground/abandonedvillage
name = "Abandoned Village"
id = "abandonedvillage"
description = "Who knows what lies within?"
suffix = "icemoon_underground_abandoned_village.dmm"
/datum/map_template/ruin/icemoon/underground/library
name = "Buried Library"
id = "buriedlibrary"
description = "A once grand library, now lost to the confines of the Ice Moon."
suffix = "icemoon_underground_library.dmm"
/datum/map_template/ruin/icemoon/underground/wrath
name = "Ruin of Wrath"
id = "wrath"
description = "You'll fight and fight and just keep fighting."
suffix = "icemoon_underground_wrath.dmm"
/datum/map_template/ruin/icemoon/underground/lavaland
name = "Lavaland Site"
id = "lavalandsite"
description = "I guess we never really left you huh?"
suffix = "icemoon_underground_lavaland.dmm"
/datum/map_template/ruin/icemoon/underground/puzzle
name = "Ancient Puzzle"
id = "puzzle"
description = "Mystery to be solved."
suffix = "icemoon_underground_puzzle.dmm"
/datum/map_template/ruin/icemoon/underground/bathhouse
name = "Bath House"
id = "bathhouse"
description = "A taste of paradise, locked in the hell of the Ice Moon."
suffix = "icemoon_underground_bathhouse.dmm"
/datum/map_template/ruin/icemoon/underground/wendigo_cave
name = "Wendigo Cave"
id = "wendigocave"
description = "Into the jaws of the beast."
suffix = "icemoon_underground_wendigo_cave.dmm"
/datum/map_template/ruin/icemoon/underground/free_golem
name = "Free Golem Ship"
id = "golem-ship"
description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \
Seem very intent on research and individual liberty, and also geology-based naming?"
prefix = "_maps/RandomRuins/AnywhereRuins/"
suffix = "golem_ship.dmm"
allow_duplicates = FALSE
+4 -2
View File
@@ -67,7 +67,8 @@
description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \
Seem very intent on research and individual liberty, and also geology based naming?"
cost = 20
suffix = "lavaland_surface_golem_ship.dmm"
prefix = "_maps/RandomRuins/AnywhereRuins/"
suffix = "golem_ship.dmm"
allow_duplicates = FALSE
/datum/map_template/ruin/lavaland/animal_hospital
@@ -175,7 +176,8 @@
name = "Fountain Hall"
id = "fountain"
description = "The fountain has a warning on the side. DANGER: May have undeclared side effects that only become obvious when implemented."
suffix = "lavaland_surface_fountain_hall.dmm"
prefix = "_maps/RandomRuins/AnywhereRuins/"
suffix = "fountain_hall.dmm"
cost = 5
allow_duplicates = FALSE
+6
View File
@@ -467,6 +467,12 @@
else
new /obj/effect/temp_visual/bleed(get_turf(owner))
/datum/status_effect/stacking/saw_bleed/bloodletting
id = "bloodletting"
stack_threshold = 7
max_stacks = 7
bleed_damage = 20
/datum/status_effect/neck_slice
id = "neck_slice"
status_type = STATUS_EFFECT_UNIQUE
+108 -26
View File
@@ -1,49 +1,96 @@
//The effects of weather occur across an entire z-level. For instance, lavaland has periodic ash storms that scorch most unprotected creatures.
/**
* Causes weather to occur on a z level in certain area types
*
* The effects of weather occur across an entire z-level. For instance, lavaland has periodic ash storms that scorch most unprotected creatures.
* Weather always occurs on different z levels at different times, regardless of weather type.
* Can have custom durations, targets, and can automatically protect indoor areas.
*
*/
/datum/weather
/// name of weather
var/name = "space wind"
/// description of weather
var/desc = "Heavy gusts of wind blanket the area, periodically knocking down anyone caught in the open."
var/telegraph_message = "<span class='warning'>The wind begins to pick up.</span>" //The message displayed in chat to foreshadow the weather's beginning
var/telegraph_duration = 300 //In deciseconds, how long from the beginning of the telegraph until the weather begins
var/telegraph_sound //The sound file played to everyone on an affected z-level
var/telegraph_overlay //The overlay applied to all tiles on the z-level
/// The message displayed in chat to foreshadow the weather's beginning
var/telegraph_message = "<span class='warning'>The wind begins to pick up.</span>"
var/weather_message = "<span class='userdanger'>The wind begins to blow ferociously!</span>" //Displayed in chat once the weather begins in earnest
var/weather_duration = 1200 //In deciseconds, how long the weather lasts once it begins
var/weather_duration_lower = 1200 //See above - this is the lowest possible duration
var/weather_duration_upper = 1500 //See above - this is the highest possible duration
/// In deciseconds, how long from the beginning of the telegraph until the weather begins
var/telegraph_duration = 300
/// The sound file played to everyone on an affected z-level
var/telegraph_sound
/// The overlay applied to all tiles on the z-level
var/telegraph_overlay
/// Displayed in chat once the weather begins in earnest
var/weather_message = "<span class='userdanger'>The wind begins to blow ferociously!</span>"
///In deciseconds, how long the weather lasts once it begins
var/weather_duration = 1200
///See above - this is the lowest possible duration
var/weather_duration_lower = 1200
///See above - this is the highest possible duration
var/weather_duration_upper = 1500
/// Looping sound while weather is occuring
var/weather_sound
/// Area overlay while the weather is occuring
var/weather_overlay
/// Color to apply to the area while weather is occuring
var/weather_color = null
var/end_message = "<span class='danger'>The wind relents its assault.</span>" //Displayed once the weather is over
var/end_duration = 300 //In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely
/// Displayed once the weather is over
var/end_message = "<span class='danger'>The wind relents its assault.</span>"
/// In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely
var/end_duration = 300
/// Sound that plays while weather is ending
var/end_sound
/// Area overlay while weather is ending
var/end_overlay
var/area_type = /area/space //Types of area to affect
var/list/impacted_areas = list() //Areas to be affected by the weather, calculated when the weather begins
var/list/protected_areas = list()//Areas that are protected and excluded from the affected areas.
var/impacted_z_levels // The list of z-levels that this weather is actively affecting
/// Types of area to affect
var/area_type = /area/space
/// TRUE value protects areas with outdoors marked as false, regardless of area type
var/protect_indoors = FALSE
/// Areas to be affected by the weather, calculated when the weather begins
var/list/impacted_areas = list()
var/overlay_layer = AREA_LAYER //Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that.
var/aesthetic = FALSE //If the weather has no purpose other than looks
var/immunity_type = "storm" //Used by mobs to prevent them from being affected by the weather
/// Areas that are protected and excluded from the affected areas.
var/list/protected_areas = list()
/// The list of z-levels that this weather is actively affecting
var/impacted_z_levels
var/stage = END_STAGE //The stage of the weather, from 1-4
/// Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that.
var/overlay_layer = AREA_LAYER
/// Plane for the overlay
var/overlay_plane = BLACKNESS_PLANE
/// If the weather has no purpose but aesthetics.
var/aesthetic = FALSE
/// Used by mobs to prevent them from being affected by the weather
var/immunity_type = "storm"
// These are read by the weather subsystem and used to determine when and where to run the weather.
var/probability = 0 // Weight amongst other eligible weather. If zero, will never happen randomly.
var/target_trait = ZTRAIT_STATION // The z-level trait to affect when run randomly or when not overridden.
/// The stage of the weather, from 1-4
var/stage = END_STAGE
/// Weight amongst other eligible weather. if zero, will never happen randomly.
var/probability = 0
/// The z-level trait to affect when run randomly or when not overridden.
var/target_trait = ZTRAIT_STATION
/// Whether a barometer can predict when the weather will happen
var/barometer_predictable = FALSE
var/next_hit_time = 0 //For barometers to know when the next storm will hit
/// For barometers to know when the next storm will hit
var/next_hit_time = 0
/datum/weather/New(z_levels)
..()
impacted_z_levels = z_levels
/**
* Telegraphs the beginning of the weather on the impacted z levels
*
* Sends sounds and details to mobs in the area
* Calculates duration and hit areas, and makes a callback for the actual weather to start
*
*/
/datum/weather/proc/telegraph()
if(stage == STARTUP_STAGE)
return
@@ -58,6 +105,8 @@
affectareas -= get_areas(V)
for(var/V in affectareas)
var/area/A = V
if(protect_indoors && !A.outdoors)
continue
if(A.z in impacted_z_levels)
impacted_areas |= A
weather_duration = rand(weather_duration_lower, weather_duration_upper)
@@ -72,6 +121,13 @@
SEND_SOUND(M, sound(telegraph_sound))
addtimer(CALLBACK(src, .proc/start), telegraph_duration)
/**
* Starts the actual weather and effects from it
*
* Updates area overlays and sends sounds and messages to mobs to notify them
* Begins dealing effects from weather to mobs in the area
*
*/
/datum/weather/proc/start()
if(stage >= MAIN_STAGE)
return
@@ -86,6 +142,13 @@
SEND_SOUND(M, sound(weather_sound))
addtimer(CALLBACK(src, .proc/wind_down), weather_duration)
/**
* Weather enters the winding down phase, stops effects
*
* Updates areas to be in the winding down phase
* Sends sounds and messages to mobs to notify them
*
*/
/datum/weather/proc/wind_down()
if(stage >= WIND_DOWN_STAGE)
return
@@ -100,6 +163,13 @@
SEND_SOUND(M, sound(end_sound))
addtimer(CALLBACK(src, .proc/end), end_duration)
/**
* Fully ends the weather
*
* Effects no longer occur and area overlays are removed
* Removes weather from processing completely
*
*/
/datum/weather/proc/end()
if(stage == END_STAGE)
return 1
@@ -115,7 +185,11 @@
if(can_weather_act(L))
weather_act(L)
/datum/weather/proc/can_weather_act(mob/living/L) //Can this weather impact a mob?
/**
* Returns TRUE if the living mob can be affected by the weather
*
*/
/datum/weather/proc/can_weather_act(mob/living/L)
var/turf/mob_turf = get_turf(L)
if(mob_turf && !(mob_turf.z in impacted_z_levels))
return
@@ -123,11 +197,19 @@
return
if(!(get_area(L) in impacted_areas))
return
return 1
return TRUE
/datum/weather/proc/weather_act(mob/living/L) //What effect does this weather have on the hapless mob?
/**
* Affects the mob with whatever the weather does
*
*/
/datum/weather/proc/weather_act(mob/living/L)
return
/**
* Updates the overlays on impacted areas
*
*/
/datum/weather/proc/update_areas()
for(var/V in impacted_areas)
var/area/N = V
@@ -17,8 +17,9 @@
end_message = "<span class='boldannounce'>The downpour gradually slows to a light shower. It should be safe outside now.</span>"
end_sound = 'sound/ambience/acidrain_end.ogg'
area_type = /area/lavaland/surface/outdoors
target_trait = ZTRAIT_MINING
area_type = /area
protect_indoors = TRUE
target_trait = ZTRAIT_ACIRDRAIN
immunity_type = "acid" // temp
@@ -16,8 +16,9 @@
end_duration = 300
end_overlay = "light_ash"
area_type = /area/lavaland/surface/outdoors
target_trait = ZTRAIT_MINING
area_type = /area
protect_indoors = TRUE
target_trait = ZTRAIT_ASHSTORM
immunity_type = "ash"
@@ -15,8 +15,9 @@
end_duration = 100
end_message = "<span class='boldannounce'>The snowfall dies down, it should be safe to go outside again.</span>"
area_type = /area/awaymission/snowdin/outside
target_trait = ZTRAIT_AWAY
area_type = /area
protect_indoors = TRUE
target_trait = ZTRAIT_SNOWSTORM
immunity_type = "snow"
+30 -10
View File
@@ -11,13 +11,27 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
invisibility = INVISIBILITY_LIGHTING
var/map_name // Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints.
/// Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints.
var/map_name
var/valid_territory = TRUE // If it's a valid territory for gangs to claim
var/blob_allowed = TRUE // Does it count for blobs score? By default, all areas count.
var/clockwork_warp_allowed = TRUE // Can servants warp into this area from Reebe?
/// If it's valid territory for gangs/cults to summon
var/valid_territory = TRUE
/// if blobs can spawn there and if it counts towards their score.
var/blob_allowed = TRUE
/// whether servants can warp into this area from Reebe
var/clockwork_warp_allowed = TRUE
/// Message to display when the clockwork warp fails
var/clockwork_warp_fail = "The structure there is too dense for warping to pierce. (This is normal in high-security areas.)"
/// If mining tunnel generation is allowed in this area
var/tunnel_allowed = FALSE
/// If flora are allowed to spawn in this area randomly through tunnel generation
var/flora_allowed = FALSE
/// if mobs can be spawned by natural random generation
var/mob_spawn_allowed = FALSE
/// If megafauna can be spawned by natural random generation
var/megafauna_spawn_allowed = FALSE
var/fire = null
var/atmos = TRUE
var/atmosalm = FALSE
@@ -25,11 +39,14 @@
var/lightswitch = TRUE
var/requires_power = TRUE
var/always_unpowered = FALSE // This gets overridden to 1 for space in area/Initialize().
/// This gets overridden to 1 for space in area/Initialize().
var/always_unpowered = FALSE
var/outdoors = FALSE //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room)
/// For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room)
var/outdoors = FALSE
var/areasize = 0 //Size of the area in open turfs, only calculated for indoors areas.
/// Size of the area in open turfs, only calculated for indoors areas.
var/areasize = 0
var/power_equip = TRUE
var/power_light = TRUE
@@ -43,9 +60,12 @@
var/static_environ
var/has_gravity = 0
var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter)
var/hidden = FALSE //Hides area from player Teleport function.
var/safe = FALSE //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers
/// Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter)
var/noteleport = FALSE
/// Hides area from player Teleport function.
var/hidden = FALSE
/// Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers
var/safe = FALSE
/// If false, loading multiple maps with this area type will create multiple instances.
var/unique = TRUE
+74
View File
@@ -3,6 +3,7 @@
/area/mine
icon_state = "mining"
has_gravity = STANDARD_GRAVITY
flora_allowed = TRUE
/area/mine/explored
name = "Mine"
@@ -17,6 +18,7 @@
outdoors = TRUE
flags_1 = NONE
ambientsounds = MINING
flora_allowed FALSE
/area/mine/unexplored
name = "Mine"
@@ -31,6 +33,7 @@
outdoors = TRUE
flags_1 = NONE
ambientsounds = MINING
tunnel_allowed = TRUE
/area/mine/lobby
name = "Mining Station"
@@ -82,6 +85,7 @@
icon_state = "mining"
has_gravity = STANDARD_GRAVITY
flags_1 = NONE
flora_allowed = TRUE
/area/lavaland/surface
name = "Lavaland"
@@ -114,9 +118,79 @@
/area/lavaland/surface/outdoors/unexplored //monsters and ruins spawn here
icon_state = "unexplored"
tunnel_allowed = TRUE
mob_spawn_allowed = TRUE
/area/lavaland/surface/outdoors/unexplored/danger //megafauna will also spawn here
icon_state = "danger"
megafauna_spawn_allowed = TRUE
/area/lavaland/surface/outdoors/explored
name = "Lavaland Labor Camp"
flora_allowed = FALSE
/**********************Ice Moon Areas**************************/
/area/icemoon
icon_state = "mining"
has_gravity = STANDARD_GRAVITY
flags_1 = NONE
flora_allowed = TRUE
blob_allowed = FALSE
/area/icemoon/surface
name = "Icemoon"
icon_state = "explored"
always_unpowered = TRUE
poweralm = FALSE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
requires_power = TRUE
ambientsounds = MINING
/area/icemoon/underground
name = "Icemoon Caves"
outdoors = TRUE
always_unpowered = TRUE
requires_power = TRUE
poweralm = FALSE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
ambientsounds = MINING
/area/icemoon/underground/unexplored // mobs and megafauna and ruins spawn here
name = "Icemoon Caves"
icon_state = "unexplored"
tunnel_allowed = TRUE
mob_spawn_allowed = TRUE
megafauna_spawn_allowed = TRUE
/area/icemoon/underground/unexplored/rivers // rivers spawn here
icon_state = "danger"
/area/icemoon/underground/explored
name = "Icemoon Underground"
flora_allowed = FALSE
/area/icemoon/surface/outdoors
name = "Icemoon Wastes"
outdoors = TRUE
/area/icemoon/surface/outdoors/labor_camp
name = "Icemoon Labor Camp"
flora_allowed = FALSE
/area/icemoon/surface/outdoors/unexplored //monsters and ruins spawn here
icon_state = "unexplored"
tunnel_allowed = TRUE
mob_spawn_allowed = TRUE
/area/icemoon/surface/outdoors/unexplored/rivers // rivers spawn here
icon_state = "danger"
/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters
mob_spawn_allowed = FALSE
+9
View File
@@ -0,0 +1,9 @@
// Icemoon Ruins
/area/ruin/unpowered/buried_library
name = "Buried Library"
icon_state = "dk_yellow"
/area/ruin/powered/bathhouse
name = "Bath House"
icon_state = "dk_yellow"
@@ -351,6 +351,12 @@
light_color = "#FFAA44"
flashlight_power = 0.8
/obj/item/flashlight/lantern/jade
name = "jade lantern"
desc = "An ornate, green lantern."
color = LIGHT_COLOR_GREEN
light_color = LIGHT_COLOR_GREEN
/obj/item/flashlight/slime
gender = PLURAL
name = "glowing slime extract"
+23
View File
@@ -3,6 +3,7 @@
* Fork
* Kitchen knives
* Ritual Knife
* Bloodletter
* Butcher's cleaver
* Combat Knife
* Rolling Pins
@@ -97,6 +98,28 @@
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL
/obj/item/kitchen/knife/bloodletter
name = "bloodletter"
desc = "An occult looking dagger that is cold to the touch. Somehow, the flawless orb on the pommel is made entirely of liquid blood."
icon = 'icons/obj/ice_moon/artifacts.dmi'
icon_state = "bloodletter"
w_class = WEIGHT_CLASS_NORMAL
/// Bleed stacks applied when an organic mob target is hit
var/bleed_stacks_per_hit = 3
/obj/item/kitchen/knife/bloodletter/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!isliving(target) || !proximity_flag)
return
var/mob/living/M = target
if(!(M.mob_biotypes & MOB_ORGANIC))
return
var/datum/status_effect/stacking/saw_bleed/bloodletting/B = M.has_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting)
if(!B)
M.apply_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting, bleed_stacks_per_hit)
else
B.add_stacks(bleed_stacks_per_hit)
/obj/item/kitchen/knife/butcher
name = "butcher's cleaver"
icon_state = "butch"
+147
View File
@@ -0,0 +1,147 @@
//**************
//*****Keys*******************
//************** ** **
/obj/item/keycard
name = "security keycard"
desc = "This feels like it belongs to a door."
icon = 'icons/obj/puzzle_small.dmi'
icon_state = "keycard"
force = 0
throwforce = 0
w_class = WEIGHT_CLASS_TINY
throw_speed = 1
throw_range = 7
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
var/puzzle_id = null
//Two test keys for use alongside the two test doors.
/obj/item/keycard/cheese
name = "cheese keycard"
desc = "Look, I still don't understand the reference. What the heck is a keyzza?"
color = "#f0da12"
puzzle_id = "cheese"
/obj/item/keycard/swordfish
name = "titanic keycard"
desc = "Smells like it was at the bottom of a harbor."
color = "#3bbbdb"
puzzle_id = "swordfish"
//***************
//*****Doors*****
//***************
/obj/machinery/door/keycard
name = "locked door"
desc = "This door only opens when a keycard is swiped. It looks virtually indestructable."
icon = 'icons/obj/doors/puzzledoor/default.dmi'
icon_state = "door_closed"
explosion_block = 3
heat_proof = TRUE
max_integrity = 600
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
damage_deflection = 70
/// Make sure that the key has the same puzzle_id as the keycard door!
var/puzzle_id = null
/// Message that occurs when the door is opened
var/open_message = "The door beeps, and slides opens."
//Standard Expressions to make keycard doors basically un-cheeseable
/obj/machinery/door/keycard/Bumped(atom/movable/AM)
return !density && ..()
/obj/machinery/door/keycard/emp_act(severity)
return
/obj/machinery/door/keycard/ex_act(severity, target)
return
/obj/machinery/door/keycard/try_to_activate_door(mob/user)
add_fingerprint(user)
if(operating)
return
/obj/machinery/door/keycard/attackby(obj/item/I, mob/user, params)
. = ..()
if(istype(I,/obj/item/keycard))
var/obj/item/keycard/key = I
if((!puzzle_id || puzzle_id == key.puzzle_id) && density)
if(open_message)
to_chat(user, "<span class='notice'>[open_message]</span>")
open()
return
else if(puzzle_id != key.puzzle_id)
to_chat(user, "<span class='notice'>[src] buzzes. This must not be the right key.</span>")
return
else
to_chat(user, "<span class='notice'>This door doesn't appear to close.</span>")
return
//Test doors. Gives admins a few doors to use quickly should they so choose.
/obj/machinery/door/keycard/cheese
name = "blue airlock"
desc = "Smells like... pizza?"
puzzle_id = "cheese"
/obj/machinery/door/keycard/swordfish
name = "blue airlock"
desc = "If nautical nonsense be something you wish."
puzzle_id = "swordfish"
//*************************
//***Box Pushing Puzzles***
//*************************
//We're working off a subtype of pressureplates, which should work just a BIT better now.
/obj/structure/holobox
name = "holobox"
desc = "A hard-light box, containing a secure decryption key."
icon = 'icons/obj/puzzle_small.dmi'
icon_state = "laserbox"
density = TRUE
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
//Uses the pressure_plate settings for a pretty basic custom pattern that waits for a specific item to trigger. Easy enough to retool for mapping purposes or subtypes.
/obj/item/pressure_plate/hologrid
name = "hologrid"
desc = "A high power, electronic input port for a holobox, which can unlock the hologrid's storage compartment. Safe to stand on."
icon = 'icons/obj/puzzle_small.dmi'
icon_state = "lasergrid"
anchored = TRUE
trigger_mob = FALSE
trigger_item = TRUE
specific_item = /obj/structure/holobox
removable_signaller = FALSE //Being a pressure plate subtype, this can also use signals.
roundstart_signaller_freq = FREQ_HOLOGRID_SOLUTION //Frequency is kept on it's own default channel however.
active = TRUE
trigger_delay = 10
protected = TRUE
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
var/reward = /obj/item/reagent_containers/food/snacks/cookie
var/claimed = FALSE
/obj/item/pressure_plate/hologrid/Initialize()
. = ..()
AddElement(/datum/element/undertile, tile_overlay = tile_overlay) //we remove use_anchor here, so it ALWAYS stays anchored
/obj/item/pressure_plate/hologrid/examine(mob/user)
. = ..()
if(claimed)
. += "<span class='notice'>This one appears to be spent already.</span>"
/obj/item/pressure_plate/hologrid/trigger()
if(!claimed)
new reward(loc)
flick("lasergrid_a",src)
icon_state = "lasergrid_full"
claimed = TRUE
/obj/item/pressure_plate/hologrid/Crossed(atom/movable/AM)
. = ..()
if(trigger_item && istype(AM, specific_item) && !claimed)
AM.anchored = TRUE
flick("laserbox_burn", AM)
trigger()
sleep(15)
qdel(AM)
@@ -178,6 +178,11 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \
icon_state = "sinew"
novariants = TRUE
/obj/item/stack/sheet/sinew/wolf
name = "wolf sinew"
desc = "Long stringy filaments which came from the insides of a wolf."
singular_name = "wolf sinew"
GLOBAL_LIST_INIT(sinew_recipes, list ( \
new/datum/stack_recipe("sinew restraints", /obj/item/restraints/handcuffs/sinew, 1), \
@@ -202,6 +207,11 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
w_class = WEIGHT_CLASS_NORMAL
layer = MOB_LAYER
/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide
name = "polar bear hides"
desc = "Pieces of a polar bear's fur, these might be able to make your suit a bit more durable to attack from the local fauna."
icon_state = "polar_bear_hide"
singular_name = "polar bear hide"
/obj/item/stack/sheet/animalhide/ashdrake
name = "ash drake hide"
+17
View File
@@ -350,11 +350,28 @@
icon = 'icons/obj/flora/rocks.dmi'
resistance_flags = FIRE_PROOF
density = TRUE
/// Itemstack that is dropped when a rock is mined with a pickaxe
var/obj/item/stack/mineResult = /obj/item/stack/ore/glass/basalt
/// Amount of the itemstack to drop
var/mineAmount = 20
/obj/structure/flora/rock/Initialize()
. = ..()
icon_state = "[icon_state][rand(1,3)]"
/obj/structure/flora/rock/attackby(obj/item/W, mob/user, params)
if(!mineResult || W.tool_behaviour != TOOL_MINING)
return ..()
if(flags_1 & NODECONSTRUCT_1)
return ..()
to_chat(user, "<span class='notice'>You start mining...</span>")
if(W.use_tool(src, user, 40, volume=50))
to_chat(user, "<span class='notice'>You finish mining the rock.</span>")
if(mineResult && mineAmount)
new mineResult(get_turf(src), mineAmount)
SSblackbox.record_feedback("tally", "pick_used_mining", 1, W.type)
qdel(src)
/obj/structure/flora/rock/pile
icon_state = "lavarocks"
desc = "A pile of rocks."
@@ -0,0 +1,178 @@
GLOBAL_LIST_INIT(ore_probability, list(/obj/item/stack/ore/uranium = 50,
/obj/item/stack/ore/iron = 100,
/obj/item/stack/ore/plasma = 75,
/obj/item/stack/ore/silver = 50,
/obj/item/stack/ore/gold = 50,
/obj/item/stack/ore/diamond = 25,
/obj/item/stack/ore/bananium = 5,
/obj/item/stack/ore/titanium = 75))
/obj/structure/spawner/ice_moon
name = "cave entrance"
desc = "A hole in the ground, filled with monsters ready to defend it."
icon = 'icons/mob/nest.dmi'
icon_state = "hole"
faction = list("mining")
max_mobs = 3
max_integrity = 250
mob_types = list(/mob/living/simple_animal/hostile/asteroid/wolf)
move_resist = INFINITY
anchored = TRUE
/obj/structure/spawner/ice_moon/Initialize()
. = ..()
clear_rock()
/**
* Clears rocks around the spawner when it is created
*
*/
/obj/structure/spawner/ice_moon/proc/clear_rock()
for(var/turf/F in RANGE_TURFS(2, src))
if(abs(src.x - F.x) + abs(src.y - F.y) > 3)
continue
if(ismineralturf(F))
var/turf/closed/mineral/M = F
M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
/obj/structure/spawner/ice_moon/deconstruct(disassembled)
destroy_effect()
drop_loot()
return ..()
/**
* Effects and messages created when the spawner is destroyed
*
*/
/obj/structure/spawner/ice_moon/proc/destroy_effect()
playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE)
visible_message("<span class='boldannounce'>[src] collapses, sealing everything inside!</span>\n<span class='warning'>Ores fall out of the cave as it is destroyed!</span>")
/**
* Drops items after the spawner is destroyed
*
*/
/obj/structure/spawner/ice_moon/proc/drop_loot()
for(var/type in GLOB.ore_probability)
var/chance = GLOB.ore_probability[type]
if(!prob(chance))
continue
new type(loc, rand(5, 10))
/obj/structure/spawner/ice_moon/polarbear
max_mobs = 1
spawn_time = 60 SECONDS
mob_types = list(/mob/living/simple_animal/hostile/asteroid/polarbear)
/obj/structure/spawner/ice_moon/polarbear/clear_rock()
for(var/turf/F in RANGE_TURFS(1, src))
if(ismineralturf(F))
var/turf/closed/mineral/M = F
M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
/obj/structure/spawner/ice_moon/demonic_portal
name = "demonic portal"
desc = "A portal that goes to another world, normal creatures couldn't survive there."
icon_state = "nether"
mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_demon)
light_range = 1
light_color = LIGHT_COLOR_RED
/obj/structure/spawner/ice_moon/demonic_portal/clear_rock()
for(var/turf/F in RANGE_TURFS(3, src))
if(abs(src.x - F.x) + abs(src.y - F.y) > 5)
continue
if(ismineralturf(F))
var/turf/closed/mineral/M = F
M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
/obj/structure/spawner/ice_moon/demonic_portal/destroy_effect()
new /obj/effect/collapsing_demonic_portal(loc)
/obj/structure/spawner/ice_moon/demonic_portal/drop_loot()
return
/obj/structure/spawner/ice_moon/demonic_portal/ice_whelp
mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_whelp)
/obj/structure/spawner/ice_moon/demonic_portal/snowlegion
mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow)
/obj/effect/collapsing_demonic_portal
name = "collapsing demonic portal"
desc = "It's slowly fading!"
layer = TABLE_LAYER
icon = 'icons/mob/nest.dmi'
icon_state = "nether"
anchored = TRUE
density = TRUE
/obj/effect/collapsing_demonic_portal/Initialize()
. = ..()
playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE)
visible_message("<span class='boldannounce'>[src] begins to collapse, cutting it off from this world!</span>")
animate(src, transform = matrix().Scale(0, 1), alpha = 50, time = 5 SECONDS)
addtimer(CALLBACK(src, .proc/collapse), 5 SECONDS)
/obj/effect/collapsing_demonic_portal/proc/collapse()
visible_message("<span class='warning'>Something slips out of [src]!</span>")
var/loot = rand(1, 28)
switch(loot)
if(1)
new /obj/item/clothing/suit/space/hardsuit/cult(loc)
if(2)
new /obj/item/clothing/glasses/godeye(loc)
if(3)
new /obj/item/reagent_containers/glass/bottle/potion/flight(loc)
if(4)
new /obj/item/organ/heart/cursed/wizard(loc)
if(5)
new /obj/item/jacobs_ladder(loc)
if(6)
new /obj/item/rod_of_asclepius(loc)
if(7)
new /obj/item/warp_cube/red(loc)
if(8)
new /obj/item/wisp_lantern(loc)
if(9)
new /obj/item/immortality_talisman(loc)
if(10)
new /obj/item/book/granter/spell/summonitem(loc)
if(11)
new /obj/item/clothing/neck/necklace/memento_mori(loc)
if(12)
new /obj/item/borg/upgrade/modkit/lifesteal(loc)
new /obj/item/bedsheet/cult(loc)
if(13)
new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(loc)
if(14)
new /obj/item/disk/design_disk/modkit_disc/bounty(loc)
if(15)
new /obj/item/ship_in_a_bottle(loc)
new /obj/item/oar(loc)
if(16)
new /obj/item/seeds/gatfruit(loc)
if(17)
new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc)
if(18)
new /obj/item/assembly/signaler/anomaly/bluespace(loc)
if(19)
new /obj/item/disk/design_disk/modkit_disc/resonator_blast(loc)
if(20)
new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(loc)
if(21)
new /obj/item/slimepotion/transference(loc)
if(22)
new /obj/item/slime_extract/adamantine(loc)
if(23)
new /obj/item/weldingtool/abductor(loc)
if(24)
new /obj/structure/elite_tumor(loc)
if(25)
new /mob/living/simple_animal/hostile/retaliate/clown/clownhulk(loc)
if(26)
new /obj/item/clothing/shoes/winterboots/ice_boots(loc)
if(27)
new /obj/item/book/granter/spell/sacredflame(loc)
if(28)
new /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom(loc)
@@ -25,6 +25,9 @@
/obj/structure/spawner/lavaland/legion
mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril)
/obj/structure/spawner/lavaland/icewatcher
mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing)
GLOBAL_LIST_INIT(tendrils, list())
/obj/structure/spawner/lavaland/Initialize()
. = ..()
@@ -94,4 +97,4 @@ GLOBAL_LIST_INIT(tendrils, list())
for(var/turf/T in range(2,src))
if(!T.density)
T.TerraformTurf(/turf/open/chasm/lavaland, /turf/open/chasm/lavaland, flags = CHANGETURF_INHERIT_AIR)
qdel(src)
qdel(src)
+9
View File
@@ -134,6 +134,15 @@
icon = 'icons/turf/walls.dmi'
icon_state = "icerock"
/turf/closed/indestructible/rock/snow/ice/ore
icon = 'icons/turf/walls/icerock_wall.dmi'
icon_state = "icerock"
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/closed)
pixel_x = -4
pixel_y = -4
/turf/closed/indestructible/paper
name = "thick paper wall"
desc = "A wall layered with impenetrable sheets of paper."
+10
View File
@@ -132,3 +132,13 @@
PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
return TRUE
return FALSE
/turf/open/openspace/icemoon
name = "ice chasm"
baseturfs = /turf/open/openspace/icemoon
can_cover_up = FALSE
can_build_on = FALSE
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/open/openspace/icemoon/can_zFall(atom/movable/A, levels = 1, turf/target)
return TRUE
+10 -1
View File
@@ -88,6 +88,15 @@
light_power = 0.65 //less bright, too
light_color = LIGHT_COLOR_LAVA //let's just say you're falling into lava, that makes sense right
// Chasms for Ice moon, with planetary atmos and glow
/turf/open/chasm/icemoon
icon = 'icons/turf/floors/icechasms.dmi'
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
planetary_atmos = TRUE
baseturfs = /turf/open/chasm/icemoon
light_range = 1.9
light_power = 0.65
light_color = LIGHT_COLOR_PURPLE
// Chasms for the jungle, with planetary atmos and a different icon
/turf/open/chasm/jungle
@@ -115,4 +124,4 @@
. = ..()
var/turf/T = safepick(get_area_turfs(/area/fabric_of_reality))
if(T)
set_target(T)
set_target(T)
@@ -13,11 +13,15 @@
barefootstep = FOOTSTEP_SAND
clawfootstep = FOOTSTEP_SAND
heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/// Environment type for the turf
var/environment_type = "asteroid"
/// Base turf type to be created by the tunnel
var/turf_type = /turf/open/floor/plating/asteroid //Because caves do whacky shit to revert to normal
var/floor_variance = 20 //probability floor has a different icon state
/// Probability the floor has a different icon state
var/floor_variance = 20
attachment_holes = FALSE
var/obj/item/stack/digResult = /obj/item/stack/ore/glass/basalt
/// Whether the turf has been dug or not
var/dug
/turf/open/floor/plating/asteroid/Initialize()
@@ -27,6 +31,7 @@
if(prob(floor_variance))
icon_state = "[environment_type][rand(0,12)]"
/// Drops itemstack when dug and changes icon
/turf/open/floor/plating/asteroid/proc/getDug()
new digResult(src, 5)
if(postdig_icon_change)
@@ -35,6 +40,7 @@
icon_state = "[environment_type]_dug"
dug = TRUE
/// If the user can dig the turf
/turf/open/floor/plating/asteroid/proc/can_dig(mob/user)
if(!dug)
return TRUE
@@ -135,16 +141,27 @@
#define SPAWN_BUBBLEGUM 6
/turf/open/floor/plating/asteroid/airless/cave
/// Length of the tunnel
var/length = 100
/// Mobs that can spawn in the tunnel, weighted list
var/list/mob_spawn_list
/// Megafauna that can spawn in the tunnel, weighted list
var/list/megafauna_spawn_list
/// Flora that can spawn in the tunnel, weighted list
var/list/flora_spawn_list
/// if the tunnel should keep being created
var/sanity = 1
/// Cave direction to move
var/forward_cave_dir = 1
/// Backwards cave direction for tracking
var/backward_cave_dir = 2
/// If the tunnel is moving backwards
var/going_backwards = TRUE
/// If this is a cave creating type
var/has_data = FALSE
/// The non-cave creating type
var/data_having_type = /turf/open/floor/plating/asteroid/airless/cave/has_data
/// Option tunnel width, wegihted list
turf_type = /turf/open/floor/plating/asteroid/airless
/turf/open/floor/plating/asteroid/airless/cave/has_data //subtype for producing a tunnel with given data
@@ -163,6 +180,48 @@
/turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data //subtype for producing a tunnel with given data
has_data = TRUE
/turf/open/floor/plating/asteroid/airless/cave/snow
gender = PLURAL
name = "snow"
desc = "Looks cold."
icon = 'icons/turf/snow.dmi'
baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon
icon_state = "snow"
icon_plating = "snow"
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
slowdown = 2
environment_type = "snow"
flags_1 = NONE
planetary_atmos = TRUE
burnt_states = list("snow_dug")
bullet_sizzle = TRUE
bullet_bounce_sound = null
digResult = /obj/item/stack/sheet/mineral/snow
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/wolf = 50, /obj/structure/spawner/ice_moon = 3, \
/mob/living/simple_animal/hostile/asteroid/polarbear = 30, /obj/structure/spawner/ice_moon/polarbear = 3, \
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10)
flora_spawn_list = list(/obj/structure/flora/tree/pine = 2, /obj/structure/flora/grass/both = 12)
terrain_spawn_list = list()
data_having_type = /turf/open/floor/plating/asteroid/airless/cave/snow/has_data
turf_type = /turf/open/floor/plating/asteroid/snow/icemoon
choose_turf_type = list(/turf/open/floor/plating/asteroid/snow/icemoon = 19, /turf/open/floor/plating/ice/icemoon = 1)
pick_tunnel_width = list("1" = 6, "2" = 1)
/turf/open/floor/plating/asteroid/airless/cave/snow/underground
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/ice_demon = 50, /obj/structure/spawner/ice_moon/demonic_portal = 3, \
/mob/living/simple_animal/hostile/asteroid/ice_whelp = 30, /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 3, \
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 3)
flora_spawn_list = list(/obj/structure/flora/rock/icy = 6, /obj/structure/flora/rock/pile/icy = 6)
data_having_type = /turf/open/floor/plating/asteroid/airless/cave/snow/underground/has_data
choose_turf_type = null
/turf/open/floor/plating/asteroid/airless/cave/snow/has_data //subtype for producing a tunnel with given data
has_data = TRUE
/turf/open/floor/plating/asteroid/airless/cave/snow/underground/has_data //subtype for producing a tunnel with given data
has_data = TRUE
/turf/open/floor/plating/asteroid/airless/cave/Initialize()
if (!mob_spawn_list)
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 1, /mob/living/simple_animal/hostile/asteroid/goliath = 5, /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3)
@@ -175,6 +234,7 @@
if(!has_data)
produce_tunnel_from_data()
/// Sets the tunnel length and direction
/turf/open/floor/plating/asteroid/airless/cave/proc/get_cave_data(set_length, exclude_dir = -1)
// If set_length (arg1) isn't defined, get a random length; otherwise assign our length to the length arg.
if(!set_length)
@@ -187,6 +247,7 @@
// Get the opposite direction of our facing direction
backward_cave_dir = angle2dir(dir2angle(forward_cave_dir) + 180)
/// Gets the tunnel length and direction then makes the tunnel
/turf/open/floor/plating/asteroid/airless/cave/proc/produce_tunnel_from_data(tunnel_length, excluded_dir = -1)
get_cave_data(tunnel_length, excluded_dir)
// Make our tunnels
@@ -196,10 +257,22 @@
// Kill ourselves by replacing ourselves with a normal floor.
SpawnFloor(src)
/**
* Makes the tunnel and spawns things inside of it
*
* Picks a tunnel width for the tunnel and then starts spawning turfs in the direction it moves in
* Can randomly change directions of the tunnel, stops if it hits the edge of the map, or a no tunnel area
* Can randomly make new tunnels out of itself
*
*/
/turf/open/floor/plating/asteroid/airless/cave/proc/make_tunnel(dir)
var/turf/closed/mineral/tunnel = src
var/next_angle = pick(45, -45)
var/tunnel_width = 1
if(pick_tunnel_width)
tunnel_width = text2num(pickweight(pick_tunnel_width))
for(var/i = 0; i < length; i++)
if(!sanity)
break
@@ -210,9 +283,11 @@
// Expand the edges of our tunnel
for(var/edge_angle in L)
var/turf/closed/mineral/edge = get_step(tunnel, angle2dir(dir2angle(dir) + edge_angle))
if(istype(edge))
SpawnFloor(edge)
var/turf/closed/mineral/edge = tunnel
for(var/current_tunnel_width = 1 to tunnel_width)
edge = get_step(edge, angle2dir(dir2angle(dir) + edge_angle))
if(istype(edge))
SpawnFloor(edge)
if(!sanity)
break
@@ -223,9 +298,12 @@
if(istype(tunnel))
// Small chance to have forks in our tunnel; otherwise dig our tunnel.
if(i > 3 && prob(20))
if(istype(tunnel.loc, /area/mine/explored) || (istype(tunnel.loc, /area/lavaland/surface/outdoors) && !istype(tunnel.loc, /area/lavaland/surface/outdoors/unexplored)))
sanity = 0
break
if(isarea(tunnel.loc))
var/area/A = tunnel.loc
if(!A.tunnel_allowed)
sanity = 0
break
var/turf/open/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type, null, CHANGETURF_IGNORE_AIR)
C.going_backwards = FALSE
C.produce_tunnel_from_data(rand(10, 15), dir)
@@ -241,26 +319,39 @@
setDir(angle2dir(dir2angle(dir) )+ next_angle)
/// Spawns the floor of the tunnel and any type of structure or mob it can have
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnFloor(turf/T)
for(var/S in RANGE_TURFS(1, src))
var/turf/NT = S
if(!NT || isspaceturf(NT) || istype(NT.loc, /area/mine/explored) || (istype(NT.loc, /area/lavaland/surface/outdoors) && !istype(NT.loc, /area/lavaland/surface/outdoors/unexplored)))
sanity = 0
break
if(!sanity)
if(!T)
sanity = 0
return
SpawnFlora(T)
SpawnMonster(T)
if(isarea(T.loc))
if(!A.tunnel_allowed)
sanity = 0
return
if(choose_turf_type)
turf_type = pickweight(choose_turf_type)
if(turf_type == initial(turf_type)) // Don't spawn different turf types under flora or terrain
var/spawned_flora = FALSE
var/spawned_terrain = FALSE
if(is_mining_level(z))
spawned_flora = SpawnFlora(T)
if(!spawned_flora && !spawned_terrain) // no rocks beneath mob spawners / mobs.
SpawnMonster(T)
T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
/// Spawns a random mob or megafauna in the tunnel
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
if(!isarea(loc))
return
var/area/A = loc
if(prob(30))
if(istype(loc, /area/mine/explored) || !istype(loc, /area/lavaland/surface/outdoors/unexplored))
if(!A.mob_spawn_allowed)
return
var/randumb = pickweight(mob_spawn_list)
if(!randumb)
return
while(randumb == SPAWN_MEGAFAUNA)
if(istype(loc, /area/lavaland/surface/outdoors/unexplored/danger)) //this is danger. it's boss time.
if(A.megafauna_spawn_allowed && megafauna_spawn_list && megafauna_spawn_list.len) //this is danger. it's boss time.
var/maybe_boss = pickweight(megafauna_spawn_list)
if(megafauna_spawn_list[maybe_boss])
randumb = maybe_boss
@@ -278,22 +369,26 @@
return //prevents tendrils spawning in each other's collapse range
new randumb(T)
return
return TRUE
#undef SPAWN_MEGAFAUNA
#undef SPAWN_BUBBLEGUM
/// Spawns a random flora in the tunnel, can spawn clumps of them.
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnFlora(turf/T)
if(prob(12))
if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored))
return
if(isarea(loc))
var/area/A = loc
if(!A.flora_allowed)
return
var/randumb = pickweight(flora_spawn_list)
for(var/obj/structure/flora/ash/F in range(4, T)) //Allows for growing patches, but not ridiculous stacks of flora
if(!randumb)
return
for(var/obj/structure/flora/F in range(4, T)) // Allows for growing patches, but not ridiculous stacks of flora
if(!istype(F, randumb))
return
new randumb(T)
return TRUE
/turf/open/floor/plating/asteroid/snow
gender = PLURAL
@@ -322,6 +417,15 @@
return TRUE
return FALSE
/turf/open/floor/plating/asteroid/snow/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/open/lava/plasma/ice_moon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
baseturfs = /turf/open/lava/plasma/ice_moon
planetary_atmos = TRUE
/turf/open/floor/plating/asteroid/snow/ice
name = "icy snow"
desc = "Looks colder."
@@ -336,6 +440,11 @@
clawfootstep = FOOTSTEP_HARD_CLAW
heavyfootstep = FOOTSTEP_GENERIC_HEAVY
/turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
planetary_atmos = TRUE
/turf/open/floor/plating/asteroid/snow/ice/burn_tile()
return FALSE
@@ -347,4 +456,4 @@
/turf/open/floor/plating/asteroid/snow/atmosphere
initial_gas_mix = FROZEN_ATMOS
planetary_atmos = FALSE
planetary_atmos = FALSE
@@ -3,6 +3,10 @@
icon_state = "plating"
initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/plating/icemoon
icon_state = "plating"
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/open/floor/plating/abductor
name = "alien floor"
icon_state = "alienpod1"
@@ -209,6 +213,8 @@
/turf/open/floor/plating/ice/burn_tile()
return
/turf/open/floor/plating/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/open/floor/plating/snowed
name = "snowed-over plating"
@@ -240,4 +246,6 @@
/turf/open/floor/plating/snowed/temperatre
temperature = 255.37
/turf/open/plating/snowed/smoothed/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
+217 -13
View File
@@ -147,6 +147,11 @@
var/mineralChance = 13
var/display_icon_state = "rock"
/turf/closed/mineral/random/more_caves
mineralSpawnChanceList = list(/obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10,
/obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40, /obj/item/stack/ore/titanium = 11,
/turf/closed/mineral/gibtonite = 4, /turf/open/floor/plating/asteroid/airless/cave = 15, /obj/item/stack/ore/bluespace_crystal = 1)
/turf/closed/mineral/random/Initialize()
mineralSpawnChanceList = typelist("mineralSpawnChanceList", mineralSpawnChanceList)
@@ -195,11 +200,27 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium/volcanic = 35, /turf/closed/mineral/diamond/volcanic = 30, /turf/closed/mineral/gold/volcanic = 45, /turf/closed/mineral/titanium/volcanic = 45,
/turf/closed/mineral/silver/volcanic = 50, /turf/closed/mineral/plasma/volcanic = 50, /turf/closed/mineral/bscrystal/volcanic = 20)
/turf/closed/mineral/random/high_chance/snow
name = "snowy mountainside"
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/mountain_wall.dmi'
icon_state = "mountainrock"
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/closed)
defer_change = TRUE
environment_type = "snow"
turf_type = /turf/open/floor/plating/asteroid/snow/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium/ice/icemoon = 35, /turf/closed/mineral/diamond/ice/icemoon = 30, /turf/closed/mineral/gold/ice/icemoon = 45, /turf/closed/mineral/titanium/ice/icemoon = 45,
/turf/closed/mineral/silver/ice/icemoon = 50, /turf/closed/mineral/plasma/ice/icemoon = 50, /turf/closed/mineral/bscrystal/ice/icemoon = 20)
/turf/closed/mineral/random/high_chance/earth_like
icon_state = "rock_highchance_oxy"
turf_type = /turf/open/floor/plating/asteroid
@@ -236,7 +257,7 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
mineralChance = 10
mineralSpawnChanceList = list(
@@ -244,6 +265,36 @@
/turf/closed/mineral/silver/volcanic = 12, /turf/closed/mineral/plasma/volcanic = 20, /turf/closed/mineral/iron/volcanic = 40,
/turf/closed/mineral/gibtonite/volcanic = 4, /turf/open/floor/plating/asteroid/airless/cave/volcanic = 1, /turf/closed/mineral/bscrystal/volcanic = 1)
/turf/closed/mineral/random/volcanic/more_caves
mineralSpawnChanceList = list(
/obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, /obj/item/stack/ore/titanium = 11,
/obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40,
/turf/closed/mineral/gibtonite/volcanic = 4, /turf/open/floor/plating/asteroid/airless/cave/volcanic = 15, /obj/item/stack/ore/bluespace_crystal = 1)
/turf/closed/mineral/random/snow
name = "snowy mountainside"
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/mountain_wall.dmi'
icon_state = "mountainrock"
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/closed)
defer_change = TRUE
environment_type = "snow"
turf_type = /turf/open/floor/plating/asteroid/snow/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
mineralChance = 10
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium/ice/icemoon = 5, /turf/closed/mineral/diamond/ice/icemoon = 1, /turf/closed/mineral/gold/ice/icemoon = 10, /turf/closed/mineral/titanium/ice/icemoon = 11,
/turf/closed/mineral/silver/ice/icemoon = 12, /turf/closed/mineral/plasma/ice/icemoon = 20, /turf/closed/mineral/iron/ice/icemoon = 40,
/turf/closed/mineral/gibtonite/ice/icemoon = 4, /turf/open/floor/plating/asteroid/airless/cave/snow = 1, /turf/closed/mineral/bscrystal/ice/icemoon = 1)
/turf/closed/mineral/random/snow/no_caves
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium/ice/icemoon = 5, /turf/closed/mineral/diamond/ice/icemoon = 1, /turf/closed/mineral/gold/ice/icemoon = 10, /turf/closed/mineral/titanium/ice/icemoon = 11,
/turf/closed/mineral/silver/ice/icemoon = 12, /turf/closed/mineral/plasma/ice/icemoon = 20, /turf/closed/mineral/iron/ice/icemoon = 40,
/turf/closed/mineral/gibtonite/ice/icemoon = 4, /turf/closed/mineral/bscrystal/ice/icemoon = 1)
/turf/closed/mineral/random/labormineral
mineralSpawnChanceList = list(
@@ -252,18 +303,51 @@
/turf/closed/mineral/gibtonite = 2)
icon_state = "rock_labor"
/turf/closed/mineral/random/snow/underground
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium/ice/icemoon = 5, /turf/closed/mineral/diamond/ice/icemoon = 1, /turf/closed/mineral/gold/ice/icemoon = 10, /turf/closed/mineral/titanium/ice/icemoon = 11,
/turf/closed/mineral/silver/ice/icemoon = 12, /turf/closed/mineral/plasma/ice/icemoon = 20, /turf/closed/mineral/iron/ice/icemoon = 40,
/turf/closed/mineral/gibtonite/ice/icemoon = 4, /turf/open/floor/plating/asteroid/airless/cave/snow/underground = 1, /turf/closed/mineral/bscrystal/ice/icemoon = 1)
/turf/closed/mineral/random/snow/more_caves
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium/ice/icemoon = 5, /turf/closed/mineral/diamond/ice/icemoon = 1, /turf/closed/mineral/gold/ice/icemoon = 10, /turf/closed/mineral/titanium/ice/icemoon = 11,
/turf/closed/mineral/silver/ice/icemoon = 12, /turf/closed/mineral/plasma/ice/icemoon = 20, /turf/closed/mineral/iron/ice/icemoon = 40,
/turf/closed/mineral/gibtonite/ice/icemoon = 4, /turf/open/floor/plating/asteroid/airless/cave/snow = 15, /turf/closed/mineral/bscrystal/ice/icemoon = 1)
/turf/closed/mineral/random/labormineral/volcanic
environment_type = "basalt"
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium/volcanic = 3, /turf/closed/mineral/diamond/volcanic = 1, /turf/closed/mineral/gold/volcanic = 8, /turf/closed/mineral/titanium/volcanic = 8,
/turf/closed/mineral/silver/volcanic = 20, /turf/closed/mineral/plasma/volcanic = 30, /turf/closed/mineral/bscrystal/volcanic = 1, /turf/closed/mineral/gibtonite/volcanic = 2,
/turf/closed/mineral/iron/volcanic = 95)
//Subtypes for placing ores manually.
/turf/closed/mineral/random/labormineral/ice
name = "snowy mountainside"
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/mountain_wall.dmi'
icon_state = "mountainrock"
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/closed)
defer_change = TRUE
environment_type = "snow"
turf_type = /turf/open/floor/plating/asteroid/snow/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
defer_change = TRUE
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium/ice/icemoon = 3, /turf/closed/mineral/diamond/ice/icemoon = 1, /turf/closed/mineral/gold/ice/icemoon = 8, /turf/closed/mineral/titanium/ice/icemoon = 8,
/turf/closed/mineral/silver/ice/icemoon = 20, /turf/closed/mineral/plasma/ice/icemoon = 30, /turf/closed/mineral/bscrystal/ice/icemoon = 1, /turf/closed/mineral/gibtonite/ice/icemoon = 2,
/turf/closed/mineral/iron/ice/icemoon = 95)
/turf/closed/mineral/iron
mineralType = /obj/item/stack/ore/iron
@@ -294,6 +378,11 @@
initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
/turf/closed/mineral/iron/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/closed/mineral/uranium
mineralType = /obj/item/stack/ore/uranium
@@ -306,7 +395,21 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
/turf/closed/mineral/uranium/ice
environment_type = "snow_cavern"
icon_state = "icerock_Uranium"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
/turf/closed/mineral/uranium/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/closed/mineral/uranium/earth_like
icon_state = "rock_oxy"
@@ -327,7 +430,7 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
/turf/closed/mineral/diamond/earth_like
icon_state = "rock_oxy"
@@ -345,6 +448,11 @@
initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
/turf/closed/mineral/diamond/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/closed/mineral/gold
mineralType = /obj/item/stack/ore/gold
@@ -357,7 +465,7 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
/turf/closed/mineral/gold/earth_like
icon_state = "rock_oxy"
@@ -366,6 +474,19 @@
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
defer_change = TRUE
/turf/closed/mineral/gold/ice
environment_type = "snow_cavern"
icon_state = "icerock_gold"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
/turf/closed/mineral/gold/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/closed/mineral/silver
mineralType = /obj/item/stack/ore/silver
@@ -378,7 +499,7 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
/turf/closed/mineral/silver/earth_like
icon_state = "rock_oxy"
@@ -387,6 +508,19 @@
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
defer_change = TRUE
/turf/closed/mineral/silver/ice
environment_type = "snow_cavern"
icon_state = "icerock_silver"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
/turf/closed/mineral/silver/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/closed/mineral/titanium
mineralType = /obj/item/stack/ore/titanium
@@ -399,7 +533,7 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
/turf/closed/mineral/titanium/earth_like
icon_state = "rock_oxy"
@@ -408,6 +542,19 @@
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
defer_change = TRUE
/turf/closed/mineral/titanium/ice
environment_type = "snow_cavern"
icon_state = "icerock_titanium"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
/turf/closed/mineral/titanium/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/closed/mineral/plasma
mineralType = /obj/item/stack/ore/plasma
@@ -420,7 +567,7 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
/turf/closed/mineral/plasma/earth_like
icon_state = "rock_oxy"
@@ -438,6 +585,10 @@
initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
/turf/closed/mineral/plasma/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/closed/mineral/bananium
@@ -454,6 +605,21 @@
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
defer_change = TRUE
/turf/closed/mineral/bananium/ice
environment_type = "snow_cavern"
icon_state = "icerock_Bananium"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
/turf/closed/mineral/bananium/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/closed/mineral/bscrystal
mineralType = /obj/item/stack/ore/bluespace_crystal
mineralAmt = 1
@@ -466,7 +632,7 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
/turf/closed/mineral/bscrystal/earth_like
icon_state = "rock_oxy"
@@ -475,6 +641,19 @@
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
defer_change = TRUE
/turf/closed/mineral/bscrystal/ice
environment_type = "snow_cavern"
icon_state = "icerock_BScrystal"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
/turf/closed/mineral/bscrystal/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/closed/mineral/volcanic
environment_type = "basalt"
@@ -486,7 +665,7 @@
environment_type = "basalt"
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
defer_change = 1
defer_change = TRUE
/turf/closed/mineral/earth_like
icon_state = "rock_oxy"
@@ -506,7 +685,7 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
environment_type = "waste"
turf_type = /turf/open/floor/plating/ashplanet/rocky
defer_change = 1
defer_change = TRUE
/turf/closed/mineral/snowmountain
name = "snowy mountainside"
@@ -521,6 +700,11 @@
turf_type = /turf/open/floor/plating/asteroid/snow
defer_change = TRUE
/turf/closed/mineral/snowmountain/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/closed/mineral/snowmountain/cavern
name = "ice cavern rock"
icon = 'icons/turf/mining.dmi'
@@ -532,6 +716,11 @@
environment_type = "snow_cavern"
turf_type = /turf/open/floor/plating/asteroid/snow/ice
/turf/closed/mineral/snowmountain/cavern/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
//GIBTONITE
/turf/closed/mineral/gibtonite
@@ -634,7 +823,7 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
defer_change = TRUE
/turf/closed/mineral/gibtonite/earth_like
icon_state = "rock_oxy"
@@ -642,3 +831,18 @@
baseturfs = /turf/open/floor/plating/asteroid
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
defer_change = TRUE
/turf/closed/mineral/gibtonite/ice
environment_type = "snow_cavern"
icon_state = "icerock_Gibtonite"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
/turf/closed/mineral/gibtonite/ice/icemoon
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
+8 -1
View File
@@ -705,10 +705,17 @@
var/list/names = list()
names += "---- Space Ruins ----"
for(var/name in SSmapping.space_ruins_templates)
names[name] = list(SSmapping.space_ruins_templates[name], ZTRAIT_SPACE_RUINS, /area/space)
names[name] = list(SSmapping.space_ruins_templates[name], ZTRAIT_SPACE_RUINS, list(/area/space))
names += "---- Lava Ruins ----"
for(var/name in SSmapping.lava_ruins_templates)
names[name] = list(SSmapping.lava_ruins_templates[name], ZTRAIT_LAVA_RUINS, /area/lavaland/surface/outdoors/unexplored)
names[name] = list(SSmapping.lava_ruins_templates[name], ZTRAIT_LAVA_RUINS, list(/area/lavaland/surface/outdoors/unexplored))
names += "---- Ice Ruins ----"
for(var/name in SSmapping.ice_ruins_templates)
names[name] = list(SSmapping.ice_ruins_templates[name], ZTRAIT_ICE_RUINS, list(/area/icemoon/surface/outdoors/unexplored, /area/icemoon/underground/unexplored))
names += "---- Ice Underground Ruins ----"
for(var/name in SSmapping.ice_ruins_underground_templates)
names[name] = list(SSmapping.ice_ruins_underground_templates[name], ZTRAIT_ICE_RUINS_UNDERGROUND, list(/area/icemoon/underground/unexplored))
var/ruinname = input("Select ruin", "Spawn Ruin") as null|anything in names
var/data = names[ruinname]
@@ -143,6 +143,13 @@
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
/obj/item/clothing/shoes/winterboots/ice_boots
name = "ice hiking boots"
desc = "A pair of winter boots with special grips on the bottom, designed to prevent slipping on frozen surfaces."
icon_state = "iceboots"
item_state = "iceboots"
clothing_flags = NOSLIP_ICE
/obj/item/clothing/shoes/winterboots/christmasbootsr
name = "red christmas boots"
desc = "A pair of fluffy red christmas boots!"
+11 -3
View File
@@ -11,9 +11,17 @@
for(var/turf/check in get_affected_turfs(central_turf,1))
var/area/new_area = get_area(check)
if(!(istype(new_area, allowed_areas)) || check.flags_1 & NO_RUINS_1)
valid = FALSE
valid = FALSE // set to false before we check
if(check.flags_1 & NO_RUINS_1)
break
for(var/type in allowed_areas)
if(istype(new_area, type)) // it's at least one of our types so it's whitelisted
valid = TRUE
break
if(!valid)
break
if(!valid)
continue
@@ -51,7 +59,7 @@
new /obj/effect/landmark/ruin(center, src)
return center
/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins)
/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = list(/area/space), list/potentialRuins)
if(!z_levels || !z_levels.len)
WARNING("No Z levels provided - Not generating ruins")
return
@@ -22,13 +22,18 @@
/mob/living/carbon/human/slip(knockdown_amount, obj/O, lube)
if(HAS_TRAIT(src, TRAIT_NOSLIPALL))
return 0
if (!(lube&GALOSHES_DONT_HELP))
if (!(lube & GALOSHES_DONT_HELP))
if(HAS_TRAIT(src, TRAIT_NOSLIPWATER))
return 0
if(shoes && istype(shoes, /obj/item/clothing))
var/obj/item/clothing/CS = shoes
if (CS.clothing_flags & NOSLIP)
return 0
if (lube & SLIDE_ICE)
if(shoes && istype(shoes, /obj/item/clothing))
var/obj/item/clothing/CS = shoes
if (CS.clothing_flags & NOSLIP_ICE)
return FALSE
return ..()
/mob/living/carbon/human/experience_pressure_difference()
@@ -265,4 +265,12 @@ Difficulty: Medium
desc = "The sweet blood, oh, it sings to me."
invisibility = 100
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom
name = "hostile-environment miner"
desc = "A miner destined to hop across dimensions for all eternity, hunting anomalous creatures."
speed = 8
move_to_delay = 8
ranged_cooldown_time = 8
dash_cooldown = 8
#undef MINER_DASH_RANGE
@@ -0,0 +1,365 @@
/*
Difficulty: Extremely Hard
*/
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner
name = "demonic-frost miner"
desc = "An extremely geared miner, driven crazy or possessed by the demonic forces here, either way a terrifying enemy."
health = 1500
maxHealth = 1500
icon_state = "demonic_miner"
icon_living = "demonic_miner"
icon = 'icons/mob/icemoon/icemoon_monsters.dmi'
attack_verb_continuous = "pummels"
attack_verb_simple = "pummels"
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
light_color = "#E4C7C5"
movement_type = GROUND
weather_immunities = list("snow")
speak_emote = list("roars")
armour_penetration = 100
melee_damage_lower = 10
melee_damage_upper = 10
aggro_vision_range = 18 // large vision range so combat doesn't abruptly end when someone runs a bit away
rapid_melee = 4
speed = 20
move_to_delay = 20
ranged = TRUE
crusher_loot = list(/obj/effect/decal/remains/plasma, /obj/item/crusher_trophy/ice_block_talisman)
loot = list(/obj/effect/decal/remains/plasma)
wander = FALSE
del_on_death = TRUE
blood_volume = BLOOD_VOLUME_NORMAL
achievement_type = /datum/award/achievement/boss/demonic_miner_kill
crusher_achievement_type = /datum/award/achievement/boss/demonic_miner_crusher
score_achievement_type = /datum/award/score/demonic_miner_score
deathmessage = "falls to the ground, decaying into plasma particles."
deathsound = "bodyfall"
footstep_type = FOOTSTEP_MOB_HEAVY
attack_action_types = list(/datum/action/innate/megafauna_attack/frost_orbs,
/datum/action/innate/megafauna_attack/snowball_machine_gun,
/datum/action/innate/megafauna_attack/ice_shotgun)
/// Modifies the speed of the projectiles the demonic frost miner shoots out
var/projectile_speed_multiplier = 1
/// If the demonic frost miner is in its enraged state
var/enraged = FALSE
/// If the demonic frost miner is currently transforming to its enraged state
var/enraging = FALSE
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Initialize()
. = ..()
AddComponent(/datum/component/knockback, 7, FALSE, TRUE)
AddComponent(/datum/component/lifesteal, 50)
/datum/action/innate/megafauna_attack/frost_orbs
name = "Fire Frost Orbs"
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "sniper_zoom"
chosen_message = "<span class='colossus'>You are now sending out frost orbs to track in on a target.</span>"
chosen_attack_num = 1
/datum/action/innate/megafauna_attack/snowball_machine_gun
name = "Fire Snowball Machine Gun"
icon_icon = 'icons/obj/guns/energy.dmi'
button_icon_state = "kineticgun"
chosen_message = "<span class='colossus'>You are now firing a snowball machine gun at a target.</span>"
chosen_attack_num = 2
/datum/action/innate/megafauna_attack/ice_shotgun
name = "Fire Ice Shotgun"
icon_icon = 'icons/obj/guns/projectile.dmi'
button_icon_state = "shotgun"
chosen_message = "<span class='colossus'>You are now firing shotgun ice blasts.</span>"
chosen_attack_num = 3
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/OpenFire()
check_enraged()
projectile_speed_multiplier = 1 - enraged * 0.25
SetRecoveryTime(100, 100)
if(client)
switch(chosen_attack)
if(1)
frost_orbs()
if(2)
snowball_machine_gun()
if(3)
ice_shotgun()
return
var/easy_attack = prob(80 - enraged * 40)
chosen_attack = rand(1, 3)
switch(chosen_attack)
if(1)
if(easy_attack)
frost_orbs(10, 8)
else
frost_orbs(5, 16)
if(2)
if(easy_attack)
snowball_machine_gun()
else
INVOKE_ASYNC(src, .proc/ice_shotgun, 5, list(list(-180, -140, -100, -60, -20, 20, 60, 100, 140), list(-160, -120, -80, -40, 0, 40, 80, 120, 160)))
snowball_machine_gun(5 * 8, 5)
if(3)
if(easy_attack)
ice_shotgun()
else
ice_shotgun(5, list(list(0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330), list(-30, -15, 0, 15, 30)))
/obj/projectile/frost_orb
name = "frost orb"
icon_state = "ice_1"
damage = 20
armour_penetration = 100
speed = 10
homing_turn_speed = 30
damage_type = BURN
/obj/projectile/frost_orb/on_hit(atom/target, blocked = FALSE)
. = ..()
if(isturf(target) || isobj(target))
target.ex_act(EXPLODE_HEAVY)
/obj/projectile/snowball
name = "machine-gun snowball"
icon_state = "nuclear_particle"
damage = 5
armour_penetration = 100
speed = 4
damage_type = BRUTE
/obj/projectile/ice_blast
name = "ice blast"
icon_state = "ice_2"
damage = 15
armour_penetration = 100
speed = 4
damage_type = BRUTE
/obj/projectile/ice_blast/on_hit(atom/target, blocked = FALSE)
. = ..()
if(isturf(target) || isobj(target))
target.ex_act(EXPLODE_HEAVY)
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/ex_act(severity, target)
adjustBruteLoss(30 * severity - 120)
visible_message("<span class='danger'>[src] absorbs the explosion!</span>", "<span class='userdanger'>You absorb the explosion!</span>")
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Goto(target, delay, minimum_distance)
if(enraging)
return
return ..()
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/MoveToTarget(list/possible_targets)
if(enraging)
return
return ..()
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Move()
if(enraging)
return
return ..()
/// Shoots out homing frost orbs that explode into ice blast projectiles after a couple seconds
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/frost_orbs(added_delay = 10, shoot_times = 8)
for(var/i in 1 to shoot_times)
var/turf/startloc = get_turf(src)
var/turf/endloc = get_turf(target)
if(!endloc)
break
var/obj/projectile/frost_orb/P = new(startloc)
P.preparePixelProjectile(endloc, startloc)
P.firer = src
if(target)
P.original = target
P.set_homing_target(target)
P.fire(rand(0, 360))
addtimer(CALLBACK(P, /obj/projectile/frost_orb/proc/orb_explosion, projectile_speed_multiplier), 20) // make the orbs home in after a second
SLEEP_CHECK_DEATH(added_delay)
SetRecoveryTime(40, 60)
/// Called when the orb is exploding, shoots out projectiles
/obj/projectile/frost_orb/proc/orb_explosion(projectile_speed_multiplier)
for(var/i in 0 to 5)
var/angle = i * 60
var/turf/startloc = get_turf(src)
var/turf/endloc = get_turf(original)
if(!startloc || !endloc)
break
var/obj/projectile/ice_blast/P = new(startloc)
P.speed *= projectile_speed_multiplier
P.preparePixelProjectile(endloc, startloc, null, angle + rand(-10, 10))
P.firer = firer
if(original)
P.original = original
P.fire()
qdel(src)
/// Shoots out snowballs with a random spread
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/snowball_machine_gun(shots = 60, spread = 45)
for(var/i in 1 to shots)
var/turf/startloc = get_turf(src)
var/turf/endloc = get_turf(target)
if(!endloc)
break
var/obj/projectile/P = new /obj/projectile/snowball(startloc)
P.speed *= projectile_speed_multiplier
P.preparePixelProjectile(endloc, startloc, null, rand(-spread, spread))
P.firer = src
if(target)
P.original = target
P.fire()
SLEEP_CHECK_DEATH(1)
SetRecoveryTime(15, 15)
/// Shoots out ice blasts in a shotgun like pattern
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/ice_shotgun(shots = 5, list/patterns = list(list(-40, -20, 0, 20, 40), list(-30, -10, 10, 30)))
for(var/i in 1 to shots)
var/list/pattern = patterns[i % length(patterns) + 1] // alternating patterns
for(var/spread in pattern)
var/turf/startloc = get_turf(src)
var/turf/endloc = get_turf(target)
if(!endloc)
break
var/obj/projectile/P = new /obj/projectile/ice_blast(startloc)
P.speed *= projectile_speed_multiplier
P.preparePixelProjectile(endloc, startloc, null, spread)
P.firer = src
if(target)
P.original = target
P.fire()
SLEEP_CHECK_DEATH(8)
SetRecoveryTime(15, 20)
/// Checks if the demonic frost miner is ready to be enraged
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/check_enraged()
if(enraged)
return
if(health > maxHealth*0.25)
return
SetRecoveryTime(80, 80)
adjustHealth(-maxHealth)
enraged = TRUE
enraging = TRUE
animate(src, pixel_y = pixel_y + 96, time = 100, easing = ELASTIC_EASING)
spin(100, 10)
SLEEP_CHECK_DEATH(60)
playsound(src, 'sound/effects/explosion3.ogg', 100, TRUE)
icon_state = "demonic_miner_phase2"
animate(src, pixel_y = pixel_y - 96, time = 8, flags = ANIMATION_END_NOW)
spin(8, 2)
SLEEP_CHECK_DEATH(8)
for(var/mob/living/L in viewers(src))
shake_camera(L, 3, 2)
playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE)
setMovetype(movement_type | FLYING)
enraging = FALSE
adjustHealth(-maxHealth)
/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/death(gibbed, list/force_grant)
if(health > 0)
return
var/turf/T = get_turf(src)
var/loot = rand(1, 3)
switch(loot)
if(1)
new /obj/item/resurrection_crystal(T)
if(2)
new /obj/item/clothing/shoes/winterboots/ice_boots/speedy(T)
if(3)
new /obj/item/pickaxe/drill/jackhammer/demonic(T)
return ..()
/obj/item/resurrection_crystal
name = "resurrection crystal"
desc = "When used by anything holding it, this crystal gives them a second chance at life if they die."
icon = 'icons/obj/objects.dmi'
icon_state = "demonic_crystal"
/obj/item/resurrection_crystal/attack_self(mob/living/user)
if(!iscarbon(user))
to_chat(user, "<span class='notice'>A dark presence stops you from absorbing the crystal.</span>")
return
forceMove(user)
to_chat(user, "<span class='notice'>You feel a bit safer... but a demonic presence lurks in the back of your head...</span>")
RegisterSignal(user, COMSIG_MOB_DEATH, .proc/resurrect)
/// Resurrects the target when they die by cloning them into a new duplicate body and transferring their mind to the clone on a safe station turf
/obj/item/resurrection_crystal/proc/resurrect(mob/living/carbon/user, gibbed)
user.visible_message("<span class='notice'>You see [user]'s soul dragged out of their body!</span>", "<span class='notice'>You feel your soul dragged away to a fresh body!</span>")
var/typepath = user.type
var/turf/T = find_safe_turf()
var/mob/living/carbon/clone = new typepath(T)
clone.real_name = user.real_name
user.dna.transfer_identity(clone)
clone.updateappearance(mutcolor_update=1)
user.mind.transfer_to(clone) // second life
to_chat(clone, "<span class='notice'>You blink and find yourself in [get_area_name(T)].</span>")
user.gib()
qdel(src)
/obj/item/clothing/shoes/winterboots/ice_boots/speedy
name = "cursed ice hiking boots"
desc = "A pair of winter boots contractually made by a devil, they cannot be taken off once put on."
slowdown = SHOES_SPEED_SLIGHT
/obj/item/clothing/shoes/winterboots/ice_boots/speedy/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
/obj/item/pickaxe/drill/jackhammer/demonic
name = "demonic jackhammer"
desc = "Cracks rocks at an inhuman speed, as well as being enhanced for combat purposes."
toolspeed = 0
/obj/item/pickaxe/drill/jackhammer/demonic/Initialize()
. = ..()
AddComponent(/datum/component/knockback, 4, FALSE, TRUE)
AddComponent(/datum/component/lifesteal, 5)
/obj/item/crusher_trophy/ice_block_talisman
name = "ice block talisman"
desc = "A glowing trinket that a demonic miner had on him, it seems he couldn't utilize it for whatever reason."
icon_state = "ice_trap_talisman"
denied_type = /obj/item/crusher_trophy/ice_block_talisman
/obj/item/crusher_trophy/ice_block_talisman/effect_desc()
return "mark detonation to freeze a creature in a block of ice for a period, preventing them from moving"
/obj/item/crusher_trophy/ice_block_talisman/on_mark_detonation(mob/living/target, mob/living/user)
target.apply_status_effect(/datum/status_effect/ice_block_talisman)
/datum/status_effect/ice_block_talisman
id = "ice_block_talisman"
duration = 25
status_type = STATUS_EFFECT_REFRESH
alert_type = /obj/screen/alert/status_effect/ice_block_talisman
/// Stored icon overlay for the hit mob, removed when effect is removed
var/icon/cube
/obj/screen/alert/status_effect/ice_block_talisman
name = "Frozen Solid"
desc = "You're frozen inside an ice cube, and cannot move!"
icon_state = "frozen"
/datum/status_effect/ice_block_talisman/on_apply()
RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, .proc/owner_moved)
if(!owner.stat)
to_chat(owner, "<span class='userdanger'>You become frozen in a cube!</span>")
cube = icon('icons/effects/freeze.dmi', "ice_cube")
var/icon/size_check = icon(owner.icon, owner.icon_state)
cube.Scale(size_check.Width(), size_check.Height())
owner.add_overlay(cube)
return ..()
/// Blocks movement from the status effect owner
/datum/status_effect/ice_block_talisman/proc/owner_moved()
return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
/datum/status_effect/ice_block_talisman/on_remove()
if(!owner.stat)
to_chat(owner, "<span class='notice'>The cube melts!</span>")
owner.cut_overlay(cube)
UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
@@ -27,12 +27,18 @@
mob_size = MOB_SIZE_LARGE
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1
/// Crusher loot dropped when fauna killed with a crusher
var/list/crusher_loot
var/medal_type
/// Score given to players when the fauna is killed
var/score_type = BOSS_SCORE
/// If the megafauna is actually killed (vs entering another phase)
var/elimination = 0
/// Modifies attacks when at lower health
var/anger_modifier = 0
/// Internal tracking GPS inside fauna
var/obj/item/gps/internal
/// Next time fauna can use a melee attack
var/recovery_time = 0
/mob/living/simple_animal/hostile/megafauna/Initialize(mapload)
@@ -0,0 +1,208 @@
/*
Difficulty: Hard
*/
/mob/living/simple_animal/hostile/megafauna/wendigo
name = "wendigo"
desc = "A mythological man-eating legendary creature, you probably aren't going to survive this."
health = 2500
maxHealth = 2500
icon_state = "wendigo"
icon_living = "wendigo"
icon_dead = "wendigo_dead"
icon = 'icons/mob/icemoon/64x64megafauna.dmi'
attack_verb_continuous = "claws"
attack_verb_simple = "claw"
attack_sound = 'sound/magic/demon_attack1.ogg'
weather_immunities = list("snow")
speak_emote = list("roars")
armour_penetration = 40
melee_damage_lower = 40
melee_damage_upper = 40
vision_range = 9
aggro_vision_range = 18 // man-eating for a reason
speed = 8
move_to_delay = 8
rapid_melee = 16 // every 1/8 second
melee_queue_distance = 20 // as far as possible really, need this because of charging and teleports
ranged = TRUE
pixel_x = -16
loot = list()
butcher_results = list()
guaranteed_butcher_results = list(/obj/item/wendigo_blood)
crusher_loot = list(/obj/item/wendigo_blood, /obj/item/crusher_trophy/demon_claws)
wander = FALSE
del_on_death = FALSE
blood_volume = BLOOD_VOLUME_NORMAL
achievement_type = /datum/award/achievement/boss/wendigo_kill
crusher_achievement_type = /datum/award/achievement/boss/wendigo_crusher
score_achievement_type = /datum/award/score/wendigo_score
deathmessage = "falls, shaking the ground around it"
deathsound = 'sound/effects/gravhit.ogg'
footstep_type = FOOTSTEP_MOB_HEAVY
attack_action_types = list(/datum/action/innate/megafauna_attack/heavy_stomp,
/datum/action/innate/megafauna_attack/teleport,
/datum/action/innate/megafauna_attack/disorienting_scream)
/// Saves the turf the megafauna was created at (spawns exit portal here)
var/turf/starting
/// Range for wendigo stomping when it moves
var/stomp_range = 1
/// Stores directions the mob is moving, then calls that a move has fully ended when these directions are removed in moved
var/stored_move_dirs = 0
/// If the wendigo is allowed to move
var/can_move = TRUE
/datum/action/innate/megafauna_attack/heavy_stomp
name = "Heavy Stomp"
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "sniper_zoom"
chosen_message = "<span class='colossus'>You are now stomping the ground around you.</span>"
chosen_attack_num = 1
/datum/action/innate/megafauna_attack/teleport
name = "Teleport"
icon_icon = 'icons/effects/bubblegum.dmi'
button_icon_state = "smack ya one"
chosen_message = "<span class='colossus'>You are now teleporting at the target you click on.</span>"
chosen_attack_num = 2
/datum/action/innate/megafauna_attack/disorienting_scream
name = "Disorienting Scream"
icon_icon = 'icons/turf/walls/wall.dmi'
button_icon_state = "wall"
chosen_message = "<span class='colossus'>You are now screeching, disorienting targets around you.</span>"
chosen_attack_num = 3
/mob/living/simple_animal/hostile/megafauna/wendigo/Initialize()
. = ..()
starting = get_turf(src)
/mob/living/simple_animal/hostile/megafauna/wendigo/OpenFire()
SetRecoveryTime(0, 100)
if(health <= maxHealth*0.5)
stomp_range = 2
speed = 6
move_to_delay = 6
else
stomp_range = initial(stomp_range)
speed = initial(speed)
move_to_delay = initial(move_to_delay)
if(client)
switch(chosen_attack)
if(1)
heavy_stomp()
if(2)
teleport()
if(3)
disorienting_scream()
return
chosen_attack = rand(1, 3)
switch(chosen_attack)
if(1)
heavy_stomp()
if(2)
teleport()
if(3)
disorienting_scream()
/mob/living/simple_animal/hostile/megafauna/wendigo/Move(atom/newloc, direct)
if(!can_move)
return
stored_move_dirs |= direct
return ..()
/mob/living/simple_animal/hostile/megafauna/wendigo/Moved(atom/oldloc, direct)
. = ..()
stored_move_dirs &= ~direct
if(!stored_move_dirs)
INVOKE_ASYNC(src, .proc/ground_slam, stomp_range, 1)
/// Slams the ground around the wendigo throwing back enemies caught nearby
/mob/living/simple_animal/hostile/megafauna/wendigo/proc/ground_slam(range, delay)
var/turf/orgin = get_turf(src)
var/list/all_turfs = RANGE_TURFS(range, orgin)
for(var/i = 0 to range)
for(var/turf/T in all_turfs)
if(get_dist(orgin, T) > i)
continue
playsound(T,'sound/effects/bamf.ogg', 600, TRUE, 10)
new /obj/effect/temp_visual/small_smoke/halfsecond(T)
for(var/mob/living/L in T)
if(L == src || L.throwing)
continue
to_chat(L, "<span class='userdanger'>[src]'s ground slam shockwave sends you flying!</span>")
var/turf/thrownat = get_ranged_target_turf_direct(src, L, 8, rand(-10, 10))
L.throw_at(thrownat, 8, 2, src, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE)
L.apply_damage(20, BRUTE)
shake_camera(L, 2, 1)
all_turfs -= T
sleep(delay)
/// Larger but slower ground stomp
/mob/living/simple_animal/hostile/megafauna/wendigo/proc/heavy_stomp()
can_move = FALSE
ground_slam(5, 2)
SetRecoveryTime(0, 0)
can_move = TRUE
/// Teleports to a location 4 turfs away from the enemy in view
/mob/living/simple_animal/hostile/megafauna/wendigo/proc/teleport()
var/list/possible_ends = list()
for(var/turf/T in view(4, target.loc) - view(3, target.loc))
if(isclosedturf(T))
continue
possible_ends |= T
var/turf/end = pick(possible_ends)
do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
SetRecoveryTime(20, 0)
/// Shakes all nearby enemies screens and animates the wendigo shaking up and down
/mob/living/simple_animal/hostile/megafauna/wendigo/proc/disorienting_scream()
can_move = FALSE
playsound(src, 'sound/magic/demon_dies.ogg', 600, FALSE, 10)
animate(src, pixel_z = rand(5, 15), time = 1, loop = 6)
animate(pixel_z = 0, time = 1)
for(var/mob/living/L in get_hearers_in_view(7, src) - src)
shake_camera(L, 120, 2)
to_chat(L, "<span class='danger'>The wendigo screams loudly!</span>")
SetRecoveryTime(30, 0)
SLEEP_CHECK_DEATH(12)
can_move = TRUE
return
/mob/living/simple_animal/hostile/megafauna/wendigo/death(gibbed, list/force_grant)
if(health > 0)
return
var/obj/effect/portal/permanent/one_way/exit = new /obj/effect/portal/permanent/one_way(starting)
exit.id = "wendigo arena exit"
exit.add_atom_colour(COLOR_RED_LIGHT, ADMIN_COLOUR_PRIORITY)
exit.set_light(20, 1, LIGHT_COLOR_RED)
return ..()
/obj/item/wendigo_blood
name = "bottle of wendigo blood"
desc = "You're not actually going to drink this, are you?"
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
/obj/item/wendigo_blood/attack_self(mob/living/user)
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
if(!H.mind)
return
to_chat(H, "<span class='danger'>Power courses through you! You can now shift your form at will.</span>")
var/obj/effect/proc_holder/spell/targeted/shapeshift/polar_bear/P = new
H.mind.AddSpell(P)
playsound(H.loc,'sound/items/drink.ogg', rand(10,50), TRUE)
qdel(src)
/obj/effect/proc_holder/spell/targeted/shapeshift/polar_bear
name = "Polar Bear Form"
desc = "Take on the shape of a polar bear."
invocation = "RAAAAAAAAWR!"
convert_damage = FALSE
shapeshift_type = /mob/living/simple_animal/hostile/asteroid/polarbear
@@ -424,3 +424,26 @@
l_pocket = /obj/item/reagent_containers/food/drinks/soda_cans/buzz_fuzz
mask = /obj/item/clothing/mask/rat/bee
. = ..()
// Snow Legion
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow
name = "snow legion"
desc = "You can still see what was once a human under the shifting snowy mass, clearly decorated by a clown."
icon = 'icons/mob/icemoon/icemoon_monsters.dmi'
icon_state = "snowlegion"
icon_living = "snowlegion"
icon_aggro = "snowlegion_alive"
icon_dead = "snowlegion"
crusher_loot = /obj/item/crusher_trophy/legion_skull
loot = list(/obj/item/organ/regenerative_core/legion)
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow
// Snow Legion skull
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow
name = "snow legion"
desc = "One of many."
icon = 'icons/mob/icemoon/icemoon_monsters.dmi'
icon_state = "snowlegion_head"
icon_living = "snowlegion_head"
icon_aggro = "snowlegion_head"
icon_dead = "snowlegion_head"
@@ -0,0 +1,78 @@
/mob/living/simple_animal/hostile/asteroid/ice_demon
name = "demonic watcher"
desc = "A creature formed entirely out of ice, bluespace energy emanates from inside of it."
icon = 'icons/mob/icemoon/icemoon_monsters.dmi'
icon_state = "ice_demon"
icon_living = "ice_demon"
icon_dead = "ice_demon_dead"
icon_gib = "syndicate_gib"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
speak_emote = list("telepathically cries")
speed = 2
move_to_delay = 2
projectiletype = /obj/projectile/temp/basilisk/ice
projectilesound = 'sound/weapons/pierce.ogg'
ranged = TRUE
ranged_message = "manifests ice"
ranged_cooldown_time = 30
minimum_distance = 3
retreat_distance = 3
maxHealth = 150
health = 150
obj_damage = 40
melee_damage_lower = 15
melee_damage_upper = 15
attack_verb_continuous = "slices"
attack_verb_simple = "slice"
attack_sound = 'sound/weapons/bladeslice.ogg'
vision_range = 9
aggro_vision_range = 9
move_force = MOVE_FORCE_VERY_STRONG
move_resist = MOVE_FORCE_VERY_STRONG
pull_force = MOVE_FORCE_VERY_STRONG
del_on_death = TRUE
loot = list(/obj/item/stack/ore/bluespace_crystal = 3)
crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing
deathmessage = "fades as the energies that tied it to this world dissipate."
deathsound = 'sound/magic/demon_dies.ogg'
stat_attack = UNCONSCIOUS
movement_type = FLYING
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
/// Distance the demon will teleport from the target
var/teleport_distance = 3
/obj/projectile/temp/basilisk/ice
name = "ice blast"
damage = 5
nodamage = FALSE
temperature = -75
/mob/living/simple_animal/hostile/asteroid/ice_demon/OpenFire()
if(teleport_distance <= 0)
return ..()
var/list/possible_ends = list()
for(var/turf/T in view(teleport_distance, target.loc) - view(teleport_distance - 1, target.loc))
if(isclosedturf(T))
continue
possible_ends |= T
var/turf/end = pick(possible_ends)
do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
SLEEP_CHECK_DEATH(8)
return ..()
/mob/living/simple_animal/hostile/asteroid/ice_demon/Life()
. = ..()
if(!. || target)
return
adjustHealth(-maxHealth*0.025)
/mob/living/simple_animal/hostile/asteroid/ice_demon/death(gibbed)
move_force = MOVE_FORCE_DEFAULT
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
var/turf/T = get_turf(src)
if(T && prob(5))
new /obj/item/assembly/signaler/anomaly/bluespace(T)
return ..()
@@ -0,0 +1,57 @@
/mob/living/simple_animal/hostile/asteroid/ice_whelp
name = "ice whelp"
desc = "The offspring of an ice drake, weak in comparison but still terrifying."
icon = 'icons/mob/icemoon/icemoon_monsters.dmi'
icon_state = "ice_whelp"
icon_living = "ice_whelp"
icon_dead = "ice_whelp_dead"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
friendly_verb_continuous = "stares down"
friendly_verb_simple = "stare down"
speak_emote = list("roars")
speed = 30
move_to_delay = 30
ranged = TRUE
ranged_cooldown_time = 40
maxHealth = 350
health = 350
obj_damage = 40
armour_penetration = 20
melee_damage_lower = 20
melee_damage_upper = 20
attack_verb_continuous = "chomps"
attack_verb_simple = "chomp"
attack_sound = 'sound/magic/demon_attack1.ogg'
vision_range = 9
aggro_vision_range = 9
move_force = MOVE_FORCE_VERY_STRONG
move_resist = MOVE_FORCE_VERY_STRONG
pull_force = MOVE_FORCE_VERY_STRONG
butcher_results = list(/obj/item/stack/ore/diamond = 3, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 10, /obj/item/stack/sheet/animalhide/ashdrake = 1)
loot = list()
crusher_loot = /obj/item/crusher_trophy/tail_spike
deathmessage = "collapses on it's side."
deathsound = 'sound/magic/demon_dies.ogg'
stat_attack = UNCONSCIOUS
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
/// How far the whelps fire can go
var/fire_range = 4
/mob/living/simple_animal/hostile/asteroid/ice_whelp/OpenFire()
var/turf/T = get_ranged_target_turf_direct(src, target, fire_range)
var/list/burn_turfs = getline(src, T) - get_turf(src)
dragon_fire_line(src, burn_turfs)
/mob/living/simple_animal/hostile/asteroid/ice_whelp/Life()
. = ..()
if(!. || target)
return
adjustHealth(-maxHealth*0.025)
/mob/living/simple_animal/hostile/asteroid/ice_whelp/death(gibbed)
move_force = MOVE_FORCE_DEFAULT
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
return ..()
@@ -28,7 +28,7 @@
/mob/living/simple_animal/hostile/asteroid/Aggro()
..()
if(vision_range != aggro_vision_range)
if(vision_range == aggro_vision_range && icon_aggro)
icon_state = icon_aggro
/mob/living/simple_animal/hostile/asteroid/LoseAggro()
@@ -0,0 +1,59 @@
/mob/living/simple_animal/hostile/asteroid/polarbear
name = "polar bear"
desc = "An aggressive animal that defends it's territory with incredible power. These beasts don't run from their enemies."
icon = 'icons/mob/icemoon/icemoon_monsters.dmi'
icon_state = "polarbear"
icon_living = "polarbear"
icon_dead = "polarbear_dead"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
friendly_verb_continuous = "growls at"
friendly_verb_simple = "growl at"
speak_emote = list("growls")
speed = 12
move_to_delay = 12
maxHealth = 300
health = 300
obj_damage = 40
melee_damage_lower = 25
melee_damage_upper = 25
attack_verb_continuous = "claws"
attack_verb_simple = "claw"
attack_sound = 'sound/weapons/bladeslice.ogg'
vision_range = 2 // don't aggro unless you basically antagonize it, though they will kill you worse than a goliath will
aggro_vision_range = 9
move_force = MOVE_FORCE_VERY_STRONG
move_resist = MOVE_FORCE_VERY_STRONG
pull_force = MOVE_FORCE_VERY_STRONG
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/bear = 3, /obj/item/stack/sheet/bone = 2)
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 1)
loot = list()
crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
stat_attack = UNCONSCIOUS
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
/// Message for when the polar bear starts to attack faster
var/aggressive_message_said = FALSE
/mob/living/simple_animal/hostile/asteroid/polarbear/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()
if(health > maxHealth*0.5)
rapid_melee = initial(rapid_melee)
return
if(!aggressive_message_said && target)
visible_message("<span class='danger'>The [name] gets an enraged look at [target]!</span>")
aggressive_message_said = TRUE
rapid_melee = 2
/mob/living/simple_animal/hostile/asteroid/polarbear/Life()
. = ..()
if(!. || target)
return
adjustHealth(-maxHealth*0.025)
aggressive_message_said = FALSE
/mob/living/simple_animal/hostile/asteroid/polarbear/death(gibbed)
move_force = MOVE_FORCE_DEFAULT
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
return ..()
@@ -0,0 +1,60 @@
/mob/living/simple_animal/hostile/asteroid/wolf
name = "white wolf"
desc = "A beast that survives by feasting on weaker opponents, they're much stronger with numbers."
icon = 'icons/mob/icemoon/icemoon_monsters.dmi'
icon_state = "whitewolf"
icon_living = "whitewolf"
icon_dead = "whitewolf_dead"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
friendly_verb_continuous = "howls at"
friendly_verb_simple = "howl at"
speak_emote = list("howls")
speed = 5
move_to_delay = 5
maxHealth = 130
health = 130
obj_damage = 15
melee_damage_lower = 7.5
melee_damage_upper = 7.5
rapid_melee = 2 // every second attack
dodging = TRUE
dodge_prob = 50
attack_verb_continuous = "bites"
attack_verb_simple = "bite"
attack_sound = 'sound/weapons/bite.ogg'
vision_range = 7
aggro_vision_range = 7
move_force = MOVE_FORCE_WEAK
move_resist = MOVE_FORCE_WEAK
pull_force = MOVE_FORCE_WEAK
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 2, /obj/item/stack/sheet/bone = 2)
loot = list()
crusher_loot = /obj/item/crusher_trophy/watcher_wing
stat_attack = UNCONSCIOUS
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
/// Message for when the wolf decides to start running away
var/retreat_message_said = FALSE
/mob/living/simple_animal/hostile/asteroid/wolf/Move(atom/newloc)
if(newloc && newloc.z == z && (islava(newloc) || ischasm(newloc)))
return FALSE
return ..()
/mob/living/simple_animal/hostile/asteroid/wolf/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()
if(stat == DEAD || health > maxHealth*0.1)
retreat_distance = initial(retreat_distance)
return
if(!retreat_message_said && target)
visible_message("<span class='danger'>The [name] tries to flee from [target]!</span>")
retreat_message_said = TRUE
retreat_distance = 30
/mob/living/simple_animal/hostile/asteroid/wolf/Life()
. = ..()
if(!. || target)
return
adjustHealth(-maxHealth*0.025)
retreat_message_said = FALSE
@@ -0,0 +1,55 @@
GLOBAL_LIST_EMPTY(cursed_minds)
/**
* Turns whoever enters into a mob or random person
*
* If mob is chosen, turns the person into a random animal type
* If appearance is chosen, turns the person into a random human with a random species
* This changes name, and changes their DNA as well
* Random species is same as wizard swap event so people don't get killed ex: plasmamen
* Once the spring is used, it cannot be used by the same mind ever again
* After usage, teleports the user back to a random safe turf (so mobs are not killed by ice moon atmosphere)
*
*/
/turf/open/water/cursed_spring
baseturfs = /turf/open/water/cursed_spring
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/open/water/cursed_spring/Entered(atom/movable/thing, atom/oldLoc)
. = ..()
if(!isliving(thing))
return
var/mob/living/L = thing
if(!L.client)
return
if(GLOB.cursed_minds[L.mind])
return
GLOB.cursed_minds[L.mind] = TRUE
RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, .proc/remove_from_cursed)
var/random_choice = pick("Mob", "Appearance")
switch(random_choice)
if("Mob")
L = wabbajack(L, "animal")
if("Appearance")
var/mob/living/carbon/human/H = wabbajack(L, "humanoid")
randomize_human(H)
var/list/all_species = list()
for(var/stype in subtypesof(/datum/species))
var/datum/species/S = stype
if(initial(S.changesource_flags) & RACE_SWAP)
all_species += stype
var/random_race = pick(all_species)
H.set_species(random_race)
H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
L = H
var/turf/T = find_safe_turf()
L.forceMove(T)
to_chat(L, "<span class='notice'>You blink and find yourself in [get_area_name(T)].</span>")
/**
* Deletes minds from the cursed minds list after their deletion
*
*/
/turf/open/water/cursed_spring/proc/remove_from_cursed(datum/mind/M)
GLOB.cursed_minds -= M
@@ -0,0 +1,33 @@
/obj/machinery/door/keycard/library
name = "wooden door"
desc = "A dusty, scratched door with a thick lock attached."
icon = 'icons/obj/doors/puzzledoor/wood.dmi'
puzzle_id = "library"
open_message = "The door opens with a loud creak."
/obj/item/keycard/library
name = "golden key"
desc = "A dull, golden key."
icon_state = "golden_key"
puzzle_id = "library"
/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/library/warning
name = "ancient note"
info = "<b>Here lies the vast collection of He Who Knows Ten Thousand Things. May all who pursue this knowledge for power be cursed a thousand times.</b>"
/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary
name = "diary entry 13"
info = "It has been a week since the library was buried. I am so hungry that I can barely muster the energy to think, let alone write. The owl is gone."
/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary2
name = "diary entry 18"
info = "I've lost track of time. I lack the strength to even pick up books off the shelves. To think, after all this time spent searching for the library, I will die before I can so much as graze the depth of its knowledge."
/obj/item/feather
name = "feather"
desc = "A dark, wilting feather. It seems as old as time."
icon = 'icons/obj/objects.dmi'
icon_state = "feather"
force = 0
throwforce = 0
w_class = WEIGHT_CLASS_TINY
+2 -1
View File
@@ -62,6 +62,7 @@
view_range = 13
x_offset = -7
y_offset = -1
whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating, /turf/open/lava, /turf/closed/mineral)
see_hidden = TRUE
#undef SYNDICATE_CHALLENGE_TIMER
#undef SYNDICATE_CHALLENGE_TIMER
+4 -1
View File
@@ -529,7 +529,10 @@ BOMBCAP 20
## of ruins.
LAVALAND_BUDGET 60
## Space Ruin Budged
## Ice Moon Budget
ICEMOON_BUDGET 90
## Space Ruin Budget
Space_Budget 16
## Station Ruin Budget
+22
View File
@@ -0,0 +1,22 @@
#Listing maps here will blacklist them from generating in the ice moon.
#Maps must be the full path to them
#A list of maps valid to blacklist can be found in _maps\RandomRuins\IceRuins
#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
##RESPAWN
#_maps/RandomRuins/AnywhereRuins/golem_ship.dmm
##MISC
#_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm
#_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm
#_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm
#_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm
#_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm
#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
#_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm
#_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm
#_maps/RandomRuins/IceRuins/icemoon_underground_wrath.dmm
#_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm
#_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm
#_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm
#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm
+3 -2
View File
@@ -13,7 +13,7 @@
#_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
#_maps/RandomRuins/AnywhereRuins/golem_ship.dmm
##SIN
#_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm
@@ -33,8 +33,9 @@
#_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm
#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm
+4
View File
@@ -36,6 +36,10 @@ map deltastation
minplayers 50
endmap
map icebox
minplayers 25
endmap
map runtimestation
endmap
Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 43 KiB

+12
View File
@@ -562,6 +562,7 @@
#include "code\datums\mutations\space_adaptation.dm"
#include "code\datums\mutations\speech.dm"
#include "code\datums\mutations\telekinesis.dm"
#include "code\datums\ruins\icemoon.dm"
#include "code\datums\ruins\lavaland.dm"
#include "code\datums\ruins\space.dm"
#include "code\datums\ruins\station.dm"
@@ -617,6 +618,7 @@
#include "code\game\area\areas\mining.dm"
#include "code\game\area\areas\shuttles.dm"
#include "code\game\area\areas\ruins\_ruins.dm"
#include "code\game\area\areas\ruins\icemoon.dm"
#include "code\game\area\areas\ruins\lavaland.dm"
#include "code\game\area\areas\ruins\space.dm"
#include "code\game\area\areas\ruins\templates.dm"
@@ -940,6 +942,7 @@
#include "code\game\objects\items\plushes.dm"
#include "code\game\objects\items\pneumaticCannon.dm"
#include "code\game\objects\items\powerfist.dm"
#include "code\game\objects\items\puzzle_pieces.dm"
#include "code\game\objects\items\RCD.dm"
#include "code\game\objects\items\RCL.dm"
#include "code\game\objects\items\religion.dm"
@@ -1176,6 +1179,7 @@
#include "code\game\objects\structures\crates_lockers\crates\large.dm"
#include "code\game\objects\structures\crates_lockers\crates\secure.dm"
#include "code\game\objects\structures\crates_lockers\crates\wooden.dm"
#include "code\game\objects\structures\icemoon\cave_entrance.dm"
#include "code\game\objects\structures\lavaland\necropolis_tendril.dm"
#include "code\game\objects\structures\signs\_signs.dm"
#include "code\game\objects\structures\signs\signs_departments.dm"
@@ -2517,19 +2521,25 @@
#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\demonic_frost_miner.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon_vore.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\wendigo.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_demon.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_whelp.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\wolf.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\elite.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\goliath_broodmother.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\herald.dm"
@@ -2992,6 +3002,8 @@
#include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm"
#include "code\modules\research\xenobiology\crossbreeding\stabilized.dm"
#include "code\modules\ruins\lavaland_ruin_code.dm"
#include "code\modules\ruins\icemoonruin_code\hotsprings.dm"
#include "code\modules\ruins\icemoonruin_code\library.dm"
#include "code\modules\ruins\lavalandruin_code\alien_nest.dm"
#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm"
#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm"