diff --git a/code/__defines/planets.dm b/code/__defines/planets.dm new file mode 100644 index 0000000000..e8f526382e --- /dev/null +++ b/code/__defines/planets.dm @@ -0,0 +1,15 @@ +#define WEATHER_CLEAR "clear" +#define WEATHER_OVERCAST "overcast" +#define WEATHER_LIGHT_SNOW "light snow" +#define WEATHER_SNOW "snow" +#define WEATHER_BLIZZARD "blizzard" +#define WEATHER_RAIN "rain" +#define WEATHER_STORM "storm" +#define WEATHER_HAIL "hail" +#define WEATHER_WINDY "windy" +#define WEATHER_HOT "hot" +#define WEATHER_BLOOD_MOON "blood moon" // For admin fun or cult later on. + +#define PLANET_PROCESS_WEATHER 0x1 +#define PLANET_PROCESS_SUN 0x2 +#define PLANET_PROCESS_TEMP 0x4 \ No newline at end of file diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm index b3b556d7bd..7b446b4d2d 100644 --- a/code/controllers/Processes/planet.dm +++ b/code/controllers/Processes/planet.dm @@ -2,16 +2,77 @@ var/datum/controller/process/planet/planet_controller = null /datum/controller/process/planet var/list/planets = list() + var/list/z_to_planet = list() /datum/controller/process/planet/setup() - name = "planet" + name = "planet controller" planet_controller = src - schedule_interval = 600 // every minute + schedule_interval = 1 MINUTE + var/list/planet_datums = typesof(/datum/planet) - /datum/planet for(var/P in planet_datums) var/datum/planet/NP = new P() planets.Add(NP) + allocateTurfs() + +/datum/controller/process/planet/proc/allocateTurfs() + for(var/turf/simulated/OT in outdoor_turfs) + for(var/datum/planet/P in planets) + if(OT.z in P.expected_z_levels) + P.planet_floors += OT + break + outdoor_turfs.Cut() //Why were you in there INCORRECTLY? + + for(var/turf/unsimulated/wall/planetary/PW in planetary_walls) + for(var/datum/planet/P in planets) + if(PW.type == P.planetary_wall_type) + P.planet_walls += PW + break + planetary_walls.Cut() + +/datum/controller/process/planet/proc/unallocateTurf(var/turf/T) + for(var/planet in planets) + var/datum/planet/P = planet + if(T.z in P.expected_z_levels) + P.planet_floors -= T + /datum/controller/process/planet/doWork() + if(outdoor_turfs.len || planetary_walls.len) + allocateTurfs() + for(var/datum/planet/P in planets) - P.process(schedule_interval / 10) \ No newline at end of file + P.process(schedule_interval / 10) + SCHECK //Your process() really shouldn't take this long... + //Weather style needs redrawing + if(P.needs_work & PLANET_PROCESS_WEATHER) + P.needs_work &= ~PLANET_PROCESS_WEATHER + var/image/new_overlay = image(icon = P.weather_holder.current_weather.icon, icon_state = P.weather_holder.current_weather.icon_state, layer = LIGHTING_LAYER - 1) + //Redraw weather icons + for(var/T in P.planet_floors) + var/turf/simulated/turf = T + turf.overlays -= turf.weather_overlay + turf.weather_overlay = new_overlay + turf.overlays += turf.weather_overlay + SCHECK + + //Sun light needs changing + if(P.needs_work & PLANET_PROCESS_SUN) + P.needs_work &= ~PLANET_PROCESS_SUN + //Redraw sun overlay + var/new_range = P.sun["range"] + var/new_brightness = P.sun["brightness"] + var/new_color = P.sun["color"] + for(var/T in P.planet_floors) + var/turf/simulated/turf = T + turf.set_light(new_range, new_brightness, new_color) + SCHECK + + //Temperature needs updating + if(P.needs_work & PLANET_PROCESS_TEMP) + P.needs_work &= ~PLANET_PROCESS_TEMP + //Set new temperatures + for(var/W in P.planet_walls) + var/turf/unsimulated/wall/planetary/wall = W + wall.set_temperature(P.weather_holder.temperature) + SCHECK diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index ee361c9888..f0d3cc3341 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -25,7 +25,7 @@ usr.client.debug_variables(antag) message_admins("Admin [key_name_admin(usr)] is debugging the [antag.role_text] template.") -/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry","Vote","Xenobio")) +/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry","Vote","Xenobio","Planets")) set category = "Debug" set name = "Debug Controller" set desc = "Debug the various periodic loop controllers for the game (be careful!)" @@ -98,5 +98,8 @@ if("Xenobio") debug_variables(xenobio_controller) feedback_add_details("admin_verb", "DXenobio") + if("Planets") + debug_variables(planet_controller) + feedback_add_details("admin_verb", "DPlanets") message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") return diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index da69406157..75c7e68083 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -31,17 +31,19 @@ var/list/outdoor_turfs = list() /turf/simulated/floor/Destroy() if(outdoors) - outdoor_turfs.Remove(src) + planet_controller.unallocateTurf(src) ..() -/turf/simulated/floor/proc/update_icon_edge() +/turf/simulated/proc/update_icon_edge() if(edge_blending_priority) for(var/checkdir in cardinal) var/turf/simulated/T = get_step(src, checkdir) if(istype(T) && T.edge_blending_priority && edge_blending_priority < T.edge_blending_priority && icon_state != T.icon_state) var/cache_key = "[T.get_edge_icon_state()]-[checkdir]" if(!turf_edge_cache[cache_key]) - turf_edge_cache[cache_key] = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir) + var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir) + I.plane = 0 + turf_edge_cache[cache_key] = I overlays += turf_edge_cache[cache_key] /turf/simulated/proc/get_edge_icon_state() diff --git a/code/game/turfs/unsimulated/planetary.dm b/code/game/turfs/unsimulated/planetary.dm index ce4ffa44c0..7d9159d04a 100644 --- a/code/game/turfs/unsimulated/planetary.dm +++ b/code/game/turfs/unsimulated/planetary.dm @@ -27,6 +27,15 @@ var/list/planetary_walls = list() planetary_walls.Remove(src) ..() +/turf/unsimulated/wall/planetary/proc/set_temperature(var/new_temperature) + if(new_temperature == temperature) + return + temperature = new_temperature + // Force ZAS to reconsider our connections because our temperature has changed + if(connections) + connections.erase_all() + air_master.mark_for_update(src) + // Normal station/earth air. /turf/unsimulated/wall/planetary/normal oxygen = MOLES_O2STANDARD @@ -55,3 +64,4 @@ var/list/planetary_walls = list() oxygen = MOLES_O2STANDARD nitrogen = MOLES_N2STANDARD temperature = 310.92 // About 37.7C / 100F + diff --git a/code/modules/planet/planet.dm b/code/modules/planet/planet.dm index 53a07f228b..4c308ca930 100644 --- a/code/modules/planet/planet.dm +++ b/code/modules/planet/planet.dm @@ -12,8 +12,17 @@ var/datum/weather_holder/weather_holder var/sun_position = 0 // 0 means midnight, 1 means noon. + var/list/sun = list("range","brightness","color") var/expected_z_levels = list() + var/turf/unsimulated/wall/planetary/planetary_wall_type = /turf/unsimulated/wall/planetary + + var/turf/simulated/floor/planet_floors = list() + var/turf/unsimulated/wall/planetary/planet_walls = list() + + + var/needs_work = 0 // Bitflags to signal to the planet controller these need (properly deferrable) work. Flags defined in controller. + /datum/planet/New() ..() weather_holder = new(src) @@ -31,17 +40,13 @@ /datum/planet/proc/update_sun() sun_last_process = world.time - /datum/planet/proc/update_weather() if(weather_holder) weather_holder.process() /datum/planet/proc/update_sun_deferred(var/new_range, var/new_brightness, var/new_color) - set background = 1 - set waitfor = 0 - var/i = 0 - for(var/turf/simulated/floor/T in outdoor_turfs) - T.set_light(new_range, new_brightness, new_color) - i++ - if(i % 30 == 0) - sleep(1) + sun["range"] = new_range + sun["brightness"] = new_brightness + sun["color"] = new_color + needs_work |= PLANET_PROCESS_SUN + diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index 303d05f509..e35646ce7f 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -10,6 +10,7 @@ var/datum/planet/sif/planet_sif = null Its center of government is the equatorial city and site of first settlement, New Reykjavik." // Ripped straight from the wiki. current_time = new /datum/time/sif() // 32 hour clocks are nice. expected_z_levels = list(1) // To be changed when real map is finished. + planetary_wall_type = /turf/unsimulated/wall/planetary/sif /datum/planet/sif/New() ..() @@ -104,3 +105,197 @@ var/datum/planet/sif/planet_sif = null /proc/get_sif_time() if(planet_sif) return planet_sif.current_time + +//Weather definitions +/datum/weather_holder/sif + temperature = T0C + allowed_weather_types = list( + WEATHER_CLEAR = new /datum/weather/sif/clear(), + WEATHER_OVERCAST = new /datum/weather/sif/overcast(), + WEATHER_LIGHT_SNOW = new /datum/weather/sif/light_snow(), + WEATHER_SNOW = new /datum/weather/sif/snow(), + WEATHER_BLIZZARD = new /datum/weather/sif/blizzard(), + WEATHER_RAIN = new /datum/weather/sif/rain(), + WEATHER_STORM = new /datum/weather/sif/storm(), + WEATHER_HAIL = new /datum/weather/sif/hail(), + WEATHER_BLOOD_MOON = new /datum/weather/sif/blood_moon() + ) + roundstart_weather_chances = list( + WEATHER_CLEAR = 30, + WEATHER_OVERCAST = 30, + WEATHER_LIGHT_SNOW = 20, + WEATHER_SNOW = 5, + WEATHER_BLIZZARD = 5, + WEATHER_RAIN = 5, + WEATHER_STORM = 2.5, + WEATHER_HAIL = 2.5 + ) + +datum/weather/sif + name = "sif base" + temp_high = 243.15 // -20c + temp_low = 233.15 // -30c + +/datum/weather/sif/clear + name = "clear" + transition_chances = list( + WEATHER_CLEAR = 60, + WEATHER_OVERCAST = 40 + ) + +/datum/weather/sif/overcast + name = "overcast" + light_modifier = 0.8 + transition_chances = list( + WEATHER_CLEAR = 25, + WEATHER_OVERCAST = 50, + WEATHER_LIGHT_SNOW = 10, + WEATHER_SNOW = 5, + WEATHER_RAIN = 5, + WEATHER_HAIL = 5 + ) + +/datum/weather/sif/light_snow + name = "light snow" + icon_state = "snowfall_light" + temp_high = 238.15 // -25c + temp_low = 228.15 // -35c + light_modifier = 0.7 + transition_chances = list( + WEATHER_OVERCAST = 20, + WEATHER_LIGHT_SNOW = 50, + WEATHER_SNOW = 25, + WEATHER_HAIL = 5 + ) + +/datum/weather/sif/snow + name = "moderate snow" + icon_state = "snowfall_med" + temp_high = 233.15 // -30c + temp_low = 223.15 // -40c + light_modifier = 0.5 + transition_chances = list( + WEATHER_LIGHT_SNOW = 20, + WEATHER_SNOW = 50, + WEATHER_BLIZZARD = 20, + WEATHER_HAIL = 5, + WEATHER_OVERCAST = 5 + ) + +/datum/weather/sif/snow/process_effects() + for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs) + if(S.z in holder.our_planet.expected_z_levels) + for(var/dir_checked in cardinal) + var/turf/simulated/floor/T = get_step(S, dir_checked) + if(istype(T)) + if(istype(T, /turf/simulated/floor/outdoors) && prob(33)) + T.chill() + +/datum/weather/sif/blizzard + name = "blizzard" + icon_state = "snowfall_heavy" + temp_high = 223.15 // -40c + temp_low = 203.15 // -60c + light_modifier = 0.3 + transition_chances = list( + WEATHER_SNOW = 45, + WEATHER_BLIZZARD = 40, + WEATHER_HAIL = 10, + WEATHER_OVERCAST = 5 + ) + +/datum/weather/sif/blizzard/process_effects() + for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs) + if(S.z in holder.our_planet.expected_z_levels) + for(var/dir_checked in cardinal) + var/turf/simulated/floor/T = get_step(S, dir_checked) + if(istype(T)) + if(istype(T, /turf/simulated/floor/outdoors) && prob(50)) + T.chill() + +/datum/weather/sif/rain + name = "rain" + icon_state = "rain" + light_modifier = 0.5 + transition_chances = list( + WEATHER_OVERCAST = 25, + WEATHER_LIGHT_SNOW = 10, + WEATHER_RAIN = 50, + WEATHER_STORM = 10, + WEATHER_HAIL = 5 + ) + +/datum/weather/sif/rain/process_effects() + for(var/mob/living/L in living_mob_list) + if(L.z in holder.our_planet.expected_z_levels) + var/turf/T = get_turf(L) + if(!T.outdoors) + return // They're indoors, so no need to rain on them. + + L.adjust_fire_stacks(-5) + to_chat(L, "Rain falls on you.") + +/datum/weather/sif/storm + name = "storm" + icon_state = "storm" + temp_high = 233.15 // -30c + temp_low = 213.15 // -50c + light_modifier = 0.3 + transition_chances = list( + WEATHER_RAIN = 45, + WEATHER_STORM = 40, + WEATHER_HAIL = 10, + WEATHER_OVERCAST = 5 + ) + +/datum/weather/sif/rain/process_effects() + for(var/mob/living/L in living_mob_list) + if(L.z in holder.our_planet.expected_z_levels) + var/turf/T = get_turf(L) + if(!T.outdoors) + return // They're indoors, so no need to rain on them. + + L.adjust_fire_stacks(-10) + to_chat(L, "Rain falls on you, drenching you in water.") + +/datum/weather/sif/hail + name = "hail" + icon_state = "hail" + temp_high = 233.15 // -30c + temp_low = 213.15 // -50c + light_modifier = 0.3 + transition_chances = list( + WEATHER_RAIN = 45, + WEATHER_STORM = 10, + WEATHER_HAIL = 40, + WEATHER_OVERCAST = 5 + ) + +/datum/weather/sif/hail/process_effects() + for(var/mob/living/L in living_mob_list) + if(L.z in holder.our_planet.expected_z_levels) + var/turf/T = get_turf(L) + if(!T.outdoors) + return // They're indoors, so no need to pelt them with ice. + + var/target_zone = pick(BP_ALL) + var/amount_blocked = L.run_armor_check(target_zone, "melee") + var/amount_soaked = L.get_armor_soak(target_zone, "melee") + + if(amount_blocked >= 100) + return // No need to apply damage. + + if(amount_soaked >= 10) + return // No need to apply damage. + + L.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail") + to_chat(L, "The hail raining down on you [L.can_feel_pain() ? "hurts" : "damages you"]!") + +/datum/weather/sif/blood_moon + name = "blood moon" + light_modifier = 0.5 + light_color = "#FF0000" + transition_chances = list( + WEATHER_BLOODMOON = 100 + ) + diff --git a/code/modules/planet/weather.dm b/code/modules/planet/weather.dm index c98383a242..5e392be796 100644 --- a/code/modules/planet/weather.dm +++ b/code/modules/planet/weather.dm @@ -1,15 +1,3 @@ -#define WEATHER_CLEAR "clear" -#define WEATHER_OVERCAST "overcast" -#define WEATHER_LIGHT_SNOW "light snow" -#define WEATHER_SNOW "snow" -#define WEATHER_BLIZZARD "blizzard" -#define WEATHER_RAIN "rain" -#define WEATHER_STORM "storm" -#define WEATHER_HAIL "hail" -#define WEATHER_WINDY "windy" -#define WEATHER_HOT "hot" -#define WEATHER_BLOOD_MOON "blood moon" // For admin fun or cult later on. - /datum/weather_holder var/datum/planet/our_planet = null var/datum/weather/current_weather = null @@ -19,7 +7,6 @@ var/list/allowed_weather_types = list() var/list/roundstart_weather_chances = list() var/next_weather_shift = null - var/planetary_wall_type = null // Which walls to look for when updating temperature. /datum/weather_holder/New(var/source) ..() @@ -54,55 +41,15 @@ current_weather.process_effects() /datum/weather_holder/proc/update_icon_effects() - set background = 1 - set waitfor = 0 - if(current_weather) - for(var/turf/simulated/floor/T in outdoor_turfs) - if(T.z in our_planet.expected_z_levels) - T.overlays -= T.weather_overlay - T.weather_overlay = image(icon = current_weather.icon, icon_state = current_weather.icon_state, layer = LIGHTING_LAYER - 1) - T.overlays += T.weather_overlay + our_planet.needs_work |= PLANET_PROCESS_WEATHER /datum/weather_holder/proc/update_temperature() temperature = Interpolate(current_weather.temp_low, current_weather.temp_high, weight = our_planet.sun_position) - - for(var/turf/unsimulated/wall/planetary/wall in planetary_walls) - if(ispath(wall.type, planetary_wall_type)) - wall.temperature = temperature - for(var/dir in cardinal) - var/turf/simulated/T = get_step(wall, dir) - if(istype(T)) - if(T.zone) - T.zone.rebuild() - + our_planet.needs_work |= PLANET_PROCESS_TEMP /datum/weather_holder/proc/get_weather_datum(desired_type) return allowed_weather_types[desired_type] -/datum/weather_holder/sif - temperature = T0C - allowed_weather_types = list( - WEATHER_CLEAR = new /datum/weather/sif/clear(), - WEATHER_OVERCAST = new /datum/weather/sif/overcast(), - WEATHER_LIGHT_SNOW = new /datum/weather/sif/light_snow(), - WEATHER_SNOW = new /datum/weather/sif/snow(), - WEATHER_BLIZZARD = new /datum/weather/sif/blizzard(), - WEATHER_RAIN = new /datum/weather/sif/rain(), - WEATHER_STORM = new /datum/weather/sif/storm(), - WEATHER_HAIL = new /datum/weather/sif/hail(), - WEATHER_BLOOD_MOON = new /datum/weather/sif/blood_moon() - ) - planetary_wall_type = /turf/unsimulated/wall/planetary/sif - roundstart_weather_chances = list( - WEATHER_CLEAR = 30, - WEATHER_OVERCAST = 30, - WEATHER_LIGHT_SNOW = 20, - WEATHER_SNOW = 5, - WEATHER_BLIZZARD = 5, - WEATHER_RAIN = 5, - WEATHER_STORM = 2.5, - WEATHER_HAIL = 2.5 - ) /datum/weather var/name = "weather base" @@ -117,169 +64,3 @@ /datum/weather/proc/process_effects() return - -/datum/weather/sif - name = "sif base" - temp_high = 243.15 // -20c - temp_low = 233.15 // -30c - -/datum/weather/sif/clear - name = "clear" - transition_chances = list( - WEATHER_CLEAR = 60, - WEATHER_OVERCAST = 40 - ) - -/datum/weather/sif/overcast - name = "overcast" - light_modifier = 0.8 - transition_chances = list( - WEATHER_CLEAR = 25, - WEATHER_OVERCAST = 50, - WEATHER_LIGHT_SNOW = 10, - WEATHER_SNOW = 5, - WEATHER_RAIN = 5, - WEATHER_HAIL = 5 - ) - -/datum/weather/sif/light_snow - name = "light snow" - icon_state = "snowfall_light" - temp_high = 238.15 // -25c - temp_low = 228.15 // -35c - light_modifier = 0.7 - transition_chances = list( - WEATHER_OVERCAST = 20, - WEATHER_LIGHT_SNOW = 50, - WEATHER_SNOW = 25, - WEATHER_HAIL = 5 - ) - -/datum/weather/sif/snow - name = "moderate snow" - icon_state = "snowfall_med" - temp_high = 233.15 // -30c - temp_low = 223.15 // -40c - light_modifier = 0.5 - transition_chances = list( - WEATHER_LIGHT_SNOW = 20, - WEATHER_SNOW = 50, - WEATHER_BLIZZARD = 20, - WEATHER_HAIL = 5, - WEATHER_OVERCAST = 5 - ) - -/datum/weather/sif/snow/process_effects() - for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs) - for(var/dir_checked in cardinal) - var/turf/simulated/floor/T = get_step(S, dir_checked) - if(istype(T)) - if(istype(T, /turf/simulated/floor/outdoors) && prob(33)) - T.chill() - -/datum/weather/sif/blizzard - name = "blizzard" - icon_state = "snowfall_heavy" - temp_high = 223.15 // -40c - temp_low = 203.15 // -60c - light_modifier = 0.3 - transition_chances = list( - WEATHER_SNOW = 45, - WEATHER_BLIZZARD = 40, - WEATHER_HAIL = 10, - WEATHER_OVERCAST = 5 - ) - -/datum/weather/sif/blizzard/process_effects() - for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs) - for(var/dir_checked in cardinal) - var/turf/simulated/floor/T = get_step(S, dir_checked) - if(istype(T)) - if(istype(T, /turf/simulated/floor/outdoors) && prob(50)) - T.chill() - -/datum/weather/sif/rain - name = "rain" - icon_state = "rain" - light_modifier = 0.5 - transition_chances = list( - WEATHER_OVERCAST = 25, - WEATHER_LIGHT_SNOW = 10, - WEATHER_RAIN = 50, - WEATHER_STORM = 10, - WEATHER_HAIL = 5 - ) - -/datum/weather/sif/rain/process_effects() - for(var/mob/living/L in living_mob_list) - if(L.z in holder.our_planet.expected_z_levels) - var/turf/T = get_turf(L) - if(!T.outdoors) - return // They're indoors, so no need to rain on them. - - L.adjust_fire_stacks(-5) - to_chat(L, "Rain falls on you.") - -/datum/weather/sif/storm - name = "storm" - icon_state = "storm" - temp_high = 233.15 // -30c - temp_low = 213.15 // -50c - light_modifier = 0.3 - transition_chances = list( - WEATHER_RAIN = 45, - WEATHER_STORM = 40, - WEATHER_HAIL = 10, - WEATHER_OVERCAST = 5 - ) - -/datum/weather/sif/rain/process_effects() - for(var/mob/living/L in living_mob_list) - if(L.z in holder.our_planet.expected_z_levels) - var/turf/T = get_turf(L) - if(!T.outdoors) - return // They're indoors, so no need to rain on them. - - L.adjust_fire_stacks(-10) - to_chat(L, "Rain falls on you, drenching you in water.") - -/datum/weather/sif/hail - name = "hail" - icon_state = "hail" - temp_high = 233.15 // -30c - temp_low = 213.15 // -50c - light_modifier = 0.3 - transition_chances = list( - WEATHER_RAIN = 45, - WEATHER_STORM = 10, - WEATHER_HAIL = 40, - WEATHER_OVERCAST = 5 - ) - -/datum/weather/sif/hail/process_effects() - for(var/mob/living/L in living_mob_list) - if(L.z in holder.our_planet.expected_z_levels) - var/turf/T = get_turf(L) - if(!T.outdoors) - return // They're indoors, so no need to pelt them with ice. - - var/target_zone = pick(BP_ALL) - var/amount_blocked = L.run_armor_check(target_zone, "melee") - var/amount_soaked = L.get_armor_soak(target_zone, "melee") - - if(amount_blocked >= 100) - return // No need to apply damage. - - if(amount_soaked >= 10) - return // No need to apply damage. - - L.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail") - to_chat(L, "The hail raining down on you [L.can_feel_pain() ? "hurts" : "damages you"]!") - -/datum/weather/sif/blood_moon - name = "blood moon" - light_modifier = 0.5 - light_color = "#FF0000" - transition_chances = list( - WEATHER_BLOODMOON = 100 - ) diff --git a/polaris.dme b/polaris.dme index 1c2ee26d08..f259635324 100644 --- a/polaris.dme +++ b/polaris.dme @@ -32,6 +32,7 @@ #include "code\__defines\math_physics.dm" #include "code\__defines\misc.dm" #include "code\__defines\mobs.dm" +#include "code\__defines\planets.dm" #include "code\__defines\process_scheduler.dm" #include "code\__defines\research.dm" #include "code\__defines\species_languages.dm"