diff --git a/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm b/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm index bde32c844a7..b747f03ac30 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm @@ -2662,7 +2662,7 @@ "gW" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood{ - amount = 0 + cleanable_amount = 0 }, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; diff --git a/code/game/objects/effects/decals/Cleanable/alien_blood.dm b/code/game/objects/effects/decals/Cleanable/alien_blood.dm index 23e452a5b42..c8d6f5d3085 100644 --- a/code/game/objects/effects/decals/Cleanable/alien_blood.dm +++ b/code/game/objects/effects/decals/Cleanable/alien_blood.dm @@ -6,7 +6,7 @@ /obj/effect/decal/cleanable/blood/xeno/splatter random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5") - amount = 2 + cleanable_amount = 2 /obj/effect/decal/cleanable/blood/gibs/xeno name = "xeno gibs" @@ -46,7 +46,7 @@ /obj/effect/decal/cleanable/blood/slime/streak random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5") - amount = 2 + cleanable_amount = 2 /obj/effect/decal/cleanable/blood/vox name = "vox blood" diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm index 00c3e27158a..a75256e19ac 100644 --- a/code/game/objects/effects/decals/Cleanable/fuel.dm +++ b/code/game/objects/effects/decals/Cleanable/fuel.dm @@ -2,16 +2,16 @@ //Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles. icon_state = "fuel" layer = ABOVE_NORMAL_TURF_LAYER - var/amount = 1 //Basically moles. + cleanable_amount = 1 //Basically moles. /obj/effect/decal/cleanable/liquid_fuel/Initialize(mapload, amt = 1) . = ..() - amount = amt + cleanable_amount = amt //Be absorbed by any other liquid fuel in the tile. for(var/obj/effect/decal/cleanable/liquid_fuel/other in loc) if(other != src) - other.amount += amount + other.cleanable_amount += cleanable_amount spawn other.Spread() qdel(src) @@ -19,7 +19,7 @@ /obj/effect/decal/cleanable/liquid_fuel/proc/Spread() //Allows liquid fuels to sometimes flow into other tiles. - if(amount < 0.5) + if(cleanable_amount < 0.5) return var/turf/simulated/S = loc if(!istype(S)) @@ -30,8 +30,8 @@ var/turf/simulated/origin = get_turf(src) if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0)) if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target) - new/obj/effect/decal/cleanable/liquid_fuel(target, amount * 0.25) - amount *= 0.75 + new/obj/effect/decal/cleanable/liquid_fuel(target, cleanable_amount * 0.25) + cleanable_amount *= 0.75 /obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel icon_state = "mustard" @@ -43,7 +43,7 @@ /obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Spread() //The spread for flamethrower fuel is much more precise, to create a wide fire pattern. - if(amount < 0.1) + if(cleanable_amount < 0.1) return var/turf/simulated/S = loc if(!istype(S)) @@ -54,7 +54,7 @@ if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O) continue if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0)) - new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O, amount * 0.25, d) + new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O, cleanable_amount * 0.25, d) O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately. - amount *= 0.25 + cleanable_amount *= 0.25 diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index a75a13a78d0..430a705493e 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -1,4 +1,4 @@ -#define DRYING_TIME 5 MINUTES //for 1 unit of depth in puddle (amount var) +#define DRYING_TIME 5 MINUTES //for 1 unit of depth in puddle (cleanable_amount var) #define ALWAYS_IN_GRAVITY 2 /obj/effect/decal/cleanable/blood @@ -17,7 +17,7 @@ var/blood_state = BLOOD_STATE_HUMAN bloodiness = BLOOD_AMOUNT_PER_DECAL var/basecolor = "#A10808" // Color when wet. - var/amount = 5 + cleanable_amount = 5 var/dry_timer = 0 var/off_floor = FALSE var/image/weightless_image @@ -50,12 +50,12 @@ if(gravity_check) if(!. && !QDELETED(src)) - dry_timer = addtimer(CALLBACK(src, PROC_REF(dry)), DRYING_TIME * (amount+1), TIMER_STOPPABLE) + dry_timer = addtimer(CALLBACK(src, PROC_REF(dry)), DRYING_TIME * (cleanable_amount + 1), TIMER_STOPPABLE) else if(prob(50)) - animate_float(src, -1, rand(30,120)) + animate_float(src, -1, rand(30, 120)) else - animate_levitate(src, -1, rand(30,120)) + animate_levitate(src, -1, rand(30, 120)) //weightless blood cannot dry return @@ -106,7 +106,7 @@ name = dryname desc = drydesc color = adjust_brightness(color, -50) - amount = 0 + cleanable_amount = 0 gravity_check = ALWAYS_IN_GRAVITY animate(src) @@ -162,7 +162,7 @@ // they were going in. var/list/obj/item/things_to_potentially_bloody = list() - var/count = amount + 1 + var/count = cleanable_amount + 1 for(var/obj/item/i in H.contents) things_to_potentially_bloody += i @@ -177,12 +177,12 @@ /obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user) ..() - if(amount && istype(user)) + if(cleanable_amount && istype(user)) add_fingerprint(user) if(user.gloves) return - var/taken = rand(1,amount) - amount -= taken + var/taken = rand(1,cleanable_amount) + cleanable_amount -= taken to_chat(user, SPAN_NOTICE("You get some of \the [src] on your hands.")) if(!user.blood_DNA) user.blood_DNA = list() @@ -200,7 +200,7 @@ /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5") - amount = 2 + cleanable_amount = 2 /obj/effect/decal/cleanable/blood/drip name = "drips of blood" @@ -208,7 +208,7 @@ icon = 'icons/effects/drip.dmi' icon_state = "1" random_icon_states = list("1", "2", "3", "4", "5") - amount = 0 + cleanable_amount = 0 bloodiness = 0 var/drips = 1 @@ -234,7 +234,7 @@ desc = "It looks like a writing in blood." gender = NEUTER random_icon_states = list("writing1", "writing2", "writing3", "writing4", "writing5") - amount = 0 + cleanable_amount = 0 var/message /obj/effect/decal/cleanable/blood/writing/Initialize(mapload) diff --git a/code/game/objects/effects/decals/Cleanable/misc_cleanables.dm b/code/game/objects/effects/decals/Cleanable/misc_cleanables.dm index fbb715965c5..be2c37bd31b 100644 --- a/code/game/objects/effects/decals/Cleanable/misc_cleanables.dm +++ b/code/game/objects/effects/decals/Cleanable/misc_cleanables.dm @@ -49,6 +49,7 @@ smoothing_groups = list(SMOOTH_GROUP_CLEANABLE_DIRT) canSmoothWith = list(SMOOTH_GROUP_CLEANABLE_DIRT, SMOOTH_GROUP_WALLS) mouse_opacity = FALSE + cleanable_amount = 1 /obj/effect/decal/cleanable/dirt/Initialize(mapload) . = ..() @@ -74,6 +75,7 @@ gender = PLURAL layer = TURF_LAYER icon_state = "flour" + cleanable_amount = 1 /obj/effect/decal/cleanable/flour/nanofrost name = "nanofrost residue" @@ -138,6 +140,7 @@ random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") no_clear = TRUE scoop_reagents = list("vomit" = 5) + cleanable_amount = 2 /obj/effect/decal/cleanable/vomit/Initialize(mapload) @@ -254,12 +257,14 @@ layer = TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") + cleanable_amount = 1 /obj/effect/decal/cleanable/plant_smudge name = "plant smudge" layer = TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_plant") + cleanable_amount = 1 /obj/effect/decal/cleanable/egg_smudge name = "smashed egg" @@ -267,6 +272,7 @@ layer = TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") + cleanable_amount = 1 /// honk /obj/effect/decal/cleanable/pie_smudge @@ -275,6 +281,7 @@ layer = TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") + cleanable_amount = 2 /obj/effect/decal/cleanable/paint_splat name = "paint splat" @@ -284,6 +291,7 @@ icon_state = "splatter-1" random_icon_states = list("splatter-1", "splatter-2", "splatter-3") mergeable_decal = FALSE + cleanable_amount = 1 /obj/effect/decal/cleanable/paint_splat/Initialize(mapload) pixel_x = rand(-10, 10) @@ -339,6 +347,7 @@ icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") + cleanable_amount = 2 /obj/effect/decal/cleanable/reagent name = "fluid" @@ -347,7 +356,7 @@ icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") var/basecolor = "#909090" - var/amount = 10 + cleanable_amount = 5 /obj/effect/decal/cleanable/reagent/Initialize(mapload, decal_color) . = ..() @@ -362,6 +371,6 @@ icon = 'icons/effects/drip.dmi' icon_state = "1" random_icon_states = list("1", "2", "3", "4", "5") - amount = 1 + cleanable_amount = 1 #undef ALWAYS_IN_GRAVITY diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index ec02e0c720c..f6730bce2a4 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -59,4 +59,4 @@ /obj/effect/decal/cleanable/blood/oil/streak random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5") - amount = 2 + cleanable_amount = 2 diff --git a/code/game/objects/effects/decals/Cleanable/tar.dm b/code/game/objects/effects/decals/Cleanable/tar.dm index 1c69341a576..62f5dac6b49 100644 --- a/code/game/objects/effects/decals/Cleanable/tar.dm +++ b/code/game/objects/effects/decals/Cleanable/tar.dm @@ -3,6 +3,7 @@ name = "tar" desc = "A sticky substance." icon_state = "tar2" + cleanable_amount = 5 /// The turf that the tar is sitting on var/turf/simulated/target diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index c86af868121..4846ec0705d 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -14,7 +14,7 @@ GLOBAL_LIST_EMPTY(fluidtrack_cache) drydesc = "Whoops..." icon_state = "wheels1" random_icon_states = null - amount = 0 + cleanable_amount = 0 gravity_check = ALWAYS_IN_GRAVITY /// Subtype of tracks used for decorating maps. diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 0f6b3bdad5e..55bb7b4c6f9 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,14 +1,17 @@ #define ALWAYS_IN_GRAVITY 2 /obj/effect/decal/cleanable - ///when Initialized() its icon_state will be chosen from this list + /// when Initialized() its icon_state will be chosen from this list var/list/random_icon_states = list() - ///0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints + /// 0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints var/bloodiness = 0 - ///when another of the same type is made on the same tile will they merge --- YES=TRUE; NO=FLASE + /// How much yuck there is this decal, usually from 0-5. + /// Used to calculate drying times, blood writing uses, and similar things. + var/cleanable_amount = 0 + /// when another of the same type is made on the same tile will they merge --- YES=TRUE; NO=FLASE var/mergeable_decal = TRUE - ///prevents Ambient Occlusion effects around it ; Set to GAME_PLANE in Initialize() if on a wall - ///for blood n vomit in zero G --- IN GRAVITY=TRUE; NO GRAVITY=FALSE + /// prevents Ambient Occlusion effects around it ; Set to GAME_PLANE in Initialize() if on a wall + /// for blood n vomit in zero G --- IN GRAVITY=TRUE; NO GRAVITY=FALSE var/gravity_check = TRUE hud_possible = list(JANI_HUD) @@ -24,8 +27,8 @@ else ..() -//Add "bloodiness" of this blood's type, to the human's shoes -//This is on /cleanable because fuck this ancient mess +// Add "bloodiness" of this blood's type, to the human's shoes +// This is on /cleanable because fuck this ancient mess /obj/effect/decal/cleanable/blood/proc/on_atom_entered(datum/source, atom/movable/entered) if(!ishuman(entered)) return @@ -52,7 +55,7 @@ add_blood = bloodiness bloodiness -= add_blood S.bloody_shoes[blood_state] = min(MAX_SHOE_BLOODINESS, S.bloody_shoes[blood_state] + add_blood) - S.bloody_shoes[BLOOD_BASE_ALPHA] = BLOODY_FOOTPRINT_BASE_ALPHA * (alpha/255) + S.bloody_shoes[BLOOD_BASE_ALPHA] = BLOODY_FOOTPRINT_BASE_ALPHA * (alpha / 255) if(length(blood_DNA)) S.add_blood(blood_DNA, basecolor) S.blood_state = blood_state @@ -67,7 +70,7 @@ add_blood = bloodiness bloodiness -= add_blood H.bloody_feet[blood_state] = min(MAX_SHOE_BLOODINESS, H.bloody_feet[blood_state] + add_blood) - H.bloody_feet[BLOOD_BASE_ALPHA] = BLOODY_FOOTPRINT_BASE_ALPHA * (alpha/255) + H.bloody_feet[BLOOD_BASE_ALPHA] = BLOODY_FOOTPRINT_BASE_ALPHA * (alpha / 255) if(!H.feet_blood_DNA) H.feet_blood_DNA = list() H.blood_state = blood_state diff --git a/code/modules/clothing/neck/towel.dm b/code/modules/clothing/neck/towel.dm new file mode 100644 index 00000000000..2cf2b02ea42 --- /dev/null +++ b/code/modules/clothing/neck/towel.dm @@ -0,0 +1,284 @@ +#define TOWEL_WATER_ABSORBED (1 << 0) +#define TOWEL_WATER_SPREAD (1 << 1) +#define TOWEL_GRIME_ABSORBED (1 << 2) +#define TOWEL_GRIME_SPREAD (1 << 3) +#define TOWEL_CLEANED_TARGET (1 << 4) + +/obj/item/clothing/neck/towel + name = "plain towel" + desc = "Larger than a rag, smaller than a beach towel." + icon_state = "towel" + inhand_icon_state = "towel" + sprite_sheets = list( + "Drask" = 'icons/mob/clothing/species/drask/neck.dmi', + "Grey" = 'icons/mob/clothing/species/grey/neck.dmi', + "Kidan" = 'icons/mob/clothing/species/kidan/neck.dmi', + "Vox" = 'icons/mob/clothing/species/vox/neck.dmi', + "Skkulakin" = 'icons/mob/clothing/species/skkulakin/neck.dmi' + ) + /// Tracks how wet the towel is. Wet towels dampen their targets instead of drying them. + var/wet_level = 0 + /// Tracks how much yuck the towel has on it. Grime levels higher than 1 can be spread. + var/grime_level = 0 + /// A list of stuff we can towel off. + var/list/obj/effect/decal/cleanable/grime_sources = list( + /obj/effect/decal/cleanable/blood/drip, + /obj/effect/decal/cleanable/blood/tracks, + /obj/effect/decal/cleanable/blood/splatter, + /obj/effect/decal/cleanable/blood/xeno/splatter, + /obj/effect/decal/cleanable/blood/gibs, + /obj/effect/decal/cleanable/blood, + /obj/effect/decal/cleanable/dirt, + /obj/effect/decal/cleanable/flour, + /obj/effect/decal/cleanable/insectguts, + /obj/effect/decal/cleanable/liquid_fuel, + /obj/effect/decal/cleanable/paint_splat, + /obj/effect/decal/cleanable/pie_smudge, + /obj/effect/decal/cleanable/tar, + /obj/effect/decal/cleanable/tomato_smudge, + /obj/effect/decal/cleanable/plant_smudge, + /obj/effect/decal/cleanable/egg_smudge, + /obj/effect/decal/cleanable/vomit, + ) + +/// Display warnings for towel grime and wetness levels that would transfer. +/obj/item/clothing/neck/towel/examine() + . = ..() + + switch(wet_level) + if(0) . += SPAN_NOTICE("It looks dry.") + if(1 to 4) . += SPAN_NOTICE("It looks damp.") + if(5) . += SPAN_WARN("It looks sopping wet.") + + switch(grime_level) + if(0) . += SPAN_NOTICE("It looks clean.") + if(1) . += SPAN_NOTICE("It looks a bit grimy.") + if(2 to 5) . += SPAN_WARN("It looks filthy.") + +/obj/item/clothing/neck/towel/interact_with_atom(atom/target, mob/living/user, list/modifiers) + var/toweling_result = NONE + + if(iscarbon(target) || issimulatedturf(target)) + toweling_result |= exchange_water(target, user, modifiers) + toweling_result |= exchange_grime(target, user, modifiers) + + var/user_message = "" + var/target_message = "" + + if(toweling_result & TOWEL_GRIME_SPREAD) + user_message += "You smear [src]'s grime all over [target == user ? "you" : target]." + target_message += "[user] smears the grimy [src] all over you." + else if(toweling_result & TOWEL_CLEANED_TARGET) + user_message += "You wipe [target == user ? "yourself" : target] clean with [src]." + target_message += "[user] wipes you clean with [src]." + else if(toweling_result & TOWEL_GRIME_ABSORBED) + user_message += "You absorb some of the grime with [src]." + target_message += "[user] mops up some of the grime on you with [src]." + else + user_message += "You pat [target == user ? "yourself" : target] with [src]." + target_message += "[user] pats you with [src]." + + if(toweling_result & TOWEL_WATER_SPREAD) + user_message += " It dampens [target == user ? "you" : target.p_them()]." + target_message += " It dampens you." + else if(toweling_result & TOWEL_WATER_ABSORBED) + user_message += " It dries [target == user ? "you" : target.p_them()]." + target_message += " It dries you." + + update_icon() + + to_chat(user, SPAN_NOTICE(user_message)) + if(target != user && ismob(target)) + to_chat(target, SPAN_NOTICE(target_message)) + return ITEM_INTERACT_COMPLETE + +/obj/item/clothing/neck/towel/proc/exchange_grime(atom/target, mob/living/user, list/modifiers) + var/toweling_result = NONE + // the grimiest decal will transfer to the towel. calculate this before griming up the toweling target + var/obj/effect/decal/cleanable/grimiest_decal = null + for(var/obj/effect/decal/cleanable/target_decal in target) + if(!(target_decal.type in grime_sources)) + // we can't pick this up, it's glass shards or some other not-really-towelable mess + continue + if(!grimiest_decal || target_decal.cleanable_amount > grimiest_decal.cleanable_amount) + grimiest_decal = target_decal + + // In the case of no decals, compare how much blood DNA is on there that isn't already on the towel. + var/list/blood_DNA_copy = list() + if(target.blood_DNA) + blood_DNA_copy = target.blood_DNA.Copy() + blood_DNA_copy.Remove(blood_DNA) + var/target_grime_level = grimiest_decal ? grimiest_decal.cleanable_amount : length(blood_DNA_copy) + + // if the towel is grimy, add grime to the target. do this before adding more grime to the towel + if(grime_level > 1) + for(var/obj/effect/decal/cleanable/towel_decal in src) + if(towel_decal.cleanable_amount < 1) + continue + if(istype(towel_decal, /obj/effect/decal/cleanable/blood)) + var/obj/effect/decal/cleanable/blood/towel_blood_decal = towel_decal + target.add_blood(towel_blood_decal.blood_DNA, towel_blood_decal.basecolor) + if(istype(target, /turf/simulated)) + var/turf/simulated/target_turf = target + for(var/obj/effect/decal/cleanable/blood/turf_decal in target_turf) + turf_decal.cleanable_amount = 1 + else if(istype(target, /turf/simulated)) + var/obj/effect/decal/cleanable/turf_decal = new towel_decal.type(target) + turf_decal.cleanable_amount = 1 + target.germ_level += 20 * grime_level + towel_decal.cleanable_amount -= 1 + grime_level -= 1 + toweling_result |= TOWEL_GRIME_SPREAD + + // if the grimiest decal (above) is grimier than the towel, add it to the towel. + if(target_grime_level > grime_level) + if(!grimiest_decal) + add_blood(target.blood_DNA, target.blood_color) + else if(istype(grimiest_decal, /obj/effect/decal/cleanable/blood)) + var/obj/effect/decal/cleanable/blood/grimiest_blood_decal = grimiest_decal + add_blood(grimiest_blood_decal.blood_DNA, grimiest_blood_decal.basecolor) + + grimiest_blood_decal.bloodiness = 0 + grimiest_blood_decal.cleanable_amount = 0 + else + new grimiest_decal.type(src) + toweling_result |= TOWEL_GRIME_ABSORBED + + // if the towel wasn't dirty before we started, clean the target + if(can_clean()) + for(var/obj/effect/decal/cleanable/target_decal in target) + qdel(target_decal) + target.clean_blood() + toweling_result |= TOWEL_CLEANED_TARGET + grime_level = min(max(grime_level + 1, target_grime_level - 1), 5) + return toweling_result + +/obj/item/clothing/neck/towel/proc/exchange_water(atom/target, mob/living/user, list/modifiers) + if(!iscarbon(target)) + if(issimulatedturf(target)) + var/turf/simulated/T = target + // dry a turf that's wetter than the towel + if(T.wet == TURF_WET_WATER && wet_level < 5) + T.MakeDry() + wet_level += 1 + return TOWEL_WATER_ABSORBED + + // wet a dry turf with a sopping wet towel + else if(wet_level > 4 && T.wet == NONE) + T.MakeSlippery() + wet_level -= 1 + return TOWEL_WATER_SPREAD + + // it's not a mob or a turf so its wetness is irrelevant + return NONE + + var/mob/living/carbon/toweling_target = target + // towel sopping wet, target dryish. wet the target + if(wet_level > 4 && toweling_target.wetlevel < 2) + toweling_target.wetlevel = max(toweling_target.wetlevel + 1, 1) + wet_level -= 1 + return TOWEL_WATER_SPREAD + + // towel drier than creature. dries target + else if(wet_level < toweling_target.wetlevel) + toweling_target.wetlevel = max(toweling_target.wetlevel - 2, 0) + wet_level += 1 + return TOWEL_WATER_ABSORBED + + return NONE + +/obj/item/clothing/neck/towel/add_blood(list/blood_dna, b_color) + . = ..() + var/obj/effect/decal/cleanable/blood/blood_container = new(src) + blood_container.transfer_blood_dna(blood_dna) + blood_container.basecolor = b_color + +/obj/item/clothing/neck/towel/water_act(volume, temperature, source, method) + . = ..() + if(volume < 10) + return + wet_level = min(wet_level + 1, 5) + if(temperature > VIRUS_DISINFECTION_TEMP || volume > 99) + grime_level = max(grime_level - 1, 0) + for(var/obj/effect/decal/cleanable/towel_decal in src) + towel_decal.cleanable_amount -= 1 + if(towel_decal.cleanable_amount < 1) + qdel(towel_decal) + +/obj/item/clothing/neck/towel/can_clean() + return !grime_level + +/obj/item/clothing/neck/towel/cleaning_act(mob/user, atom/cleaner, cleanspeed, text_verb, text_description, text_targetname, skip_do_after) + if(..()) + grime_level = 0 + +/obj/item/clothing/neck/towel/machine_wash(obj/machinery/washing_machine/source) + . = ..() + wet_level = 0 + // if the washing machine has a bloody mess in it, make the towel maximum grimy + grime_level = source.bloody_mess ? 5 : 0 + +/obj/item/clothing/neck/towel/beach + name = "balmy beach towel" + desc = "A fluffy towel large enough for beachgoers." + icon_state = "towel_palm" + inhand_icon_state = "beach_towel" + worn_icon_state = "towel_palm" + +/obj/item/clothing/neck/towel/beach/interact_with_atom(atom/target, mob/living/user, list/modifiers) + // place beach towel on ground + if(issimulatedturf(target)) + var/turf/simulated/T = target + if(!T.density) + user.drop_item_to_ground(src) + forceMove(T) + return ..() + +/obj/item/clothing/neck/towel/beach/Moved() + . = ..() + update_icon(UPDATE_ICON_STATE) + +/obj/item/clothing/neck/towel/beach/update_icon_state() + . = ..() + icon_state = isturf(loc) ? initial(icon_state) : "[initial(icon_state)]_roll" + +/obj/item/clothing/neck/towel/beach/lava_waves + name = "lava waves beach towel" + icon_state = "towel_lavawaves" + worn_icon_state = "towel_lavawaves" + +/obj/item/clothing/neck/towel/beach/water_waves + name = "ocean waves beach towel" + icon_state = "towel_waterwaves" + worn_icon_state = "towel_waterwaves" + +/obj/item/clothing/neck/towel/beach/striped_green + name = "striped green beach towel" + icon_state = "towel_striped_green" + worn_icon_state = "towel_striped_green" + +/obj/item/clothing/neck/towel/beach/striped_red + name = "striped red beach towel" + icon_state = "towel_striped_red" + worn_icon_state = "towel_striped_red" + +/obj/item/clothing/neck/towel/beach/striped_blue + name = "striped blue beach towel" + icon_state = "towel_striped_blue" + worn_icon_state = "towel_striped_blue" + +/obj/item/clothing/neck/towel/beach/ian + name = "ian motif beach towel" + icon_state = "towel_ian" + worn_icon_state = "towel_ian" + +/obj/item/clothing/neck/towel/beach/dolphin + name = "dolphin motif beach towel" + icon_state = "towel_dolphin" + worn_icon_state = "towel_dolphin" + +#undef TOWEL_WATER_ABSORBED +#undef TOWEL_WATER_SPREAD +#undef TOWEL_GRIME_ABSORBED +#undef TOWEL_GRIME_SPREAD +#undef TOWEL_CLEANED_TARGET diff --git a/code/modules/reagents/chemistry/reagents/drinks_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks_reagents.dm index 7d7f8aaee9a..532560a5619 100644 --- a/code/modules/reagents/chemistry/reagents/drinks_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks_reagents.dm @@ -1137,8 +1137,8 @@ var/drop_type = /obj/effect/decal/cleanable/reagent/drip var/obj/effect/decal/cleanable/reagent/drip/drop = locate() in T if(drop) - if(drop.amount < 5) - drop.amount++ + if(drop.cleanable_amount < 5) + drop.cleanable_amount++ var/image/I = image(drop.icon, drop.random_icon_states) I.icon += drop.basecolor drop.overlays |= I diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 6e933fb6719..353fd84d94e 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/species/drask/neck.dmi b/icons/mob/clothing/species/drask/neck.dmi index c5e9355f000..7f5965b7797 100644 Binary files a/icons/mob/clothing/species/drask/neck.dmi and b/icons/mob/clothing/species/drask/neck.dmi differ diff --git a/icons/mob/clothing/species/grey/neck.dmi b/icons/mob/clothing/species/grey/neck.dmi index 40cb532571d..05ff59458ba 100644 Binary files a/icons/mob/clothing/species/grey/neck.dmi and b/icons/mob/clothing/species/grey/neck.dmi differ diff --git a/icons/mob/clothing/species/kidan/neck.dmi b/icons/mob/clothing/species/kidan/neck.dmi index 64ff17b0efd..2dc2c093a00 100644 Binary files a/icons/mob/clothing/species/kidan/neck.dmi and b/icons/mob/clothing/species/kidan/neck.dmi differ diff --git a/icons/mob/clothing/species/skkulakin/neck.dmi b/icons/mob/clothing/species/skkulakin/neck.dmi index 0f69b98d914..17d4656ddaa 100644 Binary files a/icons/mob/clothing/species/skkulakin/neck.dmi and b/icons/mob/clothing/species/skkulakin/neck.dmi differ diff --git a/icons/mob/clothing/species/vox/neck.dmi b/icons/mob/clothing/species/vox/neck.dmi index a15c410f72e..4154d904d81 100644 Binary files a/icons/mob/clothing/species/vox/neck.dmi and b/icons/mob/clothing/species/vox/neck.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index b09cb0d0e43..0c09c835439 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index 4ff4dd33981..dd26b5cbd9d 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 7fbff6835e2..2bd8db2e2c4 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 9938e22f30e..dec43f2d147 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 9ba6d94247e..3de4c1c3b7e 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/paradise.dme b/paradise.dme index 753b92835ee..746fb250084 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2123,6 +2123,7 @@ #include "code\modules\clothing\neck\neck.dm" #include "code\modules\clothing\neck\necklace.dm" #include "code\modules\clothing\neck\scarfs.dm" +#include "code\modules\clothing\neck\towel.dm" #include "code\modules\clothing\patreon\hats.dm" #include "code\modules\clothing\patreon\patreon_glasses.dm" #include "code\modules\clothing\shoes\colour.dm"