From 404666546be83728d37ee7af8f7e39eb4cc0abdd Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Wed, 23 Dec 2015 04:45:09 -0600 Subject: [PATCH] More weather updates --- code/__DEFINES/misc.dm | 2 + .../modules/mining/lavaland/lavaland_areas.dm | 28 ++++++++++ code/modules/mining/lavaland/weather.dm | 51 +++++++++++------- code/modules/mining/lavaland/weather_types.dm | 51 +++++++++++++++--- code/modules/mining/mine_items.dm | 3 +- code/modules/mob/living/carbon/human/life.dm | 20 ++++--- code/modules/shuttle/shuttle.dm | 1 + icons/effects/weather_effects.dmi | Bin 0 -> 13535 bytes tgstation.dme | 1 + 9 files changed, 124 insertions(+), 33 deletions(-) create mode 100644 code/modules/mining/lavaland/lavaland_areas.dm create mode 100644 icons/effects/weather_effects.dmi diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 6e49c476ac4..0f61f0d4235 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -181,6 +181,8 @@ #define ZLEVEL_ABANDONNEDTSAT 3 #define ZLEVEL_CENTCOM 2 #define ZLEVEL_STATION 1 +#define ZLEVEL_LAVALAND 5 +#define ZLEVEL_UNDERGROUND 6 //ticker.current_state values #define GAME_STATE_STARTUP 0 diff --git a/code/modules/mining/lavaland/lavaland_areas.dm b/code/modules/mining/lavaland/lavaland_areas.dm new file mode 100644 index 00000000000..e3fa70aa43d --- /dev/null +++ b/code/modules/mining/lavaland/lavaland_areas.dm @@ -0,0 +1,28 @@ +/**********************Lavaland Areas**************************/ + +/area/lavaland + icon_state = "mining" + has_gravity = 1 + +/area/lavaland/surface + name = "Lavaland" + icon_state = "explored" + music = null + requires_power = 1 + ambientsounds = list('sound/ambience/ambimine.ogg') + +/area/lavaland/underground + name = "Lavaland Caves" + icon_state = "unexplored" + music = null + always_unpowered = 1 + requires_power = 1 + poweralm = 0 + power_environ = 0 + power_equip = 0 + power_light = 0 + ambientsounds = list('sound/ambience/ambimine.ogg') + + +/area/lavaland/surface/outdoors + name = "Lavaland Wastes" diff --git a/code/modules/mining/lavaland/weather.dm b/code/modules/mining/lavaland/weather.dm index 282f9ac8950..b65f177e802 100644 --- a/code/modules/mining/lavaland/weather.dm +++ b/code/modules/mining/lavaland/weather.dm @@ -10,6 +10,8 @@ var/global/datum/weather/activeWeather var/start_up_time = 300 //30 seconds var/start_up_message = "The wind begins to pick up." var/duration = 120 //2 minutes + var/duration_lower = 120 + var/duration_upper = 120 var/duration_message = "A storm has started!" var/wind_down = 300 // 30 seconds var/wind_down_message = "The storm is passing." @@ -22,9 +24,11 @@ var/global/datum/weather/activeWeather var/start_up_overlay = "lava" var/duration_overlay = "lava" + var/overlay_layer = 10 //This is the default area layer, and above everything else. 2 is floors/below walls and mobs. var/purely_aesthetic = FALSE //If we just want gentle rain that doesn't hurt people /datum/weather/proc/weather_start_up() + duration = rand(duration_lower,duration_upper) if(activeWeather) return activeWeather = src @@ -47,11 +51,11 @@ var/global/datum/weather/activeWeather sleep(duration*10) else //Storm effects for(var/i in 1 to duration-1) - for(var/mob/living/L in living_mob_list) . + for(var/mob/living/L in living_mob_list) var/turf/Z = get_turf(L) if(Z.weather == src) storm_act(L) - sleep(10) + sleep(10) stage = WIND_DOWN_STAGE weather_wind_down() @@ -78,19 +82,30 @@ var/global/datum/weather/activeWeather for(var/turf/T in get_area_turfs(area_type, target_z)) if(exclude_walls && T.density == 1) continue - switch(stage) - if(STARTUP_STAGE) - T.overlays += "[start_up_overlay]" - T.weather = src - if(MAIN_STAGE) - T.overlays -= "[duration_overlay]" - T.overlays += "[duration_overlay]" - T.weather = src - if(WIND_DOWN_STAGE) - T.overlays -= "[duration_overlay]" - T.overlays += "[start_up_overlay]" - T.weather = src - if(END_STAGE) - T.overlays -= start_up_overlay - T.weather = null - activeWeather = null \ No newline at end of file + if(stage == END_STAGE) + T.weather = null + else + T.weather = src + + for(var/area/N in get_areas(area_type)) + if(N.z == target_z) + N.layer = overlay_layer + N.icon = 'icons/effects/weather_effects.dmi' + N.invisibility = 0 + N.opacity = 1 + switch(stage) + if(STARTUP_STAGE) + N.icon_state = start_up_overlay + + if(MAIN_STAGE) + N.icon_state = duration_overlay + + if(WIND_DOWN_STAGE) + N.icon_state = start_up_overlay + + if(END_STAGE) + N.icon_state = initial(N.icon_state) + N.layer = 10 //Just default back to normal area stuff since I assume setting a var is faster than initial + N.invisibility = 100 + N.opacity = 0 + activeWeather = null \ No newline at end of file diff --git a/code/modules/mining/lavaland/weather_types.dm b/code/modules/mining/lavaland/weather_types.dm index 6d943ee9f58..e069271bdce 100644 --- a/code/modules/mining/lavaland/weather_types.dm +++ b/code/modules/mining/lavaland/weather_types.dm @@ -1,8 +1,11 @@ +///The floor is lava + /datum/weather/floor_is_lava name = "floor is lava" start_up_time = 30 //3 seconds start_up_message = "The ground begins to bubble." - duration = 60 //1 minute + duration_lower = 45 + duration_upper = 60 //1 minute duration_message = "The floor is lava!" wind_down = 30// 3 seconds wind_down_message = "The ground begins to cool." @@ -13,14 +16,50 @@ start_up_overlay = "lava" duration_overlay = "lava" + overlay_layer = 2 //Covers floors only /datum/weather/floor_is_lavaproc/storm_act(mob/living/L) - var/safe = 0 var/turf/F = get_turf(L) for(var/obj/structure/O in L.contents) if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor! - safe = 1 - break - if(!safe) - L.adjustFireLoss(3) \ No newline at end of file + return + L.adjustFireLoss(3) + + + + +//Ash storms + +/datum/weather/ash_storm + name = "ash storm" + start_up_time = 300 //30 seconds + start_up_message = "The wind begins to pick up. Seek shelter." + duration_lower = 90 //1.5 minutes + duration_upper = 360 //3 minutes + duration_message = "An ash storm has started! Get inside!" + wind_down = 300 // 30 seconds + wind_down_message = "The storm begins to fade. Should be safe to go outside again." + + target_z = ZLEVEL_LAVALAND + area_type = /area/lavaland/surface/outdoors + + start_up_overlay = "light_ash" + duration_overlay = "ash_storm" + overlay_layer = 10 + + +/datum/weather/ash_storm/false_alarm //No storm, just light ember fall + purely_aesthetic = TRUE + duration_message = "An ash storm has started! Get inside!" + duration_overlay = "light_ash" + duration_message = "Looks like the storm just missed the mining area. False alarm." + wind_down_message = "The ash fall starts to trail off." + +/datum/weather/ash_storm/storm_act(mob/living/L) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + var/thermal_protection = H.get_thermal_protection() + if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) + return + L.adjustFireLoss(4) \ No newline at end of file diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 5958d0275ad..c8fdb135872 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -245,6 +245,7 @@ threshhold.toxins = 0 L.contents += threshhold threshhold.overlays.Cut() + threshhold.weather = null var/list/turfs = room["floors"] for(var/turf/simulated/floor/A in turfs) @@ -261,5 +262,5 @@ A.air.temperature = 293.15 SSair.add_to_active(A) A.overlays.Cut() - + A.weather = null L.contents += A diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 34803e4bff7..88a4581e713 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -106,14 +106,8 @@ if(!dna || !dna.species.handle_fire(src)) ..() if(on_fire) - var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures - if(wear_suit) - if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT) - thermal_protection += (wear_suit.max_heat_protection_temperature*0.7) - if(head) - if(head.max_heat_protection_temperature >= FIRE_HELM_MAX_TEMP_PROTECT) - thermal_protection += (head.max_heat_protection_temperature*THERMAL_PROTECTION_HEAD) - thermal_protection = round(thermal_protection) + var/thermal_protection = get_thermal_protection() + if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) return if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT) @@ -121,6 +115,16 @@ else bodytemperature += (BODYTEMP_HEATING_MAX + (fire_stacks * 12)) +/mob/living/carbon/human/proc/get_thermal_protection() + var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures + if(wear_suit) + if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT) + thermal_protection += (wear_suit.max_heat_protection_temperature*0.7) + if(head) + if(head.max_heat_protection_temperature >= FIRE_HELM_MAX_TEMP_PROTECT) + thermal_protection += (head.max_heat_protection_temperature*THERMAL_PROTECTION_HEAD) + thermal_protection = round(thermal_protection) + return thermal_protection /mob/living/carbon/human/IgniteMob() if(!dna || !dna.species.IgniteMob(src)) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 8c3330b9045..193c1bb25f5 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -403,6 +403,7 @@ SSair.remove_from_active(T1) T1.CalculateAdjacentTurfs() SSair.add_to_active(T1,1) + T1.weather = null T0.ChangeTurf(turf_type) diff --git a/icons/effects/weather_effects.dmi b/icons/effects/weather_effects.dmi new file mode 100644 index 0000000000000000000000000000000000000000..92c50e1dea2c3688ad4903374f61fd463768eb6b GIT binary patch literal 13535 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 m9A*AS+{+-?`k3