From f78fea73337eb6e73ee27884cdc496b106fa170b Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 16 Mar 2018 15:26:09 -0700 Subject: [PATCH 1/2] [READY] Refactors wet floors to a component (#36130) * Wet Floor components * No more turf wet slide. --- code/__DEFINES/components.dm | 5 + code/__DEFINES/misc.dm | 12 +- code/__DEFINES/subsystems.dm | 1 + .../subsystem/processing/wet_floors.dm | 5 + code/datums/components/wet_floor.dm | 171 ++++++++++++++++++ code/game/atoms.dm | 6 +- code/game/objects/items/extinguisher.dm | 2 +- .../objects/items/grenades/syndieminibomb.dm | 3 +- code/game/objects/structures/watercloset.dm | 2 +- code/game/turfs/open.dm | 143 ++------------- code/game/turfs/simulated/chasm.dm | 4 +- .../turfs/simulated/floor/plating/asteroid.dm | 4 +- .../simulated/floor/plating/misc_plating.dm | 9 +- code/game/turfs/simulated/lava.dm | 2 +- code/game/turfs/simulated/water.dm | 9 +- code/game/turfs/space/space.dm | 8 +- code/modules/clothing/shoes/miscellaneous.dm | 4 +- .../mob/living/carbon/carbon_movement.dm | 1 - .../mob/living/simple_animal/bot/cleanbot.dm | 2 +- .../chemistry/reagents/blob_reagents.dm | 4 +- .../chemistry/reagents/food_reagents.dm | 6 +- .../chemistry/reagents/other_reagents.dm | 9 +- tgstation.dme | 2 + 23 files changed, 240 insertions(+), 174 deletions(-) create mode 100644 code/controllers/subsystem/processing/wet_floors.dm create mode 100644 code/datums/components/wet_floor.dm diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 5b4ff7e378..bbe29f3e85 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -86,3 +86,8 @@ #define CALTROP_BYPASS_SHOES 1 #define CALTROP_IGNORE_WALKERS 2 + +//Component Specific Signals +//Wet floors +#define COMSIG_TURF_IS_WET "check_turf_wet" //(): Returns bitflags of wet values. +#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool. diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 199535a04e..de75a06afb 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -185,15 +185,17 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define HAS_SENSORS 1 #define LOCKED_SENSORS 2 -//Turf wet states +//Wet floor type flags. Stronger ones should be higher in number. #define TURF_DRY 0 #define TURF_WET_WATER 1 #define TURF_WET_LUBE 2 -#define TURF_WET_ICE 3 -#define TURF_WET_PERMAFROST 4 +#define TURF_WET_ICE 4 +#define TURF_WET_PERMAFROST 8 -//Maximum amount of time, (in approx. seconds.) a tile can be wet for. -#define MAXIMUM_WET_TIME 300 +#define IS_WET_OPEN_TURF(O) O.GetComponent(/datum/component/wet_floor) + +//Maximum amount of time, (in deciseconds) a tile can be wet for. +#define MAXIMUM_WET_TIME 3000 //unmagic-strings for types of polls #define POLLTYPE_OPTION "OPTION" diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 7925edb76a..15459f7f71 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -86,6 +86,7 @@ #define FIRE_PRIORITY_SERVER_MAINT 10 #define FIRE_PRIORITY_RESEARCH 10 #define FIRE_PRIORITY_GARBAGE 15 +#define FIRE_PRIORITY_WET_FLOORS 20 #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_NPC 20 #define FIRE_PRIORITY_PROCESS 25 diff --git a/code/controllers/subsystem/processing/wet_floors.dm b/code/controllers/subsystem/processing/wet_floors.dm new file mode 100644 index 0000000000..e125b5849c --- /dev/null +++ b/code/controllers/subsystem/processing/wet_floors.dm @@ -0,0 +1,5 @@ +PROCESSING_SUBSYSTEM_DEF(wet_floors) + name = "Wet floors" + priority = FIRE_PRIORITY_WET_FLOORS + wait = 15 + stat_tag = "WFP" //Used for logging diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm new file mode 100644 index 0000000000..92f0250e4f --- /dev/null +++ b/code/datums/components/wet_floor.dm @@ -0,0 +1,171 @@ +/datum/component/wet_floor + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/highest_strength = TURF_DRY + var/lube_flags = NONE //why do we have this? + var/list/time_left_list //In deciseconds. + var/static/mutable_appearance/permafrost_overlay = mutable_appearance('icons/effects/water.dmi', "ice_floor") + var/static/mutable_appearance/ice_overlay = mutable_appearance('icons/turf/overlays.dmi', "snowfloor") + var/static/mutable_appearance/water_overlay = mutable_appearance('icons/effects/water.dmi', "wet_floor_static") + var/static/mutable_appearance/generic_turf_overlay = mutable_appearance('icons/effects/water.dmi', "wet_static") + var/current_overlay + var/permanent = FALSE + +/datum/component/wet_floor/InheritComponent(datum/newcomp, orig, argslist) + if(!newcomp) //We are getting passed the arguments of a would-be new component, but not a new component + add_wet(arglist(argslist)) + else //We are being passed in a full blown component + var/datum/component/wet_floor/WF = newcomp //Lets make an assumption + if(WF.gc()) //See if it's even valid, still. Also does LAZYLEN and stuff for us. + CRASH("Wet floor component tried to inherit another, but the other was able to garbage collect while being inherited! What a waste of time!") + return + for(var/i in WF.time_left_list) + add_wet(text2num(i), WF.time_left_list[i]) + +/datum/component/wet_floor/Initialize(strength, duration_minimum, duration_add, duration_maximum, permanent = FALSE) + if(!isopenturf(parent)) + . = COMPONENT_INCOMPATIBLE + CRASH("Wet floor component attempted to be applied to a non open turf!") + add_wet(strength, duration_minimum, duration_add, duration_maximum) + RegisterSignal(COMSIG_TURF_IS_WET, .proc/is_wet) + RegisterSignal(COMSIG_TURF_MAKE_DRY, .proc/dry) + if(!permanent) + START_PROCESSING(SSwet_floors, src) + if(gc()) + stack_trace("Warning: Wet floor component added and immediately deleted! What a waste of time!") + +/datum/component/wet_floor/Destroy() + STOP_PROCESSING(SSwet_floors, src) + var/turf/T = parent + qdel(T.GetComponent(/datum/component/slippery)) + if(istype(T)) //If this is false there is so many things wrong with it. + T.cut_overlay(current_overlay) + else + stack_trace("Warning: Wet floor component wasn't on a turf when being destroyed! This is really bad!") + return ..() + +/datum/component/wet_floor/proc/update_overlay() + var/intended + if(!istype(parent, /turf/open/floor)) + intended = generic_turf_overlay + else + switch(highest_strength) + if(TURF_WET_PERMAFROST) + intended = permafrost_overlay + if(TURF_WET_ICE) + intended = ice_overlay + else + intended = water_overlay + if(current_overlay != intended) + var/turf/T = parent + T.cut_overlay(current_overlay) + T.add_overlay(intended) + current_overlay = intended + +/datum/component/wet_floor/proc/AfterSlip(mob/living/L) + if(highest_strength == TURF_WET_LUBE) + L.confused = max(L.confused, 8) + +/datum/component/wet_floor/proc/update_flags() + var/intensity + lube_flags = NONE + switch(highest_strength) + if(TURF_WET_WATER) + intensity = 60 + lube_flags = NO_SLIP_WHEN_WALKING + if(TURF_WET_LUBE) + intensity = 80 + lube_flags = SLIDE | GALOSHES_DONT_HELP + if(TURF_WET_ICE) + intensity = 120 + lube_flags = SLIDE | GALOSHES_DONT_HELP + if(TURF_WET_PERMAFROST) + intensity = 120 + lube_flags = SLIDE_ICE | GALOSHES_DONT_HELP + else + qdel(parent.GetComponent(/datum/component/slippery)) + return + + var/datum/component/slippery/S = parent.LoadComponent(/datum/component/slippery, NONE, CALLBACK(src, .proc/AfterSlip)) + S.intensity = intensity + S.lube_flags = lube_flags + +/datum/component/wet_floor/proc/dry(strength = TURF_WET_WATER, immediate = FALSE, duration_decrease = INFINITY) + for(var/i in time_left_list) + if(text2num(i) <= strength) + time_left_list[i] = max(0, time_left_list[i] - duration_decrease) + if(immediate) + check() + +/datum/component/wet_floor/proc/max_time_left() + . = 0 + for(var/i in time_left_list) + . = max(., time_left_list[i]) + +/datum/component/wet_floor/process() + var/turf/open/T = parent + var/decrease = 0 + var/t = T.GetTemperature() + switch(t) + if(-INFINITY to T0C) + add_wet(TURF_WET_ICE, max_time_left()) //Water freezes into ice! + if(T0C to T0C + 100) + decrease = (T.air.temperature - T0C) //one ds per degree. + if(T0C + 100 to INFINITY) + decrease = INFINITY + if((is_wet() & TURF_WET_ICE) && t > T0C) //Ice melts into water! + for(var/obj/O in T.contents) + if(O.flags_2 & FROZEN_2) + O.make_unfrozen() + add_wet(TURF_WET_WATER, max_time_left()) + dry(TURF_WET_ICE) + dry(ALL, FALSE, decrease) + check() + +/datum/component/wet_floor/proc/update_strength() + highest_strength = 0 //Not bitflag. + for(var/i in time_left_list) + highest_strength = max(highest_strength, text2num(i)) + +/datum/component/wet_floor/proc/is_wet() + . = 0 + for(var/i in time_left_list) + . |= text2num(i) + +/datum/component/wet_floor/OnTransfer(datum/to_datum) + if(!isopenturf(to_datum)) + . = COMPONENT_INCOMPATIBLE + CRASH("Wet floor component attempted to be transferred to a non open turf!") + var/turf/O = parent + O.cut_overlay(current_overlay) + var/turf/T = to_datum + T.add_overlay(current_overlay) + +/datum/component/wet_floor/proc/add_wet(type, duration_minimum = 0, duration_add = 0, duration_maximum = MAXIMUM_WET_TIME) + var/static/list/allowed_types = list(TURF_WET_WATER, TURF_WET_LUBE, TURF_WET_ICE, TURF_WET_PERMAFROST) + if(!duration_minimum || duration_minimum < 0 || !type || !(type in allowed_types)) + return FALSE + var/time = 0 + if(LAZYACCESS(time_left_list, "[type]")) + time = CLAMP(LAZYACCESS(time_left_list, "[type]") + duration_add, duration_minimum, duration_maximum) + else + time = min(duration_minimum, duration_maximum) + LAZYSET(time_left_list, "[type]", time) + check(TRUE) + return TRUE + +/datum/component/wet_floor/proc/gc() + if(!LAZYLEN(time_left_list)) + qdel(src) + return TRUE + +/datum/component/wet_floor/proc/check(force_update = FALSE) + var/changed = FALSE + for(var/i in time_left_list) + if(time_left_list[i] <= 0) + time_left_list -= i + changed = TRUE + if(changed || force_update) + update_strength() + update_overlay() + update_flags() + gc() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index b966fe2905..ef04bf9620 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -304,6 +304,9 @@ if(AM && isturf(AM.loc)) step(AM, turn(AM.dir, 180)) +/atom/proc/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube) + return + //returns the mob's dna info as a list, to be inserted in an object's blood_DNA list /mob/living/proc/get_blood_dna_list() if(get_blood_id() != "blood") @@ -354,9 +357,6 @@ /atom/proc/handle_fall() return -/atom/proc/handle_slip() - return - /atom/proc/singularity_act() return diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index ecbb4de4a0..eccd3c657d 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -202,6 +202,6 @@ var/turf/T = get_turf(loc) if(isopenturf(T)) var/turf/open/theturf = T - theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) + theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] using its release valve.") diff --git a/code/game/objects/items/grenades/syndieminibomb.dm b/code/game/objects/items/grenades/syndieminibomb.dm index d63216a2a0..b05da3ab0a 100644 --- a/code/game/objects/items/grenades/syndieminibomb.dm +++ b/code/game/objects/items/grenades/syndieminibomb.dm @@ -43,8 +43,7 @@ for(var/turf/T in view(freeze_range,loc)) if(isfloorturf(T)) var/turf/open/floor/F = T - F.wet = TURF_WET_PERMAFROST - addtimer(CALLBACK(F, /turf/open/floor.proc/MakeDry, TURF_WET_PERMAFROST), rand(3000, 3100)) + F.MakeSlippery(TURF_WET_PERMAFROST, 6 MINUTES) for(var/mob/living/carbon/L in T) L.adjustStaminaLoss(stamina_damage) L.adjust_bodytemperature(-230) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 2213e56921..047408c760 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -247,7 +247,7 @@ soundloop.stop() if(isopenturf(loc)) var/turf/open/tile = loc - tile.MakeSlippery(TURF_WET_WATER, min_wet_time = 5, wet_time_to_add = 1) + tile.MakeSlippery(TURF_WET_WATER, min_wet_time = 5 SECONDS, wet_time_to_add = 1 SECONDS) /obj/machinery/shower/attackby(obj/item/I, mob/user, params) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index e9276d777b..9b19a9d093 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -1,12 +1,16 @@ /turf/open var/slowdown = 0 //negative for faster, positive for slower - var/wet = 0 - var/wet_time = 0 // Time in seconds that this floor will be wet for. var/mutable_appearance/wet_overlay var/postdig_icon_change = FALSE var/postdig_icon var/list/archdrops + var/wet + +/turf/open/Initialize() + . = ..() + if(wet) + AddComponent(/datum/component/wet_floor, wet, INFINITY, 0, INFINITY, TRUE) /turf/open/indestructible name = "floor" @@ -164,11 +168,11 @@ for(var/mob/living/L in contents) if(L.bodytemperature <= 50) L.apply_status_effect(/datum/status_effect/freon) - MakeSlippery(TURF_WET_PERMAFROST, 5) + MakeSlippery(TURF_WET_PERMAFROST, 50) return 1 /turf/open/proc/water_vapor_gas_act() - MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) + MakeSlippery(TURF_WET_WATER, min_wet_time = 100, wet_time_to_add = 50) for(var/mob/living/simple_animal/slime/M in src) M.apply_water() @@ -177,7 +181,7 @@ for(var/obj/effect/O in src) if(is_cleanable(O)) qdel(O) - return 1 + return TRUE /turf/open/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube) if(C.movement_type & FLYING) @@ -224,132 +228,23 @@ /turf/open/copyTurf(turf/T) . = ..() - if(. && isopenturf(T) && wet_time) - var/turf/open/O = T - O.MakeSlippery(wet_setting = wet, wet_time_to_add = wet_time) //we're copied, copy how wet we are also + if(. && isopenturf(T)) + GET_COMPONENT(slip, /datum/component/wet_floor) + if(slip) + var/datum/component/wet_floor/WF = T.AddComponent(/datum/component/wet_floor) + WF.InheritComponent(slip) -/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost, 5 = Slide - wet_time = max(wet_time+wet_time_to_add, min_wet_time) - if(wet >= wet_setting) - return - wet = wet_setting - UpdateSlip() - if(wet_setting != TURF_DRY) - if(wet_overlay) - cut_overlay(wet_overlay) - else - wet_overlay = mutable_appearance() - var/turf/open/floor/F = src - if(istype(F)) - if(wet_setting == TURF_WET_PERMAFROST) - wet_overlay.icon = 'icons/effects/water.dmi' - wet_overlay.icon_state = "ice_floor" - else if(wet_setting == TURF_WET_ICE) - wet_overlay.icon = 'icons/turf/overlays.dmi' - wet_overlay.icon_state = "snowfloor" - else - wet_overlay.icon = 'icons/effects/water.dmi' - wet_overlay.icon_state = "wet_floor_static" - else - wet_overlay.icon = 'icons/effects/water.dmi' - wet_overlay.icon_state = "wet_static" - add_overlay(wet_overlay) - HandleWet() +/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0, max_wet_time = MAXIMUM_WET_TIME, permanent) + AddComponent(/datum/component/wet_floor, wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) -/turf/open/proc/UpdateSlip() - var/intensity - var/lube_flags - switch(wet) - if(TURF_WET_WATER) - intensity = 60 - lube_flags = NO_SLIP_WHEN_WALKING - if(TURF_WET_LUBE) - intensity = 80 - lube_flags = SLIDE | GALOSHES_DONT_HELP - if(TURF_WET_ICE) - intensity = 120 - lube_flags = SLIDE | GALOSHES_DONT_HELP - if(TURF_WET_PERMAFROST) - intensity = 120 - lube_flags = SLIDE_ICE | GALOSHES_DONT_HELP - else - qdel(GetComponent(/datum/component/slippery)) - return - var/datum/component/slippery/S = LoadComponent(/datum/component/slippery, NONE, CALLBACK(src, .proc/AfterSlip)) - S.intensity = intensity - S.lube_flags = lube_flags - -/turf/open/proc/AfterSlip(mob/living/L) - if(wet == TURF_WET_LUBE) - L.confused = max(L.confused, 8) - -/turf/open/proc/MakeDry(wet_setting = TURF_WET_WATER) - if(wet > wet_setting || !wet) - return - spawn(rand(0,20)) - if(wet == TURF_WET_PERMAFROST) - wet = TURF_WET_ICE - else if(wet == TURF_WET_ICE) - wet = TURF_WET_WATER - else - wet = TURF_DRY - if(wet_overlay) - cut_overlay(wet_overlay) - UpdateSlip() - -/turf/open/proc/HandleWet() - if(!wet) - //It's possible for this handler to get called after all the wetness is - //cleared, so bail out if that is the case - return - if(!wet_time && wet < TURF_WET_ICE) - MakeDry(TURF_WET_ICE) - if(wet_time > MAXIMUM_WET_TIME) - wet_time = MAXIMUM_WET_TIME - if(wet == TURF_WET_ICE && air.temperature > T0C) - for(var/obj/O in contents) - if(O.flags_2 & FROZEN_2) - O.make_unfrozen() - MakeDry(TURF_WET_ICE) - MakeSlippery(TURF_WET_WATER) - if(wet != TURF_WET_PERMAFROST) - switch(air.temperature) - if(-INFINITY to T0C) - if(wet != TURF_WET_ICE && wet) - MakeDry(TURF_WET_ICE) - MakeSlippery(TURF_WET_ICE) - if(T0C to T20C) - wet_time = max(0, wet_time-1) - if(T20C to T0C + 40) - wet_time = max(0, wet_time-2) - if(T0C + 40 to T0C + 60) - wet_time = max(0, wet_time-3) - if(T0C + 60 to T0C + 80) - wet_time = max(0, wet_time-5) - if(T0C + 80 to T0C + 100) - wet_time = max(0, wet_time-10) - if(T0C + 100 to INFINITY) - wet_time = 0 - else if (GetTemperature() > BODYTEMP_COLD_DAMAGE_LIMIT) //seems like a good place - MakeDry(TURF_WET_PERMAFROST) - else - wet_time = max(0, wet_time-5) - if(wet && wet < TURF_WET_ICE && !wet_time) - MakeDry(TURF_WET_ICE) - if(!wet && wet_time) - wet_time = 0 - if(wet) - addtimer(CALLBACK(src, .proc/HandleWet), 15, TIMER_UNIQUE) +/turf/open/proc/MakeDry(wet_setting = TURF_WET_WATER, immediate = FALSE, amount = INFINITY) + SendSignal(COMSIG_TURF_MAKE_DRY, wet_setting, immediate, amount) /turf/open/get_dumping_location() return src /turf/open/proc/ClearWet()//Nuclear option of immediately removing slipperyness from the tile instead of the natural drying over time - wet = TURF_DRY - UpdateSlip() - if(wet_overlay) - cut_overlay(wet_overlay) - + qdel(GetComponent(/datum/component/wet_floor)) /turf/open/rad_act(pulse_strength) . = ..() diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 5c05c44fc5..1bb2a2b798 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -21,10 +21,10 @@ GET_COMPONENT(chasm_component, /datum/component/chasm) chasm_component.drop(AM) -/turf/open/chasm/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) +/turf/open/chasm/MakeSlippery() return -/turf/open/chasm/MakeDry(wet_setting = TURF_WET_WATER) +/turf/open/chasm/MakeDry() return /turf/open/chasm/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 2b8400abdb..44fc9dc643 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -33,10 +33,10 @@ /turf/open/floor/plating/asteroid/burn_tile() return -/turf/open/floor/plating/asteroid/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) +/turf/open/floor/plating/asteroid/MakeSlippery() return -/turf/open/floor/plating/asteroid/MakeDry(wet_setting = TURF_WET_WATER) +/turf/open/floor/plating/asteroid/MakeDry() return /turf/open/floor/plating/asteroid/attackby(obj/item/W, mob/user, params) diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index 6e37f4ba4a..12edefb680 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -143,22 +143,15 @@ planetary_atmos = TRUE baseturfs = /turf/open/floor/plating/ice slowdown = 1 - wet = TURF_WET_PERMAFROST attachment_holes = FALSE /turf/open/floor/plating/ice/Initialize() . = ..() - UpdateSlip() + MakeSlippery(TURF_WET_PERMAFROST, INFINITY, 0, INFINITY, TRUE) /turf/open/floor/plating/ice/try_replace_tile(obj/item/stack/tile/T, mob/user, params) return -/turf/open/floor/plating/ice/HandleWet() - if(wet == TURF_WET_ICE) - return - ..() - MakeSlippery(TURF_WET_ICE) //rewet after ..() clears out lube/ice etc. - /turf/open/floor/plating/ice/smooth icon_state = "smooth" smooth = SMOOTH_MORE | SMOOTH_BORDER diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 856537c1d5..2d86854265 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -14,7 +14,7 @@ /turf/open/lava/ex_act(severity, target) contents_explosion(severity, target) -/turf/open/lava/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) +/turf/open/lava/MakeSlippery() return /turf/open/lava/MakeDry(wet_setting = TURF_WET_WATER) diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index 104f8b4b53..765da26136 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -7,10 +7,7 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS planetary_atmos = TRUE slowdown = 1 - wet = TURF_WET_WATER -/turf/open/water/HandleWet() - if(wet == TURF_WET_WATER) - return - ..() - MakeSlippery(TURF_WET_WATER) //rewet after ..() clears out lube/ice etc. \ No newline at end of file +/turf/open/water/Initialize() + . = ..() + MakeSlippery(TURF_WET_WATER, INFINITY, 0, INFINITY, TRUE) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index ed21431fe7..2e4c42ed44 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -84,6 +84,9 @@ /turf/open/space/proc/CanBuildHere() return TRUE +/turf/open/space/handle_slip() + return + /turf/open/space/attackby(obj/item/C, mob/user, params) ..() if(!CanBuildHere()) @@ -162,10 +165,7 @@ A.newtonian_move(A.inertia_dir) -/turf/open/space/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) - return - -/turf/open/space/handle_slip() +/turf/open/space/MakeSlippery() return /turf/open/space/singularity_act() diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index b954dcef75..7ae401f564 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -64,9 +64,7 @@ /obj/item/clothing/shoes/galoshes/dry/step_action() var/turf/open/t_loc = get_turf(src) - if(istype(t_loc) && t_loc.wet) - t_loc.MakeDry(TURF_WET_WATER) - t_loc.wet_time = 0 + t_loc.SendSignal(COMSIG_TURF_MAKE_DRY, TURF_WET_WATER, TRUE, INFINITY) /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!" diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 662a42eea4..7ee828adb7 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -27,7 +27,6 @@ add_logs(src,, "slipped",, "on [O ? O.name : "floor"]") return loc.handle_slip(src, knockdown_amount, O, lube) - /mob/living/carbon/Process_Spacemove(movement_dir = 0) if(..()) return 1 diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index ff8b3fa0e9..fe0789d960 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -246,7 +246,7 @@ if(prob(75)) var/turf/open/T = loc if(istype(T)) - T.MakeSlippery(TURF_WET_WATER, min_wet_time = 20, wet_time_to_add = 15) + T.MakeSlippery(TURF_WET_WATER, min_wet_time = 20 SECONDS, wet_time_to_add = 15 SECONDS) else visible_message("[src] whirs and bubbles violently, before releasing a plume of froth!") new /obj/effect/particle_effect/foam(loc) diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm index 3f81e27a83..7ca900488e 100644 --- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm @@ -459,7 +459,7 @@ reac_volume = ..() var/turf/open/T = get_turf(M) if(istype(T) && prob(reac_volume)) - T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) + T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) M.adjust_fire_stacks(-(reac_volume / 10)) M.ExtinguishMob() M.apply_damage(0.4*reac_volume, BRUTE) @@ -481,7 +481,7 @@ /datum/reagent/blob/pressurized_slime/proc/extinguisharea(obj/structure/blob/B, probchance) for(var/turf/open/T in range(1, B)) if(prob(probchance)) - T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) + T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) for(var/obj/O in T) O.extinguish() for(var/mob/living/L in T) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 55d64ea36c..47bbc899a9 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -124,7 +124,7 @@ if(!istype(T)) return if(reac_volume >= 5) - T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10, wet_time_to_add = reac_volume * 1.5) + T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume * 1.5 SECONDS) T.name = "deep-fried [initial(T.name)]" T.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) @@ -249,7 +249,7 @@ if(reac_volume >= 1) // Make Freezy Foam and anti-fire grenades! if(isopenturf(T)) var/turf/open/OT = T - OT.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=10, wet_time_to_add=reac_volume) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure. + OT.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=100, wet_time_to_add=reac_volume SECONDS) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure. OT.air.temperature -= MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity() // reduces environment temperature by 5K per unit. /datum/reagent/consumable/condensedcapsaicin @@ -433,7 +433,7 @@ /datum/reagent/consumable/cornoil/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return - T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10, wet_time_to_add = reac_volume*2) + T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume*2 SECONDS) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles()) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 0e6be47893..fca2260e02 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -135,7 +135,7 @@ var/CT = cooling_temperature if(reac_volume >= 5) - T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = min(reac_volume*1.5, 60)) + T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = min(reac_volume*1.5 SECONDS, 60 SECONDS)) for(var/mob/living/simple_animal/slime/M in T) M.apply_water() @@ -329,7 +329,7 @@ if (!istype(T)) return if(reac_volume >= 1) - T.MakeSlippery(TURF_WET_LUBE, 15, min(reac_volume * 2, 120)) + T.MakeSlippery(TURF_WET_LUBE, 15 SECONDS, min(reac_volume * 2 SECONDS, 120)) /datum/reagent/spraytan name = "Spray Tan" @@ -1613,9 +1613,8 @@ taste_description = "dryness" /datum/reagent/drying_agent/reaction_turf(turf/open/T, reac_volume) - if(istype(T) && T.wet) - T.wet_time = max(0, T.wet_time-reac_volume*5) // removes 5 seconds of wetness for every unit. - T.HandleWet() + if(istype(T)) + T.MakeDry(ALL, TRUE, reac_volume * 5 SECONDS) //50 deciseconds per unit /datum/reagent/drying_agent/reaction_obj(obj/O, reac_volume) if(O.type == /obj/item/clothing/shoes/galoshes) diff --git a/tgstation.dme b/tgstation.dme index b8e037701f..37d2ae9cac 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -261,6 +261,7 @@ #include "code\controllers\subsystem\processing\processing.dm" #include "code\controllers\subsystem\processing\projectiles.dm" #include "code\controllers\subsystem\processing\traits.dm" +#include "code\controllers\subsystem\processing\wet_floors.dm" #include "code\datums\action.dm" #include "code\datums\ai_laws.dm" #include "code\datums\armor.dm" @@ -336,6 +337,7 @@ #include "code\datums\components\spooky.dm" #include "code\datums\components\squeek.dm" #include "code\datums\components\thermite.dm" +#include "code\datums\components\wet_floor.dm" #include "code\datums\components\decals\blood.dm" #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm"