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 9988f49c6fa..16535bf205f 100644 Binary files a/icons/map_icons/items/_item.dmi and b/icons/map_icons/items/_item.dmi differ 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"