From 0d8e223e90709f5460a5cd184f7c319a4ed4a847 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Tue, 5 May 2026 09:35:12 -0500 Subject: [PATCH] Adds some tier zero (penguin, plant) and a tier one (stoat) gene infusion (#95923) --- code/__DEFINES/DNA.dm | 1 - .../infuser_tier_one_entries.dm | 40 +++ .../infuser_tier_zero_entries.dm | 53 +++ .../dna_infuser/organ_sets/fish_organs.dm | 1 - .../dna_infuser/organ_sets/goliath_organs.dm | 1 - .../dna_infuser/organ_sets/rat_organs.dm | 4 +- .../dna_infuser/organ_sets/stoat_organs.dm | 303 ++++++++++++++++++ .../crates_lockers/closets/bodybag.dm | 8 +- code/modules/hydroponics/grown.dm | 1 + code/modules/hydroponics/growninedible.dm | 1 + code/modules/mob/living/living_defines.dm | 4 + code/modules/mob/living/living_say.dm | 8 +- code/modules/unit_tests/dna_infusion.dm | 5 +- icons/map_icons/items/_item.dmi | Bin 17757 -> 19598 bytes tgstation.dme | 1 + 15 files changed, 415 insertions(+), 16 deletions(-) create mode 100644 code/game/machinery/dna_infuser/organ_sets/stoat_organs.dm diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 718fbcd49f5..cf146f19572 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -31,7 +31,6 @@ #define MUTATION_SOURCE_SPELL "spell" ///From the heart eater component #define MUTATION_SOURCE_HEART_EATER "heart_eater" -#define MUTATION_SOURCE_RAT_HEART "rat_heart" #define MUTATION_SOURCE_CLOWN_CLUMSINESS "clown_clumsiness" #define MUTATION_SOURCE_CHANGELING "changeling" #define MUTATION_SOURCE_GHOST_ROLE "ghost_role" diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm index e69a78f132d..83ed8b3a02e 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm @@ -214,3 +214,43 @@ tier = DNA_MUTANT_TIER_ONE unreachable_effect = TRUE status_effect_type = /datum/status_effect/organ_set_bonus/fish + +/datum/infuser_entry/stoat + name = "Stoat" + infuse_mob_name = "stoat" + desc = "We looked at a stoat, and begin to admire its fearless nature, hunting animals much larger than itself head on. \ + This kind of action is what we need on the corporate ladder." + threshold_desc = "become fearless, dodging attacks from larger opponents" + qualities = list( + "a snout!", + "really tall", + "better senses, weaker organs", + "instinctively want to be alone", + "ferocious bites - especially when grappling", + "rodents and eggs look very tasty... but anything plant does not", + ) + input_obj_or_mob = list( + /mob/living/basic/stoat, + ) + output_organs = list( + /obj/item/organ/eyes/stoat, + /obj/item/organ/ears/stoat, + /obj/item/organ/heart/stoat, + /obj/item/organ/tongue/stoat, + /obj/item/organ/snout/stoat, + ) + infusion_desc = "ermine" + tier = DNA_MUTANT_TIER_ONE + status_effect_type = /datum/status_effect/organ_set_bonus/stoat + +/datum/infuser_entry/stoat/get_output_organs(mob/living/carbon/human/target, atom/movable/infused_from) + // eyes and ears are low priority, infuse them last + var/datum/status_effect/organ_set_bonus/stoat/organ_tracker = target.has_status_effect(__IMPLIED_TYPE__) + if(organ_tracker?.organs < 3) + return list( + /obj/item/organ/heart/stoat, + /obj/item/organ/tongue/stoat, + /obj/item/organ/snout/stoat, + ) + + return ..() diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm index e4d93a587f8..a00e561d589 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm @@ -110,3 +110,56 @@ ) infusion_desc = "domestic" tier = DNA_MUTANT_TIER_ZERO + +/datum/infuser_entry/penguin + name = "Penguin" + infuse_mob_name = "penguin" + desc = "Honestly, there wasn't much to gleam from a penguin's DNA, other than they walk funny." + threshold_desc = DNA_INFUSION_NO_THRESHOLD + qualities = list( + "you waddle when you walk", + ) + input_obj_or_mob = list( + /mob/living/basic/pet/penguin, + ) + output_organs = list( + /obj/item/organ/ears/penguin, + ) + infusion_desc = "waddly" + tier = DNA_MUTANT_TIER_ZERO + +/datum/infuser_entry/plants + name = "Plant" + infuse_mob_name = "plant hybrid" + desc = "Hydroponics research has long been interested in splicing human DNA into plant DNA, creating podpeople. \ + Many scientists didn't want to let those hippies get the leg up on them, so they attempted the opposite - to pretty uninteresting results." + threshold_desc = DNA_INFUSION_NO_THRESHOLD + qualities = list( + "gives you neat hair", + "not much else, honestly", + ) + input_obj_or_mob = list( + /obj/item/food/grown, + /obj/item/grown, + ) + output_organs = list( + /obj/item/organ/appendix/pod, + /obj/item/organ/brain/pod, + /obj/item/organ/ears/pod, + /obj/item/organ/eyes/pod, + /obj/item/organ/heart/pod, + /obj/item/organ/liver/pod, + /obj/item/organ/lungs/pod, + /obj/item/organ/pod_hair, + /obj/item/organ/stomach/pod, + /obj/item/organ/tongue/pod, + ) + infusion_desc = "botanical" + tier = DNA_MUTANT_TIER_ZERO + +/datum/infuser_entry/plants/get_output_organs(mob/living/carbon/human/target, atom/movable/infused_from) + // Prioritize pod hair since it's the only thing that matters here + if(!target.get_organ_by_type(/obj/item/organ/pod_hair)) + return list(/obj/item/organ/pod_hair) + + return ..() diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm index 2284e2afa18..78a32be3c6f 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm @@ -6,7 +6,6 @@ /// Currently liver, stomach, lungs and tail plus tongue #define FISH_INFUSION_ALL_ORGANS 4 -///bonus of the observing gondola: you can ignore environmental hazards /datum/status_effect/organ_set_bonus/fish id = "organ_set_bonus_fish" tick_interval = 1 SECONDS diff --git a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm index 8939fb64e0f..3a9a893d54d 100644 --- a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm @@ -3,7 +3,6 @@ #define GOLIATH_PUPIL_COLOR COLOR_RED #define GOLIATH_COLORS GOLIATH_ORGAN_COLOR + GOLIATH_SCLERA_COLOR + GOLIATH_PUPIL_COLOR -///bonus of the goliath: you can swim through space! /datum/status_effect/organ_set_bonus/goliath id = "organ_set_bonus_goliath" organs_needed = 4 diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm index 3b1e1b9f3bb..d9a0abbe76a 100644 --- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm @@ -62,6 +62,7 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = RAT_COLORS beat_noise = "a fast-paced high-pitched pit-pat" + organ_traits = list(TRAIT_DWARF) /obj/item/organ/heart/rat/Initialize(mapload) . = ..() @@ -74,8 +75,6 @@ if(!ishuman(receiver)) return var/mob/living/carbon/human/human_receiver = receiver - if(human_receiver.can_mutate()) - human_receiver.dna.add_mutation(/datum/mutation/dwarfism, MUTATION_SOURCE_RAT_HEART) //but 1.5 damage human_receiver.physiology?.damage_resistance -= 50 @@ -84,7 +83,6 @@ if(!ishuman(heartless)) return var/mob/living/carbon/human/human_heartless = heartless - human_heartless.dna.remove_mutation(/datum/mutation/dwarfism, MUTATION_SOURCE_RAT_HEART) human_heartless.physiology?.damage_resistance += 50 /// you occasionally squeak, and have some rat related verbal tics diff --git a/code/game/machinery/dna_infuser/organ_sets/stoat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/stoat_organs.dm new file mode 100644 index 00000000000..623f8607e9a --- /dev/null +++ b/code/game/machinery/dna_infuser/organ_sets/stoat_organs.dm @@ -0,0 +1,303 @@ +// Organ color - Sclera color - Pupil color +#define STOAT_COLORS COLOR_BROWNER_BROWN + COLOR_BLACK + COLOR_BLACK + +/datum/status_effect/organ_set_bonus/stoat + id = "organ_set_bonus_stoat" + tick_interval = 3 SECONDS + organs_needed = 4 + bonus_activate_text = span_notice("Stoat DNA is deeply infused with you! \ + Your instincts set in - you now feel fearless, as if you could take on any enemy, no matter the size difference.") + bonus_deactivate_text = span_notice("You are no longer majority stoat, \ + and you realize larger enemies are quite intimidating after all.") + bonus_traits = list(TRAIT_FEARLESS, TRAIT_NOFEAR_HOLDUPS) + COOLDOWN_DECLARE(big_attack_dodge_cd) + +/datum/status_effect/organ_set_bonus/stoat/enable_bonus(obj/item/organ/inserted_organ) + . = ..() + RegisterSignal(owner, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(dodge_bigger_attack)) + +/datum/status_effect/organ_set_bonus/stoat/disable_bonus(obj/item/organ/removed_organ) + . = ..() + UnregisterSignal(owner, COMSIG_LIVING_CHECK_BLOCK) + owner.clear_mood_event("stoat_enemy") + owner.clear_mood_event("stoat_friendly") + +/datum/status_effect/organ_set_bonus/stoat/on_remove() + . = ..() + UnregisterSignal(owner, COMSIG_LIVING_CHECK_BLOCK) + owner.clear_mood_event("stoat_enemy") + owner.clear_mood_event("stoat_friendly") + +/datum/status_effect/organ_set_bonus/stoat/proc/dodge_bigger_attack(datum/source, atom/movable/hit_by, damage, the_attack, attack_type, ...) + SIGNAL_HANDLER + + if(attack_type != UNARMED_ATTACK && attack_type != OVERWHELMING_ATTACK && attack_type != LEAP_ATTACK) + return NONE + if(!COOLDOWN_FINISHED(src, big_attack_dodge_cd)) + return NONE + if(isliving(hit_by)) + var/mob/living/attacker = hit_by + if(attacker.mob_size <= owner.mob_size) + return NONE + else if(!ismecha(hit_by)) + return NONE + + if(owner.incapacitated || owner.is_blind()) + return FAILED_BLOCK + + INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "spin") + owner.visible_message( + span_warning("[owner] instinctively dodges [the_attack] from [hit_by]!"), + span_warning("You instinctively dodge out of the way of [the_attack] from [hit_by]!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) + owner.add_movespeed_modifier(/datum/movespeed_modifier/stoat_dodge) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/stoat_dodge), 1 SECONDS) + COOLDOWN_START(src, big_attack_dodge_cd, 5 SECONDS) + playsound(owner, 'sound/items/weapons/punchmiss.ogg', 25, TRUE, -1) + return SUCCESSFUL_BLOCK + +/datum/status_effect/organ_set_bonus/stoat/proc/is_dangerous_mob(mob/living/target) + if(target.stat >= UNCONSCIOUS) + return FALSE + if(istype(target, /mob/living/basic/stoat)) + return owner.gender == MALE && target.gender == MALE // other stoats are ENEMIES if we are both males + for(var/obj/item/weapon in target.held_items) + if(weapon.force > 15 || isgun(weapon)) + return TRUE + if(target.mob_size > owner.mob_size) + return TRUE + if(target.mob_size == owner.mob_size) + return !ishuman(target) // assuming same-sized animals are enemies, same-sized humans are friends + return FALSE + +/datum/status_effect/organ_set_bonus/stoat/proc/is_friendly_mob(mob/living/target) + if(target.stat >= UNCONSCIOUS) + return FALSE + if(istype(target, /mob/living/basic/stoat)) + return owner.gender != MALE || target.gender != MALE + if(ishuman(target)) + return TRUE + return FALSE + +/datum/status_effect/organ_set_bonus/stoat/tick(seconds_between_ticks) + . = ..() + if(!bonus_active) + return + var/nearby_friends = 0 + var/nearby_enemies = 0 + for(var/obj/vehicle/sealed/mecha/mech in oview(owner, 5)) + nearby_enemies++ + for(var/mob/living/nearby in oview(owner, 5)) + if(is_dangerous_mob(nearby)) + nearby_enemies++ + else if(is_friendly_mob(nearby)) + nearby_friends++ + + if(nearby_enemies) + switch(nearby_enemies) + if(1) + owner.add_mood_event("stoat_enemy", /datum/mood_event/stoat/enemies_nearby/one) + if(2 to 4) + owner.add_mood_event("stoat_enemy", /datum/mood_event/stoat/enemies_nearby/multiple) + if(4 to INFINITY) + owner.add_mood_event("stoat_enemy", /datum/mood_event/stoat/enemies_nearby/crowd) + owner.clear_mood_event("stoat_friendly") + + else + switch(nearby_friends) + if(0) + owner.add_mood_event("stoat_friendly", /datum/mood_event/stoat/friendlies_nearby/one) + if(2 to 4) + owner.add_mood_event("stoat_friendly", /datum/mood_event/stoat/friendlies_nearby/multiple) + if(4 to INFINITY) + owner.add_mood_event("stoat_friendly", /datum/mood_event/stoat/friendlies_nearby/crowd) + owner.clear_mood_event("stoat_enemy") + + +/obj/item/organ/heart/stoat + name = "mutated stoat-heart" + desc = "Stoat DNA infused into what was once a normal heart." + icon = 'icons/map_icons/items/_item.dmi' + icon_state = "/obj/item/organ/heart/stoat" + post_init_icon_state = "heart" + greyscale_config = /datum/greyscale_config/mutant_organ + greyscale_colors = STOAT_COLORS + beat_noise = "a fast-paced high-pitched pit-pat" + maxHealth = parent_type::maxHealth * 0.8 // weaker heart + /// Tracks height of the mob on add + var/mob_base_height = HUMAN_HEIGHT_MEDIUM + +/obj/item/organ/heart/stoat/Initialize(mapload) + . = ..() + AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/stoat) + AddElement(/datum/element/update_icon_blocker) + +/obj/item/organ/heart/stoat/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + if(!ishuman(organ_owner)) + return + var/mob/living/carbon/human/human_owner = organ_owner + mob_base_height = human_owner.get_base_mob_height() + human_owner.set_mob_height(HUMAN_HEIGHT_TALLER, update_dna = FALSE) + +/obj/item/organ/heart/stoat/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + if(!ishuman(organ_owner)) + return + var/mob/living/carbon/human/human_owner = organ_owner + human_owner.set_mob_height(mob_base_height, update_dna = FALSE) + +/obj/item/organ/tongue/stoat + name = "mutated stoat-tongue" + desc = "Stoat DNA infused into what was once a normal tongue." + say_mod = "chirps" + modifies_speech = TRUE + icon = 'icons/map_icons/items/_item.dmi' + icon_state = "/obj/item/organ/tongue/rat" + post_init_icon_state = "tongue" + greyscale_config = /datum/greyscale_config/mutant_organ + greyscale_colors = STOAT_COLORS + liked_foodtypes = MEAT | RAW | GORE | BUGS + disliked_foodtypes = FRUIT | VEGETABLES + taste_sensitivity = 12 + organ_traits = list(TRAIT_FERAL_BITER) + +/obj/item/organ/tongue/stoat/Initialize(mapload) + . = ..() + AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/stoat) + +/obj/item/organ/tongue/stoat/on_life(seconds_per_tick) + . = ..() + if(prob(1)) + playsound(owner, 'sound/mobs/non-humanoids/stoat/stoat_sounds.ogg', 100) + +/obj/item/organ/tongue/stoat/on_mob_insert(mob/living/carbon/receiver, special, movement_flags) + . = ..() + RegisterSignals(receiver, COMSIG_LIVING_GET_PERCEIVED_FOOD_QUALITY, PROC_REF(get_perceived_food_quality)) + if(ishuman(receiver)) + var/mob/living/carbon/human/human_receiver = receiver + human_receiver.physiology.hunger_mod *= 2 + +/obj/item/organ/tongue/stoat/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + UnregisterSignal(organ_owner, COMSIG_LIVING_GET_PERCEIVED_FOOD_QUALITY) + if(ishuman(organ_owner)) + var/mob/living/carbon/human/human_remover = organ_owner + human_remover.physiology.hunger_mod /= 2 + +/obj/item/organ/tongue/stoat/on_bodypart_insert(obj/item/bodypart/limb) + . = ..() + limb.unarmed_damage_low += 7 + limb.unarmed_damage_high += 7 + limb.unarmed_effectiveness += 20 + limb.unarmed_pummeling_bonus += 0.75 + limb.unarmed_attack_effect = ATTACK_EFFECT_BITE + limb.unarmed_sharpness = SHARP_POINTY + +/obj/item/organ/tongue/stoat/on_bodypart_remove(obj/item/bodypart/limb) + . = ..() + limb.unarmed_damage_low -= 7 + limb.unarmed_damage_high -= 7 + limb.unarmed_effectiveness -= 20 + limb.unarmed_pummeling_bonus -= 0.75 + limb.unarmed_attack_effect = initial(limb.unarmed_attack_effect) + limb.unarmed_sharpness = initial(limb.unarmed_sharpness) + +/obj/item/organ/tongue/stoat/proc/get_perceived_food_quality(mob/living/carbon/consumer, obj/item/food/consumed_food, list/extra_quality) + SIGNAL_HANDLER + + if(organ_flags & ORGAN_FAILING) + return + if(istype(consumed_food, /obj/item/food/deadmouse) || istype(consumed_food, /obj/item/food/egg)) + extra_quality += LIKED_FOOD_QUALITY_CHANGE + +/obj/item/organ/eyes/stoat + name = "mutated stoat-eyes" + desc = "Stoat DNA infused into what was once a normal pair of eyes." + icon = 'icons/map_icons/items/_item.dmi' + icon_state = "/obj/item/organ/eyes/stoat" + post_init_icon_state = "eyes" + greyscale_config = /datum/greyscale_config/mutant_organ + greyscale_colors = STOAT_COLORS + eye_color_left = COLOR_BLACK + eye_color_right = COLOR_BLACK + lighting_cutoff = LIGHTING_CUTOFF_LOW + maxHealth = parent_type::maxHealth * 0.8 // weaker eyes + penlight_message = "shine green" + +/obj/item/organ/eyes/stoat/Initialize(mapload) + . = ..() + AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/stoat) + AddElement(/datum/element/noticable_organ, "%PRONOUN_Their eyes are black orbs.", zone) + +/obj/item/organ/ears/stoat + name = "mutated stoat-ears" + desc = "Stoat DNA infused into what was once a normal pair of ears." + icon = 'icons/map_icons/items/_item.dmi' + icon_state = "/obj/item/organ/ears/stoat" + post_init_icon_state = "ears" + greyscale_config = /datum/greyscale_config/mutant_organ + greyscale_colors = STOAT_COLORS + damage_multiplier = 1.2 + maxHealth = parent_type::maxHealth * 0.8 // weaker ears + +/obj/item/organ/ears/stoat/Initialize(mapload) + . = ..() + AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/stoat) + AddElement(/datum/element/noticable_organ, "%PRONOUN_Their ears are furred, and twitch occasionally.", zone) + +/obj/item/organ/ears/stoat/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + organ_owner.eavesdrop_range += 2 + +/obj/item/organ/ears/stoat/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + organ_owner.eavesdrop_range -= 2 + +/obj/item/organ/snout/stoat + name = "stoat snout" + +/obj/item/organ/snout/stoat/Initialize(mapload) + . = ..() + AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/stoat) + +/datum/mood_event/stoat + +/datum/mood_event/stoat/enemies_nearby + event_flags = MOOD_EVENT_FEAR + +/datum/mood_event/stoat/enemies_nearby/one + description = "My instincts say there's something dangerous nearby, better be careful." + mood_change = -1 + +/datum/mood_event/stoat/enemies_nearby/multiple + description = "My instincts say there potential danger nearby, better be on edge." + mood_change = -3 + +/datum/mood_event/stoat/enemies_nearby/crowd + description = "My instincts say there are a lot of dangerous things nearby, I need to get out of here!" + mood_change = -5 + +/datum/mood_event/stoat/alone + description = "There is no one nearby, my instincts are at rest. I feel at peace." + mood_change = 1 + +/datum/mood_event/stoat/friendlies_nearby + event_flags = MOOD_EVENT_FEAR + +/datum/mood_event/stoat/friendlies_nearby/one + description = "There is only one friend nearby, my instincts are at rest." + +/datum/mood_event/stoat/friendlies_nearby/multiple + description = "My instincts say there are too many people nearby, I feel a little on edge." + mood_change = -1 + +/datum/mood_event/stoat/friendlies_nearby/crowd + description = "My instincts say there are too many people nearby, I need to get out of here!" + mood_change = -3 + +/datum/movespeed_modifier/stoat_dodge + multiplicative_slowdown = 1 + +#undef STOAT_COLORS diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 4a4830a960f..b911705b010 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -159,11 +159,9 @@ content.forceMove(folding_bodybag) if(isliving(content)) to_chat(content, span_userdanger("You're suddenly forced into a tiny, compressed space!")) - if(iscarbon(content)) - var/mob/living/carbon/mob = content - if (mob.dna?.get_mutation(/datum/mutation/dwarfism)) - max_weight_of_contents = max(WEIGHT_CLASS_NORMAL, max_weight_of_contents) - continue + if(HAS_TRAIT(content, TRAIT_DWARF)) + max_weight_of_contents = max(WEIGHT_CLASS_NORMAL, max_weight_of_contents) + continue if(!isitem(content)) max_weight_of_contents = max(WEIGHT_CLASS_BULKY, max_weight_of_contents) continue diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index f5f58af7bbf..fd84b1a0fd3 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -82,6 +82,7 @@ reagents.clear_reagents() seed.prepare_result(src) transform *= TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5 //Makes the resulting produce's sprite larger or smaller based on potency! + ADD_TRAIT(src, TRAIT_VALID_DNA_INFUSION, INNATE_TRAIT) /obj/item/food/grown/Destroy() if(isatom(seed)) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 82c69a8ef09..0502a500ef2 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -43,6 +43,7 @@ seed.prepare_result(src) transform *= TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5 add_juice() + ADD_TRAIT(src, TRAIT_VALID_DNA_INFUSION, INNATE_TRAIT) /obj/item/grown/Destroy() if(isatom(seed)) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index cfc7924aa3c..69edd7a3728 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -262,3 +262,7 @@ /// Lazy assoc list of currently applied fishing difficulty modifiers keyed to their source var/list/fishing_difficulty_mods_by_source + + /// When less than or equal to this distance (but not adjacent), this mob can hear parts of distant whispers, but not the entire message. + /// When greater than this distance, this mob cannot hear anything of a whisper. + var/eavesdrop_range = EAVESDROP_EXTRA_RANGE diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 6926d6abe99..56f0988c936 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -291,13 +291,13 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( var/message = "" // if someone is whispering we make an extra type of message that is obfuscated for people out of range - // Less than or equal to 0 means normal hearing. More than 0 and less than or equal to EAVESDROP_EXTRA_RANGE means - // partial hearing. More than EAVESDROP_EXTRA_RANGE means no hearing. Exception for GOOD_HEARING trait + // Less than or equal to 0 means normal hearing. More than 0 and less than or equal to eavesdrop_range means + // partial hearing. More than eavesdrop_range means no hearing. Exception for GOOD_HEARING trait var/dist = get_dist(speaker, src) - message_range - if(dist > 0 && dist <= EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING)) + if(dist > 0 && dist <= eavesdrop_range && !HAS_TRAIT(src, TRAIT_GOOD_HEARING)) raw_message = stars(raw_message) var/speaker_name = span_name("[message_mods[MODE_SPEAKER_NAME_OVERRIDE] || speaker]") - if(message_range != INFINITY && dist > EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING)) + if(message_range != INFINITY && dist > eavesdrop_range && !HAS_TRAIT(src, TRAIT_GOOD_HEARING)) // Too far away and don't have good hearing, you can't hear anything if(is_blind() || HAS_TRAIT(speaker, TRAIT_INVISIBLE_MAN)) // Can't see them speak either return FALSE diff --git a/code/modules/unit_tests/dna_infusion.dm b/code/modules/unit_tests/dna_infusion.dm index 4abe0e16e54..a8d8b2ea4ec 100644 --- a/code/modules/unit_tests/dna_infusion.dm +++ b/code/modules/unit_tests/dna_infusion.dm @@ -3,9 +3,12 @@ /datum/unit_test/valid_dna_infusion/Run() for(var/datum/infuser_entry/infuser_entry as anything in assoc_to_values(GLOB.infuser_entries)) - for(var/input_type in infuser_entry.input_obj_or_mob) + for(var/datum/input_type as anything in infuser_entry.input_obj_or_mob) if(ispath(input_type, /mob/living)) continue + if(input_type == input_type::abstract_type) + input_type = pick(subtypesof(input_type)) + var/atom/movable/movable = allocate(input_type) if(!HAS_TRAIT(movable, TRAIT_VALID_DNA_INFUSION)) //TEST_FAIL() doesn't early return the unit test so we can keep checking. diff --git a/icons/map_icons/items/_item.dmi b/icons/map_icons/items/_item.dmi index 9988f49c6fa8c9ae8a2c8b47cc7fdc11177ccd41..16535bf205f18cd3bcfbcb8729f1647a93487f68 100644 GIT binary patch literal 19598 zcmZ^~byytFx-A^sJ-7`X+%+(`y9Ot?2M7*>6I=#&C%C%=3GRc05Inet3_j@PxA#8Z z{m!}f{?YwZt$wS!x}JWjR;_n+w1%2I7CIUFn>TN;6cuE&-n@YWydG~*kzWx4&g!-| zZ{V%`bo4!Btlcd?+q-($yL@`{#wWKnWBSu77v?BrTpRJMwc=;pl1T)SG|mYtNsG#= zgOy@QX~)JwVq0uL;SoBEB(8+k#X}0MeOA|6K)~J2T}$`NbB7o}c4z(1GorD(HSM*4k13RR?nB6~a(QumwrI8~UV3re%!7uq z=(kys@Obz(#I2RO`sY2~QODghcRU<>@jTJ^p~IVa{Pbx@^@?K1%?_3cdx53YxH`)( z3V-Wq^};ekMr2?2D7D{nFX3es-<8^K>+~@x$_YRV5?i__I;NdY?65KgCXrt|%n34% z5%6%P^Zs?;MqK57DB${xA3o_YpdJutaih#N{|zzzJM#5t&F|ob$L4t7Y^MB|Ro;+8 zvl3TbHM}y|j}(B;C+hh-b-FHAxs|w>2>auAD9urA$d6d-WN(uZ9%9qwneGvzcf)A( zjV~ziGM&0@qwG>a zWXAYan@*YyHCumbrj7{NYva>6+{u{YCZ_W&J-OT+4U9Kk(v-9sDpCn4`p{tt_{#&Fm%o1V=_m)c+w3347 zDgNDKU1#xkhxs_(rN#&qz(`T}Y3#QaRh5|9X>+McF(U2e0jtdBvm9)ll8^x+tH>)+QZoM}o^sQ|* zd}wjdl`vY;Yy8>EVrOK0Y+A4#f$khV=n>Fr26{rnc$jcB0ofSNd8PPW;($FViel!h) zSx*T4;rT)zfX@sV4@TPd-AnsWQB|c>6V%qM{aq#*81@!y)$cZF0%2tP*I5k zt1Bs?E8Y_&-St5r`QAV32S}?gDQsL0_LMju! z;@PFO0@M>2yho))SP9%cq_p)}2J&&6I&o4EonQMnx!8-I-Uj%*Zyud|PBLv9t$;QL z^kv+A>shDkZNJ?*n@XrF!O1+f_HQ8*m(M%EiGP3Wv$3&-7v#Ws4*B&2LqR|Pc8Tqq z0$ETOS9SbZgSVlOREUdGZTxo^Fp0W&{mbribW*!as37XG?{v{KzbCT#H2nh55 zL$61@F@qtS)DrtU%E0!`z;0#W$emX`i2^tF=@tdPg& zJ_?e&Yd&s)(L}1{1&oNAIUVBP!8=l72MrP!@aQsp zArtT3!VAw8tHe=9*})2No`n&(;M-ZM{! zaR;*Ny1Tt=X-!Lir)vJh)3JKf{1pdMP(u(sGzO?D4z;OZC_05Hq?(Tfe*LG&OV4V=T?U*^j*KzU9gH zmikuYrme+mx1RK=%CVBRx6-nAlv{|V*=^f-^IT}qlDZ(g$c7eyyLSn5j5i=L>hp^Q z4k?dJ4sAq7xxuWk$~K7c=wT<>sqcsRk&MRd`A^H z<^?ENTQgP#9zSy0t7E|KCc>xs3qVuws?oY#o=@x6^;HX_mbNjLe@`F=!OzzOX^c(0 z&)ou}K{Ir{tAgH3c+MB!K6}+C4mqFWp~sj6CP2iCRgtJh3GbuK-da6^#7EEnXbrWL zuRirZa-0WA1bVxYp8eq%KHs!GIKV+n$E@RcK1|iM_%kaocSv0zr&pMv9uUxDeNp*d zM>5hj?_J=v+4Zl;YxZUc(P%CKu{@IsiBj|!{EvMUHK|X5#sqSlX?Re<6^gzebb%WD zh19)&vzNr5n}T}re?(q*!j*_8+~NiKfuZW?+|QYPeY@A5S(9d{$4?-W{zIJCL2!pf zy|;UQgmFNB7mM>ve&hch_bJeK!d7ZPa?)>|0wdWT^2g*V)2|q+I7XlbJRRf)UCO%p=h@&FA#_G5;vk�cIq^o|;P8?1&B_vVMFTwDg_AS*V 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%0A4+?LEjR+}z?8}#c- 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 DM6?W! literal 17757 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�?6-E=4MST-N;&rQCi~kFM-^J+~ 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 diff --git a/tgstation.dme b/tgstation.dme index 38fd2c07cab..a8a3e2551e2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2397,6 +2397,7 @@ #include "code\game\machinery\dna_infuser\organ_sets\gondola_organs.dm" #include "code\game\machinery\dna_infuser\organ_sets\rat_organs.dm" #include "code\game\machinery\dna_infuser\organ_sets\roach_organs.dm" +#include "code\game\machinery\dna_infuser\organ_sets\stoat_organs.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_electronics.dm" #include "code\game\machinery\doors\brigdoors.dm"