var/datum/planet/virgo3b/planet_virgo3b = null /datum/time/virgo3b seconds_in_day = 6 HOURS /datum/planet/virgo3b name = "Virgo-3B" desc = "A mid-sized moon of the Virgo 3 gas giant, this planet has an atmosphere mainly comprised of phoron, with trace \ amounts of both oxygen and nitrogen. Fortunately, the oxygen is not enough to be combustible in any meaningful way, however \ the phoron is desirable by many corporations, including NanoTrasen." current_time = new /datum/time/virgo3b() expected_z_levels = list( Z_LEVEL_SURFACE_LOW, Z_LEVEL_SURFACE_MID, Z_LEVEL_SURFACE_HIGH, Z_LEVEL_SURFACE_MINE, Z_LEVEL_SOLARS, Z_LEVEL_PLAINS ) planetary_wall_type = /turf/unsimulated/wall/planetary/virgo3b /datum/planet/virgo3b/New() ..() planet_virgo3b = src weather_holder = new /datum/weather_holder/virgo3b(src) /datum/planet/virgo3b/update_sun() ..() var/datum/time/time = current_time var/length_of_day = time.seconds_in_day / 10 / 60 / 60 var/noon = length_of_day / 2 var/distance_from_noon = abs(text2num(time.show_time("hh")) - noon) sun_position = distance_from_noon / noon sun_position = abs(sun_position - 1) var/low_brightness = null var/high_brightness = null var/low_color = null var/high_color = null var/min = 0 switch(sun_position) if(0 to 0.40) // Night low_brightness = 0.2 low_color = "#000066" high_brightness = 0.5 high_color = "#66004D" min = 0 if(0.40 to 0.50) // Twilight low_brightness = 0.6 low_color = "#66004D" high_brightness = 0.8 high_color = "#CC3300" min = 0.40 if(0.50 to 0.70) // Sunrise/set low_brightness = 0.8 low_color = "#CC3300" high_brightness = 0.9 high_color = "#FF9933" min = 0.50 if(0.70 to 1.00) // Noon low_brightness = 0.9 low_color = "#DDDDDD" high_brightness = 1.0 high_color = "#FFFFFF" min = 0.70 var/lerp_weight = (abs(min - sun_position)) * 4 var/weather_light_modifier = 1 if(weather_holder && weather_holder.current_weather) weather_light_modifier = weather_holder.current_weather.light_modifier var/new_brightness = (LERP(low_brightness, high_brightness, lerp_weight) ) * weather_light_modifier var/new_color = null if(weather_holder && weather_holder.current_weather && weather_holder.current_weather.light_color) new_color = weather_holder.current_weather.light_color else var/list/low_color_list = hex2rgb(low_color) var/low_r = low_color_list[1] var/low_g = low_color_list[2] var/low_b = low_color_list[3] var/list/high_color_list = hex2rgb(high_color) var/high_r = high_color_list[1] var/high_g = high_color_list[2] var/high_b = high_color_list[3] var/new_r = LERP(low_r, high_r, lerp_weight) var/new_g = LERP(low_g, high_g, lerp_weight) var/new_b = LERP(low_b, high_b, lerp_weight) new_color = rgb(new_r, new_g, new_b) spawn(1) update_sun_deferred(2, new_brightness, new_color) /datum/weather_holder/virgo3b temperature = T0C allowed_weather_types = list( WEATHER_CLEAR = new /datum/weather/virgo3b/clear(), WEATHER_OVERCAST = new /datum/weather/virgo3b/overcast(), WEATHER_LIGHT_SNOW = new /datum/weather/virgo3b/light_snow(), WEATHER_SNOW = new /datum/weather/virgo3b/snow(), WEATHER_BLIZZARD = new /datum/weather/virgo3b/blizzard(), WEATHER_RAIN = new /datum/weather/virgo3b/rain(), WEATHER_STORM = new /datum/weather/virgo3b/storm(), WEATHER_HAIL = new /datum/weather/virgo3b/hail(), WEATHER_BLOOD_MOON = new /datum/weather/virgo3b/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/virgo3b name = "virgo3b base" temp_high = 243.15 // -20c temp_low = 233.15 // -30c /datum/weather/virgo3b/clear name = "clear" transition_chances = list( WEATHER_CLEAR = 60, WEATHER_OVERCAST = 40 ) transition_messages = list( "The sky clears up.", "The sky is visible.", "The weather is calm." ) sky_visible = TRUE observed_message = "The sky is clear." /datum/weather/virgo3b/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 ) observed_message = "It is overcast, all you can see are clouds." transition_messages = list( "All you can see above are clouds.", "Clouds cut off your view of the sky.", "It's very cloudy." ) /datum/weather/virgo3b/light_snow name = "light snow" icon_state = "snowfall_light" temp_high = 235 temp_low = 225 light_modifier = 0.7 transition_chances = list( WEATHER_OVERCAST = 20, WEATHER_LIGHT_SNOW = 50, WEATHER_SNOW = 25, WEATHER_HAIL = 5 ) observed_message = "It is snowing lightly." effect_message = list( "The gentle breeze lifts tiny particles of falling snow past you.", "Cool wind rushes over your senses as the breeze softly stirs and spirals around you.", "A momentary pause in wind leaves the air still before it finds its peaceful rhythm again.", "Blanketed cold envelops you as the wind carries its chilled embrace." ) transition_messages = list( "Small snowflakes begin to fall from above.", "It begins to snow lightly.", ) /datum/weather/virgo3b/light_snow/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) continue // Are they indoors? if(show_message) to_chat(L, pick(effect_message)) /datum/weather/virgo3b/snow name = "moderate snow" icon_state = "snowfall_med" temp_high = 230 temp_low = 220 light_modifier = 0.5 flight_failure_modifier = 5 transition_chances = list( WEATHER_LIGHT_SNOW = 20, WEATHER_SNOW = 50, WEATHER_BLIZZARD = 20, WEATHER_HAIL = 5, WEATHER_OVERCAST = 5 ) observed_message = "It is snowing." effect_message = list( "Snow falls gently around you with a quiet pattering song.", "Cool wind rushes over your senses as the breeze softly stirs and spirals around you.", "A momentary pause in wind leaves the air still before it finds its peaceful rhythm again.", "Blanketed cold envelops you as the wind carries its chilled embrace." ) transition_messages = list( "It's starting to snow.", "The air feels much colder as snowflakes fall from above." ) /datum/weather/virgo3b/snow/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) continue // Are they indoors? if(show_message) to_chat(L, pick(effect_message)) for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either if(S.z in holder.our_planet.expected_z_levels) for(var/dir_checked in GLOB.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/virgo3b/blizzard name = "blizzard" icon_state = "snowfall_heavy" temp_high = 215 temp_low = 200 light_modifier = 0.3 flight_failure_modifier = 10 transition_chances = list( WEATHER_SNOW = 45, WEATHER_BLIZZARD = 40, WEATHER_HAIL = 10, WEATHER_OVERCAST = 5 ) observed_message = "A blizzard blows snow everywhere." effect_message = list( "Distant howling wind swirls up to meet you as the blizzard tempers and flares.", "Cool wind rushes over your senses as the strong wing stirs and spirals around you.", "A strong gust of wind rushes past you." ) transition_messages = list( "Strong winds howl around you as a blizzard appears.", "It starts snowing heavily, and it feels extremly cold now." ) /datum/weather/virgo3b/blizzard/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) continue // Are they indoors? if(show_message) to_chat(L, pick(effect_message)) for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either if(S.z in holder.our_planet.expected_z_levels) for(var/dir_checked in GLOB.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/virgo3b/rain name = "rain" icon_state = "rain" light_modifier = 0.5 effect_message = list( "A gentle white noise of rain taps away a restless song.", "Stray droplets of rain momentarily obscure your vision.", "The rainfall lessens for the span of a breath, stirring your mind from the ambience of it." ) transition_chances = list( WEATHER_OVERCAST = 25, WEATHER_LIGHT_SNOW = 10, WEATHER_RAIN = 50, WEATHER_STORM = 10, WEATHER_HAIL = 5 ) observed_message = "It is raining." transition_messages = list( "The sky is dark, and rain falls down upon you.", "Billowing clouds seem to hasten overhead as stray rain droplets form more consistent patterns from above." ) /datum/weather/virgo3b/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) continue // Are they indoors? // If they have an open umbrella, it'll guard from rain if(istype(L.get_active_held_item(), /obj/item/melee/umbrella)) var/obj/item/melee/umbrella/U = L.get_active_held_item() if(U.open) if(show_message) to_chat(L, "Rain patters softly onto your umbrella.") continue else if(istype(L.get_inactive_held_item(), /obj/item/melee/umbrella)) var/obj/item/melee/umbrella/U = L.get_inactive_held_item() if(U.open) if(show_message) to_chat(L, "Rain patters softly onto your umbrella.") continue L.water_act(1) if(show_message) to_chat(L, pick(effect_message)) /datum/weather/virgo3b/storm name = "storm" icon_state = "storm" light_modifier = 0.3 flight_failure_modifier = 10 effect_message = list( "A gentle white noise of rain taps away a restless song.", "Showering rain from above intesifies for a moment and briefly obscures your vision.", "Gusting winds sweep past you and carry harsher rainfall before returning to its previous intensity." ) var/next_lightning_strike = 0 // world.time when lightning will strike. var/min_lightning_cooldown = 5 SECONDS var/max_lightning_cooldown = 1 MINUTE observed_message = "An intense storm pours down over the region." transition_messages = list( "You feel intense winds hit you as a few droplets of water spatter the ground.", "Loud thunder is heard in the distance.", "A bright flash heralds the approach of a storm." ) transition_chances = list( WEATHER_RAIN = 45, WEATHER_STORM = 40, WEATHER_HAIL = 10, WEATHER_OVERCAST = 5 ) /datum/weather/virgo3b/storm/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) continue // Are they indoors? // Lazy wind code if(prob(10)) if(istype(L.get_active_held_item(), /obj/item/melee/umbrella)) var/obj/item/melee/umbrella/U = L.get_active_held_item() if(U.open) to_chat(L, "You struggle to keep hold of your umbrella!") L.Stun(20) // This is not nearly as long as it seems playsound(L, 'sound/effects/rustle1.ogg', 100, 1) // Closest sound I've got to "Umbrella in the wind" else if(istype(L.get_inactive_held_item(), /obj/item/melee/umbrella)) var/obj/item/melee/umbrella/U = L.get_inactive_held_item() if(U.open) to_chat(L, "A gust of wind yanks the umbrella from your hand!") playsound(L, 'sound/effects/rustle1.ogg', 100, 1) L.drop_from_inventory(U) U.toggle_umbrella() U.throw_at_old(get_edge_target_turf(U, pick(GLOB.alldirs)), 8, 1, L) // If they have an open umbrella, it'll guard from rain if(istype(L.get_active_held_item(), /obj/item/melee/umbrella)) var/obj/item/melee/umbrella/U = L.get_active_held_item() if(U.open) if(show_message) to_chat(L, pick(effect_message)) continue else if(istype(L.get_inactive_held_item(), /obj/item/melee/umbrella)) var/obj/item/melee/umbrella/U = L.get_inactive_held_item() if(U.open) if(show_message) to_chat(L, pick(effect_message)) continue L.water_act(2) if(show_message) to_chat(L, pick(effect_message)) handle_lightning() // This gets called to do lightning periodically. // There is a seperate function to do the actual lightning strike, so that badmins can play with it. /datum/weather/virgo3b/storm/proc/handle_lightning() if(world.time < next_lightning_strike) return // It's too soon to strike again. next_lightning_strike = world.time + rand(min_lightning_cooldown, max_lightning_cooldown) var/turf/T = pick(holder.our_planet.planet_floors) // This has the chance to 'strike' the sky, but that might be a good thing, to scare reckless pilots. lightning_strike(T) /datum/weather/virgo3b/hail name = "hail" icon_state = "hail" light_modifier = 0.3 flight_failure_modifier = 15 timer_low_bound = 2 timer_high_bound = 5 effect_message = list( "Small chunks of ice clatter to the ground around you.", "Little pellets of ice sweep at you seemingly from all sides.", "The stream of hail thickens for a moment and temporarily obscures your vision." ) transition_chances = list( WEATHER_RAIN = 45, WEATHER_STORM = 40, WEATHER_HAIL = 10, WEATHER_OVERCAST = 5 ) observed_message = "Ice is falling from the sky." transition_messages = list( "Ice begins to fall from the sky.", "It begins to hail.", "An intense chill washes over you as chunks of ice start to fall from the sky." ) /datum/weather/virgo3b/hail/process_effects() ..() for(var/humie in living_mob_list) var/mob/living/H = humie if(H.z in holder.our_planet.expected_z_levels) var/turf/T = get_turf(H) if(!T.outdoors) continue // They're indoors, so no need to pelt them with ice. // If they have an open umbrella, it'll guard from hail var/obj/item/melee/umbrella/U if(istype(H.get_active_held_item(), /obj/item/melee/umbrella)) U = H.get_active_held_item() else if(istype(H.get_inactive_held_item(), /obj/item/melee/umbrella)) U = H.get_inactive_held_item() if(U && U.open) if(show_message) to_chat(H, pick(effect_message)) continue //removed needless damage code that spammed the user. if they're outside on this planet, they can withstand the useless damage that was here. if(show_message) to_chat(H, pick(effect_message)) /datum/weather/virgo3b/blood_moon name = "blood moon" light_modifier = 0.5 light_color = "#FF0000" flight_failure_modifier = 25 transition_chances = list( WEATHER_BLOODMOON = 100 ) observed_message = "Everything is red. Something really ominous is going on." transition_messages = list( "The sky turns blood red!" )