From 6a75ebc943a69db9ae02fb922f1fdedbcab5b919 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 18 Mar 2023 11:13:17 +0100 Subject: [PATCH] [MIRROR] Player-controlled Regal Rats now lick or scratch based on their combat mode [MDB IGNORE] (#19941) * Player-controlled Regal Rats now lick or scratch based on their combat mode (#74040) ## About The Pull Request This updates Regal Rats to now check for a user's combat mode when determining whether to lick or scratch a living target (Lick = combat off, and Scratch = combat on). It also Closes #68621. Additionally, it allows for player movement during the licking interaction to properly cancel that action. Previously, it would attempt a lick, the player would cancel it, and then the player would attack their target instead (this was due to an oversight in the code). Edit: It now also prevents NPC Regal rats from licking entirely, and fixes their logic so that they move on to a new target after completing a kill. ## Why It's Good For The Game It allows players to control what their Regal rat does according to their combat mode, which matches the behavior for other player-controlled creatures (such as humans). Plus, this allows Regal rats control over when to harm living creatures, making them much less vulnerable than they were before. Edit: As for NPC Regal rats, it allows them to be a bit more dangerous, since they'll now only attack creatures that are alive. Moreover, removing the ability to lick from NPCs helps avoid the strange scenario where players could belong to a faction which is led by an NPC. (How can one serve a King that lacks a sentient mind? Spacemen aren't ready for that type of philosophical dilemma.) ## Changelog :cl: fix: Player-controlled Regal Rats now lick or claw based on their combat mode. fix: NPC Regal rats now properly claw at enemies, moving on to new targets after completing kills. /:cl: --------- Co-authored-by: san7890 * Player-controlled Regal Rats now lick or scratch based on their combat mode --------- Co-authored-by: Antonio Tosti <5588048+atosti@users.noreply.github.com> Co-authored-by: san7890 --- .../living/simple_animal/hostile/regalrat.dm | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index 735371f6621..a16ab9fbc2a 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -99,7 +99,8 @@ /mob/living/simple_animal/hostile/regalrat/CanAttack(atom/the_target) if(isliving(the_target)) var/mob/living/living_target = the_target - return !living_target.faction_check_mob(src, exact_match = TRUE) + if (living_target.stat != DEAD) + return !living_target.faction_check_mob(src, exact_match = TRUE) return ..() @@ -126,27 +127,19 @@ #define REGALRAT_INTERACTION "regalrat" /mob/living/simple_animal/hostile/regalrat/AttackingTarget() - if (DOING_INTERACTION(src, REGALRAT_INTERACTION)) - return - if (QDELETED(target)) + if (DOING_INTERACTION(src, REGALRAT_INTERACTION) || QDELETED(target)) return if(istype(target, /obj/machinery/door/airlock) && !opening_airlock) pry_door(target) return - - if (target.reagents && target.is_injectable(src, allowmobs = TRUE) && !istype(target, /obj/item/food/cheese)) + if (src.mind && !src.combat_mode && target.reagents && target.is_injectable(src, allowmobs = TRUE) && !istype(target, /obj/item/food/cheese)) src.visible_message(span_warning("[src] starts licking [target] passionately!"),span_notice("You start licking [target]...")) if (do_after(src, 2 SECONDS, target, interaction_key = REGALRAT_INTERACTION)) target.reagents.add_reagent(/datum/reagent/rat_spit,rand(1,3),no_react = TRUE) to_chat(src, span_notice("You finish licking [target].")) - return + return else SEND_SIGNAL(target, COMSIG_RAT_INTERACT, src) - if(QDELETED(target)) - return - - if (DOING_INTERACTION(src, REGALRAT_INTERACTION)) // check again in case we started interacting - return return ..() #undef REGALRAT_INTERACTION