From d53d0d799ca15670a382bf0845e49d358b314b4e Mon Sep 17 00:00:00 2001 From: BluBerry016 <50649185+unit0016@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:45:10 -0400 Subject: [PATCH] Assorted Liquids Patches (#28714) * Resurrects Liquidscode Fixes everything broken with liquidscode; with a heavy emphasis on making oceans work again. This makes it possible via signal for atoms to react to liquids updating on a turf nearby, fixes immutable turf rendering; fixes liquid plumbing('s rendering - we're still working on getting the input and outputs themselves fixed and is our biggest "we need this done" rn, the recent plumbing refactor fucked us here); fixes ocean area's icons; redoes liquids spawners' hierarchy and gives them a new sprite, and finally fixes trench mapgen & ocean turfs (while implementing some new subtypes we needed). Co-Authored-By: lessthanthree <83487515+lessthnthree@users.noreply.github.com> Co-Authored-By: Ivory <47710522+distributivgesetz@users.noreply.github.com> * I fucked this one up; oopsies. * I regex'd for this!! How did this slip through?? * This one's more understandable though. * Update ocean_turfs.dm Real "ghosts in the machine" vibe to this one; why specifically does THIS one fail but the rest don't. I don't get it. Worked on our code. --------- Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com> Co-authored-by: Ivory <47710522+distributivgesetz@users.noreply.github.com> Co-authored-by: SpaceLoveSs13 <68121607+SpaceLoveSs13@users.noreply.github.com> --- code/__DEFINES/~skyrat_defines/signals.dm | 2 + code/modules/unit_tests/turf_icons.dm | 2 +- .../code/liquid_systems/liquid_controller.dm | 17 +- .../code/liquid_systems/liquid_effect.dm | 16 +- .../code/liquid_systems/liquid_plumbers.dm | 24 ++- .../code/liquid_systems/liquid_turf.dm | 4 + .../modules/liquids/code/ocean_areas.dm | 5 +- .../modules/liquids/code/ocean_biomes.dm | 12 +- .../modules/liquids/code/ocean_flora.dm | 23 ++- .../modules/liquids/code/ocean_mapgen.dm | 24 ++- .../modules/liquids/code/ocean_turfs.dm | 187 +++++++++++++----- .../liquids/icons/obj/effects/liquid.dmi | Bin 11407 -> 11729 bytes 12 files changed, 234 insertions(+), 82 deletions(-) diff --git a/code/__DEFINES/~skyrat_defines/signals.dm b/code/__DEFINES/~skyrat_defines/signals.dm index bb3e678bbf9..800ccfd8601 100644 --- a/code/__DEFINES/~skyrat_defines/signals.dm +++ b/code/__DEFINES/~skyrat_defines/signals.dm @@ -47,6 +47,8 @@ #define COMSIG_TURF_MOB_FALL "turf_mob_fall" ///from base of /obj/effect/abstract/liquid_turf/Initialize() (/obj/effect/abstract/liquid_turf/liquids) #define COMSIG_TURF_LIQUIDS_CREATION "turf_liquids_creation" +/// From base of /turf/proc/liquids_change(new_state) +#define COMSIG_TURF_LIQUIDS_CHANGE "turf_liquids_change" /// listens to wet_stacks, if wetting a mob above 10 stacks it will signal the akula race trait to apply its buffs and nerfs #define COMSIG_MOB_TRIGGER_WET_SKIN "mob_trigger_wet_skin" diff --git a/code/modules/unit_tests/turf_icons.dm b/code/modules/unit_tests/turf_icons.dm index e7b7d722ffb..f9d8296419e 100644 --- a/code/modules/unit_tests/turf_icons.dm +++ b/code/modules/unit_tests/turf_icons.dm @@ -30,7 +30,7 @@ //ignored_types += typesof(YOUR_DOWNSTREAM_TYPEPATH(s)_HERE) //MODULARITY SUPPORT. If you have snowflake typepaths that are blacklisted in, for example, create & destroy unit test because they require certain SS's being init, use this to blacklist them. //SKYRAT EDIT START ignored_types += typesof(/turf/open/openspace/ocean) - ignored_types += typesof(/turf/open/floor/plating/ocean) + ignored_types += typesof(/turf/open/misc/ocean) // SKYRAT EDIT END diff --git a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_controller.dm b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_controller.dm index b53cbc3bf04..14a0173c723 100644 --- a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_controller.dm +++ b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_controller.dm @@ -17,15 +17,22 @@ SUBSYSTEM_DEF(liquids) var/list/processing_fire = list() var/fire_counter = 0 //Only process fires on intervals + // format: list[path, list[str, instance]] var/list/singleton_immutables = list() var/run_type = SSLIQUIDS_RUN_TYPE_TURFS -/datum/controller/subsystem/liquids/proc/get_immutable(type) - if(!singleton_immutables[type]) - var/obj/effect/abstract/liquid_turf/immutable/new_one = new type() - singleton_immutables[type] = new_one - return singleton_immutables[type] +/datum/controller/subsystem/liquids/proc/get_immutable(type, turf/reference_turf) + if(isnull(singleton_immutables[type])) + singleton_immutables[type] = list() + + var/offset = GET_TURF_PLANE_OFFSET(reference_turf) + + if(!("[offset]" in singleton_immutables[type])) + var/obj/effect/abstract/liquid_turf/immutable/new_one = new type(null, offset) + singleton_immutables[type]["[offset]"] = new_one + + return singleton_immutables[type]["[offset]"] /datum/controller/subsystem/liquids/stat_entry(msg) diff --git a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_effect.dm b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_effect.dm index 443fa8bd35d..94680daf3d3 100644 --- a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_effect.dm +++ b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_effect.dm @@ -6,6 +6,7 @@ anchored = TRUE plane = FLOOR_PLANE layer = ABOVE_OPEN_TURF_LAYER + appearance_flags = TILE_BOUND color = "#DDF" //For being on fire @@ -222,15 +223,17 @@ /obj/effect/abstract/liquid_turf/proc/make_state_layer(state, has_top) PRIVATE_PROC(TRUE) - . = list(make_liquid_overlay("stage[state]_bottom", ABOVE_MOB_LAYER, ABOVE_GAME_PLANE)) + . = list(make_liquid_overlay("stage[state]_bottom", ABOVE_MOB_LAYER, GAME_PLANE)) if(!has_top) return - . += make_liquid_overlay("stage[state]_top", BELOW_OBJ_LAYER, GAME_PLANE) + . += make_liquid_overlay("stage[state]_top", TABLE_LAYER + 0.05, GAME_PLANE) /obj/effect/abstract/liquid_turf/proc/set_new_liquid_state(new_state) liquid_state = new_state + if(!isnull(my_turf)) + my_turf.liquids_change(new_state) update_icon(UPDATE_OVERLAYS) /obj/effect/abstract/liquid_turf/update_overlays() @@ -651,8 +654,8 @@ smoothing_flags = NONE icon_state = "ocean" base_icon_state = "ocean" - plane = DEFAULT_PLANE //Same as weather, etc. - layer = ABOVE_MOB_LAYER + layer = FLY_LAYER + plane = ABOVE_GAME_PLANE starting_temp = T20C-150 no_effects = TRUE vis_flags = NONE @@ -660,8 +663,9 @@ /obj/effect/abstract/liquid_turf/immutable/ocean/warm starting_temp = T20C+20 -/obj/effect/abstract/liquid_turf/immutable/Initialize(mapload) +/obj/effect/abstract/liquid_turf/immutable/Initialize(mapload, plane_offset) . = ..() + SET_PLANE_W_SCALAR(src, initial(plane), plane_offset) reagent_list = starting_mixture.Copy() total_reagents = 0 for(var/key in reagent_list) @@ -669,5 +673,3 @@ temp = starting_temp calculate_height() set_reagent_color_for_liquid() - - diff --git a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_plumbers.dm b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_plumbers.dm index dd764e2c564..c04676a7e37 100644 --- a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_plumbers.dm +++ b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_plumbers.dm @@ -40,7 +40,7 @@ /obj/machinery/plumbing/floor_pump/update_appearance(updates) . = ..() layer = tile_placed ? GAS_SCRUBBER_LAYER : BELOW_OBJ_LAYER - plane = tile_placed ? FLOOR_PLANE : GAME_PLANE + SET_PLANE_IMPLICIT(src, tile_placed ? FLOOR_PLANE : GAME_PLANE) /obj/machinery/plumbing/floor_pump/update_icon_state() . = ..() @@ -294,6 +294,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/plumbing/floor_pump/output/on, 0) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/plumbing/floor_pump/output/on/supply, 0) +// Stops at 30 height - perfect for automatically refilling pools and other water fixtures. +/obj/machinery/plumbing/floor_pump/output/on/supply/waist_deep + height_regulator = 30 + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/plumbing/floor_pump/output/on/supply/waist_deep, 0) + /obj/item/construction/plumbing/engineering name = "engineering plumbing constructor" desc = "A type of plumbing constructor designed to rapidly deploy the machines needed for logistics regarding fluids." @@ -335,9 +341,25 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/plumbing/floor_pump/output/on/supply, // Helpers for maps /obj/machinery/duct/supply + color = COLOR_CYAN duct_color = COLOR_CYAN duct_layer = FOURTH_DUCT_LAYER + pixel_x = 5 + pixel_y = 5 + +/obj/machinery/duct/supply/Initialize(mapload) + pixel_x = 0 + pixel_y = 0 + . = ..() /obj/machinery/duct/waste + color = COLOR_BROWN duct_color = COLOR_BROWN duct_layer = SECOND_DUCT_LAYER + pixel_x = -5 + pixel_y = -5 + +/obj/machinery/duct/waste/Initialize(mapload) + pixel_x = 0 + pixel_y = 0 + . = ..() diff --git a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm index b23574e40ce..91fd436b217 100644 --- a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm +++ b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm @@ -22,6 +22,10 @@ lgroup.remove_from_group(src) SSliquids.add_active_turf(src) +/// Called when liquids flow or otherwise update - intercept COMSIG_TURF_LIQUIDS_CHANGE to react. +/turf/proc/liquids_change(new_state) + SEND_SIGNAL(src, COMSIG_TURF_LIQUIDS_CHANGE, new_state) + /obj/effect/abstract/liquid_turf/proc/liquid_simple_delete_flat(flat_amount) if(flat_amount >= total_reagents) qdel(src, TRUE) diff --git a/modular_skyrat/modules/liquids/code/ocean_areas.dm b/modular_skyrat/modules/liquids/code/ocean_areas.dm index 47e5289c71d..ce9a64463c5 100644 --- a/modular_skyrat/modules/liquids/code/ocean_areas.dm +++ b/modular_skyrat/modules/liquids/code/ocean_areas.dm @@ -1,6 +1,7 @@ /area/ocean name = "Ocean" - icon_state = "space" + icon = 'icons/area/areas_station.dmi' + icon_state = "explored" requires_power = TRUE always_unpowered = TRUE power_light = FALSE @@ -12,6 +13,7 @@ sound_environment = SOUND_AREA_SPACE /area/ocean/generated + icon_state = "unexplored" map_generator = /datum/map_generator/ocean_generator /area/ocean/trench @@ -19,6 +21,7 @@ name = "The Trench" /area/ocean/trench/generated + icon_state = "unexplored" map_generator = /datum/map_generator/cave_generator/trench /area/ruin/ocean diff --git a/modular_skyrat/modules/liquids/code/ocean_biomes.dm b/modular_skyrat/modules/liquids/code/ocean_biomes.dm index 28e1c47d8f8..d49698f6caf 100644 --- a/modular_skyrat/modules/liquids/code/ocean_biomes.dm +++ b/modular_skyrat/modules/liquids/code/ocean_biomes.dm @@ -1,34 +1,34 @@ /datum/biome/ocean_sand - turf_type = /turf/open/floor/plating/ocean + turf_type = /turf/open/misc/ocean flora_types = list(/obj/effect/spawner/ocean_curio, /obj/structure/flora/rock, /obj/structure/flora/rock/pile, /obj/structure/flora/ocean/glowweed, /obj/structure/flora/ocean/seaweed, /obj/structure/flora/ocean/longseaweed) flora_density = 10 /datum/biome/ocean_sand_flora - turf_type = /turf/open/floor/plating/ocean + turf_type = /turf/open/misc/ocean flora_types = list(/obj/effect/spawner/ocean_curio, /obj/structure/flora/rock/pile, /obj/structure/flora/ocean/glowweed, /obj/structure/flora/ocean/seaweed, /obj/structure/flora/ocean/longseaweed, /obj/structure/flora/ocean/coral) flora_density = 25 fauna_density = 0.03 fauna_types = list(/mob/living/basic/carp) /datum/biome/ocean_redsand - turf_type = /turf/open/floor/plating/ocean/ironsand + turf_type = /turf/open/misc/ironsand/ocean flora_types = list(/obj/effect/spawner/ocean_curio, /obj/structure/flora/rock/pile, /obj/structure/flora/ocean/glowweed, /obj/structure/flora/ocean/seaweed, /obj/structure/flora/ocean/longseaweed, /obj/structure/flora/ocean/coral) flora_density = 40 fauna_density = 0.06 fauna_types = list(/mob/living/basic/carp) /datum/biome/ocean_rocklight - turf_type = /turf/open/floor/plating/ocean/rock + turf_type = /turf/open/misc/ocean/rock flora_types = list(/obj/effect/spawner/ocean_curio/rock, /obj/structure/flora/rock, /obj/structure/flora/rock/pile) flora_density = 3 /datum/biome/ocean_rockmed - turf_type = /turf/open/floor/plating/ocean/rock/medium + turf_type = /turf/open/misc/ocean/rock/medium flora_types = list(/obj/effect/spawner/ocean_curio/rock, /obj/structure/flora/rock, /obj/structure/flora/rock/pile) flora_density = 5 /datum/biome/ocean_rockheavy - turf_type = /turf/open/floor/plating/ocean/rock/heavy + turf_type = /turf/open/misc/ocean/rock/heavy flora_types = list(/obj/effect/spawner/ocean_curio/rock, /obj/structure/flora/rock, /obj/structure/flora/rock/pile) flora_density = 7 diff --git a/modular_skyrat/modules/liquids/code/ocean_flora.dm b/modular_skyrat/modules/liquids/code/ocean_flora.dm index a3f93496cfd..3cd2af2fa0a 100644 --- a/modular_skyrat/modules/liquids/code/ocean_flora.dm +++ b/modular_skyrat/modules/liquids/code/ocean_flora.dm @@ -81,7 +81,10 @@ #undef SCRAP_METAL_YIELD_HIGH /obj/effect/spawner/liquids_spawner - name = "Liquids Spawner" + name = "Liquids Spawner (Water, Waist-Deep)" + icon = 'modular_skyrat/modules/liquids/icons/obj/effects/liquid.dmi' + icon_state = "spawner" + color = "#AAAAAA77" var/reagent_list = list(/datum/reagent/water = ONE_LIQUIDS_HEIGHT*LIQUID_WAIST_LEVEL_HEIGHT) var/temp = T20C @@ -93,11 +96,21 @@ var/turf/T = loc T.add_liquid_list(reagent_list, FALSE, temp) -/obj/effect/spawner/liquids_spawner/acid_puddle - reagent_list = list(/datum/reagent/toxin/acid = ONE_LIQUIDS_HEIGHT) +/obj/effect/spawner/liquids_spawner/puddle + name = "Liquids Spawner (Water, Puddle)" + reagent_list = list(/datum/reagent/water = ONE_LIQUIDS_HEIGHT) -/obj/effect/spawner/liquids_spawner/acid_waist - reagent_list = list(/datum/reagent/toxin/acid = ONE_LIQUIDS_HEIGHT*LIQUID_WAIST_LEVEL_HEIGHT) +/obj/effect/spawner/liquids_spawner/ankles + name = "Liquids Spawner (Water, Ankle-Deep)" + reagent_list = list(/datum/reagent/water = ONE_LIQUIDS_HEIGHT*LIQUID_ANKLES_LEVEL_HEIGHT) + +/obj/effect/spawner/liquids_spawner/shoulders + name = "Liquids Spawner (Water, Shoulder-Deep)" + reagent_list = list(/datum/reagent/water = ONE_LIQUIDS_HEIGHT*LIQUID_SHOULDERS_LEVEL_HEIGHT) + +/obj/effect/spawner/liquids_spawner/fulltile + name = "Liquids Spawner (Water, Fulltile)" + reagent_list = list(/datum/reagent/water = ONE_LIQUIDS_HEIGHT*LIQUID_FULLTILE_LEVEL_HEIGHT) /obj/effect/spawner/ocean_curio name = "Ocean Curio Spawner" diff --git a/modular_skyrat/modules/liquids/code/ocean_mapgen.dm b/modular_skyrat/modules/liquids/code/ocean_mapgen.dm index aaaef881cce..4f72a4a1b5a 100644 --- a/modular_skyrat/modules/liquids/code/ocean_mapgen.dm +++ b/modular_skyrat/modules/liquids/code/ocean_mapgen.dm @@ -42,7 +42,7 @@ for(var/t in turfs) //Go through all the turfs and generate them var/turf/gen_turf = t - if(istype(gen_turf, /turf/open/space/mirage) || istype(gen_turf, /turf/open/openspace/ocean)) + if(istype(gen_turf, /turf/open/openspace/ocean)) continue var/drift_x = (gen_turf.x + rand(-BIOME_RANDOM_SQUARE_DRIFT, BIOME_RANDOM_SQUARE_DRIFT)) / perlin_zoom @@ -85,15 +85,25 @@ /datum/map_generator/cave_generator/trench name = "Trench Generator" - open_turf_types = list(/turf/open/floor/plating/ocean/rock/heavy = 1) - closed_turf_types = list(/turf/closed/mineral/random/ocean = 1) + weighted_open_turf_types = list(/turf/open/misc/ocean/rock/heavy = 1) + weighted_closed_turf_types = list(/turf/closed/mineral/random/ocean = 1) - feature_spawn_list = null - - mob_spawn_list = list(/mob/living/basic/carp = 1) + weighted_mob_spawn_list = list(/mob/living/basic/carp = 1) mob_spawn_chance = 1 + ///Note that this spawn list is also in the lavaland generator + weighted_feature_spawn_list = list( + /obj/structure/geyser/hollowwater = 10, \ + /obj/structure/geyser/plasma_oxide = 10, \ + /obj/structure/geyser/protozine = 10, \ + /obj/structure/geyser/random = 2, \ + /obj/structure/geyser/wittel = 10, \ + ) + flora_spawn_chance = 4 - flora_spawn_list = list(/obj/structure/flora/rock = 1, /obj/structure/flora/rock/pile = 1) + weighted_flora_spawn_list = list( + /obj/structure/flora/rock = 1, \ + /obj/structure/flora/rock/pile = 1, \ + ) #undef BIOME_RANDOM_SQUARE_DRIFT diff --git a/modular_skyrat/modules/liquids/code/ocean_turfs.dm b/modular_skyrat/modules/liquids/code/ocean_turfs.dm index 356cda189a1..e0b94156f50 100644 --- a/modular_skyrat/modules/liquids/code/ocean_turfs.dm +++ b/modular_skyrat/modules/liquids/code/ocean_turfs.dm @@ -2,7 +2,7 @@ name = "ocean" planetary_atmos = TRUE baseturfs = /turf/open/openspace/ocean - var/replacement_turf = /turf/open/floor/plating/ocean + var/replacement_turf = /turf/open/misc/ocean /turf/open/openspace/ocean/Initialize(mapload) . = ..() @@ -10,16 +10,20 @@ for(var/obj/structure/flora/plant in contents) qdel(plant) var/turf/T = GET_TURF_BELOW(src) - if(T) - if(T.turf_flags & NO_RUINS) - ChangeTurf(replacement_turf, null, CHANGETURF_IGNORE_AIR) - return - if(!ismineralturf(T)) - return - var/turf/closed/mineral/M = T - M.mineralAmt = 0 - M.gets_drilled() - baseturfs = /turf/open/openspace/ocean //This is to ensure that IF random turf generation produces a openturf, there won't be other turfs assigned other than openspace. + //I wonder if I should error here + if(!T) + return + if(T.turf_flags & NO_RUINS) + var/turf/newturf = ChangeTurf(replacement_turf, null, CHANGETURF_IGNORE_AIR) + if(!isopenspaceturf(newturf)) // only openspace turfs should be returning INITIALIZE_HINT_LATELOAD + return INITIALIZE_HINT_NORMAL + return + if(!ismineralturf(T)) + return + var/turf/closed/mineral/M = T + M.mineralAmt = 0 + M.gets_drilled() + baseturfs = /turf/open/openspace/ocean //This is to ensure that IF random turf generation produces a openturf, there won't be other turfs assigned other than openspace. /turf/open/openspace/ocean/Initialize(mapload) . = ..() @@ -31,26 +35,36 @@ var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean) new_immmutable.add_turf(src) -/turf/open/floor/plating/ocean/ironsand - baseturfs = /turf/open/floor/plating/ocean/ironsand - icon_state = "ironsand1" - base_icon_state = "ironsand" - rand_variants = 15 - rand_chance = 100 +/turf/open/misc/ironsand/ocean + planetary_atmos = TRUE + baseturfs = /turf/open/misc/ocean -/turf/open/floor/plating/ocean/rock +/turf/open/misc/ironsand/ocean/Initialize(mapload) + . = ..() + if(liquids) + if(liquids.immutable) + liquids.remove_turf(src) + else + qdel(liquids, TRUE) + var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean, src) + new_immmutable.add_turf(src) + + +/turf/open/misc/ocean/rock name = "rock" - baseturfs = /turf/open/floor/plating/ocean/rock + desc = "Polished over centuries of undersea weather conditions and a distinct lack of light." + baseturfs = /turf/open/misc/ocean/rock icon = 'modular_skyrat/modules/liquids/icons/turf/seafloor.dmi' icon_state = "seafloor" base_icon_state = "seafloor" rand_variants = 0 -/turf/open/floor/plating/ocean/rock/warm +/turf/open/misc/ocean/rock/warm liquid_type = /obj/effect/abstract/liquid_turf/immutable/ocean/warm -/turf/open/floor/plating/ocean/rock/warm/fissure +/turf/open/misc/ocean/rock/warm/fissure name = "fissure" + desc = "A comfortable, warm tempature eminates from these - followed immediately after by toxic chemicals in liquid or gaseous forms; but warmth all the same!" icon = 'modular_skyrat/modules/liquids/icons/turf/fissure.dmi' icon_state = "fissure-0" base_icon_state = "fissure" @@ -60,20 +74,21 @@ light_range = 3 light_color = LIGHT_COLOR_LAVA -/turf/open/floor/plating/ocean/rock/medium +/turf/open/misc/ocean/rock/medium icon_state = "seafloor_med" base_icon_state = "seafloor_med" - baseturfs = /turf/open/floor/plating/ocean/rock/medium + baseturfs = /turf/open/misc/ocean/rock/medium -/turf/open/floor/plating/ocean/rock/heavy +/turf/open/misc/ocean/rock/heavy icon_state = "seafloor_heavy" base_icon_state = "seafloor_heavy" - baseturfs = /turf/open/floor/plating/ocean/rock/heavy + baseturfs = /turf/open/misc/ocean/rock/heavy -/turf/open/floor/plating/ocean +/turf/open/misc/ocean gender = PLURAL name = "ocean sand" - baseturfs = /turf/open/floor/plating/ocean + desc = "If you can't escape sandstorms underwater, is anywhere safe?" + baseturfs = /turf/open/misc/ocean icon = 'icons/turf/floors.dmi' icon_state = "asteroid" base_icon_state = "asteroid" @@ -86,24 +101,24 @@ var/rand_chance = 30 var/liquid_type = /obj/effect/abstract/liquid_turf/immutable/ocean -/turf/open/floor/plating/ocean/Initialize(mapload) +/turf/open/misc/ocean/Initialize(mapload) . = ..() if(liquids) if(liquids.immutable) liquids.remove_turf(src) else qdel(liquids, TRUE) - var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(liquid_type) + var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(liquid_type, src) new_immmutable.add_turf(src) if(rand_variants && prob(rand_chance)) var/random = rand(1,rand_variants) - icon_state = "[base_icon_state][random]" - base_icon_state = "[base_icon_state][random]" + icon_state = "[icon_state][random]" + base_icon_state = "[icon_state][random]" /turf/open/floor/plating/ocean_plating planetary_atmos = TRUE - baseturfs = /turf/open/floor/plating/ocean_plating + baseturfs = /turf/open/misc/ocean /turf/open/floor/plating/ocean_plating/Initialize(mapload) . = ..() @@ -112,12 +127,12 @@ liquids.remove_turf(src) else qdel(liquids, TRUE) - var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean) + var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean, src) new_immmutable.add_turf(src) /turf/open/floor/iron/ocean planetary_atmos = TRUE - baseturfs = /turf/open/floor/iron/ocean + baseturfs = /turf/open/floor/plating/ocean_plating /turf/open/floor/iron/ocean/Initialize(mapload) . = ..() @@ -126,36 +141,109 @@ liquids.remove_turf(src) else qdel(liquids, TRUE) - var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean) + var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean, src) + new_immmutable.add_turf(src) + +/turf/open/floor/iron/solarpanel/ocean + planetary_atmos = TRUE + baseturfs = /turf/open/floor/plating/ocean_plating + +/turf/open/floor/iron/solarpanel/ocean/Initialize(mapload) + . = ..() + if(liquids) + if(liquids.immutable) + liquids.remove_turf(src) + else + qdel(liquids, TRUE) + var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean, src) + new_immmutable.add_turf(src) + +/turf/open/floor/engine/hull/reinforced/ocean + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + temperature = T20C + planetary_atmos = TRUE + baseturfs = /turf/open/misc/ocean + +/turf/open/floor/engine/hull/reinforced/ocean/Initialize(mapload) + . = ..() + if(liquids) + if(liquids.immutable) + liquids.remove_turf(src) + else + qdel(liquids, TRUE) + var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean, src) + new_immmutable.add_turf(src) + +/turf/open/floor/glass/reinforced/ocean + planetary_atmos = TRUE + baseturfs = /turf/open/floor/plating/ocean_plating + +/turf/open/floor/glass/reinforced/ocean/Initialize(mapload) + . = ..() + if(liquids) + if(liquids.immutable) + liquids.remove_turf(src) + else + qdel(liquids, TRUE) + var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean, src) + new_immmutable.add_turf(src) + +/turf/open/floor/glass/plasma/ocean + planetary_atmos = TRUE + baseturfs = /turf/open/floor/plating/ocean_plating + +/turf/open/floor/glass/plasma/ocean/Initialize(mapload) + . = ..() + if(liquids) + if(liquids.immutable) + liquids.remove_turf(src) + else + qdel(liquids, TRUE) + var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean, src) + new_immmutable.add_turf(src) + +/turf/open/floor/glass/reinforced/plasma/ocean + planetary_atmos = TRUE + baseturfs = /turf/open/floor/plating/ocean_plating + +/turf/open/floor/glass/reinforced/plasma/ocean/Initialize(mapload) + . = ..() + if(liquids) + if(liquids.immutable) + liquids.remove_turf(src) + else + qdel(liquids, TRUE) + var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/ocean, src) new_immmutable.add_turf(src) /turf/closed/mineral/random/ocean - baseturfs = /turf/open/floor/plating/ocean/rock/heavy - turf_type = /turf/open/floor/plating/ocean/rock/heavy + baseturfs = /turf/open/misc/ocean/rock/heavy + turf_type = /turf/open/misc/ocean/rock/heavy color = "#58606b" /turf/closed/mineral/random/high_chance/ocean - baseturfs = /turf/open/floor/plating/ocean/rock/heavy - turf_type = /turf/open/floor/plating/ocean/rock/heavy + baseturfs = /turf/open/misc/ocean/rock/heavy + turf_type = /turf/open/misc/ocean/rock/heavy color = "#58606b" /turf/closed/mineral/random/low_chance/ocean - baseturfs = /turf/open/floor/plating/ocean/rock/heavy - turf_type = /turf/open/floor/plating/ocean/rock/heavy + baseturfs = /turf/open/misc/ocean/rock/heavy + turf_type = /turf/open/misc/ocean/rock/heavy color = "#58606b" /turf/closed/mineral/random/stationside/ocean - baseturfs = /turf/open/floor/plating/ocean/rock/heavy - turf_type = /turf/open/floor/plating/ocean/rock/heavy + baseturfs = /turf/open/misc/ocean/rock/heavy + turf_type = /turf/open/misc/ocean/rock/heavy color = "#58606b" /obj/effect/abstract/liquid_turf/immutable/canal starting_mixture = list(/datum/reagent/water = 100) -/turf/open/floor/plating/canal +/turf/open/misc/canal gender = PLURAL name = "canal" - baseturfs = /turf/open/floor/plating/canal + desc = "A section of the earth given way to form a natural aqueduct." + baseturfs = /turf/open/misc/canal icon = 'icons/turf/floors.dmi' icon_state = "asteroid" base_icon_state = "asteroid" @@ -166,20 +254,21 @@ liquid_height = -30 turf_height = -30 -/turf/open/floor/plating/canal/Initialize(mapload) +/turf/open/misc/canal/Initialize(mapload) . = ..() if(liquids) if(liquids.immutable) liquids.remove_turf(src) else qdel(liquids, TRUE) - var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/canal) + var/obj/effect/abstract/liquid_turf/immutable/new_immmutable = SSliquids.get_immutable(/obj/effect/abstract/liquid_turf/immutable/canal, src) new_immmutable.add_turf(src) -/turf/open/floor/plating/canal_mutable +/turf/open/misc/canal_mutable gender = PLURAL name = "canal" - baseturfs = /turf/open/floor/plating/canal_mutable + desc = "A section of the earth given way to form a natural aqueduct." + baseturfs = /turf/open/misc/canal_mutable icon = 'icons/turf/floors.dmi' icon_state = "asteroid" base_icon_state = "asteroid" diff --git a/modular_skyrat/modules/liquids/icons/obj/effects/liquid.dmi b/modular_skyrat/modules/liquids/icons/obj/effects/liquid.dmi index 35ae915a4bff394c5fce6ed8cbb0151bb6814dca..6babb35b68ee39e1088d16cea99cf45c8b2a42b4 100644 GIT binary patch literal 11729 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 literal 11407 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 SM2H_61NU`}b!xR7p8X%nTxnha