mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 11:34:19 +01:00
Lavaland weather types: Dying is Fun edition (#28600)
* ddsadsa ddsadsa * beginning * more progress * oops saved * radar workin now * bugfixing and tweaks * working on volcano * tweaking * ill figure this out later * testing still * MORE testing * gunna cry * PROGRESS!!! * volcano DONE * starting the acid rain * acid rain code complete * starting windstorm * more bugfixing... * its finished! need to bugtest * bugfixing * bugfixing * forgot prob values * spacing fix for linter * linter fix * undefining things * Update code/datums/weather/weather_types/lavaland_weather.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/datums/weather/weather_types/lavaland_weather.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/machinery/radar.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/datums/weather/weather_types/lavaland_weather.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/machinery/radar.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/machinery/radar.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * misc fixes/changes * updated the doppler tower * small tweaks * still trying to get pods to work * better support for sound transition to newly placed shelters * minor fixes * this didnt take oops * nudged the probabilities * deconflicting * Update code/datums/weather/weather_types/lavaland_weather.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/machinery/radar.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/machinery/radar.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/machinery/radar.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * applied requested fixes * master update * updates * this should be here * Apply suggestions from code review Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * requested fixes * sound tweaks * remove debug message * turned down ash storm sound * fix gulag weather and attempt to fix sound overlap * blackbox weather and title-case ash storms * change up probabilities and bump acid rain melt chance * another title case * starting on issues * revert some changes * tiny tweak * reworked acid rain a bit * small tweaks to sleepers * moderate again * revert * ups the rocks * bug fixes --------- Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
This commit is contained in:
@@ -432,15 +432,10 @@
|
||||
/turf/simulated/floor/lava/mapping_lava,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"cZ" = (
|
||||
/obj/effect/spawner/random/loot_crate,
|
||||
/obj/machinery/radar,
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/obj/structure/railing{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/lattice/catwalk/mining,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors/targetable)
|
||||
/turf/simulated/floor/engine/lavaland_air,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"da" = (
|
||||
/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
|
||||
/obj/machinery/door/airlock/maintenance,
|
||||
@@ -1164,6 +1159,12 @@
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/mine/outpost/smith_workshop)
|
||||
"gP" = (
|
||||
/obj/structure/lattice/catwalk/mining,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/item/cigbutt,
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"gQ" = (
|
||||
/obj/effect/turf_decal/stripes/red/line,
|
||||
/obj/effect/turf_decal/stripes/red/line{
|
||||
@@ -1504,6 +1505,13 @@
|
||||
icon_state = "darkfull"
|
||||
},
|
||||
/area/mine/outpost/hallway/west)
|
||||
"iy" = (
|
||||
/obj/structure/railing{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/turf/simulated/floor/engine/lavaland_air,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"iA" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
@@ -1591,6 +1599,13 @@
|
||||
icon_state = "barber"
|
||||
},
|
||||
/area/mine/laborcamp)
|
||||
"iY" = (
|
||||
/obj/structure/railing{
|
||||
dir = 9
|
||||
},
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/turf/simulated/floor/engine/lavaland_air,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"jc" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/rack,
|
||||
@@ -1797,6 +1812,14 @@
|
||||
},
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/mine/laborcamp)
|
||||
"kf" = (
|
||||
/obj/structure/railing{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/screwdriver,
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/turf/simulated/floor/engine/lavaland_air,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"kl" = (
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors/explored)
|
||||
@@ -1817,6 +1840,14 @@
|
||||
icon_state = "darkfull"
|
||||
},
|
||||
/area/mine/outpost/engineering)
|
||||
"kC" = (
|
||||
/obj/structure/lattice/catwalk/mining,
|
||||
/obj/structure/railing,
|
||||
/obj/structure/railing/corner{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/lava/mapping_lava,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"kG" = (
|
||||
/obj/effect/turf_decal/stripes/red/line,
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -3118,6 +3149,10 @@
|
||||
icon_state = "darkredyellowfull"
|
||||
},
|
||||
/area/mine/laborcamp)
|
||||
"re" = (
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/turf/simulated/mineral/volcanic/lava_land_surface,
|
||||
/area/lavaland/surface/gulag_rock)
|
||||
"rg" = (
|
||||
/obj/structure/rack,
|
||||
/obj/item/screwdriver,
|
||||
@@ -4196,11 +4231,8 @@
|
||||
/area/mine/outpost/maintenance/east)
|
||||
"wX" = (
|
||||
/obj/structure/lattice/catwalk/mining,
|
||||
/obj/structure/railing/corner{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/railing,
|
||||
/turf/simulated/floor/lava/mapping_lava,
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"xf" = (
|
||||
/obj/machinery/computer/card/minor/qm,
|
||||
@@ -4510,10 +4542,12 @@
|
||||
},
|
||||
/area/mine/laborcamp)
|
||||
"zn" = (
|
||||
/obj/structure/marker_beacon/dock_marker/collision,
|
||||
/obj/structure/railing{
|
||||
dir = 5
|
||||
},
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors/targetable)
|
||||
/turf/simulated/floor/engine/lavaland_air,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"zp" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 8
|
||||
@@ -4559,6 +4593,17 @@
|
||||
dir = 8
|
||||
},
|
||||
/area/mine/outpost/mechbay)
|
||||
"zA" = (
|
||||
/obj/structure/railing/corner{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/railing/corner{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/baseturf_helper/lava_land,
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/turf/simulated/floor/engine/lavaland_air,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"zB" = (
|
||||
/obj/effect/spawner/random/cobweb/left/frequent,
|
||||
/obj/machinery/alarm/directional/north,
|
||||
@@ -4962,9 +5007,10 @@
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/mine/laborcamp)
|
||||
"BB" = (
|
||||
/obj/structure/sign/nanotrasen,
|
||||
/turf/simulated/wall/mineral/iron,
|
||||
/area/lavaland/surface/outdoors/targetable)
|
||||
/obj/effect/spawner/random/trash,
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/turf/simulated/floor/engine/lavaland_air,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"BE" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
@@ -5255,6 +5301,16 @@
|
||||
"De" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"Df" = (
|
||||
/obj/structure/sign/nanotrasen{
|
||||
pixel_y = -32
|
||||
},
|
||||
/obj/structure/railing{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/turf/simulated/floor/engine/lavaland_air,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"Dj" = (
|
||||
/obj/structure/chair,
|
||||
/obj/item/cigbutt,
|
||||
@@ -6840,6 +6896,13 @@
|
||||
},
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"LJ" = (
|
||||
/obj/structure/railing{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/turf/simulated/floor/engine/lavaland_air,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"LK" = (
|
||||
/obj/machinery/door/airlock{
|
||||
name = "Custodial Storage"
|
||||
@@ -7313,7 +7376,6 @@
|
||||
/obj/structure/lattice/catwalk/mining,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/railing/corner,
|
||||
/obj/item/cigbutt,
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"Oq" = (
|
||||
@@ -8720,6 +8782,10 @@
|
||||
"Wn" = (
|
||||
/turf/simulated/mineral/volcanic/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"Wq" = (
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/turf/simulated/floor/engine/lavaland_air,
|
||||
/area/lavaland/surface/outdoors/outpost/catwalk)
|
||||
"Ws" = (
|
||||
/obj/structure/chair/stool/bar{
|
||||
dir = 8
|
||||
@@ -16873,8 +16939,8 @@ lR
|
||||
lR
|
||||
lR
|
||||
lR
|
||||
lR
|
||||
lR
|
||||
re
|
||||
re
|
||||
Yr
|
||||
Yr
|
||||
xt
|
||||
@@ -17034,9 +17100,9 @@ lR
|
||||
lR
|
||||
lR
|
||||
lR
|
||||
lR
|
||||
lR
|
||||
lR
|
||||
pB
|
||||
re
|
||||
re
|
||||
Yr
|
||||
Yr
|
||||
PH
|
||||
@@ -17195,13 +17261,13 @@ zP
|
||||
zP
|
||||
oO
|
||||
oO
|
||||
Yh
|
||||
Yh
|
||||
Yh
|
||||
Yr
|
||||
Yr
|
||||
Yr
|
||||
PH
|
||||
oO
|
||||
IJ
|
||||
iY
|
||||
LJ
|
||||
LJ
|
||||
zA
|
||||
gP
|
||||
gt
|
||||
gt
|
||||
gt
|
||||
@@ -17352,17 +17418,17 @@ lR
|
||||
lR
|
||||
lR
|
||||
lR
|
||||
sb
|
||||
IG
|
||||
zP
|
||||
zP
|
||||
oO
|
||||
oO
|
||||
Yh
|
||||
Yh
|
||||
Yh
|
||||
Yr
|
||||
Yr
|
||||
Yr
|
||||
IJ
|
||||
IJ
|
||||
Df
|
||||
Wq
|
||||
Wq
|
||||
Wq
|
||||
Ol
|
||||
gt
|
||||
oO
|
||||
@@ -17514,15 +17580,15 @@ sb
|
||||
sb
|
||||
sb
|
||||
sb
|
||||
sb
|
||||
IG
|
||||
zP
|
||||
zP
|
||||
oO
|
||||
oO
|
||||
IJ
|
||||
Yh
|
||||
Yh
|
||||
Yr
|
||||
IJ
|
||||
Df
|
||||
Wq
|
||||
cZ
|
||||
BB
|
||||
wX
|
||||
@@ -17676,18 +17742,18 @@ sb
|
||||
sb
|
||||
sb
|
||||
sb
|
||||
sb
|
||||
IG
|
||||
zP
|
||||
zP
|
||||
oO
|
||||
oO
|
||||
Yh
|
||||
IJ
|
||||
zn
|
||||
zn
|
||||
IJ
|
||||
oO
|
||||
dd
|
||||
IJ
|
||||
zn
|
||||
iy
|
||||
kf
|
||||
iy
|
||||
kC
|
||||
oO
|
||||
oO
|
||||
zP
|
||||
@@ -17842,14 +17908,14 @@ uv
|
||||
zP
|
||||
oO
|
||||
oO
|
||||
Yh
|
||||
Yh
|
||||
Yh
|
||||
Yh
|
||||
IJ
|
||||
IJ
|
||||
oO
|
||||
Yh
|
||||
Yr
|
||||
Yr
|
||||
Yh
|
||||
Yh
|
||||
oO
|
||||
dd
|
||||
VM
|
||||
oO
|
||||
oO
|
||||
oO
|
||||
|
||||
@@ -1,46 +1,41 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
"aa" = (
|
||||
/turf/simulated/wall/mineral/titanium/survival,
|
||||
/area/survivalpod)
|
||||
"b" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ab" = (
|
||||
/obj/structure/sign/mining/survival{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/wall/mineral/titanium/survival,
|
||||
/area/survivalpod)
|
||||
"c" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ac" = (
|
||||
/obj/machinery/smartfridge/survival_pod,
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"d" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ad" = (
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"e" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ae" = (
|
||||
/obj/machinery/door/window/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"f" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"af" = (
|
||||
/obj/machinery/light,
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"g" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ag" = (
|
||||
/obj/structure/sign/mining/survival{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/wall/mineral/titanium/survival,
|
||||
/area/survivalpod)
|
||||
"h" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ah" = (
|
||||
/obj/structure/fans,
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"i" = (
|
||||
/obj/machinery/sleeper/survival_pod,
|
||||
/obj/machinery/economy/vending/wallmed/directional/west,
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"j" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"aj" = (
|
||||
/obj/structure/table/survival_pod,
|
||||
/obj/item/storage/firstaid/regular,
|
||||
/obj/item/storage/firstaid/brute{
|
||||
@@ -48,8 +43,8 @@
|
||||
pixel_y = -2
|
||||
},
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"k" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ak" = (
|
||||
/obj/structure/table/wood/fancy/black{
|
||||
pixel_y = -9
|
||||
},
|
||||
@@ -58,26 +53,26 @@
|
||||
},
|
||||
/obj/machinery/kitchen_machine/microwave,
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"l" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"al" = (
|
||||
/obj/structure/sink/kitchen{
|
||||
dir = 4;
|
||||
pixel_x = -11
|
||||
},
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"m" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"am" = (
|
||||
/obj/structure/sign/mining/survival,
|
||||
/turf/simulated/wall/mineral/titanium/survival,
|
||||
/area/survivalpod)
|
||||
"n" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"an" = (
|
||||
/obj/structure/curtain/black,
|
||||
/obj/machinery/shower{
|
||||
pixel_y = 20
|
||||
},
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"o" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ao" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8;
|
||||
pixel_y = -8
|
||||
@@ -86,32 +81,32 @@
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"p" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"aq" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8;
|
||||
pixel_y = -8
|
||||
},
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"r" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ar" = (
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"s" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"as" = (
|
||||
/obj/item/gps/computer,
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"t" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"at" = (
|
||||
/obj/structure/bed/pod,
|
||||
/obj/item/bedsheet/brown,
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"u" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"au" = (
|
||||
/obj/structure/tubes,
|
||||
/obj/item/kirbyplants/large,
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"v" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"av" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
@@ -124,25 +119,25 @@
|
||||
/turf/simulated/floor/carpet/black{
|
||||
dir = 1
|
||||
},
|
||||
/area/survivalpod)
|
||||
"w" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"aw" = (
|
||||
/obj/structure/fans/tiny,
|
||||
/obj/machinery/door/airlock/survival_pod/glass,
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"x" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ax" = (
|
||||
/obj/structure/sign/mining/survival{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/wall/mineral/titanium/survival,
|
||||
/area/survivalpod)
|
||||
"y" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"ay" = (
|
||||
/obj/structure/toilet/secret{
|
||||
pixel_y = 12
|
||||
},
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod)
|
||||
"z" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"az" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
@@ -152,8 +147,8 @@
|
||||
name = "lusty xenomorph maid"
|
||||
},
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"A" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"aA" = (
|
||||
/obj/structure/table/wood/fancy/black,
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
@@ -164,8 +159,8 @@
|
||||
},
|
||||
/obj/item/reagent_containers/drinks/bottle/wine,
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"B" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"aB" = (
|
||||
/obj/structure/table/wood/fancy/black,
|
||||
/obj/item/reagent_containers/drinks/drinkingglass{
|
||||
pixel_x = -4;
|
||||
@@ -173,78 +168,83 @@
|
||||
},
|
||||
/obj/effect/spawner/random/food_or_drink/three_course_meal,
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"C" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"aC" = (
|
||||
/obj/structure/chair/comfy/black{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"D" = (
|
||||
/area/survivalpod/luxurypod)
|
||||
"aD" = (
|
||||
/obj/structure/sign/mining,
|
||||
/turf/simulated/wall/mineral/titanium/survival,
|
||||
/area/survivalpod)
|
||||
/area/survivalpod/luxurypod)
|
||||
"aF" = (
|
||||
/obj/machinery/sleeper/survival_pod,
|
||||
/obj/machinery/economy/vending/wallmed/directional/west,
|
||||
/turf/simulated/floor/pod,
|
||||
/area/survivalpod/luxurypod)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
b
|
||||
a
|
||||
b
|
||||
a
|
||||
b
|
||||
a
|
||||
aa
|
||||
ab
|
||||
aa
|
||||
ab
|
||||
aa
|
||||
ab
|
||||
aa
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
g
|
||||
h
|
||||
i
|
||||
j
|
||||
k
|
||||
l
|
||||
m
|
||||
ag
|
||||
ah
|
||||
aF
|
||||
aj
|
||||
ak
|
||||
al
|
||||
am
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
a
|
||||
c
|
||||
d
|
||||
d
|
||||
e
|
||||
f
|
||||
a
|
||||
aa
|
||||
ac
|
||||
ad
|
||||
ad
|
||||
ae
|
||||
af
|
||||
aa
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
g
|
||||
s
|
||||
t
|
||||
u
|
||||
v
|
||||
r
|
||||
w
|
||||
ag
|
||||
as
|
||||
at
|
||||
au
|
||||
av
|
||||
ar
|
||||
aw
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
n
|
||||
o
|
||||
p
|
||||
r
|
||||
r
|
||||
a
|
||||
aa
|
||||
an
|
||||
ao
|
||||
aq
|
||||
ar
|
||||
ar
|
||||
aa
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
g
|
||||
y
|
||||
z
|
||||
A
|
||||
B
|
||||
C
|
||||
D
|
||||
ag
|
||||
ay
|
||||
az
|
||||
aA
|
||||
aB
|
||||
aC
|
||||
aD
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
a
|
||||
x
|
||||
a
|
||||
x
|
||||
a
|
||||
x
|
||||
a
|
||||
aa
|
||||
ax
|
||||
aa
|
||||
ax
|
||||
aa
|
||||
ax
|
||||
aa
|
||||
"}
|
||||
|
||||
@@ -24,3 +24,6 @@
|
||||
|
||||
/// Used by admin-tooling to remove radiation
|
||||
#define COMSIG_ADMIN_DECONTAMINATE "admin_decontaminate"
|
||||
|
||||
/// Used when a shelter capsule deploys
|
||||
#define COMSIG_GLOB_SHELTER_PLACED "!shelter_placed"
|
||||
|
||||
@@ -146,6 +146,14 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/proc/is_path_in_list(P, list/L)
|
||||
if(!L || !length(L) || !P)
|
||||
return FALSE
|
||||
for(var/type in L)
|
||||
if(ispath(P, type))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//Checks for specific types in specifically structured (Assoc "type" = TRUE) lists ('typecaches')
|
||||
/proc/is_type_in_typecache(atom/A, list/L)
|
||||
if(!L || !length(L) || !A)
|
||||
|
||||
@@ -1989,7 +1989,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
if(CHANNEL_FIREALARM)
|
||||
return "Fire Alarms"
|
||||
if(CHANNEL_ASH_STORM)
|
||||
return "Ash Storms"
|
||||
return "Weather"
|
||||
if(CHANNEL_RADIO_NOISE)
|
||||
return "Radio Noise"
|
||||
if(CHANNEL_BOSS_MUSIC)
|
||||
|
||||
@@ -10,6 +10,7 @@ SUBSYSTEM_DEF(weather)
|
||||
var/list/processing = list()
|
||||
var/list/eligible_traits = list()
|
||||
var/list/next_hit_by_zlevel = list() //Used by barometers to know when the next storm is coming
|
||||
var/list/next_weather_by_zlevel = list() // For the weather radar detection
|
||||
cpu_display = SS_CPUDISPLAY_LOW
|
||||
|
||||
/datum/controller/subsystem/weather/get_metrics()
|
||||
@@ -28,6 +29,8 @@ SUBSYSTEM_DEF(weather)
|
||||
var/mob/living/L = i
|
||||
if(W.can_weather_act(L))
|
||||
W.weather_act(L)
|
||||
if(W.area_act == TRUE)
|
||||
W.area_act()
|
||||
|
||||
// start random weather on relevant levels
|
||||
while(length(eligible_traits))
|
||||
@@ -39,6 +42,7 @@ SUBSYSTEM_DEF(weather)
|
||||
for(var/z in zlevels)
|
||||
addtimer(CALLBACK(src, PROC_REF(make_eligible), trait, possible_weathers), randTime + initial(W.weather_duration_upper), TIMER_UNIQUE) //Around 5-10 minutes between weathers
|
||||
next_hit_by_zlevel["[z]"] = world.time + randTime + initial(W.telegraph_duration)
|
||||
next_weather_by_zlevel["[z]"] = W
|
||||
run_weather(W, zlevels)
|
||||
|
||||
eligible_traits.len--
|
||||
@@ -68,17 +72,19 @@ SUBSYSTEM_DEF(weather)
|
||||
var/list/zlevels = levels_by_trait(weather_datum_type::target_trait)
|
||||
var/datum/weather/W = new weather_datum_type(zlevels)
|
||||
W.telegraph()
|
||||
SSblackbox.record_feedback("tally", "weather_event", 1, "[weather_datum_type]")
|
||||
|
||||
/datum/controller/subsystem/weather/proc/make_eligible(trait, list/possible_weathers)
|
||||
eligible_traits[trait] = possible_weathers
|
||||
for(var/zlevel in levels_by_trait(trait))
|
||||
next_hit_by_zlevel["[zlevel]"] = null
|
||||
next_weather_by_zlevel["[zlevel]"] = null
|
||||
|
||||
/datum/controller/subsystem/weather/proc/get_weather(z, area/active_area)
|
||||
var/datum/weather/A
|
||||
for(var/V in processing)
|
||||
var/datum/weather/W = V
|
||||
if((z in W.impacted_z_levels) && W.area_type == active_area)
|
||||
if((z in W.impacted_z_levels) && is_path_in_list(active_area, W.area_types))
|
||||
A = W
|
||||
break
|
||||
return A
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
'sound/weather/ashstorm/outside/active_mid1.ogg' = 1,
|
||||
'sound/weather/ashstorm/outside/active_mid1.ogg' = 1
|
||||
)
|
||||
mid_length = 80
|
||||
mid_length = 65
|
||||
start_sound = 'sound/weather/ashstorm/outside/active_start.ogg'
|
||||
start_length = 130
|
||||
end_sound = 'sound/weather/ashstorm/outside/active_end.ogg'
|
||||
@@ -53,3 +53,44 @@
|
||||
volume = 30
|
||||
area_sound = TRUE
|
||||
channel = CHANNEL_ASH_STORM
|
||||
|
||||
/datum/looping_sound/active_outside_acid
|
||||
mid_sounds = 'sound/weather/acid/outside/active_mid1.ogg'
|
||||
mid_length = 105
|
||||
start_sound = list('sound/weather/acid/outside/active_start.ogg' = 1)
|
||||
start_length = 130
|
||||
end_sound = 'sound/weather/acid/outside/active_end.ogg'
|
||||
volume = 65
|
||||
area_sound = TRUE
|
||||
channel = CHANNEL_ASH_STORM
|
||||
|
||||
/datum/looping_sound/weak_outside_acid
|
||||
mid_sounds ='sound/weather/acid/outside/weak_mid1.ogg'
|
||||
mid_length = 120
|
||||
start_sound = list('sound/weather/acid/outside/weak_start.ogg' = 1)
|
||||
start_length = 130
|
||||
end_sound = 'sound/weather/acid/outside/weak_end.ogg'
|
||||
volume = 60
|
||||
area_sound = TRUE
|
||||
channel = CHANNEL_ASH_STORM
|
||||
|
||||
/datum/looping_sound/active_inside_acid
|
||||
mid_sounds = 'sound/weather/acid/inside/active_mid1.ogg'
|
||||
mid_length = 105
|
||||
start_sound = list('sound/weather/acid/inside/active_start.ogg' = 1)
|
||||
start_length = 130
|
||||
end_sound = 'sound/weather/acid/inside/active_end.ogg'
|
||||
volume = 50
|
||||
area_sound = TRUE
|
||||
channel = CHANNEL_ASH_STORM
|
||||
|
||||
/datum/looping_sound/weak_inside_acid
|
||||
mid_sounds = 'sound/weather/acid/inside/weak_mid1.ogg'
|
||||
mid_length = 105
|
||||
start_sound = list('sound/weather/acid/inside/weak_start.ogg' = 1)
|
||||
start_length = 130
|
||||
end_sound = 'sound/weather/acid/inside/weak_end.ogg'
|
||||
volume = 50
|
||||
area_sound = TRUE
|
||||
channel = CHANNEL_ASH_STORM
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
//The effects of weather occur across an entire z-level. For instance, lavaland has periodic ash storms that scorch most unprotected creatures.
|
||||
|
||||
GLOBAL_LIST_EMPTY(all_shelter_pods)
|
||||
|
||||
/datum/weather
|
||||
var/name = "space wind"
|
||||
var/desc = "Heavy gusts of wind blanket the area, periodically knocking down anyone caught in the open."
|
||||
@@ -22,13 +24,15 @@
|
||||
var/end_sound
|
||||
var/end_overlay
|
||||
|
||||
var/area_type = /area/space //Types of area to affect
|
||||
var/area_types = list(/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
|
||||
|
||||
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/overlay_plane = AREA_PLANE
|
||||
var/custom_overlay // Do we want to give it a non-standard weather effect
|
||||
var/overlay_dir = NORTH
|
||||
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
|
||||
|
||||
@@ -41,14 +45,27 @@
|
||||
var/barometer_predictable = FALSE
|
||||
var/next_hit_time = 0 //For barometers to know when the next storm will hit
|
||||
|
||||
var/area_act = FALSE // Does this affect more than just mobs, or the landscape?
|
||||
|
||||
var/list/inside_areas = list() // Any areas not in the outside terf
|
||||
var/list/outside_areas = list() // Any areas listed as "outside"
|
||||
var/list/eligible_areas = list() // For variable playing or not playing sounds for shuttles
|
||||
|
||||
/datum/weather/New(z_levels)
|
||||
..()
|
||||
impacted_z_levels = z_levels
|
||||
RegisterSignal(SSdcs, COMSIG_GLOB_SHELTER_PLACED, PROC_REF(on_shelter_placed))
|
||||
|
||||
/datum/weather/proc/on_shelter_placed(datum/source, turf/center)
|
||||
SIGNAL_HANDLER // COMSIG_GLOB_SHELTER_PLACED
|
||||
GLOB.all_shelter_pods += center
|
||||
return
|
||||
|
||||
/datum/weather/proc/generate_area_list()
|
||||
var/list/affectareas = list()
|
||||
for(var/V in get_areas(area_type))
|
||||
affectareas += V
|
||||
for(var/area_type in area_types)
|
||||
for(var/V in get_areas(area_type))
|
||||
affectareas += V
|
||||
for(var/V in protected_areas)
|
||||
affectareas -= get_areas(V)
|
||||
for(var/V in affectareas)
|
||||
@@ -64,6 +81,8 @@
|
||||
weather_duration = rand(weather_duration_lower, weather_duration_upper)
|
||||
START_PROCESSING(SSweather, src)
|
||||
update_areas()
|
||||
update_eligible_areas()
|
||||
update_audio()
|
||||
for(var/M in GLOB.player_list)
|
||||
var/turf/mob_turf = get_turf(M)
|
||||
if(mob_turf && (mob_turf.z in impacted_z_levels))
|
||||
@@ -71,6 +90,7 @@
|
||||
to_chat(M, telegraph_message)
|
||||
if(telegraph_sound)
|
||||
SEND_SOUND(M, sound(telegraph_sound))
|
||||
|
||||
addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration)
|
||||
|
||||
/datum/weather/proc/start()
|
||||
@@ -78,6 +98,7 @@
|
||||
return
|
||||
stage = WEATHER_MAIN_STAGE
|
||||
update_areas()
|
||||
update_audio()
|
||||
for(var/M in GLOB.player_list)
|
||||
var/turf/mob_turf = get_turf(M)
|
||||
if(mob_turf && (mob_turf.z in impacted_z_levels))
|
||||
@@ -92,6 +113,7 @@
|
||||
return
|
||||
stage = WEATHER_WIND_DOWN_STAGE
|
||||
update_areas()
|
||||
update_audio()
|
||||
for(var/M in GLOB.player_list)
|
||||
var/turf/mob_turf = get_turf(M)
|
||||
if(mob_turf && (mob_turf.z in impacted_z_levels))
|
||||
@@ -107,6 +129,7 @@
|
||||
stage = WEATHER_END_STAGE
|
||||
STOP_PROCESSING(SSweather, src)
|
||||
update_areas()
|
||||
update_audio()
|
||||
|
||||
/datum/weather/proc/can_weather_act(mob/living/L) //Can this weather impact a mob?
|
||||
var/turf/mob_turf = get_turf(L)
|
||||
@@ -128,7 +151,12 @@
|
||||
var/area/N = V
|
||||
N.layer = overlay_layer
|
||||
N.plane = overlay_plane
|
||||
N.icon = 'icons/effects/weather_effects.dmi'
|
||||
if(!custom_overlay)
|
||||
N.icon = 'icons/effects/weather_effects.dmi'
|
||||
else
|
||||
N.icon = custom_overlay
|
||||
if(overlay_dir)
|
||||
N.dir = overlay_dir
|
||||
N.invisibility = 0
|
||||
N.color = weather_color
|
||||
switch(stage)
|
||||
@@ -142,6 +170,43 @@
|
||||
N.color = null
|
||||
N.icon_state = ""
|
||||
N.icon = 'icons/turf/areas.dmi'
|
||||
N.dir = NORTH
|
||||
N.layer = initial(N.layer)
|
||||
N.plane = initial(N.plane)
|
||||
N.set_opacity(FALSE)
|
||||
|
||||
|
||||
/datum/weather/proc/update_eligible_areas()
|
||||
for(var/z in impacted_z_levels)
|
||||
for(var/area/A in GLOB.space_manager.areas_in_z["[z]"])
|
||||
eligible_areas |= A
|
||||
|
||||
// Don't play storm audio to shuttles that are not at lavaland
|
||||
var/miningShuttleDocked = is_shuttle_docked("mining", "mining_away")
|
||||
if(!miningShuttleDocked)
|
||||
eligible_areas -= get_areas(/area/shuttle/mining)
|
||||
|
||||
var/laborShuttleDocked = is_shuttle_docked("laborcamp", "laborcamp_away")
|
||||
if(!laborShuttleDocked)
|
||||
eligible_areas -= get_areas(/area/shuttle/siberia)
|
||||
|
||||
var/golemShuttleOnPlanet = is_shuttle_docked("freegolem", "freegolem_lavaland")
|
||||
if(!golemShuttleOnPlanet)
|
||||
eligible_areas -= get_areas(/area/shuttle/freegolem)
|
||||
|
||||
for(var/i in 1 to length(eligible_areas))
|
||||
var/area/place = eligible_areas[i]
|
||||
if(place.outdoors)
|
||||
outside_areas |= place
|
||||
else
|
||||
inside_areas |= place
|
||||
|
||||
/datum/weather/proc/is_shuttle_docked(shuttleId, dockId)
|
||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
||||
return M && M.getDockedId() == dockId
|
||||
|
||||
/datum/weather/proc/area_act()
|
||||
return
|
||||
|
||||
/datum/weather/proc/update_audio()
|
||||
return
|
||||
|
||||
@@ -1,148 +0,0 @@
|
||||
//Ash storms happen frequently on lavaland. They heavily obscure vision, and cause high fire damage to anyone caught outside.
|
||||
/datum/weather/ash_storm
|
||||
name = "ash storm"
|
||||
desc = "An intense atmospheric storm lifts ash off of the planet's surface and billows it down across the area, dealing intense fire damage to the unprotected."
|
||||
|
||||
telegraph_message = "<span class='boldwarning'>An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter.</span>"
|
||||
telegraph_duration = 300
|
||||
telegraph_overlay = "light_ash"
|
||||
|
||||
weather_message = "<span class='userdanger'><i>Smoldering clouds of scorching ash billow down around you! Get inside!</i></span>"
|
||||
weather_duration_lower = 600
|
||||
weather_duration_upper = 1200
|
||||
weather_overlay = "ash_storm"
|
||||
|
||||
end_message = "<span class='boldannounceic'>The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now.</span>"
|
||||
end_duration = 300
|
||||
end_overlay = "light_ash"
|
||||
|
||||
area_type = /area/lavaland/surface/outdoors
|
||||
target_trait = ORE_LEVEL
|
||||
|
||||
immunity_type = "ash"
|
||||
|
||||
probability = 90
|
||||
|
||||
barometer_predictable = TRUE
|
||||
|
||||
var/datum/looping_sound/active_outside_ashstorm/sound_ao = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/active_inside_ashstorm/sound_ai = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/weak_outside_ashstorm/sound_wo = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/weak_inside_ashstorm/sound_wi = new(list(), FALSE, TRUE)
|
||||
|
||||
/datum/weather/ash_storm/proc/is_shuttle_docked(shuttleId, dockId)
|
||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
||||
return M && M.getDockedId() == dockId
|
||||
|
||||
/datum/weather/ash_storm/proc/update_eligible_areas()
|
||||
var/list/inside_areas = list()
|
||||
var/list/outside_areas = list()
|
||||
var/list/eligible_areas = list()
|
||||
for(var/z in impacted_z_levels)
|
||||
if("[z]" in GLOB.space_manager.areas_in_z)
|
||||
eligible_areas += GLOB.space_manager.areas_in_z["[z]"]
|
||||
|
||||
// Don't play storm audio to shuttles that are not at lavaland
|
||||
var/miningShuttleDocked = is_shuttle_docked("mining", "mining_away")
|
||||
if(!miningShuttleDocked)
|
||||
eligible_areas -= get_areas(/area/shuttle/mining)
|
||||
|
||||
var/laborShuttleDocked = is_shuttle_docked("laborcamp", "laborcamp_away")
|
||||
if(!laborShuttleDocked)
|
||||
eligible_areas -= get_areas(/area/shuttle/siberia)
|
||||
|
||||
var/golemShuttleOnPlanet = is_shuttle_docked("freegolem", "freegolem_lavaland")
|
||||
if(!golemShuttleOnPlanet)
|
||||
eligible_areas -= get_areas(/area/shuttle/freegolem)
|
||||
|
||||
while(length(eligible_areas))
|
||||
var/area/place = eligible_areas[length(eligible_areas)]
|
||||
if(place.outdoors)
|
||||
outside_areas += place
|
||||
else
|
||||
inside_areas += place
|
||||
eligible_areas.len--
|
||||
|
||||
sound_ao.output_atoms = outside_areas
|
||||
sound_ai.output_atoms = inside_areas
|
||||
sound_wo.output_atoms = outside_areas
|
||||
sound_wi.output_atoms = inside_areas
|
||||
|
||||
/datum/weather/ash_storm/proc/update_audio()
|
||||
switch(stage)
|
||||
if(WEATHER_STARTUP_STAGE)
|
||||
sound_wo.start()
|
||||
sound_wi.start()
|
||||
|
||||
if(WEATHER_MAIN_STAGE)
|
||||
sound_wo.stop()
|
||||
sound_wi.stop()
|
||||
|
||||
sound_ao.start()
|
||||
sound_ai.start()
|
||||
|
||||
if(WEATHER_WIND_DOWN_STAGE)
|
||||
sound_ao.stop()
|
||||
sound_ai.stop()
|
||||
|
||||
sound_wo.start()
|
||||
sound_wi.start()
|
||||
|
||||
if(WEATHER_END_STAGE)
|
||||
sound_wo.stop()
|
||||
sound_wi.stop()
|
||||
|
||||
/datum/weather/ash_storm/generate_area_list()
|
||||
. = ..()
|
||||
// I'm a lazy fuck and it's either this or refactor procgen again
|
||||
impacted_areas |= get_areas(/area/lavaland/surface/gulag_rock)
|
||||
|
||||
/datum/weather/ash_storm/telegraph()
|
||||
. = ..()
|
||||
update_eligible_areas()
|
||||
update_audio()
|
||||
|
||||
/datum/weather/ash_storm/start()
|
||||
. = ..()
|
||||
update_audio()
|
||||
|
||||
/datum/weather/ash_storm/wind_down()
|
||||
. = ..()
|
||||
update_audio()
|
||||
|
||||
/datum/weather/ash_storm/end()
|
||||
. = ..()
|
||||
update_audio()
|
||||
|
||||
/datum/weather/ash_storm/proc/is_ash_immune(atom/L)
|
||||
while(L && !isturf(L))
|
||||
if(ismecha(L)) //Mechs are immune
|
||||
return TRUE
|
||||
if(ishuman(L)) //Are you immune?
|
||||
var/mob/living/carbon/human/H = L
|
||||
var/thermal_protection = H.get_thermal_protection()
|
||||
if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT)
|
||||
return TRUE
|
||||
L = L.loc //Matryoshka check
|
||||
return FALSE //RIP you
|
||||
|
||||
/datum/weather/ash_storm/weather_act(mob/living/L)
|
||||
if(is_ash_immune(L))
|
||||
return
|
||||
L.adjustFireLoss(4)
|
||||
|
||||
|
||||
//Emberfalls are the result of an ash storm passing by close to the playable area of lavaland. They have a 10% chance to trigger in place of an ash storm.
|
||||
/datum/weather/ash_storm/emberfall
|
||||
name = "emberfall"
|
||||
desc = "A passing ash storm blankets the area in harmless embers."
|
||||
|
||||
weather_message = "<span class='notice'>Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by...</span>"
|
||||
weather_overlay = "light_ash"
|
||||
|
||||
end_message = "<span class='notice'>The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet.</span>"
|
||||
end_sound = null
|
||||
|
||||
aesthetic = TRUE
|
||||
|
||||
probability = 10
|
||||
@@ -14,7 +14,7 @@
|
||||
end_message = "<span class='danger'>The ground cools and returns to its usual form.</span>"
|
||||
end_duration = 0
|
||||
|
||||
area_type = /area
|
||||
area_types = list(/area)
|
||||
protected_areas = list(/area/space)
|
||||
target_trait = STATION_LEVEL
|
||||
|
||||
|
||||
@@ -0,0 +1,470 @@
|
||||
#define ROCKFALL_DELAY 10 // For how long until the boulders hit the ground
|
||||
|
||||
/// MARK: Ash Storm
|
||||
//Ash storms happen frequently on lavaland. They heavily obscure vision, and cause high fire damage to anyone caught outside.
|
||||
/datum/weather/ash_storm
|
||||
name = "Ash storm"
|
||||
desc = "An intense atmospheric storm lifts ash off of the planet's surface and billows it down across the area, dealing intense fire damage to the unprotected."
|
||||
|
||||
telegraph_message = "<span class='boldwarning'>An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter.</span>"
|
||||
telegraph_duration = 300
|
||||
telegraph_overlay = "light_ash"
|
||||
|
||||
weather_message = "<span class='userdanger'><i>Smoldering clouds of scorching ash billow down around you! Get inside!</i></span>"
|
||||
weather_duration_lower = 600
|
||||
weather_duration_upper = 1200
|
||||
weather_overlay = "ash_storm"
|
||||
|
||||
end_message = "<span class='boldannounceic'>The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now.</span>"
|
||||
end_duration = 300
|
||||
end_overlay = "light_ash"
|
||||
|
||||
area_types = list(/area/lavaland/surface/outdoors, /area/lavaland/surface/gulag_rock)
|
||||
target_trait = ORE_LEVEL
|
||||
immunity_type = "ash"
|
||||
probability = 25
|
||||
barometer_predictable = TRUE
|
||||
|
||||
var/datum/looping_sound/active_outside_ashstorm/sound_ao = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/active_inside_ashstorm/sound_ai = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/weak_outside_ashstorm/sound_wo = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/weak_inside_ashstorm/sound_wi = new(list(), FALSE, TRUE)
|
||||
|
||||
/datum/weather/ash_storm/update_eligible_areas()
|
||||
. = ..()
|
||||
sound_ao.output_atoms = outside_areas
|
||||
sound_ai.output_atoms = inside_areas
|
||||
sound_wo.output_atoms = outside_areas
|
||||
sound_wi.output_atoms = inside_areas
|
||||
|
||||
/datum/weather/ash_storm/update_audio()
|
||||
switch(stage)
|
||||
if(WEATHER_STARTUP_STAGE)
|
||||
sound_wo.start()
|
||||
sound_wi.start()
|
||||
|
||||
if(WEATHER_MAIN_STAGE)
|
||||
sound_wo.stop()
|
||||
sound_wi.stop()
|
||||
|
||||
sound_ao.start()
|
||||
sound_ai.start()
|
||||
|
||||
if(WEATHER_WIND_DOWN_STAGE)
|
||||
sound_ao.stop()
|
||||
sound_ai.stop()
|
||||
|
||||
sound_wo.start()
|
||||
sound_wi.start()
|
||||
|
||||
if(WEATHER_END_STAGE)
|
||||
sound_wo.stop()
|
||||
sound_wi.stop()
|
||||
|
||||
/datum/weather/ash_storm/on_shelter_placed(datum/source, turf/center)
|
||||
. = ..()
|
||||
if(center.z in impacted_z_levels)
|
||||
var/area/A = get_area(center)
|
||||
inside_areas |= A
|
||||
sound_ai.output_atoms |= A
|
||||
sound_wi.output_atoms |= A
|
||||
|
||||
/datum/weather/ash_storm/proc/is_ash_immune(atom/L)
|
||||
while(L && !isturf(L))
|
||||
if(ismecha(L)) //Mechs are immune
|
||||
return TRUE
|
||||
if(ishuman(L)) //Are you immune?
|
||||
if(is_human_ash_immune(L))
|
||||
return TRUE
|
||||
L = L.loc //Matryoshka check
|
||||
return FALSE //RIP you
|
||||
|
||||
/datum/weather/ash_storm/proc/is_human_ash_immune(mob/living/carbon/human/H)
|
||||
var/thermal_protection = H.get_thermal_protection()
|
||||
if(thermal_protection >= (FIRE_IMMUNITY_MAX_TEMP_PROTECT - 15))
|
||||
return TRUE
|
||||
|
||||
/datum/weather/ash_storm/weather_act(mob/living/L)
|
||||
if(is_ash_immune(L))
|
||||
return
|
||||
L.adjustFireLoss(4)
|
||||
|
||||
|
||||
/// MARK: Heavy Ash Storm
|
||||
// Radar needed to detect the difference, but shouldnt matter much
|
||||
/datum/weather/ash_storm/heavy
|
||||
name = "Heavy ash storm"
|
||||
desc = "An even more intense atmospheric storm lifts ash off of the planet's surface and billows it down across the area, dealing intense fire damage to the unprotected."
|
||||
|
||||
//lasts longer
|
||||
weather_duration_lower = 800
|
||||
weather_duration_upper = 1600
|
||||
|
||||
probability = 10
|
||||
|
||||
/datum/weather/ash_storm/heavy/is_human_ash_immune(mob/living/carbon/human/H)
|
||||
var/thermal_protection = H.get_thermal_protection()
|
||||
if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT)
|
||||
return TRUE
|
||||
|
||||
/datum/weather/ash_storm/heavy/weather_act(mob/living/L)
|
||||
if(is_ash_immune(L))
|
||||
return
|
||||
L.adjustFireLoss(6) // does more damage
|
||||
|
||||
/// MARK: Emberfall
|
||||
//Emberfalls are the result of an ash storm passing by close to the playable area of lavaland. They have a 10% chance to trigger in place of an ash storm.
|
||||
/datum/weather/ash_storm/emberfall
|
||||
name = "Emberfall"
|
||||
desc = "A passing ash storm blankets the area in harmless embers."
|
||||
|
||||
weather_message = "<span class='notice'>Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by...</span>"
|
||||
weather_overlay = "light_ash"
|
||||
|
||||
end_message = "<span class='notice'>The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet.</span>"
|
||||
end_sound = null
|
||||
|
||||
aesthetic = TRUE
|
||||
probability = 25
|
||||
|
||||
/// MARK: Volcano
|
||||
/datum/weather/volcano
|
||||
name = "Volcanic activity"
|
||||
desc = "The shifting tectonic forces on the unstable planet have caused volcanic activity in the area. New rivers/chasms will form and chunks of rock will rain from the sky."
|
||||
|
||||
telegraph_message = "<span class='boldwarning'><i>The ground rumbles with an ominous strength, threatening to shift below you. Seek shelter.</i></span>"
|
||||
telegraph_duration = 600
|
||||
telegraph_sound = 'sound/weather/volcano/lavaland_volcano_warning.ogg'
|
||||
|
||||
weather_message = "<span class='userdanger'><i>A massive plume of smoke and magma can be seen billowing in the distance. The ground quakes and threatens to split. Find shelter now!.</i></span>"
|
||||
weather_duration_lower = 600
|
||||
weather_duration_upper = 1200
|
||||
weather_sound = 'sound/weather/volcano/lavaland_volcano_eruption.ogg'
|
||||
|
||||
// No end message. Radar will give you the safety message on this one, or your instincts
|
||||
end_duration = 300
|
||||
end_message = ""
|
||||
|
||||
area_types = list(/area/lavaland/surface/outdoors, /area/lavaland/surface/gulag_rock)
|
||||
target_trait = ORE_LEVEL
|
||||
probability = 5
|
||||
barometer_predictable = TRUE
|
||||
area_act = TRUE
|
||||
// The time until the next rock falls from the sky
|
||||
var/next_rubble
|
||||
// Has a river already been generated this storm?
|
||||
var/generated_river = FALSE
|
||||
// What tiles can we hit with a rock?
|
||||
var/list/valid_targets = list()
|
||||
|
||||
/datum/weather/volcano/New()
|
||||
next_rubble = world.time + 10 SECONDS // Short delay
|
||||
. = ..()
|
||||
|
||||
/datum/weather/volcano/area_act()
|
||||
if(prob(1) && !generated_river)
|
||||
generated_river = TRUE
|
||||
var/datum/river_spawner/new_river = new /datum/river_spawner(pick(levels_by_trait(ORE_LEVEL)))
|
||||
new_river.generate(nodes = 4, ignore_bridges = TRUE, warning = TRUE)
|
||||
if(world.time >= next_rubble)
|
||||
next_rubble = world.time + rand(3 DECISECONDS, 2 SECONDS)
|
||||
var/hits = 0
|
||||
var/target
|
||||
for(var/turf/T in get_area_turfs(/area/lavaland/surface/outdoors))
|
||||
if(istype(T, /turf/simulated/floor/)) // dont waste our time hitting walls
|
||||
valid_targets += T
|
||||
while(hits <= 150) //sling a bunch of rocks around the map
|
||||
if(!valid_targets) // god forbid we run out of spots to sling rocks
|
||||
break
|
||||
target = pick(valid_targets)
|
||||
new /obj/effect/temp_visual/rock_target(target)
|
||||
hits++
|
||||
valid_targets -= target
|
||||
//just play the play from the last hit in the bundle, it reaches across the map anyways
|
||||
INVOKE_ASYNC(src, PROC_REF(generate_boom), target)
|
||||
|
||||
//lets just fake some booms
|
||||
/datum/weather/volcano/proc/generate_boom(turf/target)
|
||||
sleep(ROCKFALL_DELAY)
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
var/turf/M_turf = get_turf(M)
|
||||
if(M_turf.z == target.z)
|
||||
M.playsound_local(target, 'sound/effects/explosionfar.ogg', 50, 1, get_rand_frequency(), distance_multiplier = 0)
|
||||
shake_camera(M, 2, 4)
|
||||
|
||||
/obj/effect/temp_visual/rockfall
|
||||
icon = 'icons/obj/meteor.dmi'
|
||||
icon_state = "clownish" // we shouldnt be seeing this
|
||||
name = "Ejected boulder"
|
||||
desc = "Get out of the way!"
|
||||
layer = FLY_LAYER
|
||||
randomdir = FALSE
|
||||
duration = ROCKFALL_DELAY
|
||||
pixel_z = 270
|
||||
|
||||
/obj/effect/temp_visual/rockfall/Initialize(mapload)
|
||||
. = ..()
|
||||
icon_state = pick("small","large", "sharp", "dust", "small1", "large1")
|
||||
animate(src, pixel_z = 0, time = duration)
|
||||
SpinAnimation()
|
||||
|
||||
/obj/effect/temp_visual/rock_target
|
||||
icon = 'icons/mob/actions/actions.dmi'
|
||||
icon_state = "sniper_zoom"
|
||||
layer = BELOW_MOB_LAYER
|
||||
light_range = 2
|
||||
duration = ROCKFALL_DELAY
|
||||
|
||||
/obj/effect/temp_visual/rock_target/ex_act()
|
||||
return
|
||||
|
||||
/obj/effect/temp_visual/rock_target/Initialize(mapload)
|
||||
. = ..()
|
||||
SpinAnimation()
|
||||
INVOKE_ASYNC(src, PROC_REF(fall))
|
||||
|
||||
/obj/effect/temp_visual/rock_target/proc/fall()
|
||||
var/turf/T = get_turf(src)
|
||||
playsound(T,'sound/magic/fleshtostone.ogg', 100, TRUE)
|
||||
new /obj/effect/temp_visual/rockfall(T)
|
||||
sleep(duration)
|
||||
T = get_turf(src)
|
||||
var/turf_area = get_area(T)
|
||||
if(ispath(turf_area, /area/shuttle)) //prevent hitting the shuttle when it moves
|
||||
log_debug("we hit a shuttle area. breaking rock")
|
||||
qdel(src)
|
||||
return
|
||||
playsound(T, 'sound/effects/break_stone.ogg', 80, TRUE)
|
||||
playsound(T, get_sfx("explosion"), 80, TRUE)
|
||||
for(var/mob/living/carbon/human/H in range(10, T))
|
||||
shake_camera(H, 3, 8)
|
||||
if(T.contents)
|
||||
for(var/mob/living/L in T.contents) // dont want to be crushing the hazards
|
||||
if(ismegafauna(L))
|
||||
L.visible_message("[L.name] easily withstands the hit of the massive rock!")
|
||||
return
|
||||
else
|
||||
L.visible_message("<span class='danger'>[L.name] is crushed under the massive impact of the boulder!</span>", "<span class='userdanger'>You are crushed as a massive weight suddenly descends upon you!</span>", "<span class='danger'>You hear wet splatters as something is hit with a massive object!</span>")
|
||||
L.gib()
|
||||
if(!islava(T) && !istype(T, /turf/simulated/floor/chasm)) // Splash harmlessly into the lava pools
|
||||
for(var/obj/structure/thing in T.contents) // dont cover the tendrils
|
||||
if(thing.name == "necropolis tendril")
|
||||
return
|
||||
T.ChangeTurf(/turf/simulated/mineral/random/high_chance/volcanic)
|
||||
|
||||
|
||||
|
||||
|
||||
/// MARK: Acid Rain
|
||||
/datum/weather/acid
|
||||
name = "Acidic rain"
|
||||
desc = "Emissions of sulfur and carbon into the atmosphere results in the formation of acid particulate in the ashen clouds. Eventually, enough collects that it will fall back down as sulfuric acid rain. NT brand shelter pods capsules are not rated for this level of acid."
|
||||
|
||||
telegraph_message = "<span class='boldwarning'><i>The sound of tiny drops begins to splatter against the ground, sizzling against the ash and stone. Seek shelter.</i></span>"
|
||||
telegraph_duration = 600
|
||||
telegraph_overlay = "light_ash"
|
||||
|
||||
weather_message = "<span class='userdanger'><i>Acidic rain begins to pour down in thick sheets, melting rock and flesh alike. Get inside now!</i></span>"
|
||||
weather_duration_lower = 600
|
||||
weather_duration_upper = 1200
|
||||
weather_overlay = "acid_rain"
|
||||
|
||||
end_message = "<span class='boldannounceic'>The pitter of acidic dropples slows to silence. It should be safe to go outside now.</span>"
|
||||
end_duration = 300
|
||||
end_overlay = "light_ash"
|
||||
|
||||
area_types = list(/area/lavaland/surface/outdoors, /area/lavaland/surface/gulag_rock)
|
||||
target_trait = ORE_LEVEL
|
||||
probability = 10
|
||||
barometer_predictable = TRUE
|
||||
area_act = TRUE
|
||||
// how long do you get before it melts a hole?
|
||||
var/melt_delay = 5 SECONDS
|
||||
|
||||
var/datum/looping_sound/active_outside_acid/sound_ao = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/active_inside_acid/sound_ai = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/weak_outside_acid/sound_wo = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/weak_inside_acid/sound_wi = new(list(), FALSE, TRUE)
|
||||
|
||||
/datum/weather/acid/update_eligible_areas()
|
||||
. = ..()
|
||||
sound_ao.output_atoms = outside_areas
|
||||
sound_ai.output_atoms = inside_areas
|
||||
sound_wo.output_atoms = outside_areas
|
||||
sound_wi.output_atoms = inside_areas
|
||||
|
||||
/datum/weather/acid/update_audio()
|
||||
|
||||
switch(stage)
|
||||
if(WEATHER_STARTUP_STAGE)
|
||||
sound_wo.start()
|
||||
sound_wi.start()
|
||||
|
||||
if(WEATHER_MAIN_STAGE)
|
||||
sound_wo.stop()
|
||||
sound_wi.stop()
|
||||
|
||||
sound_ao.start()
|
||||
sound_ai.start()
|
||||
|
||||
if(WEATHER_WIND_DOWN_STAGE)
|
||||
sound_ao.stop()
|
||||
sound_ai.stop()
|
||||
|
||||
sound_wo.start()
|
||||
sound_wi.start()
|
||||
|
||||
if(WEATHER_END_STAGE)
|
||||
sound_wo.stop()
|
||||
sound_wi.stop()
|
||||
|
||||
/datum/weather/acid/area_act()
|
||||
if(!length(GLOB.all_shelter_pods)) // don't need to act if there's nothing in the list so we don't runtime
|
||||
return
|
||||
for(var/turf/current_turf in GLOB.all_shelter_pods)
|
||||
if(!is_mining_level(current_turf.z)) // dont want to melt pods on other Z levels
|
||||
continue
|
||||
if(istype(get_area(current_turf), /area/survivalpod/luxurypod)) // luxury pods are immune to the storm
|
||||
continue
|
||||
if(prob(2))
|
||||
current_turf.visible_message("<span class = 'danger'>The ceiling begins to drip as acid starts eating holes in the roof!</span>", "<span class = 'danger'>You hear droplets hitting the floor as acid leaks in through the roof.</span>")
|
||||
addtimer(CALLBACK(src, PROC_REF(melt_pod), current_turf), melt_delay)
|
||||
|
||||
/datum/weather/acid/on_shelter_placed(datum/source, turf/center)
|
||||
. = ..()
|
||||
if(center.z in impacted_z_levels)
|
||||
var/area/A = get_area(center)
|
||||
inside_areas |= A
|
||||
sound_ai.output_atoms |= A
|
||||
sound_wi.output_atoms |= A
|
||||
|
||||
// lets make some holes!
|
||||
/datum/weather/acid/proc/melt_pod(turf/melt_this)
|
||||
var/area/new_area = GLOB.all_unique_areas[/area/lavaland/surface/outdoors] || new /area/lavaland/surface/outdoors
|
||||
for(var/turf/simulated/nearby_turf in RANGE_TURFS(3, melt_this)) // danger, but probably wont make the whole pod unusable unless you're VERY unlucky
|
||||
var/area/turf_area = get_area(nearby_turf)
|
||||
if(prob(70) && turf_area.type == /area/survivalpod)
|
||||
new_area.contents.Add(nearby_turf)
|
||||
if(isfloorturf(nearby_turf))
|
||||
nearby_turf.break_tile()
|
||||
if(iswallturf(nearby_turf))
|
||||
nearby_turf.dismantle_wall()
|
||||
for(var/obj/machinery/sleeper/survival_pod/pod in nearby_turf.contents)
|
||||
pod.visible_message("<span class = 'danger'>The sleeper melts away into a useless heap of junk!</span>", "<span class = 'danger'>You hear something nearby collapse from the acidic rain!</span>")
|
||||
pod.Destroy()
|
||||
|
||||
impacted_areas.Cut()
|
||||
generate_area_list()
|
||||
update_areas()
|
||||
update_eligible_areas()
|
||||
|
||||
/datum/weather/acid/weather_act(atom/L)
|
||||
while(L && !isturf(L))
|
||||
if(ismecha(L)) //Mechs are immune
|
||||
return
|
||||
if(!ishuman(L) || isgrey(L)) // greys and natural fauna shouldnt be affected by acid rain
|
||||
return
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(!H.wear_suit || !H.head) // No need to check further if they dont have clothing on
|
||||
H.adjustFireLoss(2)
|
||||
H.adjustBruteLoss(2)
|
||||
return
|
||||
if(!(H.head.resistance_flags & ACID_PROOF) && !(H.wear_suit.resistance_flags & ACID_PROOF))
|
||||
H.adjustFireLoss(2)
|
||||
H.adjustBruteLoss(2)
|
||||
L = L.loc //Matryoshka check
|
||||
|
||||
/// MARK: Wind Storm
|
||||
/datum/weather/wind
|
||||
name = "High-velocity wind"
|
||||
desc = "High-pressure barometrics in the area have caused a radical change in air pressure, resulting in high-speed winds in the immediate vicinity."
|
||||
|
||||
telegraph_message = "<span class='boldwarning'><i>The wind begins to pick up, whipping against your body with an ominous intensity. Seek shelter.</i></span>"
|
||||
telegraph_duration = 600
|
||||
telegraph_overlay = "light_ash"
|
||||
|
||||
weather_message = "<span class='userdanger'><i>The wind rises into a furious rage, kicking up dirt and ash in its wake. Get inside now!</i></span>"
|
||||
weather_duration_lower = 600
|
||||
weather_duration_upper = 1200
|
||||
weather_overlay = "wind"
|
||||
|
||||
end_message = "<span class='boldannounceic'>The wind calms into its normal rhythms, dust settling back to the ashen surface. It should be safe to go outside now.</span>"
|
||||
end_duration = 300
|
||||
end_overlay = "light_ash"
|
||||
|
||||
area_types = list(/area/lavaland/surface/outdoors, /area/lavaland/surface/gulag_rock)
|
||||
target_trait = ORE_LEVEL
|
||||
probability = 25
|
||||
barometer_predictable = TRUE
|
||||
var/wind_dir
|
||||
var/next_dir_change
|
||||
|
||||
var/datum/looping_sound/active_outside_ashstorm/sound_ao = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/active_inside_ashstorm/sound_ai = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/weak_outside_ashstorm/sound_wo = new(list(), FALSE, TRUE)
|
||||
var/datum/looping_sound/weak_inside_ashstorm/sound_wi = new(list(), FALSE, TRUE)
|
||||
|
||||
/datum/weather/wind/update_eligible_areas()
|
||||
. = ..()
|
||||
sound_ao.output_atoms = outside_areas
|
||||
sound_ai.output_atoms = inside_areas
|
||||
sound_wo.output_atoms = outside_areas
|
||||
sound_wi.output_atoms = inside_areas
|
||||
|
||||
/datum/weather/wind/update_audio()
|
||||
switch(stage)
|
||||
if(WEATHER_STARTUP_STAGE)
|
||||
sound_wo.start()
|
||||
sound_wi.start()
|
||||
|
||||
if(WEATHER_MAIN_STAGE)
|
||||
sound_wo.stop()
|
||||
sound_wi.stop()
|
||||
|
||||
sound_ao.start()
|
||||
sound_ai.start()
|
||||
|
||||
if(WEATHER_WIND_DOWN_STAGE)
|
||||
sound_ao.stop()
|
||||
sound_ai.stop()
|
||||
|
||||
sound_wo.start()
|
||||
sound_wi.start()
|
||||
|
||||
if(WEATHER_END_STAGE)
|
||||
sound_wo.stop()
|
||||
sound_wi.stop()
|
||||
|
||||
/datum/weather/wind/on_shelter_placed(datum/source, turf/center)
|
||||
. = ..()
|
||||
if(center.z in impacted_z_levels)
|
||||
var/area/A = get_area(center)
|
||||
inside_areas |= A
|
||||
sound_ai.output_atoms |= A
|
||||
sound_wi.output_atoms |= A
|
||||
|
||||
/datum/weather/wind/start() //give it our custom overlay
|
||||
custom_overlay = 'icons/effects/tile_effects.dmi'
|
||||
wind_dir = pick(GLOB.alldirs)
|
||||
overlay_dir = wind_dir
|
||||
next_dir_change = world.time + rand(10 SECONDS, 30 SECONDS)
|
||||
. = ..()
|
||||
|
||||
/datum/weather/wind/wind_down() // back to normal overlay
|
||||
custom_overlay = null
|
||||
overlay_dir = null
|
||||
. = ..()
|
||||
|
||||
/datum/weather/wind/weather_act(mob/living/L)
|
||||
if(next_dir_change <= world.time)
|
||||
next_dir_change = world.time + rand(10 SECONDS, 30 SECONDS)
|
||||
wind_dir = pick(GLOB.alldirs)
|
||||
overlay_dir = wind_dir
|
||||
update_areas()
|
||||
if(ismecha(L)) //Mechs are immune
|
||||
return
|
||||
if(ishuman(L)) // lets not push around lavaland mobs
|
||||
L.air_push(wind_dir, MOVE_FORCE_NORMAL * 2)
|
||||
|
||||
#undef ROCKFALL_DELAY
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
end_duration = 100
|
||||
end_message = "<span class='notice'>The air seems to be cooling off again.</span>"
|
||||
var/pre_maint_all_access
|
||||
area_type = /area
|
||||
area_types = list(/area)
|
||||
protected_areas = list(
|
||||
/area/station/maintenance,
|
||||
/area/station/turret_protected/ai_upload,
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
end_duration = 10 // wind_down() does not do anything for this event, so we just trigger end() semi-immediately
|
||||
end_message = null
|
||||
area_type = /area // read generate_area_list() as well below
|
||||
area_types = list(/area) // read generate_area_list() as well below
|
||||
protected_areas = list(/area/shuttle/arrival/station)
|
||||
target_trait = REACHABLE_SPACE_ONLY
|
||||
immunity_type = "burn"
|
||||
|
||||
@@ -0,0 +1,256 @@
|
||||
#define RADAR_NEEDS_WELDING 0
|
||||
#define RADAR_NEEDS_PLASTEEL 1
|
||||
#define RADAR_NEEDS_WRENCH 2
|
||||
#define RADAR_NEEDS_SCREWDRIVER 3
|
||||
|
||||
/obj/machinery/radar
|
||||
name = "Doppler Radar"
|
||||
desc = "An age-tested technology for measuring and predicting weather patterns. This one has been loaded with information of the local expected conditions."
|
||||
icon = 'icons/obj/machines/doppler_tower.dmi'
|
||||
icon_state = "base"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
layer = ABOVE_ALL_MOB_LAYER
|
||||
power_state = NO_POWER_USE // going to be used outside
|
||||
interact_offline = TRUE
|
||||
idle_power_consumption = 0
|
||||
pixel_x = -32
|
||||
armor = list(MELEE = 80, BULLET = 10, LASER = 30, ENERGY = 30, BOMB = 50, RAD = 0, FIRE = 100, ACID = 100)
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
/// Time between callouts
|
||||
var/check_time
|
||||
/// Internal radio to handle announcements over supply
|
||||
var/obj/item/radio/radio
|
||||
/// For checking what was the last weather stage an alert was sent out
|
||||
var/last_stage
|
||||
/// How accurate are we based off parts?
|
||||
var/accuracy_coeff
|
||||
/// Base Inaccuracy
|
||||
var/inaccuracy = 5 MINUTES
|
||||
/// What is our current prediction?
|
||||
var/prediction
|
||||
/// Don't want constant updates
|
||||
var/dont_announce = TRUE
|
||||
/// For fakeout calls
|
||||
var/correct_prediction
|
||||
/// Are we broken?
|
||||
var/construction_state = RADAR_NEEDS_WELDING
|
||||
luminosity = 1
|
||||
|
||||
/obj/machinery/radar/Initialize(mapload)
|
||||
. = ..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/circuitboard/machine/radar(null)
|
||||
component_parts += new /obj/item/stock_parts/scanning_module(null)
|
||||
component_parts += new /obj/item/stock_parts/scanning_module(null)
|
||||
component_parts += new /obj/item/stock_parts/scanning_module(null)
|
||||
component_parts += new /obj/item/stock_parts/scanning_module(null)
|
||||
component_parts += new /obj/item/stack/cable_coil(null, 10)
|
||||
RefreshParts()
|
||||
set_light(5, 2, "#e2db98") // so the machine isnt pitch black
|
||||
|
||||
AddComponent(/datum/component/multitile, list(
|
||||
list(1, 1),
|
||||
list(1, MACH_CENTER),
|
||||
))
|
||||
|
||||
radio = new(src)
|
||||
radio.listening = FALSE
|
||||
radio.follow_target = src
|
||||
radio.config(list("Supply" = 0))
|
||||
|
||||
AddComponent(/datum/component/largetransparency, -1, 2, 0, 1)
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
|
||||
/obj/machinery/radar/update_overlays()
|
||||
. = ..()
|
||||
if(stat & BROKEN)
|
||||
icon_state = "broken"
|
||||
else
|
||||
icon_state = "base"
|
||||
. += "chicken"
|
||||
. += "screen"
|
||||
|
||||
/obj/machinery/radar/process()
|
||||
if(stat & BROKEN)
|
||||
return
|
||||
if(check_time > world.time)
|
||||
return
|
||||
|
||||
for(var/datum/weather/W in SSweather.processing)
|
||||
if(!W)
|
||||
break
|
||||
if(W.barometer_predictable && is_path_in_list(/area/lavaland/surface/outdoors, W.area_types))
|
||||
switch(W.stage)
|
||||
if(WEATHER_STARTUP_STAGE)
|
||||
if(last_stage == WEATHER_STARTUP_STAGE)
|
||||
return
|
||||
if(W.aesthetic)
|
||||
if(correct_prediction) // unupgraded machines should still scare the poor bastards
|
||||
radio.autosay("<b>[W.name] detected settling over the sector. No further action required.</b>", name, "Supply")
|
||||
else
|
||||
radio.autosay("<b>Ash Storm detected converging over the local sector. Please finish any surface excavations.</b>", name, "Supply")
|
||||
else
|
||||
radio.autosay("<b>[W.name] detected converging over the local sector. Please finish any surface excavations.</b>", name, "Supply")
|
||||
last_stage = WEATHER_STARTUP_STAGE
|
||||
check_time = world.time + W.telegraph_duration + 5 SECONDS
|
||||
return
|
||||
if(WEATHER_MAIN_STAGE)
|
||||
if(last_stage == WEATHER_MAIN_STAGE)
|
||||
return
|
||||
radio.autosay("<b>Inclement weather has reached the local sector. Seek shelter immediately.</b>", name, "Supply")
|
||||
last_stage = WEATHER_MAIN_STAGE
|
||||
check_time = world.time + (W.weather_duration / 2)
|
||||
return
|
||||
if(WEATHER_WIND_DOWN_STAGE)
|
||||
if(last_stage == WEATHER_WIND_DOWN_STAGE)
|
||||
return
|
||||
radio.autosay("<b>Inclement weather has dispersed. It is now safe to resume surface excavations.</b>", name, "Supply")
|
||||
last_stage = WEATHER_WIND_DOWN_STAGE
|
||||
dont_announce = FALSE
|
||||
return
|
||||
|
||||
if(dont_announce)
|
||||
return
|
||||
|
||||
var/datum/weather/next_weather = SSweather.next_weather_by_zlevel["3"]
|
||||
var/next_hit = SSweather.next_hit_by_zlevel["3"]
|
||||
var/next_difference = next_hit - world.time
|
||||
var/difference_rounded = DisplayTimeText(max(1, next_difference))
|
||||
|
||||
if(next_weather == "0" || next_weather == null)
|
||||
return
|
||||
if(accuracy_coeff >= 4) //perfect accuracy
|
||||
if(next_difference <= (3 MINUTES))
|
||||
radio.autosay("<b>Weather patterns successfully analyzed. Predicted weather event in [difference_rounded]: [next_weather.name] </b>", name, "Supply")
|
||||
dont_announce = TRUE
|
||||
correct_prediction = TRUE
|
||||
else if(prob(accuracy_coeff) && next_difference <= 3 MINUTES && next_difference >= 30 SECONDS)
|
||||
if(next_weather == "emberfall" && !prob(10 * accuracy_coeff)) // fake callout
|
||||
radio.autosay("<b>Weather patterns successfully analyzed. Predicted weather event in [difference_rounded]: ash storm </b>", name, "Supply")
|
||||
dont_announce = TRUE
|
||||
correct_prediction = FALSE
|
||||
else
|
||||
radio.autosay("<b>Weather patterns successfully analyzed. Predicted weather event in [difference_rounded]: [next_weather.name] </b>", name, "Supply")
|
||||
dont_announce = TRUE
|
||||
correct_prediction = TRUE
|
||||
|
||||
/obj/machinery/radar/examine(mob/user)
|
||||
. = ..()
|
||||
if(!(stat & BROKEN))
|
||||
return
|
||||
|
||||
switch(construction_state)
|
||||
if(RADAR_NEEDS_WELDING)
|
||||
. += "<span class='notice'>The framework is damaged, and needs welding.</span>"
|
||||
if(RADAR_NEEDS_PLASTEEL)
|
||||
. += "<span class='notice'>The framework needs new plasteel plating.</span>"
|
||||
if(RADAR_NEEDS_WRENCH)
|
||||
. += "<span class='notice'>The plating needs wrenching into place.</span>"
|
||||
if(RADAR_NEEDS_SCREWDRIVER)
|
||||
. += "<span class='notice'>The cover screws are loose.</span>"
|
||||
|
||||
// Interaction
|
||||
|
||||
// REPAIRS //
|
||||
// Step 1
|
||||
// (stolen from gav gen teehee)
|
||||
/obj/machinery/radar/welder_act(mob/user, obj/item/I)
|
||||
if(construction_state != RADAR_NEEDS_WELDING)
|
||||
return
|
||||
. = TRUE
|
||||
if(!I.use_tool(src, user, null, 1, I.tool_volume))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You mend the damaged framework.</span>")
|
||||
construction_state = RADAR_NEEDS_PLASTEEL
|
||||
|
||||
// Step 2
|
||||
/obj/machinery/radar/item_interaction(mob/living/user, obj/item/used, list/modifiers)
|
||||
if(construction_state != RADAR_NEEDS_PLASTEEL)
|
||||
return ..()
|
||||
|
||||
if(istype(used, /obj/item/stack/sheet/plasteel))
|
||||
var/obj/item/stack/sheet/plasteel/PS = used
|
||||
if(PS.amount < 10)
|
||||
to_chat(user, "<span class='warning'>You need 10 sheets of plasteel.</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
to_chat(user, "<span class='notice'>You add new plating to the framework.</span>")
|
||||
construction_state = RADAR_NEEDS_WRENCH
|
||||
update_icon()
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
return ..()
|
||||
|
||||
// Step 3
|
||||
/obj/machinery/radar/wrench_act(mob/living/user, obj/item/I)
|
||||
if(construction_state != RADAR_NEEDS_WRENCH)
|
||||
return
|
||||
. = TRUE
|
||||
if(!I.use_tool(src, user, volume = I.tool_volume))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You secure the plating to the framework.</span>")
|
||||
construction_state = RADAR_NEEDS_SCREWDRIVER
|
||||
|
||||
|
||||
// Step 4
|
||||
/obj/machinery/radar/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!(stat & BROKEN)) // Not actually broken
|
||||
return
|
||||
if(construction_state != RADAR_NEEDS_SCREWDRIVER)
|
||||
return
|
||||
. = TRUE
|
||||
if(!I.use_tool(src, user, volume = I.tool_volume))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You screw the covers back into place.</span>")
|
||||
set_fixed()
|
||||
|
||||
/obj/machinery/radar/RefreshParts()
|
||||
accuracy_coeff = 0
|
||||
for(var/obj/item/stock_parts/scanning_module/C in component_parts)
|
||||
accuracy_coeff += C.rating
|
||||
accuracy_coeff = (accuracy_coeff / 4) //average all the parts
|
||||
|
||||
// We dont want them to rebuild this in random places. but if it does somehow delete, we should log it
|
||||
/obj/machinery/radar/Destroy()
|
||||
investigate_log("was destroyed!", "radar")
|
||||
qdel(radio)
|
||||
component_parts -= /obj/item/circuitboard/machine/radar // dont let them get the board
|
||||
new /obj/item/circuitboard/machine/radar/broken(src)
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/radar/ex_act(severity)
|
||||
if(severity == EXPLODE_DEVASTATE) // Very sturdy.
|
||||
set_broken()
|
||||
|
||||
/obj/machinery/radar/proc/set_broken()
|
||||
stat |= BROKEN
|
||||
investigate_log("has broken down.", "radar")
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/radar/proc/set_fixed()
|
||||
stat &= ~BROKEN
|
||||
construction_state = initial(construction_state)
|
||||
update_icon()
|
||||
|
||||
/obj/item/circuitboard/machine/radar
|
||||
board_name = "Doppler Radar"
|
||||
icon_state = "supply"
|
||||
build_path = /obj/machinery/radar
|
||||
board_type = "machine"
|
||||
origin_tech = "engineering=2"
|
||||
req_components = list(
|
||||
/obj/item/stack/cable_coil = 5,
|
||||
/obj/item/stack/sheet/glass = 10,
|
||||
/obj/item/stock_parts/scanning_module = 4,
|
||||
)
|
||||
|
||||
/obj/item/circuitboard/machine/radar/broken
|
||||
board_name = "Doppler Radar"
|
||||
desc = "Bits of char, plastic, and ash cling to the boards surface. How it was working before was nothing short of a miracle. It's probably not going to work again."
|
||||
icon_state = "command_broken"
|
||||
|
||||
#undef RADAR_NEEDS_WELDING
|
||||
#undef RADAR_NEEDS_PLASTEEL
|
||||
#undef RADAR_NEEDS_WRENCH
|
||||
#undef RADAR_NEEDS_SCREWDRIVER
|
||||
@@ -653,7 +653,7 @@ SLIME SCANNER
|
||||
|
||||
for(var/V in SSweather.processing)
|
||||
var/datum/weather/W = V
|
||||
if(W.barometer_predictable && (T.z in W.impacted_z_levels) && W.area_type == user_area.type && !(W.stage == WEATHER_END_STAGE))
|
||||
if(W.barometer_predictable && (T.z in W.impacted_z_levels) && is_type_in_list(user_area, W.area_types) && !(W.stage == WEATHER_END_STAGE))
|
||||
ongoing_weather = W
|
||||
break
|
||||
|
||||
|
||||
@@ -36,6 +36,8 @@ GLOBAL_LIST_EMPTY(tendrils)
|
||||
if(ismineralturf(F))
|
||||
var/turf/simulated/mineral/M = F
|
||||
M.ChangeTurf(M.turf_type, FALSE, FALSE, TRUE)
|
||||
var/turf/no_lava = F
|
||||
no_lava.flags |= NO_LAVA_GEN
|
||||
|
||||
/obj/structure/spawner/lavaland/deconstruct(disassembled)
|
||||
new /obj/effect/collapse(loc)
|
||||
|
||||
@@ -317,6 +317,13 @@
|
||||
toxins = 10
|
||||
atmos_mode = ATMOS_MODE_NO_DECAY
|
||||
|
||||
/turf/simulated/floor/engine/lavaland_air
|
||||
oxygen = LAVALAND_OXYGEN
|
||||
nitrogen = LAVALAND_NITROGEN
|
||||
temperature = LAVALAND_TEMPERATURE
|
||||
atmos_mode = ATMOS_MODE_EXPOSED_TO_ENVIRONMENT
|
||||
atmos_environment = ENVIRONMENT_LAVALAND
|
||||
|
||||
/turf/simulated/floor/engine/singularity_pull(S, current_size)
|
||||
if(current_size >= STAGE_FIVE)
|
||||
if(floor_tile)
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
#define RIVER_MIN_X 50
|
||||
#define RIVER_MIN_Y 50
|
||||
|
||||
#define WARNING_DELAY (4 SECONDS) // the warning time that a warning will be deisplayed before the lava conversion occurs
|
||||
|
||||
#define BRIDGE_PROB 2 // the percent probability of a bridge to spawn for every tile forward the river travels
|
||||
|
||||
GLOBAL_LIST_EMPTY(river_waypoint_presets)
|
||||
|
||||
/obj/effect/landmark/river_waypoint
|
||||
@@ -30,6 +34,12 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets)
|
||||
var/whitelist_turf_type = /turf/simulated/mineral
|
||||
/// The turf used when a spread of the tile stops.
|
||||
var/shoreline_turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
|
||||
/// To hold all the found turfs to convert to the lava type
|
||||
var/list/collected_turfs = list()
|
||||
/// Does the lava generate a warning beforehand
|
||||
var/warning
|
||||
/// Do we ignore building any bridges?
|
||||
var/ignore_bridges
|
||||
|
||||
/datum/river_spawner/New(target_z_, spread_prob_ = 25, spread_prob_loss_ = 11)
|
||||
target_z = target_z_
|
||||
@@ -42,7 +52,9 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets)
|
||||
/// `nodes` is the number of unique points in those bounds the river will
|
||||
/// connect to. Note that `nodes` says little about the resultant size of the
|
||||
/// river due to its ability to detour far away from the direct path between them.
|
||||
/datum/river_spawner/proc/generate(nodes = 4, min_x = RIVER_MIN_X, min_y = RIVER_MIN_Y, max_x = RIVER_MAX_X, max_y = RIVER_MAX_Y)
|
||||
/// set ignore_bridges TRUE to not spawn any new bridges, and set warning to TRUE to
|
||||
/// allow for the new generations to have a telegraphed icon first
|
||||
/datum/river_spawner/proc/generate(nodes = 4, min_x = RIVER_MIN_X, min_y = RIVER_MIN_Y, max_x = RIVER_MAX_X, max_y = RIVER_MAX_Y, ignore_bridges = FALSE, warning = FALSE)
|
||||
var/list/river_nodes = list()
|
||||
var/num_spawned = 0
|
||||
|
||||
@@ -72,7 +84,9 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets)
|
||||
W.connected = TRUE
|
||||
var/turf/cur_turf = get_turf(W)
|
||||
if(istype(get_area(cur_turf), whitelist_area_type) && !(cur_turf.flags & NO_LAVA_GEN))
|
||||
cur_turf.ChangeTurf(river_turf_type, ignore_air = TRUE)
|
||||
collected_turfs += cur_turf
|
||||
else if(ignore_bridges && (cur_turf.flags & LAVA_BRIDGE))
|
||||
collected_turfs += cur_turf
|
||||
var/turf/target_turf = get_turf(pick(river_nodes - W))
|
||||
if(!target_turf)
|
||||
break
|
||||
@@ -93,6 +107,7 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets)
|
||||
cur_dir = turn(cur_dir, -45)
|
||||
else
|
||||
cur_dir = get_dir(cur_turf, target_turf)
|
||||
|
||||
// we may veer off the map entirely, returning a null turf; if so, go back and try again
|
||||
while(get_step(cur_turf, cur_dir) == null && attempts-- > 0)
|
||||
|
||||
@@ -107,15 +122,14 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets)
|
||||
cur_turf = get_step(cur_turf, cur_dir)
|
||||
continue
|
||||
else
|
||||
var/turf/river_turf = cur_turf.ChangeTurf(river_turf_type, ignore_air = TRUE)
|
||||
if(prob(1))
|
||||
new /obj/effect/spawner/dynamic_bridge(river_turf)
|
||||
spread_turf(river_turf, spread_prob, spread_prob_loss, whitelist_area_type)
|
||||
collected_turfs += cur_turf
|
||||
|
||||
handle_change(warning, ignore_bridges)
|
||||
|
||||
for(var/WP in river_nodes)
|
||||
qdel(WP)
|
||||
|
||||
/datum/river_spawner/proc/spread_turf(turf/start_turf, probability = 30, prob_loss = 25, whitelisted_area)
|
||||
/datum/river_spawner/proc/spread_turf(turf/start_turf, probability = 30, prob_loss = 25, whitelisted_area, ignore_bridges)
|
||||
if(probability <= 0)
|
||||
return
|
||||
var/list/cardinal_turfs = list()
|
||||
@@ -124,7 +138,9 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets)
|
||||
for(var/F in RANGE_TURFS(1, start_turf) - start_turf)
|
||||
var/turf/T = F
|
||||
var/area/new_area = get_area(T)
|
||||
if(!T || (T.density && !istype(T, whitelist_turf_type)) || istype(T, /turf/simulated/floor/indestructible) || (whitelisted_area && !istype(new_area, whitelisted_area)) || (T.flags & NO_LAVA_GEN))
|
||||
if(!ignore_bridges && (T.flags & LAVA_BRIDGE))
|
||||
continue
|
||||
else if(!T || (T.density && !istype(T, whitelist_turf_type)) || istype(T, /turf/simulated/floor/indestructible) || (whitelisted_area && !istype(new_area, whitelisted_area)) || (T.flags & NO_LAVA_GEN))
|
||||
continue
|
||||
|
||||
if(get_dir(start_turf, F) in GLOB.cardinal)
|
||||
@@ -136,8 +152,6 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets)
|
||||
var/turf/T = F
|
||||
if(!istype(T, start_turf.type) && T.ChangeTurf(start_turf.type, ignore_air = TRUE) && prob(probability))
|
||||
spread_turf(T, probability - prob_loss, prob_loss, whitelisted_area)
|
||||
if(prob(1))
|
||||
new /obj/effect/spawner/dynamic_bridge(T)
|
||||
|
||||
for(var/F in diagonal_turfs) //diagonal turfs only sometimes change, but will always spread if changed
|
||||
var/turf/T = F
|
||||
@@ -145,8 +159,40 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets)
|
||||
spread_turf(T, probability - prob_loss, prob_loss, whitelisted_area)
|
||||
else if(istype(T, whitelist_turf_type) && !istype(T, start_turf.type))
|
||||
T.ChangeTurf(shoreline_turf_type, ignore_air = TRUE)
|
||||
if(prob(1))
|
||||
new /obj/effect/spawner/dynamic_bridge(T)
|
||||
|
||||
/// handles changing the lava turfs, and if it should delay it and place warnings
|
||||
/datum/river_spawner/proc/handle_change(warning, ignore_bridges)
|
||||
var/lava_counter = 0
|
||||
for(var/turf/listed_turf in collected_turfs)
|
||||
var/affected_turf = get_turf(listed_turf)
|
||||
if(warning)
|
||||
if(lava_counter++ >= 2)
|
||||
new /obj/effect/temp_visual/river_warning(affected_turf)
|
||||
lava_counter = 0
|
||||
addtimer(CALLBACK(src, PROC_REF(convert_turf), affected_turf), WARNING_DELAY)
|
||||
else
|
||||
convert_turf(affected_turf, ignore_bridges)
|
||||
|
||||
collected_turfs.Cut()
|
||||
|
||||
/// actually convert the turf
|
||||
/datum/river_spawner/proc/convert_turf(turf/cur_turf, ignore_bridges)
|
||||
var/turf/river_turf = cur_turf.ChangeTurf(river_turf_type, ignore_air = TRUE)
|
||||
spread_turf(river_turf, spread_prob, spread_prob_loss, whitelist_area_type, ignore_bridges)
|
||||
if(prob(BRIDGE_PROB) && !ignore_bridges)
|
||||
new /obj/effect/spawner/dynamic_bridge(cur_turf)
|
||||
|
||||
/obj/effect/temp_visual/river_warning
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "warning"
|
||||
layer = BELOW_MOB_LAYER
|
||||
duration = WARNING_DELAY
|
||||
randomdir = FALSE
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
#undef WARNING_DELAY
|
||||
#undef BRIDGE_PROB
|
||||
|
||||
#undef RIVER_MAX_X
|
||||
#undef RIVER_MAX_Y
|
||||
|
||||
@@ -73,14 +73,19 @@
|
||||
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
|
||||
template.load(deploy_location, centered = TRUE)
|
||||
new /obj/effect/particle_effect/smoke(get_turf(src))
|
||||
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SHELTER_PLACED, T)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/survivalcapsule/luxury
|
||||
name = "luxury bluespace shelter capsule"
|
||||
desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
|
||||
desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace. It is made of durable materials more capable of withstanding harsh weather over standard capsules."
|
||||
origin_tech = "engineering=3;bluespace=4"
|
||||
template_id = "shelter_beta"
|
||||
|
||||
// for things that shouldnt affect specifically the luxury pods
|
||||
/area/survivalpod/luxurypod
|
||||
name = "\improper Luxury Shelter"
|
||||
|
||||
//Pod turfs and objects
|
||||
|
||||
//Window
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
var/datum/weather/A
|
||||
for(var/V in SSweather.processing)
|
||||
var/datum/weather/W = V
|
||||
if((user_turf.z in W.impacted_z_levels) && W.area_type == user_area.type)
|
||||
if((user_turf.z in W.impacted_z_levels) && is_type_in_list(user_area, W.area_types))
|
||||
A = W
|
||||
break
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
var/power_boosted = FALSE
|
||||
for(var/V in SSweather.processing)
|
||||
var/datum/weather/W = V
|
||||
if((target_turf.z in W.impacted_z_levels) && W.area_type == target_area.type)
|
||||
if((target_turf.z in W.impacted_z_levels) && is_type_in_list(target_area, W.area_types))
|
||||
power_boosted = TRUE
|
||||
break
|
||||
playsound(src, 'sound/magic/lightningshock.ogg', 10, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
|
||||
|
||||
@@ -570,14 +570,13 @@
|
||||
mobile_port.loc = S1.loc
|
||||
mobile_port.dir = S1.dir
|
||||
|
||||
//update mining and labor shuttle ash storm audio
|
||||
//update mining and labor shuttle weather audio
|
||||
if(mobile_port.id in list("mining", "laborcamp"))
|
||||
for(var/zlvl in levels_by_trait(ORE_LEVEL))
|
||||
var/datum/weather/ash_storm/W = SSweather.get_weather(zlvl, /area/lavaland/surface/outdoors)
|
||||
var/datum/weather/W = SSweather.get_weather(zlvl, /area/lavaland/surface/outdoors)
|
||||
if(W)
|
||||
W.update_eligible_areas()
|
||||
W.update_audio()
|
||||
|
||||
mobile_port.unlockPortDoors(S1)
|
||||
|
||||
/obj/docking_port/mobile/proc/is_turf_blacklisted_for_transit(turf/T)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 20 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.9 KiB |
+2
-1
@@ -728,8 +728,8 @@
|
||||
#include "code\datums\uplink_items\uplink_special.dm"
|
||||
#include "code\datums\uplink_items\uplink_traitor.dm"
|
||||
#include "code\datums\weather\weather_datum.dm"
|
||||
#include "code\datums\weather\weather_types\ash_storm.dm"
|
||||
#include "code\datums\weather\weather_types\floor_is_lava.dm"
|
||||
#include "code\datums\weather\weather_types\lavaland_weather.dm"
|
||||
#include "code\datums\weather\weather_types\radiation_storm.dm"
|
||||
#include "code\datums\weather\weather_types\snow_storm.dm"
|
||||
#include "code\datums\weather\weather_types\solar_flare.dm"
|
||||
@@ -943,6 +943,7 @@
|
||||
#include "code\game\machinery\portable_tag_turret.dm"
|
||||
#include "code\game\machinery\portable_turret.dm"
|
||||
#include "code\game\machinery\quantum_pad.dm"
|
||||
#include "code\game\machinery\radar.dm"
|
||||
#include "code\game\machinery\recharger.dm"
|
||||
#include "code\game\machinery\rechargestation.dm"
|
||||
#include "code\game\machinery\recycler.dm"
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user