From b80f8f1127ef3bb93d68aa60f82288ab70c4bd0b Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Sat, 3 Jan 2026 15:11:12 +0100 Subject: [PATCH] Cain & Abel no longer forces dual-wielding and instead requires an empty offhand (#94661) ## About The Pull Request Instead of forcing the player to dual wield it, Cain & Abel can now be held with one hand, although doing so prohibits you from using it to attack, throw/spin daggers or send out wisps. ## Why It's Good For The Game Forcing dual wielding on a small pocketable item is a bit weird and feels bad in gameplay, as it essentially prohibits you from being able to use any healing items unless you keep an empty pocket, in which case quick storage on all other items will default to it which is rather impractical. Requiring an empty offhand essentially keeps the wielding requirement without UX issues coming from inhand usage swapping modes or inventory jank. ## Changelog :cl: balance: Cain & Abel no longer forces dual-wielding and instead requires an empty offhand /:cl: --- .../lavaland/cain_and_abel/_cain_and_abel.dm | 40 ++++++++++++++++-- .../cain_and_abel/dagger_abilities.dm | 6 ++- .../lavaland/cain_and_abel/dagger_throw.dm | 7 ++- .../inhands/equipment/kitchen_lefthand.dmi | Bin 4211 -> 4546 bytes .../inhands/equipment/kitchen_righthand.dmi | Bin 3820 -> 4781 bytes 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm b/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm index 6faf813094b..e8c60b310a0 100644 --- a/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm +++ b/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm @@ -6,7 +6,7 @@ desc = "I cry I pray mon Dieu." icon = 'icons/obj/mining_zones/artefacts.dmi' lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' //same sprite as lefthand + righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' icon_state = "cain_and_abel" inhand_icon_state = "cain_and_abel" attack_verb_continuous = list("attacks", "saws", "slices", "tears", "lacerates", "rips", "dices", "cuts") @@ -36,12 +36,13 @@ var/throw_mode = THROW_MODE_CRYSTALS /// Flames we have up! var/list/current_wisps = list() + /// Have we thrown the second dagger yet? + var/dagger_thrown = FALSE /// Cooldown till we can throw blades again COOLDOWN_DECLARE(throw_cooldown) /obj/item/cain_and_abel/Initialize(mapload) . = ..() - AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_unwielded = force, force_wielded = force) if (length(animation_steps)) return @@ -64,11 +65,10 @@ source.RemoveElement(/datum/element/relay_attackers) set_combo(new_value = 0, user = source) - UnregisterSignal(source, list(COMSIG_ATOM_WAS_ATTACKED)) + UnregisterSignal(source, list(COMSIG_ATOM_WAS_ATTACKED, COMSIG_MOB_UPDATE_HELD_ITEMS)) /obj/item/cain_and_abel/equipped(mob/user, slot) . = ..() - if(!(slot & ITEM_SLOT_HANDS)) unset_user(user) return @@ -77,6 +77,7 @@ user.AddElement(/datum/element/relay_attackers) RegisterSignal(user, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + RegisterSignal(user, COMSIG_MOB_UPDATE_HELD_ITEMS, PROC_REF(on_updated_held_items)) /obj/item/cain_and_abel/proc/on_attacked(datum/source, atom/attacker, attack_flags) SIGNAL_HANDLER @@ -86,6 +87,10 @@ if(get_dist(interacting_with, user) > 9 || interacting_with.z != user.z) return NONE + if(!check_wield(user)) + user.balloon_alert(user, "offhand busy!") + return ITEM_INTERACT_BLOCKING + if(!length(current_wisps)) user.balloon_alert(user, "no wisps!") return ITEM_INTERACT_BLOCKING @@ -94,6 +99,14 @@ addtimer(CALLBACK(src, PROC_REF(fire_wisp), user, interacting_with), index * 0.15 SECONDS) return ITEM_INTERACT_SUCCESS +/obj/item/cain_and_abel/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + . = ..() + if (.) + return + if(!check_wield(user)) + user.balloon_alert(user, "offhand busy!") + return TRUE + /obj/item/cain_and_abel/attack(mob/living/target, mob/living/carbon/human/user) if(!istype(target) || target.mob_size < MOB_SIZE_LARGE || target.stat == DEAD) attack_speed = CLICK_CD_MELEE @@ -129,6 +142,13 @@ combo_count = new_value +/obj/item/cain_and_abel/proc/on_updated_held_items(mob/living/source) + SIGNAL_HANDLER + update_dagger_icon() + +/obj/item/cain_and_abel/proc/update_dagger_icon() + inhand_icon_state = "[src::inhand_icon_state][(dagger_thrown || !check_wield(loc)) ? "_thrown" : ""]" + /obj/item/cain_and_abel/proc/add_wisp(mob/living/user) var/obj/effect/overlay/blood_wisp/new_wisp = new(src) current_wisps += new_wisp @@ -181,6 +201,18 @@ animate(wisp_to_remove, alpha = 0, time = 0.2 SECONDS) QDEL_IN(wisp_to_remove, 0.2 SECONDS) +/obj/item/cain_and_abel/proc/check_wield(mob/living/user) + if (!istype(user)) + return TRUE + var/active_item = (src == user.get_active_held_item()) + var/obj/item/other_held = active_item ? user.get_inactive_held_item() : user.get_active_held_item() + if (!isnull(other_held)) + return FALSE + var/obj/item/bodypart/hand = active_item ? user.get_inactive_hand() : user.get_active_hand() + if (!hand || hand.bodypart_disabled) + return FALSE + return TRUE + /// Frame data for cain & abel wisps so we don't have to make list monstrocities /datum/abel_wisp_frame var/x = 0 diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm index 6a7cbc0d441..f550db4c5a5 100644 --- a/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm @@ -10,12 +10,16 @@ /datum/action/cooldown/dagger_swing/Activate(atom/target_atom) var/mob/living/living_owner = owner - var/obj/item/cain_and_abel = target + var/obj/item/cain_and_abel/cain_and_abel = target if(!living_owner.is_holding(cain_and_abel)) owner.balloon_alert(owner, "must be held") return FALSE + if(!cain_and_abel.check_wield(owner)) + owner.balloon_alert(owner, "offhand busy!") + return TRUE + living_owner.apply_status_effect(/datum/status_effect/dagger_swinging) var/static/list/possible_sounds = list( diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm index 529390c26ee..8574ea59110 100644 --- a/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm @@ -11,6 +11,10 @@ user.balloon_alert(user, "unable!") return + if(!check_wield(user)) + user.balloon_alert(user, "offhand busy!") + return + if(get_dist(target, user) > 9) user.balloon_alert(user, "too far away!") return @@ -52,7 +56,8 @@ set_dagger_icon(thrown = FALSE) /obj/item/cain_and_abel/proc/set_dagger_icon(thrown = FALSE) - inhand_icon_state = "[src::inhand_icon_state][thrown ? "_thrown" : ""]" + dagger_thrown = thrown + update_dagger_icon() update_inhand_icon() /obj/item/cain_and_abel/proc/reset_dagger_icon(datum/source) diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi index 09d3d6b8a9192b81c9bdf00dff1ca0e1d67fff8e..75dd7e5a5f095b96106df302d912f8c43042046a 100644 GIT binary patch literal 4546 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 literal 4211 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 aLT++rABK1lq$^0=oi;YG&@a(@5b{sGYW1Z6 diff --git a/icons/mob/inhands/equipment/kitchen_righthand.dmi b/icons/mob/inhands/equipment/kitchen_righthand.dmi index 35e0e2ea2240a268fdbe5dabb11d9ff9e628f1ba..782aba88096f32179b2772668ac5ddc6f528181f 100644 GIT binary patch literal 4781 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 t=)gnaCsZ$frP