From 767934966009a76523c111d9bf94e40b2eed7ba3 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 12:41:25 +1100 Subject: [PATCH 1/7] Vomit and mud can now be tracked around the floor. --- code/_helpers/global_lists.dm | 11 +++- .../effects/decals/Cleanable/humans.dm | 26 +++------ .../objects/effects/decals/Cleanable/misc.dm | 13 ++++- code/game/objects/items/__item.dm | 45 ++++++++-------- code/game/objects/items/_item_materials.dm | 4 +- .../objects/items/weapons/swords_axes_etc.dm | 4 +- code/game/turfs/flooring/_flooring.dm | 6 +++ code/game/turfs/flooring/flooring_mud.dm | 9 ++++ code/game/turfs/floors/_floor.dm | 8 +++ code/game/turfs/turf.dm | 3 ++ code/modules/detectivework/tools/uvlight.dm | 7 +-- code/modules/mob/living/human/human.dm | 34 ------------ code/modules/mob/living/life.dm | 5 +- code/modules/mob/living/living.dm | 54 +++++++++++++++++-- maps/away/mining/mining-signal.dmm | 4 +- maps/away/smugglers/smugglers.dmm | 2 +- maps/away/unishi/unishi-2.dmm | 4 +- .../crashed_pod/crashed_pod.dmm | 2 +- .../deserted_lab/deserted_lab.dmm | 2 +- .../exoplanet_ruins/playablecolony/colony.dmm | 2 +- .../spider_nest/spider_nest.dmm | 4 +- maps/tradeship/tradeship-1.dmm | 2 +- 22 files changed, 150 insertions(+), 101 deletions(-) diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 84463762e677..7b98b5f58af5 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -107,4 +107,13 @@ var/global/list/bodytype_species_pairs = list() // A list of bodytypes -> specie . = global.playable_species /proc/get_bodytype_species_pairs() build_species_lists() - . = global.bodytype_species_pairs \ No newline at end of file + . = global.bodytype_species_pairs + +// Used to avoid constantly generating new lists during movement. +var/global/list/all_stance_limbs = list( + ORGAN_CATEGORY_STANCE, + ORGAN_CATEGORY_STANCE_ROOT +) +var/global/list/child_stance_limbs = list( + ORGAN_CATEGORY_STANCE +) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 3cc2dd4bf5e7..cbd3f166ddbb 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -91,26 +91,12 @@ /obj/effect/decal/cleanable/blood/Crossed(atom/movable/AM) if(!isliving(AM) || amount < 1) return - - var/mob/living/M = AM - var/obj/item/organ/external/l_foot = GET_EXTERNAL_ORGAN(M, BP_L_FOOT) - var/obj/item/organ/external/r_foot = GET_EXTERNAL_ORGAN(M, BP_R_FOOT) - var/hasfeet = l_foot && r_foot - - var/transferred_data = blood_data ? blood_data[pick(blood_data)] : null - var/obj/item/clothing/shoes/shoes = M.get_equipped_item(slot_shoes_str) - if(istype(shoes) && !M.buckled)//Adding blood to shoes - shoes.add_coating(chemical, amount, transferred_data) - else if (hasfeet)//Or feet - if(l_foot) - l_foot.add_coating(chemical, amount, transferred_data) - if(r_foot) - r_foot.add_coating(chemical, amount, transferred_data) - else if (M.buckled && istype(M.buckled, /obj/structure/bed/chair/wheelchair)) - var/obj/structure/bed/chair/wheelchair/W = M.buckled - W.bloodiness = 4 - - M.update_equipment_overlay(slot_shoes_str) + var/mob/living/walker = AM + if(istype(walker.buckled, /obj/structure/bed/chair/wheelchair)) + var/obj/structure/bed/chair/wheelchair/wheelchair = walker.buckled + wheelchair.bloodiness = 4 + else + walker.add_walking_contaminant(chemical, amount, (blood_data ? blood_data[pick(blood_data)] : null)) amount-- /obj/effect/decal/cleanable/blood/proc/dry() diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 2a22a171886e..6fe6ea7441a4 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -90,9 +90,20 @@ if(prob(75)) set_rotation(pick(90, 180, 270)) +/obj/effect/decal/cleanable/vomit/mapped/Initialize(ml, _age) + . = ..() + add_to_reagents(/decl/material/liquid/acid/stomach, rand(3,5)) + add_to_reagents(/decl/material/liquid/nutriment, rand(5,8)) + /obj/effect/decal/cleanable/vomit/on_update_icon() . = ..() - color = reagents.get_color() + color = reagents?.get_color() + +/obj/effect/decal/cleanable/vomit/Crossed(atom/movable/AM) + . = ..() + if(!QDELETED(src) && reagents?.total_volume >= 1 && isliving(AM)) + var/mob/living/walker = AM + walker.add_walking_contaminant(reagents, rand(2, 3)) /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index b02237a6b2f3..20c732782fa0 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -12,7 +12,8 @@ /// Set to false to skip state checking and never draw an icon on the mob (except when held) var/draw_on_mob_when_equipped = TRUE - var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite + /// this saves our blood splatter/coating overlay, which will be processed not to go over the edges of the sprite. + var/image/coating_overlay var/randpixel = 6 var/material_health_multiplier = 0.2 var/hitsound @@ -245,7 +246,7 @@ /obj/item/PopulateClone(obj/item/clone) clone = ..() clone.contaminated = contaminated - clone.blood_overlay = image(blood_overlay) + clone.coating_overlay = image(coating_overlay) clone.current_health = current_health //#TODO: once item damage in, check health! @@ -790,7 +791,7 @@ if(was_bloodied && !fluorescent) fluorescent = FLUORESCENT_GLOWS blood_color = COLOR_LUMINOL - blood_overlay.color = COLOR_LUMINOL + coating_overlay.color = COLOR_LUMINOL update_icon() /obj/item/add_blood(mob/living/M, amount = 2, list/blood_data) @@ -814,21 +815,21 @@ LAZYSET(blood_DNA, unique_enzymes, blood_type) return TRUE -var/global/list/_blood_overlay_cache = list() -var/global/icon/_item_blood_mask = icon('icons/effects/blood.dmi', "itemblood") -/obj/item/proc/generate_blood_overlay(force = FALSE) - if(blood_overlay && !force) +var/global/list/_coating_overlay_cache = list() +var/global/icon/_item_coating_mask = icon('icons/effects/blood.dmi', "itemblood") +/obj/item/proc/generate_coating_overlay(force = FALSE) + if(coating_overlay && !force) return var/cache_key = "[icon]-[icon_state]" - if(global._blood_overlay_cache[cache_key]) - blood_overlay = global._blood_overlay_cache[cache_key] + if(global._coating_overlay_cache[cache_key]) + coating_overlay = global._coating_overlay_cache[cache_key] return var/icon/I = new /icon(icon, icon_state) I.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) // Sets the icon RGB channel to pure white. - I.Blend(global._item_blood_mask, ICON_MULTIPLY) // Masks the blood overlay against the generated mask. - blood_overlay = image(I) - blood_overlay.appearance_flags |= NO_CLIENT_COLOR|RESET_COLOR - global._blood_overlay_cache[cache_key] = blood_overlay + I.Blend(global._item_coating_mask, ICON_MULTIPLY) // Masks the coating overlay against the generated mask. + coating_overlay = image(I) + coating_overlay.appearance_flags |= NO_CLIENT_COLOR|RESET_COLOR + global._coating_overlay_cache[cache_key] = coating_overlay /obj/item/proc/showoff(mob/user) for(var/mob/M in view(user)) @@ -1018,13 +1019,15 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. /obj/item/proc/add_coating(reagent_type, amount, data) if(!coating) - coating = new/datum/reagents(10, src) - coating.add_reagent(reagent_type, amount, data) - - if(!blood_overlay) - generate_blood_overlay() - blood_overlay.color = coating.get_color() - + coating = new /datum/reagents(10, src) + if(ispath(reagent_type)) + coating.add_reagent(reagent_type, amount, data) + else if(istype(reagent_type, /datum/reagents)) + var/datum/reagents/source = reagent_type + source.trans_to_holder(coating, amount) + if(!coating_overlay) + generate_coating_overlay() + coating_overlay.color = coating.get_color() update_icon() /obj/item/proc/remove_coating(amount) @@ -1037,7 +1040,7 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. /obj/item/clean(clean_forensics=TRUE) . = ..() QDEL_NULL(coating) - blood_overlay = null + coating_overlay = null if(clean_forensics) var/datum/extension/forensic_evidence/forensics = get_extension(src, /datum/extension/forensic_evidence) if(forensics) diff --git a/code/game/objects/items/_item_materials.dm b/code/game/objects/items/_item_materials.dm index 261a8c5f5d0d..ecf48b7029e8 100644 --- a/code/game/objects/items/_item_materials.dm +++ b/code/game/objects/items/_item_materials.dm @@ -5,8 +5,8 @@ if((material_alteration & MAT_FLAG_ALTERATION_COLOR) && material) alpha = 100 + material.opacity * 255 color = get_color() // avoiding set_color() here as that will set it on paint_color - if(blood_overlay) - add_overlay(blood_overlay) + if(coating_overlay) + add_overlay(coating_overlay) if(global.contamination_overlay && contaminated) add_overlay(global.contamination_overlay) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 124bfb02526c..25ecca6f8563 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -66,8 +66,8 @@ update_held_icon() /obj/item/telebaton/on_update_icon() - if(length(blood_DNA)) - generate_blood_overlay(TRUE) // Force recheck. + if(coating?.total_volume || blood_DNA) + generate_coating_overlay(TRUE) // Force recheck. . = ..() if(on) icon = 'icons/obj/items/weapon/telebaton_extended.dmi' diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index a02efe3cb841..8150d0abd34b 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -350,3 +350,9 @@ var/global/list/flooring_cache = list() /decl/flooring/proc/handle_turf_digging(turf/floor/target) return TRUE + +/decl/flooring/proc/turf_crossed(atom/movable/crosser) + return + +/decl/flooring/proc/can_show_footsteps(turf/target) + return TRUE diff --git a/code/game/turfs/flooring/flooring_mud.dm b/code/game/turfs/flooring/flooring_mud.dm index fd4866144b90..2b5fa2c5063d 100644 --- a/code/game/turfs/flooring/flooring_mud.dm +++ b/code/game/turfs/flooring/flooring_mud.dm @@ -19,6 +19,15 @@ return return ..() +/decl/flooring/mud/turf_crossed(atom/movable/crosser) + if(!isliving(crosser)) + return + var/mob/living/walker = crosser + walker.add_walking_contaminant(/decl/material/solid/soil, rand(2,3)) + +/decl/flooring/mud/can_show_footsteps(turf/target) + return FALSE // So we don't end up covered in a million footsteps that we provided. + /decl/flooring/dry_mud name = "dry mud" desc = "This was once mud, but forgot to keep hydrated." diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index 8a5562d03ad1..e8ede4d119e8 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -297,3 +297,11 @@ /turf/floor/get_plant_growth_rate() var/decl/flooring/flooring = get_topmost_flooring() return flooring ? flooring.growth_value : ..() + +/turf/floor/Crossed(atom/movable/AM) + var/decl/flooring/flooring = get_topmost_flooring() + flooring?.turf_crossed(AM) + return ..() + +/turf/floor/can_show_footsteps() + return ..() && get_topmost_flooring()?.can_show_footsteps(src) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index bdd356e53223..cf4d6f67920d 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -822,6 +822,9 @@ if(IS_HOE(held) && can_dig_farm(held.material?.hardness)) LAZYDISTINCTADD(., /decl/interaction_handler/dig/farm) +/turf/proc/can_show_footsteps() + return simulated + /decl/interaction_handler/show_turf_contents name = "Show Turf Contents" expected_user_type = /mob diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm index 1b5c3a86b71f..90152aa387fa 100644 --- a/code/modules/detectivework/tools/uvlight.dm +++ b/code/modules/detectivework/tools/uvlight.dm @@ -47,6 +47,7 @@ add_overlay(emissive_overlay(icon, "[icon_state]-on")) z_flags |= ZMM_MANGLE_PLANES +// TODO: does this even work with SSoverlays? /obj/item/uv_light/proc/clear_last_scan() if(scanned.len) for(var/atom/O in scanned) @@ -62,7 +63,7 @@ stored_alpha.Cut() if(reset_objects.len) for(var/obj/item/I in reset_objects) - I.overlays -= I.blood_overlay + I.overlays -= I.coating_overlay if(I.fluorescent == FLUORESCENT_GLOWING) I.fluorescent = FLUORESCENT_GLOWS reset_objects.Cut() @@ -86,6 +87,6 @@ A.alpha = use_alpha if(istype(A, /obj/item)) var/obj/item/O = A - if(O.was_bloodied && !(O.blood_overlay in O.overlays)) - O.overlays |= O.blood_overlay + if(O.was_bloodied && !(O.coating_overlay in O.overlays)) + O.overlays |= O.coating_overlay reset_objects |= O \ No newline at end of file diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 884babdc9164..38e6f1d6c10e 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -1071,40 +1071,6 @@ var/datum/appearance_descriptor/age = LAZYACCESS(bodytype.appearance_descriptors, "age") LAZYSET(appearance_descriptors, "age", (age ? age.sanitize_value(val) : 30)) -/mob/living/human/HandleBloodTrail(turf/T, old_loc) - // Tracking blood - var/obj/item/source - var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) - if(istype(shoes)) - shoes.handle_movement(src, MOVING_QUICKLY(src)) - if(shoes.coating && shoes.coating.total_volume > 1) - source = shoes - else - for(var/foot_tag in list(BP_L_FOOT, BP_R_FOOT)) - var/obj/item/organ/external/stomper = GET_EXTERNAL_ORGAN(src, foot_tag) - if(stomper && stomper.coating && stomper.coating.total_volume > 1) - source = stomper - if(!source) - species.handle_trail(src, T, old_loc) - return - - var/list/bloodDNA - var/bloodcolor - var/list/blood_data = REAGENT_DATA(source.coating, /decl/material/liquid/blood) - if(blood_data) - bloodDNA = list(blood_data[DATA_BLOOD_DNA] = blood_data[DATA_BLOOD_TYPE]) - else - bloodDNA = list() - bloodcolor = source.coating.get_color() - source.remove_coating(1) - update_equipment_overlay(slot_shoes_str) - - if(species.get_move_trail(src)) - T.AddTracks(species.get_move_trail(src),bloodDNA, dir, 0, bloodcolor) // Coming - if(isturf(old_loc)) - var/turf/old_turf = old_loc - old_turf.AddTracks(species.get_move_trail(src), bloodDNA, 0, dir, bloodcolor) // Going - /mob/living/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) if((. = ..()) && !surgical_removal) shock_stage += 20 diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index fd868a66a6ce..446bbe39a059 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -585,8 +585,7 @@ if(!root_bodytype) return - var/static/list/all_stance_limbs = list(ORGAN_CATEGORY_STANCE, ORGAN_CATEGORY_STANCE_ROOT) - var/expected_limbs_for_bodytype = root_bodytype.get_expected_organ_count_for_categories(all_stance_limbs) + var/expected_limbs_for_bodytype = root_bodytype.get_expected_organ_count_for_categories(global.all_stance_limbs) if(expected_limbs_for_bodytype <= 0) return // we don't care about stance for whatever reason. @@ -598,7 +597,7 @@ var/found_limbs = 0 var/had_limb_pain = FALSE - for(var/obj/item/organ/external/limb in get_organs_by_categories(all_stance_limbs)) + for(var/obj/item/organ/external/limb in get_organs_by_categories(global.all_stance_limbs)) found_limbs++ var/add_stance_damage = 0 if(limb.is_malfunctioning()) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fbb42a1db1a2..7685c69fda5d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1552,7 +1552,7 @@ default behaviour is: /mob/living/OnSimulatedTurfEntered(turf/T, old_loc) T.add_dirt(0.5) - HandleBloodTrail(T, old_loc) + handle_walking_tracks(T, old_loc) if(current_posture.prone) return @@ -1583,8 +1583,46 @@ default behaviour is: step(src, dir) sleep(1) -/mob/living/proc/HandleBloodTrail(turf/T, old_loc) - return +/mob/living/proc/handle_walking_tracks(turf/T, old_loc) + + if(!T.can_show_footsteps()) + return + + // Tracking blood or other contaminants + var/obj/item/source + var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) + if(istype(shoes)) + shoes.handle_movement(src, MOVING_QUICKLY(src)) + if(shoes.coating && shoes.coating.total_volume > 1) + source = shoes + else + for(var/obj/item/organ/external/stomper in get_organs_by_categories(global.child_stance_limbs)) + if(stomper.coating?.total_volume > 1) + source = stomper + break + + var/decl/species/my_species = get_species() + if(!source) + my_species?.handle_trail(src, T, old_loc) + return + + var/list/bloodDNA + var/bloodcolor + var/list/blood_data = REAGENT_DATA(source.coating, /decl/material/liquid/blood) + if(blood_data) + bloodDNA = list(blood_data[DATA_BLOOD_DNA] = blood_data[DATA_BLOOD_TYPE]) + else + bloodDNA = list() + bloodcolor = source.coating.get_color() + source.remove_coating(1) + update_equipment_overlay(slot_shoes_str) + + var/use_move_trail = my_species?.get_move_trail(src) + if(use_move_trail) + T.AddTracks(use_move_trail, bloodDNA, dir, 0, bloodcolor) // Coming + if(isturf(old_loc)) + var/turf/old_turf = old_loc + old_turf.AddTracks(use_move_trail, bloodDNA, 0, dir, bloodcolor) // Going /mob/living/proc/handle_general_grooming(user, obj/item/grooming/tool) if(tool.grooming_flags & (GROOMABLE_BRUSH|GROOMABLE_COMB)) @@ -1944,3 +1982,13 @@ default behaviour is: /mob/living/proc/get_age() . = LAZYACCESS(appearance_descriptors, "age") || 30 + +/mob/living/proc/add_walking_contaminant(material_type, amount, data) + var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) + if(istype(shoes)) + if(!buckled) + shoes.add_coating(material_type, amount, data) + else + for(var/obj/item/organ/external/limb in get_organs_by_categories(global.child_stance_limbs)) + limb.add_coating(material_type, amount, data) + update_equipment_overlay(slot_shoes_str) diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 68863f236667..867c49b56143 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -1561,7 +1561,7 @@ /area/outpost/abandoned) "fs" = ( /obj/effect/decal/cleanable/dirt/visible, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /turf/floor/tiled/airless, /area/outpost/abandoned) "ft" = ( @@ -2428,7 +2428,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 4 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/dirt/visible, diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index 911447bf6122..1881db19743e 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -854,7 +854,7 @@ /turf/floor, /area/smugglers/dorms) "cp" = ( -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/random/medical/lite, /turf/floor/plating/airless, /area/smugglers/dorms) diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index 19aad746cee2..f31f2097fe4d 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -2283,7 +2283,7 @@ /turf/space, /area/unishi/smresearch) "go" = ( -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/item/defibrillator, /turf/floor/tiled/techfloor, /area/unishi/smresearch) @@ -2397,7 +2397,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index b944f2498005..c7ef24bae56b 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -119,7 +119,7 @@ "ap" = ( /obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/dirt/visible, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/effect/decal/cleanable/filth, /obj/structure/curtain/open/shower/engineering, /obj/structure/hygiene/toilet{ diff --git a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm index f88a3a7043aa..1552d243610f 100644 --- a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm +++ b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm @@ -184,7 +184,7 @@ /turf/floor/tiled/white, /area/template_noop) "aM" = ( -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/item/chems/glass/paint/random, /obj/structure/closet/medical_wall/filled{ pixel_y = 32 diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 6d33bc94adb7..c210e95884c6 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -4708,7 +4708,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /turf/floor/tiled/white/monotile, /area/map_template/colony/bathroom) "jl" = ( diff --git a/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm b/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm index dd4f13ac1092..c3c28c3bdc98 100644 --- a/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm +++ b/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm @@ -83,7 +83,7 @@ /obj/effect/decal/cleanable/blood, /obj/item/shard, /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /turf/floor/tiled/techfloor, /area/template_noop) "q" = ( @@ -242,7 +242,7 @@ /obj/effect/spider/stickyweb, /obj/random/voidsuit, /obj/random/loot, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/structure/extinguisher_cabinet{ pixel_x = -29; dir = 4 diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index 8c98a303b76a..8a068ace688f 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -3161,7 +3161,7 @@ dir = 1; pixel_y = -21 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/structure/hygiene/toilet{ dir = 1 }, From 456fe957bcf9a5e22300c82cb3ebf8074725bbe3 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 5 Jun 2024 17:13:10 -0400 Subject: [PATCH 2/7] Allow handmade goods to be used to make moulds --- code/modules/crafting/handmade_items.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/crafting/handmade_items.dm b/code/modules/crafting/handmade_items.dm index 1135a26cc8bd..a04fc7eb13f3 100644 --- a/code/modules/crafting/handmade_items.dm +++ b/code/modules/crafting/handmade_items.dm @@ -12,6 +12,9 @@ if((. = ..())) update_icon() +/obj/item/chems/glass/handmade/get_mould_difficulty() + return SKILL_NONE + /obj/item/chems/glass/handmade/teapot name = "teapot" desc = "A handmade, slightly lumpy teapot." From a3acdd5350f92e4a476dc5e6b561b948e7d26bf9 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 5 Jun 2024 17:09:06 -0400 Subject: [PATCH 3/7] Fix fingerprints infinitely duplicating and lagging the server --- .../detectivework/evidence/_evidence_type.dm | 13 +++++++------ code/modules/detectivework/evidence/fingerprints.dm | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/modules/detectivework/evidence/_evidence_type.dm b/code/modules/detectivework/evidence/_evidence_type.dm index 631f8e4c1488..3606e7c553fb 100644 --- a/code/modules/detectivework/evidence/_evidence_type.dm +++ b/code/modules/detectivework/evidence/_evidence_type.dm @@ -4,17 +4,18 @@ var/max_entries = 10 //will hold that many entries, removing oldest when overflown var/list/data var/remove_on_transfer //if it should be removed when picked up by forensic samplers - var/spot_skill = SKILL_EXPERT // at what Forensics skill level someone can see it on examine. Set to null, can never see it + var/spot_skill = SKILL_EXPERT // at what Forensics skill level someone can see it on examine. Set to null, can never see it //subtypes can implement any merging if needed before calling parent /datum/forensics/proc/add_data(newdata) if(!newdata) return - if(unique && (newdata in data)) - return - LAZYADD(data, newdata) + if(unique) + LAZYDISTINCTADD(data, newdata) + else + LAZYADD(data, newdata) if(length(data) > max_entries) - data.Cut(1,2) + data.len = max_entries /datum/forensics/proc/add_from_atom(atom/A) @@ -28,7 +29,7 @@ for(var/D in data) . += "
  • [D]" return jointext(., "
    ") - + /datum/forensics/proc/can_spot(mob/detective, atom/location) . = FALSE if(spot_skill && detective.skill_check(SKILL_FORENSICS,spot_skill)) diff --git a/code/modules/detectivework/evidence/fingerprints.dm b/code/modules/detectivework/evidence/fingerprints.dm index 290bccd19c48..0fad8bbb784c 100644 --- a/code/modules/detectivework/evidence/fingerprints.dm +++ b/code/modules/detectivework/evidence/fingerprints.dm @@ -17,6 +17,7 @@ continue for(var/datum/fingerprint/F in data) if(F.merge(newprint)) + newdata -= newprint continue ..() From 8be553419f302977b75f38e72c011f759060a71d Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 7 Jan 2025 00:50:48 +0000 Subject: [PATCH 4/7] Automatic changelog generation [ci skip] --- html/changelog.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index e3ca34984821..357f4dcea1ff 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -98,14 +98,6 @@

    Penelope Haze updated:

  • Crayons are now slowly used up while writing on paper, at a rate of one charge per 25 characters. (Crayons have a default of 30 charges.)
  • Added new furniture to the Shaded Hills inn.
  • - -

    05 November 2024

    -

    Neerti updated:

    -
      -
    • Mining drill braces are now crafted from steel sheets directly.
    • -
    • Microlasers added to mining drills no longer multiply ore out of the ground, but make the drill mine faster, proportionally increasing the energy usage.
    • -
    • Capacitors added to mining drills are less powerful.
    • -
    From e00cd6f6c016cc8eb598ea922356bc1b301585c3 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 7 Jan 2025 18:14:07 +1100 Subject: [PATCH 5/7] Automatic changelog generation for PR #4695 [ci skip] --- html/changelogs/AutoChangeLog-pr-4695.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4695.yml diff --git a/html/changelogs/AutoChangeLog-pr-4695.yml b/html/changelogs/AutoChangeLog-pr-4695.yml new file mode 100644 index 000000000000..84dde3ff37c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4695.yml @@ -0,0 +1,4 @@ +author: MistakeNot4892 +changes: + - {tweak: Mud and blood can now leave footprints.} +delete-after: true From 14624fef08c3aff95b9a61d17cccb22190a088a6 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 19:20:28 +1100 Subject: [PATCH 6/7] Adding Discord link to README.MD --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ff562f2857bf..eb52ede5614b 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ | Code | [https://github.com/PyrelightSS13/Pyrelight](https://github.com/PyrelightSS13/Pyrelight) | | Issues | [https://github.com/PyrelightSS13/Pyrelight/issues](https://github.com/PyrelightSS13/Pyrelight/issues) | | Upstream Issues | [https://github.com/NebulaSS13/Nebula/issues](https://github.com/NebulaSS13/Nebula/issues) | -| Discord | Currently private, sorry! | +| Discord | [https://discord.gg/BqXq6Mkys5](https://discord.gg/BqXq6Mkys5) | | Nebula Discord | [https://discord.gg/DYGXkN2S](https://discord.gg/DYGXkN2S) | This is the codebase for Pyrelight, a middle-fantasy total conversion project for Space Station 13, derived from Nebula SS13. From 2b87100f52d5b964ad09d92105289c4a7d3c7fec Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 20:12:45 +1100 Subject: [PATCH 7/7] Prevented MC restarts from spamming Discord. --- code/controllers/master.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 7db377082bde..f5f59fe940ca 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -220,12 +220,17 @@ var/global/datum/controller/master/Master = new CRASH("Attempted to set invalid runlevel: [new_runlevel]") // Starts the mc, and sticks around to restart it if the loop ever ends. +var/global/_announced_start = FALSE /datum/controller/master/proc/StartProcessing(delay) set waitfor = 0 if(delay) sleep(delay) report_progress("Master starting processing") - SSwebhooks.send(WEBHOOK_ROUNDPREP, list("map" = station_name(), "url" = get_world_url())) + + if(!global._announced_start) // Only announce roundstart once. + SSwebhooks.send(WEBHOOK_ROUNDPREP, list("map" = station_name(), "url" = get_world_url())) + global._announced_start = TRUE + var/rtn = Loop() if (rtn > 0 || processing < 0) return //this was suppose to happen.