From 4ee00c11ae732502808ad035a92d5cdcafaef587 Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Sun, 14 Jun 2026 18:58:13 -0500 Subject: [PATCH 1/6] Temp prosthetic fix --- .../surgery/bodyparts/robot_bodyparts.dm | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 997582c6aab9..f20468b2e134 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -45,6 +45,10 @@ disabling_threshold_percentage = 1 bodypart_flags = BODYPART_UNHUSKABLE +/obj/item/bodypart/arm/left/robot/generate_icon_key() + . = ..() + . += icon_static + /obj/item/bodypart/arm/right/robot name = "cyborg right arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." @@ -80,6 +84,10 @@ damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT) bodypart_flags = BODYPART_UNHUSKABLE +/obj/item/bodypart/arm/right/robot/generate_icon_key() + . = ..() + . += icon_static + /obj/item/bodypart/leg/left/robot name = "cyborg left leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." @@ -133,6 +141,10 @@ return to_chat(owner, span_danger("As your [plaintext_zone] unexpectedly malfunctions, it causes you to fall to the ground!")) +/obj/item/bodypart/leg/left/robot/generate_icon_key() + . = ..() + . += icon_static + /obj/item/bodypart/leg/right/robot name = "cyborg right leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." @@ -186,6 +198,10 @@ return to_chat(owner, span_danger("As your [plaintext_zone] unexpectedly malfunctions, it causes you to fall to the ground!")) +/obj/item/bodypart/leg/right/robot/generate_icon_key() + . = ..() + . += icon_static + /obj/item/bodypart/chest/robot name = "cyborg torso" desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell." @@ -362,6 +378,10 @@ cell?.forceMove(drop_loc) return ..() +/obj/item/bodypart/chest/robot/generate_icon_key() + . = ..() + . += icon_static + /obj/item/bodypart/head/robot name = "cyborg head" desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals." @@ -481,6 +501,10 @@ flash2?.forceMove(drop_loc) return ..() +/obj/item/bodypart/head/robot/generate_icon_key() + . = ..() + . += icon_static + // Prosthetics - Cheap, mediocre, and worse than organic limbs // Actively make you less healthy by being on your body, contributing a whopping 250% to overall health at only 20 max health // They also suck to punch with. From 9653b505a4e59341211e9fde1a419186493712f1 Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Sun, 14 Jun 2026 22:09:27 -0500 Subject: [PATCH 2/6] Jukebox fix --- code/datums/components/jukebox.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/components/jukebox.dm b/code/datums/components/jukebox.dm index b147a2faf72a..3486fa72078c 100644 --- a/code/datums/components/jukebox.dm +++ b/code/datums/components/jukebox.dm @@ -112,8 +112,8 @@ config_songs["[default_track.song_name] (Default)"] = default_track for(var/datum/track/track_subtype as anything in subtypesof(/datum/track/preset)) - var/datum/track/new_preset = new(track_subtype) - config_songs["[new_preset.song_name] (Lag Free)"] = new_preset + var/datum/track/new_preset = new track_subtype() + config_songs["[new_preset.song_name] (Preset)"] = new_preset // returns a copy so it can mutate if desired. return config_songs.Copy() From 7ce228c8c28baa40d7ffbd827c87d264721e638d Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Sun, 14 Jun 2026 22:45:41 -0500 Subject: [PATCH 3/6] Rendering fixes --- .../mob/living/carbon/carbon_update_icons.dm | 4 ++++ .../surgery/bodyparts/head_hair_and_lips.dm | 4 ++-- code/modules/surgery/bodyparts/helpers.dm | 4 ++-- .../surgery/bodyparts/robot_bodyparts.dm | 20 +++++++++++++------ 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index 331e9ebe71bd..e8409bfa4000 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -523,6 +523,10 @@ . += draw_color if(is_invisible) . += "invisible" + if(is_emissive) + . += "emissive" + if(blocks_emissive != EMISSIVE_BLOCK_NONE) + . += "emissive_blocker" for(var/datum/bodypart_overlay/overlay as anything in bodypart_overlays) if(!overlay.can_draw_on_bodypart(src)) continue diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm index 36cea77c818f..840998adef9e 100644 --- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm +++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm @@ -19,9 +19,9 @@ if(overwrite_eyes || isnull(initial(peepers.eye_color_right))) peepers.eye_color_right = target.eye_color_right - if(HAS_TRAIT(target, TRAIT_USES_SKINTONES)) + if(HAS_TRAIT(target, TRAIT_USES_SKINTONES) || HAS_TRAIT(src, TRAIT_USES_SKINTONES)) skin_tone = target.skin_tone - else if(HAS_TRAIT(target, TRAIT_MUTANT_COLORS)) + else if(HAS_TRAIT(target, TRAIT_MUTANT_COLORS) || HAS_TRAIT(src, TRAIT_MUTANT_COLORS)) skin_tone = "" if(target_species.fixed_mut_color) species_color = target_species.fixed_mut_color diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 5555e12bf232..43983866ab7f 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -53,8 +53,8 @@ /// Replaces a single limb and deletes the old one if there was one /mob/living/carbon/proc/del_and_replace_bodypart(obj/item/bodypart/new_limb, special) - var/obj/item/bodypart/old_limb = get_bodypart(new_limb.body_zone) - if(old_limb) + var/obj/item/bodypart/old_limb = get_bodypart(new_limb.body_zone, include_stumps = TRUE) + if(!isnull(old_limb)) old_limb.drop_limb(special = TRUE) qdel(old_limb) new_limb.try_attach_limb(src, special = special) diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index f20468b2e134..293ffc0e64ae 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -47,7 +47,8 @@ /obj/item/bodypart/arm/left/robot/generate_icon_key() . = ..() - . += icon_static + if(limb_id == BODYPART_ID_ROBOTIC) + . += should_draw_greyscale ? icon_greyscale : icon_static /obj/item/bodypart/arm/right/robot name = "cyborg right arm" @@ -86,7 +87,8 @@ /obj/item/bodypart/arm/right/robot/generate_icon_key() . = ..() - . += icon_static + if(limb_id == BODYPART_ID_ROBOTIC) + . += should_draw_greyscale ? icon_greyscale : icon_static /obj/item/bodypart/leg/left/robot name = "cyborg left leg" @@ -143,7 +145,8 @@ /obj/item/bodypart/leg/left/robot/generate_icon_key() . = ..() - . += icon_static + if(limb_id == BODYPART_ID_ROBOTIC || limb_id == BODYPART_ID_DIGITIGRADE) + . += should_draw_greyscale ? icon_greyscale : icon_static /obj/item/bodypart/leg/right/robot name = "cyborg right leg" @@ -200,7 +203,8 @@ /obj/item/bodypart/leg/right/robot/generate_icon_key() . = ..() - . += icon_static + if(limb_id == BODYPART_ID_ROBOTIC || limb_id == BODYPART_ID_DIGITIGRADE) + . += should_draw_greyscale ? icon_greyscale : icon_static /obj/item/bodypart/chest/robot name = "cyborg torso" @@ -380,7 +384,10 @@ /obj/item/bodypart/chest/robot/generate_icon_key() . = ..() - . += icon_static + // When we reskin cybernetic limbs, we solely change their icon, nothing else + // So we need to include the relevant icon in the cache key + if(limb_id == BODYPART_ID_ROBOTIC) + . += should_draw_greyscale ? icon_greyscale : icon_static /obj/item/bodypart/head/robot name = "cyborg head" @@ -503,7 +510,8 @@ /obj/item/bodypart/head/robot/generate_icon_key() . = ..() - . += icon_static + if(limb_id == BODYPART_ID_ROBOTIC) + . += should_draw_greyscale ? icon_greyscale : icon_static // Prosthetics - Cheap, mediocre, and worse than organic limbs // Actively make you less healthy by being on your body, contributing a whopping 250% to overall health at only 20 max health From d24eb3d450265e69126d16b026853a24f55a9708 Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Sun, 14 Jun 2026 22:47:05 -0500 Subject: [PATCH 4/6] Test --- code/modules/unit_tests/screenshot_humanoids.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/unit_tests/screenshot_humanoids.dm b/code/modules/unit_tests/screenshot_humanoids.dm index 854c65795809..36c451e0063b 100644 --- a/code/modules/unit_tests/screenshot_humanoids.dm +++ b/code/modules/unit_tests/screenshot_humanoids.dm @@ -4,8 +4,6 @@ /datum/unit_test/screenshot_humanoids/Run() var/list/testable_species = subtypesof(/datum/species) - testable_species -= /datum/species/android // melbert todo : removing this for now REEE - // Test lizards as their own thing so we can get more coverage on their features var/mob/living/carbon/human/lizard = allocate(/mob/living/carbon/human/dummy/consistent) lizard.dna.features["mcolor"] = "#099" From 4e7830a4481e11983fa8bd7fcad7ced3932cacda Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Sun, 14 Jun 2026 23:00:40 -0500 Subject: [PATCH 5/6] Addictions --- .../reagents/chemistry/reagents/drinks/alcohol_reagents.dm | 2 +- code/modules/reagents/chemistry/reagents/drug_reagents.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index 23e043124b74..1a7ddcd9da3e 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -52,7 +52,7 @@ if(isnull(pain_modifier)) pain_modifier = min(12 / (boozepwr * 0.2), 1) // the stronger the drink, the less total of the drink is needed to reach addiction - LAZYSET(addiction_types, /datum/addiction/alcohol, max(50, round(150 - boozepwr, 5))) + LAZYSET(addiction_types, /datum/addiction/alcohol, max(50, round(200 - boozepwr, 5))) return ..() /datum/reagent/consumable/ethanol/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index a82eba4ecb61..fee158b3dc12 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -85,7 +85,7 @@ metabolization_rate = 0.125 * REAGENTS_METABOLISM ph = 8 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/nicotine = 10) + addiction_types = list(/datum/addiction/nicotine = 20) //Nicotine is used as a pesticide IRL. /datum/reagent/drug/nicotine/on_hydroponics_apply(obj/machinery/hydroponics/mytray, mob/user) From 84e28f3cc86723d61977a9de1ecc3e8f727739eb Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Mon, 15 Jun 2026 02:15:53 -0500 Subject: [PATCH 6/6] This one too --- code/datums/status_effects/food_effects.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/datums/status_effects/food_effects.dm b/code/datums/status_effects/food_effects.dm index 625a3fcc8762..813acfbe4179 100644 --- a/code/datums/status_effects/food_effects.dm +++ b/code/datums/status_effects/food_effects.dm @@ -10,12 +10,11 @@ /datum/status_effect/food/on_creation(mob/living/new_owner, timeout_mod = 1, strength = 1) src.strength = strength - //Generate alert when not specified - if(alert_type == /atom/movable/screen/alert/status_effect) - alert_type = "/atom/movable/screen/alert/status_effect/food/buff_[strength]" if(isnum(timeout_mod)) duration *= timeout_mod . = ..() + if(istype(linked_alert, /atom/movable/screen/alert/status_effect/food)) + linked_alert.icon_state = "food_buff_[strength]" /atom/movable/screen/alert/status_effect/food name = "Hand-crafted meal"