diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm index cdde744bd4..0ad44622b7 100644 --- a/code/game/turfs/simulated/floor_icon.dm +++ b/code/game/turfs/simulated/floor_icon.dm @@ -72,6 +72,9 @@ var/list/flooring_cache = list() if(!isnull(burnt) && (flooring.flags & TURF_CAN_BURN)) overlays |= get_flooring_overlay("[flooring.icon_base]-burned-[burnt]","[flooring.icon_base]_burned[burnt]") + if(weather_overlay) + overlays += weather_overlay + if(update_neighbors) for(var/turf/simulated/floor/F in range(src, 1)) if(F == src) diff --git a/code/game/turfs/simulated/floor_outdoors.dm b/code/game/turfs/simulated/floor_outdoors.dm deleted file mode 100644 index 8d4d38ae2c..0000000000 --- a/code/game/turfs/simulated/floor_outdoors.dm +++ /dev/null @@ -1,239 +0,0 @@ -/client/verb/test_outdoors_lights() - var/amount_range = input("Range", "Light Test", 2) as num - var/amount_brightness = input("Brightness", "Light Test", 1) as num - var/new_color = input("Color", "Light Test", "#FFFFFF") as color - - for(var/turf/simulated/floor/outdoors/T in outdoor_turfs) - T.set_light(amount_range, amount_brightness, new_color) - world << "Finished." - -/* -/client/verb/test_outdoor_time() - var/new_time = input("New time, in hours", "Day/Night cycle", 1) as num - var/datum/time/sif/time = new() - time = time.add_hours(new_time) - world << time.show_time("hh:mm:ss") - - var/length_of_day = time.seconds_in_day / 10 / 60 / 60 // 32 - var/noon = length_of_day / 2 - var/distance_from_noon = abs(text2num(time.show_time("hh")) - noon) - var/lerp_weight = distance_from_noon / noon - - var/noon_range = 5 - var/midnight_range = 3 - - var/noon_brightness = 1 - var/midnight_brightness = 0.06 - -// var/amount_range = Interpolate(noon_range, midnight_range, weight = lerp_weight) - var/amount_range = 2 - var/amount_brightness = Interpolate(noon_brightness, midnight_brightness, weight = lerp_weight) ** 3 - - world << "Changing time. [outdoor_turfs.len] turfs need to be updated. Expected ETA: [outdoor_turfs.len * 0.0033] seconds." - world << "Setting outdoor tiles to set_light([amount_range], [amount_brightness])." - var/i = 0 - for(var/turf/simulated/floor/outdoors/T in outdoor_turfs) - T.set_light(amount_range, amount_brightness, "#FFFFFF") - i++ - if(i % 30 == 0) - sleep(1) - world << "Finished." -*/ - -/client/verb/test_outdoor_timelapse() - var/i = 32 - var/j = 0 - while(i) - test_outdoor_time(j) - j++ - i-- - sleep(5 SECONDS) - -/client/verb/test_outdoor_snow() - for(var/turf/simulated/floor/T in outdoor_turfs) - T.overlays |= image(icon = 'icons/turf/outdoors.dmi', icon_state = "snowfall_med", layer = LIGHTING_LAYER - 1) - - -/client/verb/test_outdoor_time(new_time as num) - //var/new_time = input("New time, in hours", "Day/Night cycle", 1) as num - var/datum/time/sif/time = new() - time = time.add_hours(new_time) - world << time.show_time("hh:mm:ss") - - var/length_of_day = time.seconds_in_day / 10 / 60 / 60 // 32 - var/noon = length_of_day / 2 - var/distance_from_noon = abs(text2num(time.show_time("hh")) - noon) - var/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" - world << "Night." - min = 0 - - if(0.40 to 0.50) // Twilight - low_brightness = 0.6 - low_color = "#66004D" - - high_brightness = 0.8 - high_color = "#CC3300" - world << "Twilight." - 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" - world << "Sunrise/set." - min = 0.50 - - if(0.70 to 1.00) // Noon - low_brightness = 0.9 - low_color = "#DDDDDD" - - high_brightness = 1.0 - high_color = "#FFFFFF" - world << "Noon." - min = 0.70 - - //var/lerp_weight = (sun_position * 4 % 1) / (0.25 / 4) // This weirdness is needed because otherwise the compiler divides by zero. - var/lerp_weight = (abs(min - sun_position)) * 4 - world << "lerp_weight is [lerp_weight], sun_position is [sun_position]." - var/new_brightness = Interpolate(low_brightness, high_brightness, weight = lerp_weight) - - 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 = Interpolate(low_r, high_r, weight = lerp_weight) - var/new_g = Interpolate(low_g, high_g, weight = lerp_weight) - var/new_b = Interpolate(low_b, high_b, weight = lerp_weight) - - var/new_color = rgb(new_r, new_g, new_b) - - world << "Changing time. [outdoor_turfs.len] turfs need to be updated. Expected ETA: [outdoor_turfs.len * 0.0033] seconds." - world << "Setting outdoor tiles to set_light(2, [new_brightness], [new_color])." - var/i = 0 - for(var/turf/simulated/floor/T in outdoor_turfs) - T.set_light(2, new_brightness, new_color) - i++ - if(i % 30 == 0) - sleep(1) - world << "Finished." - - -/turf/simulated/floor/proc/update_icon_edge() - if(edge_blending_priority) - // world << "edge_blending_priority detected" - for(var/checkdir in cardinal) - // world << "Checking [checkdir] dir." - var/turf/simulated/T = get_step(src, checkdir) - // world << "Found [T] ([T.x], [T.y], [T.z])." - if(istype(T) && T.edge_blending_priority && edge_blending_priority < T.edge_blending_priority && icon_state != T.icon_state) - // world << "edge_blending_priority of [T] was higher than [src]." - var/cache_key = "[T.get_edge_icon_state()]-[checkdir]" - // world << "cache_key is [cache_key]" - 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) - // world << "Made new entry to cache." - overlays += turf_edge_cache[cache_key] - // world << "Applied overlay." - -/turf/simulated/proc/get_edge_icon_state() - return icon_state - -/turf/simulated/floor/outdoors/update_icon() - overlays.Cut() - update_icon_edge() - ..() - -/turf/simulated/floor/outdoors/mud - name = "grass" - icon_state = "mud_dark" - edge_blending_priority = 2 - - -/turf/simulated/floor/outdoors/rocks - name = "rocks" - desc = "Hard as a rock." - icon_state = "rockwall" - edge_blending_priority = 1 - -var/list/grass_types = list( - /obj/structure/flora/ausbushes/sparsegrass, - /obj/structure/flora/ausbushes/fullgrass -) - -/turf/simulated/floor/outdoors/grass - name = "grass" - icon_state = "grass" - edge_blending_priority = 3 - demote_turf = /turf/simulated/floor/outdoors - var/grass_chance = 20 - -/turf/simulated/floor/outdoors/grass/sif - name = "growth" - icon_state = "grass_sif" - edge_blending_priority = 3 - grass_chance = 0 - - -/turf/simulated/floor/outdoors/grass/sif/forest - name = "thick growth" - icon_state = "grass_sif_dark" - edge_blending_priority = 4 - -/turf/simulated/floor/outdoors/grass/New() - if(prob(50)) - icon_state += "2" - //edge_blending_priority++ - - if(grass_chance && prob(grass_chance)) - var/grass_type = pick(grass_types) - new grass_type(src) - ..() - -/turf/simulated/floor/outdoors/grass/forest - name = "thick grass" - icon_state = "grass-dark" - grass_chance = 80 - //tree_prob = 20 - edge_blending_priority = 4 - -/turf/simulated/floor/outdoors/snow - name = "snow" - icon_state = "snow" - edge_blending_priority = 5 - movement_cost = 2 - var/list/crossed_dirs = list() - -/turf/simulated/floor/outdoors/snow/Entered(atom/A) - if(isliving(A)) - var/mdir = "[A.dir]" - crossed_dirs[mdir] = 1 - update_icon() - . = ..() - -/turf/simulated/floor/outdoors/snow/update_icon() - overlays.Cut() - for(var/d in crossed_dirs) - overlays += image(icon = 'icons/turf/outdoors.dmi', icon_state = "snow_footprints", dir = text2num(d)) diff --git a/code/game/turfs/simulated/outdoors/dirt.dm b/code/game/turfs/simulated/outdoors/dirt.dm new file mode 100644 index 0000000000..1d735d81be --- /dev/null +++ b/code/game/turfs/simulated/outdoors/dirt.dm @@ -0,0 +1,6 @@ +/turf/simulated/floor/outdoors/dirt + name = "dirt" + desc = "Quite dirty!" + icon_state = "dirt-dark" + edge_blending_priority = 1 + turf_layers = list(/turf/simulated/floor/outdoors/rocks) \ No newline at end of file diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm new file mode 100644 index 0000000000..98b7d3dfba --- /dev/null +++ b/code/game/turfs/simulated/outdoors/grass.dm @@ -0,0 +1,42 @@ +var/list/grass_types = list( + /obj/structure/flora/ausbushes/sparsegrass, + /obj/structure/flora/ausbushes/fullgrass +) + +/turf/simulated/floor/outdoors/grass + name = "grass" + icon_state = "grass" + edge_blending_priority = 3 + turf_layers = list( + /turf/simulated/floor/outdoors/rocks, + /turf/simulated/floor/outdoors/dirt + ) + var/grass_chance = 20 + +/turf/simulated/floor/outdoors/grass/sif + name = "growth" + icon_state = "grass_sif" + edge_blending_priority = 3 + grass_chance = 0 + +/turf/simulated/floor/outdoors/grass/New() + if(prob(50)) + icon_state += "2" + //edge_blending_priority++ + + if(grass_chance && prob(grass_chance)) + var/grass_type = pick(grass_types) + new grass_type(src) + ..() + +/turf/simulated/floor/outdoors/grass/forest + name = "thick grass" + icon_state = "grass-dark" + grass_chance = 80 + //tree_prob = 20 + edge_blending_priority = 4 + +/turf/simulated/floor/outdoors/grass/sif/forest + name = "thick growth" + icon_state = "grass_sif_dark" + edge_blending_priority = 4 \ No newline at end of file diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index 1fac59c639..0ee844f320 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -4,18 +4,21 @@ var/list/outdoor_turfs = list() /turf/ // If greater than 0, this turf will apply edge overlays on top of other turfs cardinally adjacent to it, if those adjacent turfs are of a different icon_state, // and if those adjacent turfs have a lower edge_blending_priority. - // TODO: Place on base /turf/ ? var/edge_blending_priority = 0 + // Outdoors var determines if the game should consider the turf to be 'outdoors', which controls certain things such as weather effects. var/outdoors = FALSE + // This holds the image for the current weather effect. + var/image/weather_overlay = null /turf/simulated/floor/outdoors - name = "dirt" - desc = "Quite dirty." + name = "generic ground" + desc = "Rather boring." icon = 'icons/turf/outdoors.dmi' - icon_state = "dirt-dark" + icon_state = null edge_blending_priority = 1 - outdoors = TRUE - var/demote_turf = /turf/simulated/floor/outdoors // If something destructive happens, the turf gets replaced by this one. + outdoors = TRUE // This variable is used for weather effects. + // When a turf gets demoted or promoted, this list gets adjusted. The top-most layer is the layer on the bottom of the list, due to how pop() works. + var/list/turf_layers = list(/turf/simulated/floor/outdoors/rocks) /turf/simulated/floor/outdoors/initialize() update_icon() @@ -24,7 +27,6 @@ var/list/outdoor_turfs = list() /turf/simulated/floor/New() if(outdoors) outdoor_turfs.Add(src) - //set_light(2, 0.06, "#FFFFFF") ..() /turf/simulated/floor/Destroy() @@ -32,6 +34,70 @@ var/list/outdoor_turfs = list() outdoor_turfs.Remove(src) ..() +/turf/simulated/floor/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) + overlays += turf_edge_cache[cache_key] + +/turf/simulated/proc/get_edge_icon_state() + return icon_state + +/turf/simulated/floor/outdoors/update_icon() + overlays.Cut() + update_icon_edge() + ..() + +/turf/simulated/floor/outdoors/mud + name = "grass" + icon_state = "mud_dark" + edge_blending_priority = 2 + +/turf/simulated/floor/outdoors/rocks + name = "rocks" + desc = "Hard as a rock." + icon_state = "rock" + edge_blending_priority = 1 + + +// This proc adds a 'layer' on top of the turf. +/turf/simulated/floor/outdoors/proc/promote(var/new_turf_type) + var/list/new_turf_layer_list = turf_layers.Copy() + var/list/coords = list(x, y, z) + + new_turf_layer_list.Add(src.type) + + ChangeTurf(new_turf_type) + var/turf/simulated/floor/outdoors/T = locate(coords[1], coords[2], coords[3]) + if(istype(T)) + T.turf_layers = new_turf_layer_list.Copy() + +// This proc removes the topmost layer. +/turf/simulated/floor/outdoors/proc/demote() + if(!turf_layers.len) + return // Cannot demote further. + var/list/new_turf_layer_list = turf_layers.Copy() + var/list/coords = list(x, y, z) + + ChangeTurf(pop(new_turf_layer_list)) + var/turf/simulated/floor/outdoors/T = locate(coords[1], coords[2], coords[3]) + if(istype(T)) + T.turf_layers = new_turf_layer_list.Copy() + +// Called by weather processes, and maybe technomancers in the future. +/turf/simulated/floor/proc/chill() + return + +/turf/simulated/floor/outdoors/chill() + promote(/turf/simulated/floor/outdoors/snow) + +/turf/simulated/floor/outdoors/snow/chill() + return // Todo: Add heavy snow. + /turf/simulated/floor/outdoors/ex_act(severity) switch(severity) if(2) @@ -40,7 +106,4 @@ var/list/outdoor_turfs = list() if(3) if(prob(66)) return - if(demote_turf && src.type != demote_turf) - ChangeTurf(demote_turf) - else - ChangeTurf(get_base_turf_by_area(src)) \ No newline at end of file + demote() \ No newline at end of file diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm new file mode 100644 index 0000000000..474bdb171c --- /dev/null +++ b/code/game/turfs/simulated/outdoors/snow.dm @@ -0,0 +1,35 @@ +/turf/simulated/floor/outdoors/snow + name = "snow" + icon_state = "snow" + edge_blending_priority = 5 + movement_cost = 2 + turf_layers = list( + /turf/simulated/floor/outdoors/rocks, + /turf/simulated/floor/outdoors/dirt + ) + var/list/crossed_dirs = list() + +/turf/simulated/floor/outdoors/snow/Entered(atom/A) + if(isliving(A)) + var/mdir = "[A.dir]" + crossed_dirs[mdir] = 1 + update_icon() + . = ..() + +/turf/simulated/floor/outdoors/snow/update_icon() + overlays.Cut() + ..() + for(var/d in crossed_dirs) + overlays += image(icon = 'icons/turf/outdoors.dmi', icon_state = "snow_footprints", dir = text2num(d)) + +/turf/simulated/floor/outdoors/snow/attackby(var/obj/item/W, var/mob/user) + if(istype(W, /obj/item/weapon/shovel)) + to_chat(user, "You begin to remove \the [src] with your [W].") + if(do_after(user, 4 SECONDS)) + to_chat(user, "\The [src] has been dug up, and now lies in a pile nearby.") + new /obj/item/stack/material/snow(src) + demote() + else + to_chat(user, "You decide to not finish removing \the [src].") + else + ..() diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index 51f9af7da4..c415419d16 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -4,7 +4,7 @@ desc = "A body of water. It seems shallow enough to walk through, if needed." icon = 'icons/turf/outdoors.dmi' icon_state = "water_shallow" - var/under_state = "rockwall" + var/under_state = "rock" edge_blending_priority = -1 movement_cost = 4 outdoors = TRUE @@ -16,11 +16,8 @@ ..() /turf/simulated/floor/water/update_icon() -// icon_state = "rockwall" ..() // To get the edges. This also gets rid of other overlays so it needs to go first. -// var/image/water_sprite = image(icon = 'icons/turf/outdoors.dmi', icon_state = "water_shallow", layer = FLOAT_LAYER - 0.1) // Layer is slightly lower so that the adjacent edges go over the water. var/image/floorbed_sprite = image(icon = 'icons/turf/outdoors.dmi', icon_state = under_state) - //water_sprite.alpha = 150 underlays.Add(floorbed_sprite) update_icon_edge() @@ -29,10 +26,12 @@ /turf/simulated/floor/water/return_air_for_internal_lifeform(var/mob/living/L) if(L && L.lying) - if(L.can_breathe_water()) + if(L.can_breathe_water()) // For squid. var/datum/gas_mixture/water_breath = new() - var/amount = (ONE_ATMOSPHERE * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * T20C) + var/datum/gas_mixture/above_air = return_air() + var/amount = 300 water_breath.adjust_gas("oxygen", amount) // Assuming water breathes just extract the oxygen directly from the water. + water_breath.temperature = above_air.temperature return water_breath else return null // Lying down means they're submerged, which means no air. @@ -41,12 +40,12 @@ /turf/simulated/floor/water/Entered(atom/movable/AM, atom/oldloc) if(istype(AM, /mob/living)) var/mob/living/L = AM - L.adjust_fire_stacks(-50) L.update_water() if(!istype(oldloc, /turf/simulated/floor/water)) to_chat(L, "You get drenched in water from entering \the [src]!") else to_chat(L, "[movement_message]") + AM.water_act(5) ..() /turf/simulated/floor/water/Exited(atom/movable/AM, atom/newloc) @@ -66,21 +65,38 @@ movement_cost = 8 movement_message = "You swim forwards." depth = 2 + /* /turf/simulated/floor/water/deep/update_icon() ..() // To get the edges. This also gets rid of other overlays so it needs to go first. icon_state = "abyss" */ + +/turf/simulated/floor/water/pool + name = "pool" + desc = "Don't worry, it's not closed." + under_state = "pool" + outdoors = FALSE + /mob/living/proc/can_breathe_water() return FALSE /mob/living/carbon/human/can_breathe_water() - if(species && species.name == "Skrell") - return TRUE + if(species) + return species.can_breathe_water() return ..() /mob/living/proc/check_submerged() var/turf/simulated/floor/water/T = loc if(istype(T)) return T.depth - return 0 \ No newline at end of file + return 0 + +// Use this to have things react to having water applied to them. +/atom/movable/proc/water_act(amount) + return + +/mob/living/water_act(amount) + adjust_fire_stacks(amount * 5) + for(var/atom/movable/AM in contents) + AM.water_act(amount) \ No newline at end of file diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e73fdfc3c3..1074af1b90 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -40,6 +40,9 @@ else luminosity = 1 + if(movement_cost && pathweight == 1) // This updates pathweight automatically. + pathweight = movement_cost + /turf/Destroy() turfs -= src ..() diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 3469f1b6b6..9b9638d908 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -25,6 +25,7 @@ var/old_dynamic_lighting = dynamic_lighting var/list/old_affecting_lights = affecting_lights var/old_lighting_overlay = lighting_overlay + var/old_weather_overlay = weather_overlay //world << "Replacing [src.type] with [N]" @@ -42,6 +43,9 @@ if(old_fire) fire = old_fire + if(old_weather_overlay) + W.weather_overlay = old_weather_overlay + if (istype(W,/turf/simulated/floor)) W.RemoveLattice() @@ -65,6 +69,9 @@ if(old_fire) old_fire.RemoveFire() + if(old_weather_overlay) + W.weather_overlay = old_weather_overlay + if(tell_universe) universe.OnTurfChange(W) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 91a504f421..bf5ee47cba 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -200,7 +200,9 @@ var/list/admin_verbs_debug = list( /client/proc/toggle_debug_logs, /client/proc/admin_ghost, //allows us to ghost/reenter body at will, /datum/admins/proc/view_runtimes, - /client/proc/show_gm_status + /client/proc/show_gm_status, + /datum/admins/proc/change_weather, + /datum/admins/proc/change_time ) var/list/admin_verbs_paranoid_debug = list( diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index fa2c51e7e5..c5c2dfd792 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -968,3 +968,47 @@ return error_cache.showTo(usr) + +/datum/admins/proc/change_weather() + set category = "Debug" + set name = "Change Weather" + set desc = "Changes the current weather." + + if(!check_rights(R_DEBUG)) + return + + var/datum/planet/planet = input(usr, "Which planet do you want to modify the weather on?", "Change Weather") in list(planet_sif) + var/datum/weather/new_weather = input(usr, "What weather do you want to change to?", "Change Weather") as null|anything in planet.weather_holder.allowed_weather_types + if(new_weather) + planet.weather_holder.change_weather(new_weather) + var/log = "[key_name(src)] changed [planet.name]'s weather to [new_weather]." + message_admins(log) + log_admin(log) + +/datum/admins/proc/change_time() + set category = "Debug" + set name = "Change Planet Time" + set desc = "Changes the time of a planet." + + if(!check_rights(R_DEBUG)) + return + + var/datum/planet/planet = input(usr, "Which planet do you want to modify time on?", "Change Time") in list(planet_sif) + + var/datum/time/current_time_datum = planet.current_time + var/new_hour = input(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh"))) as null|num + if(!isnull(new_hour)) + var/new_minute = input(usr, "What minute do you want to change to?", "Change Time", text2num(current_time_datum.show_time("mm")) ) as null|num + if(!isnull(new_minute)) + var/type_needed = current_time_datum.type + world << "Type is [type_needed]." + var/datum/time/new_time = new type_needed() + new_time = new_time.add_hours(new_hour) + new_time = new_time.add_minutes(new_minute) + planet.current_time = new_time + spawn(1) + planet.update_sun() + + var/log = "[key_name(src)] changed [planet.name]'s time to [planet.current_time.show_time("hh:mm")]." + message_admins(log) + log_admin(log) \ No newline at end of file diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 74c00c36d9..3adb5c6458 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -146,3 +146,6 @@ new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white), \ new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow), \ )) + +/material/snow/generate_recipes() + return // Snowmen and snowballs may come here later. \ No newline at end of file diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index b6e8170e15..84bd14d417 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -189,6 +189,12 @@ icon_state = "sheet-card" default_type = "cardboard" +/obj/item/stack/material/snow + name = "snow" + desc = "The temptation to build a snowfort rises." + icon_state = "sheet-snow" + default_type = "snow" + /obj/item/stack/material/leather name = "leather" desc = "The by-product of mob grinding." diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index b6e2a49fe0..fb3af28015 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -628,6 +628,22 @@ var/list/name_to_material door_icon_base = "wood" destruction_desc = "crumples" +/material/snow + name = "snow" + stack_type = /obj/item/stack/material/snow + flags = MATERIAL_BRITTLE + icon_base = "solid" + icon_reinf = "reinf_over" + icon_colour = "#FFFFFF" + integrity = 1 + hardness = 1 + weight = 1 + stack_origin_tech = list(TECH_MATERIAL = 1) + melting_point = T0C+1 + destruction_desc = "crumples" + sheet_singular_name = "pile" + sheet_plural_name = "piles" + /material/cloth //todo name = "cloth" stack_origin_tech = list(TECH_MATERIAL = 2) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 204730a8e8..29422641df 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -457,7 +457,7 @@ /mob/living/carbon/proc/should_have_organ(var/organ_check) return 0 -/mob/living/carbon/proc/can_feel_pain(var/check_organ) +/mob/living/carbon/can_feel_pain(var/check_organ) if(isSynthetic()) return 0 return !(species.flags & NO_PAIN) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 6a3b4c7ad1..ddbef02432 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -305,3 +305,7 @@ // Called in life() when the mob has no client. /datum/species/proc/handle_npc(var/mob/living/carbon/human/H) return + +// Called when lying down on a water tile. +/datum/species/proc/can_breathe_water() + return FALSE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 28eb05bc25..88c696103d 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -193,6 +193,9 @@ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) ) +/datum/species/skrell/can_breathe_water() + return TRUE + /datum/species/diona name = "Diona" name_plural = "Dionaea" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bc4120d873..7680b6e163 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -796,3 +796,7 @@ default behaviour is: /mob/living/proc/update_water() // Involves overlays for humans. Maybe we'll get submerged sprites for borgs in the future? return +/mob/living/proc/can_feel_pain(var/check_organ) + if(isSynthetic()) + return FALSE + return TRUE diff --git a/code/modules/planet/planet.dm b/code/modules/planet/planet.dm index db2d6efafd..65a2de9845 100644 --- a/code/modules/planet/planet.dm +++ b/code/modules/planet/planet.dm @@ -1,8 +1,6 @@ // This holds information about a specific 'planetside' area, such as its time, weather, etc. This will most likely be used to model Sif, // but away missions may also have use for this. -var/datum/planet/sif/planet_sif = null - /datum/planet var/name = "a rock" var/desc = "Someone neglected to write a nice description for this poor rock." @@ -11,127 +9,34 @@ var/datum/planet/sif/planet_sif = null var/sun_process_interval = 1 HOUR var/sun_last_process = null // world.time - var/datum/weather_holder/current_weather = new() - var/weather_process_interval = 20 MINUTES - var/weather_last_process = null // world.time as well. + var/datum/weather_holder/weather_holder -/datum/planet/sif - name = "Sif" - desc = "Sif is a terrestrial planet in the Vir system. It is somewhat earth-like, in that it has oceans, a \ - breathable atmosphere, a magnetic field, weather, and similar gravity to Earth. It is currently the capital planet of Vir. \ - 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. - current_weather = new /datum/weather_holder/sif() // Cold weather is also nice. + var/sun_position = 0 // 0 means midnight, 1 means noon. + var/expected_z_levels = list() /datum/planet/New() ..() + weather_holder = new(src) current_time = current_time.make_random_time() update_sun() - update_weather() /datum/planet/proc/process(amount) if(current_time) current_time = current_time.add_seconds(amount) - world << "It's currently [current_time.show_time("hh:mm")] on [name]." + update_weather() // We update this first, because some weather types decease the brightness of the sun. if(sun_last_process <= world.time - sun_process_interval) update_sun() - if(weather_last_process <= world.time - weather_process_interval) - update_weather() - world << "Processed [name]." - +// This changes the position of the sun on the planet. /datum/planet/proc/update_sun() sun_last_process = world.time - world << "Praise the sun!" - - -/datum/planet/sif/update_sun() - ..() - var/datum/time/time = current_time - var/length_of_day = time.seconds_in_day / 10 / 60 / 60 // 32 - var/noon = length_of_day / 2 - var/distance_from_noon = abs(text2num(time.show_time("hh")) - noon) - var/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" - world << "Night." - min = 0 - - if(0.40 to 0.50) // Twilight - low_brightness = 0.6 - low_color = "#66004D" - - high_brightness = 0.8 - high_color = "#CC3300" - world << "Twilight." - 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" - world << "Sunrise/set." - min = 0.50 - - if(0.70 to 1.00) // Noon - low_brightness = 0.9 - low_color = "#DDDDDD" - - high_brightness = 1.0 - high_color = "#FFFFFF" - world << "Noon." - min = 0.70 - - //var/lerp_weight = (sun_position * 4 % 1) / (0.25 / 4) // This weirdness is needed because otherwise the compiler divides by zero. - var/lerp_weight = (abs(min - sun_position)) * 4 - world << "lerp_weight is [lerp_weight], sun_position is [sun_position]." - var/new_brightness = Interpolate(low_brightness, high_brightness, weight = lerp_weight) - - 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 = Interpolate(low_r, high_r, weight = lerp_weight) - var/new_g = Interpolate(low_g, high_g, weight = lerp_weight) - var/new_b = Interpolate(low_b, high_b, weight = lerp_weight) - - var/new_color = rgb(new_r, new_g, new_b) - - world << "Changing time. [outdoor_turfs.len] turfs need to be updated. Expected ETA: [outdoor_turfs.len * 0.0033] seconds." - world << "Setting outdoor tiles to set_light(2, [new_brightness], [new_color])." - var/i = 0 - for(var/turf/simulated/floor/T in outdoor_turfs) - T.set_light(2, new_brightness, new_color) - i++ - if(i % 30 == 0) - sleep(1) - world << "Finished." - /datum/planet/proc/update_weather() - weather_last_process = world.time - if(current_weather) - current_weather.update() \ No newline at end of file + if(weather_holder) + weather_holder.process() + +// Returns the time datum of Sif. +/proc/get_sif_time() + if(planet_sif) + return planet_sif.current_time \ No newline at end of file diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index 0a902377ad..edc169d50e 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -1,2 +1,96 @@ +var/datum/planet/sif/planet_sif = null + /datum/planet/sif name = "Sif" + +/datum/planet/sif + name = "Sif" + desc = "Sif is a terrestrial planet in the Vir system. It is somewhat earth-like, in that it has oceans, a \ + breathable atmosphere, a magnetic field, weather, and similar gravity to Earth. It is currently the capital planet of Vir. \ + 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. + +/datum/planet/sif/New() + ..() + weather_holder = new /datum/weather_holder/sif(src) // Cold weather is also nice. + +// This code is horrible. +/datum/planet/sif/update_sun() + ..() + var/datum/time/time = current_time + var/length_of_day = time.seconds_in_day / 10 / 60 / 60 // 32 + 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 = (Interpolate(low_brightness, high_brightness, weight = lerp_weight) ) * weather_light_modifier + + 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 = Interpolate(low_r, high_r, weight = lerp_weight) + var/new_g = Interpolate(low_g, high_g, weight = lerp_weight) + var/new_b = Interpolate(low_b, high_b, weight = lerp_weight) + + var/new_color = rgb(new_r, new_g, new_b) + + var/i = 0 + for(var/turf/simulated/floor/T in outdoor_turfs) + T.set_light(2, new_brightness, new_color) + i++ + if(i % 30 == 0) + sleep(1) diff --git a/code/modules/planet/time.dm b/code/modules/planet/time.dm index 6ce9f2ec82..936ae0eadd 100644 --- a/code/modules/planet/time.dm +++ b/code/modules/planet/time.dm @@ -70,17 +70,7 @@ answer = replacetext(answer, "mm", minute_text) answer = replacetext(answer, "ss", second_text) return answer -/* -/client/verb/test_time_systems() - var/input_seconds = input("Put in a number of seconds.", "Time Test") as num - //input_seconds = min(input_seconds, 864000) - world << "time2text() result: [time2text(input_seconds, "hh mm ss")]" - var/datum/time/time = new (input_seconds) - world << "show_time() result: [time.show_time("hh mm ss")]" - var/datum/time/sif/sif = new (input_seconds) - world << "sif show_time() result: [sif.show_time("hh mm ss")]" -*/ -// 115,200 + // We're gonna pretend there are 32 hours in a Sif day instead of 32.64 for the purposes of not losing sanity. We lose 38m 24s but the alternative is a path to madness. /datum/time/sif seconds_in_day = 60 * 60 * 32 * 10 // 115,200 seconds. If we did 32.64 hours/day it would be around 117,504 seconds instead. \ No newline at end of file diff --git a/code/modules/planet/weather.dm b/code/modules/planet/weather.dm index c5e120ad0b..d4d13d7a40 100644 --- a/code/modules/planet/weather.dm +++ b/code/modules/planet/weather.dm @@ -10,36 +10,259 @@ #define WEATHER_HOT "hot" /datum/weather_holder - var/current_weather = WEATHER_CLEAR + var/datum/planet/our_planet = null + var/datum/weather/current_weather = null var/temperature = T20C var/wind_dir = 0 var/wind_speed = 0 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/proc/update() - //TODO: Do actual weather. +/datum/weather_holder/New(var/source) + ..() + our_planet = source + for(var/A in allowed_weather_types) + var/datum/weather/W = allowed_weather_types[A] + if(istype(W)) + W.holder = src +/datum/weather_holder/proc/change_weather(var/new_weather) + var/old_light_modifier = null + if(current_weather) + old_light_modifier = current_weather.light_modifier // We store the old one, so we can determine if recalculating the sun is needed. + current_weather = allowed_weather_types[new_weather] + next_weather_shift = world.time + rand(20, 30) MINUTES + + update_icon_effects() update_temperature() - world << "Temperature is now [temperature]." + if(old_light_modifier && current_weather.light_modifier != old_light_modifier) // Updating the sun should be done sparingly. + our_planet.update_sun() + message_admins("[our_planet.name]'s weather is now [new_weather], with a temperature of [temperature]°K ([temperature - T0C]°C | [temperature * 1.8 - 459.67]°F).") + +/datum/weather_holder/proc/process() + if(world.time >= next_weather_shift) + var/new_weather + if(!current_weather) + new_weather = pickweight(roundstart_weather_chances) + else + new_weather = pickweight(current_weather.transition_chances) + change_weather(new_weather) + else + current_weather.process_effects() + +/datum/weather_holder/proc/update_icon_effects() + 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 /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 - wall.make_air() + for(var/dir in cardinal) + var/turf/simulated/T = get_step(wall, dir) + if(istype(T)) + if(T.zone) + T.zone.rebuild() + + +/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, - WEATHER_OVERCAST, - WEATHER_LIGHT_SNOW, - WEATHER_SNOW, - WEATHER_BLIZZARD, - WEATHER_RAIN, - WEATHER_STORM, - WEATHER_HAIL, - WEATHER_WINDY + 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() ) 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" + var/icon = 'icons/effects/weather.dmi' + var/icon_state = null // Icon to apply to turf undergoing weather. + var/temp_high = T20C + var/temp_low = T0C + var/light_modifier = 1.0 // Lower numbers means more darkness. + var/transition_chances = list() // Assoc list + var/datum/weather_holder/holder = null + +/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") + + if(amount_blocked >= 100) + return // No need to apply damage. + + L.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, used_weapon = "hail") + to_chat(L, "The hail raining down on you [L.can_feel_pain() ? "hurts" : "damages you"]!") diff --git a/icons/effects/weather.dmi b/icons/effects/weather.dmi new file mode 100644 index 0000000000..d0df90a44a Binary files /dev/null and b/icons/effects/weather.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 88457f09c2..c0df5a707f 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/turf/outdoors.dmi b/icons/turf/outdoors.dmi index 36cec31e07..c2e42d55df 100644 Binary files a/icons/turf/outdoors.dmi and b/icons/turf/outdoors.dmi differ diff --git a/icons/turf/outdoors_edge.dmi b/icons/turf/outdoors_edge.dmi index 39529dc308..02a52195c2 100644 Binary files a/icons/turf/outdoors_edge.dmi and b/icons/turf/outdoors_edge.dmi differ diff --git a/polaris.dme b/polaris.dme index 8abba6a010..d35fbe8d4f 100644 --- a/polaris.dme +++ b/polaris.dme @@ -998,7 +998,6 @@ #include "code\game\turfs\simulated\floor_attackby.dm" #include "code\game\turfs\simulated\floor_damage.dm" #include "code\game\turfs\simulated\floor_icon.dm" -#include "code\game\turfs\simulated\floor_outdoors.dm" #include "code\game\turfs\simulated\floor_static.dm" #include "code\game\turfs\simulated\floor_types.dm" #include "code\game\turfs\simulated\wall_attacks.dm" @@ -1006,7 +1005,10 @@ #include "code\game\turfs\simulated\wall_types.dm" #include "code\game\turfs\simulated\walls.dm" #include "code\game\turfs\simulated\water.dm" +#include "code\game\turfs\simulated\outdoors\dirt.dm" +#include "code\game\turfs\simulated\outdoors\grass.dm" #include "code\game\turfs\simulated\outdoors\outdoors.dm" +#include "code\game\turfs\simulated\outdoors\snow.dm" #include "code\game\turfs\snow\snow.dm" #include "code\game\turfs\space\cracked_asteroid.dm" #include "code\game\turfs\space\space.dm" @@ -2163,5 +2165,9 @@ #include "code\ZAS\Zone.dm" #include "interface\interface.dm" #include "interface\skin.dmf" -#include "maps\plane-1.dmm" +#include "maps\polaris-1.dmm" +#include "maps\polaris-2.dmm" +#include "maps\polaris-3.dmm" +#include "maps\polaris-4.dmm" +#include "maps\polaris-5.dmm" // END_INCLUDE