From 1c460c954de5cd2c747321c3e79dce87e8facb39 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 11 Oct 2025 05:21:25 -0500 Subject: [PATCH 01/13] some swing combat bullshit --- .../dcs/signals_mob/signals_mob_living.dm | 3 ++ modular_darkpack/modules/combat/code/swing.dm | 40 ++++++++++++++++++ .../modules/combat/icons/swing.dmi | Bin 0 -> 9998 bytes .../{deprecated => combat}/sounds/swing.ogg | Bin tgstation.dme | 1 + 5 files changed, 44 insertions(+) create mode 100644 modular_darkpack/modules/combat/code/swing.dm create mode 100644 modular_darkpack/modules/combat/icons/swing.dmi rename modular_darkpack/modules/{deprecated => combat}/sounds/swing.ogg (100%) diff --git a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm index b759312eac0d..fd0b8bf00e3d 100644 --- a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm @@ -1 +1,4 @@ +///from base of /mob/living/proc/melee_swing() +#define COMSIG_LIVING_MELEE_SWING "mob_melee_swing" + #define COMSIG_LIVING_JUMP_PREP_TOGGLE "living_jump_prep_toggle" diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm new file mode 100644 index 000000000000..80bc0074c4f9 --- /dev/null +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -0,0 +1,40 @@ +/mob/living/proc/melee_swing(visual_effect = /obj/effect/temp_visual/dir_setting/swing_effect) + changeNext_move(CLICK_CD_RAPID) + new visual_effect(get_turf(src), dir) + playsound(loc, 'modular_darkpack/modules/combat/sounds/swing.ogg', 50, TRUE) + var/atom/hit_target + var/turf/center_turf = get_step(src, dir) + var/turf/left_turf = get_step(center_turf, turn(dir, -90)) + var/turf/right_turf = get_step(center_turf, turn(dir, 90)) + + + for(var/turf/swung_turf in list(center_turf, left_turf, right_turf)) + hit_target = locate(/mob/living) + if(hit_target) + break + if(!hit_target) + for(var/obj/swung_object in center_turf) + if(swung_object.obj_flags & CAN_BE_HIT) + hit_target = swung_object + break + + // Originally this was in front of searching for turfs but SURELY you would want this after you get a target. Right? + SEND_SIGNAL(src, COMSIG_LIVING_MELEE_SWING, hit_target, center_turf, left_turf, right_turf) + + if(hit_target) + changeNext_move(CLICK_CD_MELEE) + return hit_target + +/obj/effect/temp_visual/dir_setting/swing_effect + icon = 'modular_darkpack/modules/combat/icons/swing.dmi' + icon_state = "swing1" + pixel_w = -32 + pixel_z = -32 + duration = 0.3 SECONDS + +/obj/effect/temp_visual/dir_setting/claw_effect + icon = 'modular_darkpack/modules/combat/icons/swing.dmi' + icon_state = "claw1" + pixel_w = -32 + pixel_z = -32 + duration = 0.3 SECONDS diff --git a/modular_darkpack/modules/combat/icons/swing.dmi b/modular_darkpack/modules/combat/icons/swing.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fabcdd2c54d1eb13462ecb41118cd30afce34fe5 GIT binary patch literal 9998 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 Date: Sat, 11 Oct 2025 05:38:40 -0500 Subject: [PATCH 02/13] yea --- code/_onclick/click.dm | 15 +++++++++++++++ modular_darkpack/modules/combat/code/swing.dm | 5 +++++ .../game_preferences/darkpack_swing_combat.tsx | 10 ++++++++++ 3 files changed, 30 insertions(+) create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_swing_combat.tsx diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index e7918e92327a..8d6f2784d098 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -162,6 +162,21 @@ if((item_atom.item_flags & IN_STORAGE) && (item_atom.loc.flags_1 & HAS_DISASSOCIATED_STORAGE_1)) UnarmedAttack(item_atom, TRUE, modifiers) + // DARKPACK EDIT ADD START - COMBAT + // This sucks. https://github.com/tgstation/tgstation/pull/76928 looked so promising but it was closed. + if(client?.prefs?.read_preference(/datum/preference/toggle/swing_combat) && isliving(src)) + var/mob/living/living_src = src + if(istype(W, /obj/item/melee) && living_src.combat_mode) + if(A && CanReach(A,W)) + living_src.melee_swing() + W.melee_attack_chain(src, A, modifiers) + else + A = living_src.melee_swing() + if(A) + W.melee_attack_chain(src, A, modifiers) + return + // DARKPACK EDIT ADD END - COMBAT + //Standard reach turf to turf or reaching inside storage if(CanReach(A,W)) if(W) diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm index 80bc0074c4f9..71b0acbdea3b 100644 --- a/modular_darkpack/modules/combat/code/swing.dm +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -38,3 +38,8 @@ pixel_w = -32 pixel_z = -32 duration = 0.3 SECONDS + +/datum/preference/toggle/swing_combat + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "swing_combat" + savefile_identifier = PREFERENCE_PLAYER diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_swing_combat.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_swing_combat.tsx new file mode 100644 index 000000000000..73507c663430 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_swing_combat.tsx @@ -0,0 +1,10 @@ +import { CheckboxInput, type FeatureToggle } from '../base'; + +export const swing_combat: FeatureToggle = { + name: 'Use swing combat', + category: 'GAMEPLAY', + description: ` + Do you want melee items to swing for combat? + `, + component: CheckboxInput, +}; From 51743e954c4ea1b433308e6f0ca2dc08e247bd0c Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 11 Oct 2025 05:55:09 -0500 Subject: [PATCH 03/13] yea --- code/_onclick/click.dm | 5 +++-- modular_darkpack/modules/combat/code/swing.dm | 12 ++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 8d6f2784d098..f356ea504e5a 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -166,13 +166,14 @@ // This sucks. https://github.com/tgstation/tgstation/pull/76928 looked so promising but it was closed. if(client?.prefs?.read_preference(/datum/preference/toggle/swing_combat) && isliving(src)) var/mob/living/living_src = src - if(istype(W, /obj/item/melee) && living_src.combat_mode) + // Considering swapping the type check to use NOBLUDGEON but that would include guns. + if(W.can_swing() && living_src.combat_mode) if(A && CanReach(A,W)) living_src.melee_swing() W.melee_attack_chain(src, A, modifiers) else A = living_src.melee_swing() - if(A) + if(CanReach(A,W)) W.melee_attack_chain(src, A, modifiers) return // DARKPACK EDIT ADD END - COMBAT diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm index 71b0acbdea3b..a8a14b20e053 100644 --- a/modular_darkpack/modules/combat/code/swing.dm +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -1,5 +1,5 @@ /mob/living/proc/melee_swing(visual_effect = /obj/effect/temp_visual/dir_setting/swing_effect) - changeNext_move(CLICK_CD_RAPID) + changeNext_move(CLICK_CD_RANGE) new visual_effect(get_turf(src), dir) playsound(loc, 'modular_darkpack/modules/combat/sounds/swing.ogg', 50, TRUE) var/atom/hit_target @@ -9,7 +9,7 @@ for(var/turf/swung_turf in list(center_turf, left_turf, right_turf)) - hit_target = locate(/mob/living) + hit_target = locate(/mob/living) in swung_turf if(hit_target) break if(!hit_target) @@ -25,6 +25,14 @@ changeNext_move(CLICK_CD_MELEE) return hit_target +/obj/item/proc/can_swing() + // Technicly meant for no flavor text but is semi widly used as a "noncombat" weapon check + if(item_flags & NOBLUDGEON) + return TRUE + +/obj/item/gun/can_swing() + return FALSE + /obj/effect/temp_visual/dir_setting/swing_effect icon = 'modular_darkpack/modules/combat/icons/swing.dmi' icon_state = "swing1" From 8d1f21f008a3b66c6dfae0cc70aa745ebce1f23c Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 11 Oct 2025 06:09:37 -0500 Subject: [PATCH 04/13] yea --- code/_onclick/click.dm | 2 +- modular_darkpack/modules/combat/code/swing.dm | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index f356ea504e5a..8a943aed5544 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -167,7 +167,7 @@ if(client?.prefs?.read_preference(/datum/preference/toggle/swing_combat) && isliving(src)) var/mob/living/living_src = src // Considering swapping the type check to use NOBLUDGEON but that would include guns. - if(W.can_swing() && living_src.combat_mode) + if(W?.can_swing() && living_src.combat_mode) if(A && CanReach(A,W)) living_src.melee_swing() W.melee_attack_chain(src, A, modifiers) diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm index a8a14b20e053..bf2b97c91a39 100644 --- a/modular_darkpack/modules/combat/code/swing.dm +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -7,7 +7,6 @@ var/turf/left_turf = get_step(center_turf, turn(dir, -90)) var/turf/right_turf = get_step(center_turf, turn(dir, 90)) - for(var/turf/swung_turf in list(center_turf, left_turf, right_turf)) hit_target = locate(/mob/living) in swung_turf if(hit_target) @@ -27,7 +26,7 @@ /obj/item/proc/can_swing() // Technicly meant for no flavor text but is semi widly used as a "noncombat" weapon check - if(item_flags & NOBLUDGEON) + if(!(item_flags & NOBLUDGEON)) return TRUE /obj/item/gun/can_swing() From aa8ae61bd9397713091dc85baf2d5473cf61c12e Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 1 May 2026 16:18:00 -0500 Subject: [PATCH 05/13] make it a config --- code/_onclick/click.dm | 2 +- config/darkpack_config.txt | 2 ++ modular_darkpack/modules/combat/code/swing.dm | 5 +---- .../game_preferences/darkpack_swing_combat.tsx | 10 ---------- 4 files changed, 4 insertions(+), 15 deletions(-) delete mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_swing_combat.tsx diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index fa0359de4567..f1eff3cf3234 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -164,7 +164,7 @@ // DARKPACK EDIT ADD START - COMBAT // This sucks. https://github.com/tgstation/tgstation/pull/76928 looked so promising but it was closed. - if(client?.prefs?.read_preference(/datum/preference/toggle/swing_combat) && isliving(src)) + if(CONFIG_GET(flag/swing_combat) && isliving(src)) var/mob/living/living_src = src // Considering swapping the type check to use NOBLUDGEON but that would include guns. if(W?.can_swing() && living_src.combat_mode) diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt index bd565bc978fd..063302330536 100644 --- a/config/darkpack_config.txt +++ b/config/darkpack_config.txt @@ -54,3 +54,5 @@ LOG_STATS ## Bool for if roleplay only merits/quirks are enabled ROLEPLAY_ONLY_MERITS 1 + +#SWING_COMBAT diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm index bf2b97c91a39..d37c4f183041 100644 --- a/modular_darkpack/modules/combat/code/swing.dm +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -46,7 +46,4 @@ pixel_z = -32 duration = 0.3 SECONDS -/datum/preference/toggle/swing_combat - category = PREFERENCE_CATEGORY_GAME_PREFERENCES - savefile_key = "swing_combat" - savefile_identifier = PREFERENCE_PLAYER +/datum/config_entry/flag/swing_combat diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_swing_combat.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_swing_combat.tsx deleted file mode 100644 index 73507c663430..000000000000 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_swing_combat.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { CheckboxInput, type FeatureToggle } from '../base'; - -export const swing_combat: FeatureToggle = { - name: 'Use swing combat', - category: 'GAMEPLAY', - description: ` - Do you want melee items to swing for combat? - `, - component: CheckboxInput, -}; From df705675a75ac56605e9c913c591cf93e05ad3a7 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 1 May 2026 17:32:33 -0500 Subject: [PATCH 06/13] fixes --- code/_onclick/click.dm | 5 ++--- tgstation.dme | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index f1eff3cf3234..5056aedc7a30 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -166,14 +166,13 @@ // This sucks. https://github.com/tgstation/tgstation/pull/76928 looked so promising but it was closed. if(CONFIG_GET(flag/swing_combat) && isliving(src)) var/mob/living/living_src = src - // Considering swapping the type check to use NOBLUDGEON but that would include guns. if(W?.can_swing() && living_src.combat_mode) - if(A && CanReach(A,W)) + if(A?.IsReachableBy(src, W.reach)) living_src.melee_swing() W.melee_attack_chain(src, A, modifiers) else A = living_src.melee_swing() - if(CanReach(A,W)) + if(A?.IsReachableBy(src, W.reach)) W.melee_attack_chain(src, A, modifiers) return // DARKPACK EDIT ADD END - COMBAT diff --git a/tgstation.dme b/tgstation.dme index 2a9748c7ccf5..a43e0148c8f4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7145,6 +7145,10 @@ #include "modular_darkpack\modules\clothes\code\neck.dm" #include "modular_darkpack\modules\clothes\code\suit.dm" #include "modular_darkpack\modules\clothes\code\under.dm" +#include "modular_darkpack\modules\combat\code\swing.dm" +#include "modular_darkpack\modules\company_logos\code\company_logos.dm" +#include "modular_darkpack\modules\company_logos\code\pentex.dm" +#include "modular_darkpack\modules\curtains\code\curtains.dm" #include "modular_darkpack\modules\dancing\code\dancing.dm" #include "modular_darkpack\modules\decor\code\bench.dm" #include "modular_darkpack\modules\decor\code\city_map.dm" From dfb0f100e3603c0ef4c20cc79f5bd7a3c07f9de8 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 1 May 2026 19:08:09 -0500 Subject: [PATCH 07/13] elementization! --- code/_onclick/click.dm | 20 ++------ config/darkpack_config.txt | 2 + .../mob/living/carbon/human/initialize.dm | 4 ++ .../modules/combat/code/config.dm | 3 ++ .../modules/combat/code/directional_attack.dm | 46 ++++++++++++++++++ modular_darkpack/modules/combat/code/swing.dm | 48 +++++++++++++++++-- tgstation.dme | 2 + 7 files changed, 107 insertions(+), 18 deletions(-) create mode 100644 modular_darkpack/modules/combat/code/config.dm create mode 100644 modular_darkpack/modules/combat/code/directional_attack.dm diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 5056aedc7a30..8a7a8bb10d88 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -162,21 +162,6 @@ if((item_atom.item_flags & IN_STORAGE) && (item_atom.loc.flags_1 & HAS_DISASSOCIATED_STORAGE_1)) UnarmedAttack(item_atom, TRUE, modifiers) - // DARKPACK EDIT ADD START - COMBAT - // This sucks. https://github.com/tgstation/tgstation/pull/76928 looked so promising but it was closed. - if(CONFIG_GET(flag/swing_combat) && isliving(src)) - var/mob/living/living_src = src - if(W?.can_swing() && living_src.combat_mode) - if(A?.IsReachableBy(src, W.reach)) - living_src.melee_swing() - W.melee_attack_chain(src, A, modifiers) - else - A = living_src.melee_swing() - if(A?.IsReachableBy(src, W.reach)) - W.melee_attack_chain(src, A, modifiers) - return - // DARKPACK EDIT ADD END - COMBAT - //Standard reach turf to turf or reaching inside storage if(A.IsReachableBy(src, W?.reach)) if(W) @@ -191,8 +176,13 @@ else if(LAZYACCESS(modifiers, RIGHT_CLICK)) ranged_secondary_attack(A, modifiers) + /* // DARKPACK EDIT REMOVAL - COMBAT else RangedAttack(A, modifiers) + */ + // DARKPACK EDIT ADD START - COMBAT + RangedAttack(A, modifiers) + // DARKPACK EDIT ADD END /// Is the atom obscured by a PREVENT_CLICK_UNDER_1 object above it /atom/proc/IsObscured() diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt index 063302330536..ba88ad8fcbca 100644 --- a/config/darkpack_config.txt +++ b/config/darkpack_config.txt @@ -55,4 +55,6 @@ LOG_STATS ## Bool for if roleplay only merits/quirks are enabled ROLEPLAY_ONLY_MERITS 1 +## Configs for the type of attack we use when we click at a ranged distance. Only one can be enabled at a time. +#DIRECTIONAL_COMBAT #SWING_COMBAT diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm index 0ac4a2ff2f89..c176a5f1d004 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm @@ -4,4 +4,8 @@ //Initializes Jumping on the player AddComponent(/datum/component/jumper) AddComponent(/datum/component/violation_observer, violation_aoe) + if(CONFIG_GET(flag/swing_combat)) + AddElement(/datum/element/swing_attack) + else if(CONFIG_GET(flag/directional_combat)) + AddElement(/datum/element/directional_attack) update_visible_name() diff --git a/modular_darkpack/modules/combat/code/config.dm b/modular_darkpack/modules/combat/code/config.dm new file mode 100644 index 000000000000..557895be4a27 --- /dev/null +++ b/modular_darkpack/modules/combat/code/config.dm @@ -0,0 +1,3 @@ +/datum/config_entry/flag/directional_combat + +/datum/config_entry/flag/swing_combat diff --git a/modular_darkpack/modules/combat/code/directional_attack.dm b/modular_darkpack/modules/combat/code/directional_attack.dm new file mode 100644 index 000000000000..147831599975 --- /dev/null +++ b/modular_darkpack/modules/combat/code/directional_attack.dm @@ -0,0 +1,46 @@ +/*! + * This element allows the mob its attached to the ability to click an adjacent mob by clicking a distant atom + * that is in the general direction relative to the parent. + */ +/datum/element/directional_attack/Attach(datum/target) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_MOB_ATTACK_RANGED, PROC_REF(on_ranged_attack)) + +/datum/element/directional_attack/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, COMSIG_MOB_ATTACK_RANGED) + +/** + * This proc handles clicks on tiles that aren't adjacent to the source mob + * In addition to clicking the distant tile, it checks the tile in the direction and clicks the mob in the tile if there is one + * Arguments: + * * source - The mob clicking + * * clicked_atom - The atom being clicked (should be a distant one) + * * click_params - Miscellaneous click parameters, passed from Click itself + */ +/datum/element/directional_attack/proc/on_ranged_attack(mob/living/source, atom/clicked_atom, click_params) + SIGNAL_HANDLER + + if(!source.combat_mode) + return + + if(QDELETED(clicked_atom)) + return + + var/turf/turf_to_check = get_step(source, angle2dir(get_angle(source, clicked_atom))) + if(!turf_to_check || !source.Adjacent(turf_to_check)) + return + + var/mob/living/target_mob + for(target_mob in turf_to_check) + if(target_mob == source) + continue + if(!target_mob || target_mob.stat == DEAD) + continue + //This is here to undo the +1 the click on the distant turf adds so we can click the mob near us + source.next_click = world.time - 1 + INVOKE_ASYNC(source, TYPE_PROC_REF(/mob, ClickOn), target_mob, turf_to_check, click_params) + return diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm index d37c4f183041..49f15d57b80b 100644 --- a/modular_darkpack/modules/combat/code/swing.dm +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -1,5 +1,4 @@ /mob/living/proc/melee_swing(visual_effect = /obj/effect/temp_visual/dir_setting/swing_effect) - changeNext_move(CLICK_CD_RANGE) new visual_effect(get_turf(src), dir) playsound(loc, 'modular_darkpack/modules/combat/sounds/swing.ogg', 50, TRUE) var/atom/hit_target @@ -21,8 +20,10 @@ SEND_SIGNAL(src, COMSIG_LIVING_MELEE_SWING, hit_target, center_turf, left_turf, right_turf) if(hit_target) - changeNext_move(CLICK_CD_MELEE) + // changeNext_move(CLICK_CD_MELEE) return hit_target + else + changeNext_move(CLICK_CD_RANGE) // Whiff punish (to avoid people spam clicking and the visuals looking dumb) /obj/item/proc/can_swing() // Technicly meant for no flavor text but is semi widly used as a "noncombat" weapon check @@ -46,4 +47,45 @@ pixel_z = -32 duration = 0.3 SECONDS -/datum/config_entry/flag/swing_combat + +/*! + * This element allows the mob its attached to the ability to click an adjacent mob by clicking a distant atom + * that is in the general direction relative to the parent. + */ +/datum/element/swing_attack/Attach(datum/target) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_MOB_ATTACK_RANGED, PROC_REF(on_ranged_attack)) + +/datum/element/swing_attack/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, COMSIG_MOB_ATTACK_RANGED) + +/** + * This proc handles clicks on tiles that aren't adjacent to the source mob + * In addition to clicking the distant tile, it checks the tile in the direction and clicks the mob in the tile if there is one + * Arguments: + * * source - The mob clicking + * * clicked_atom - The atom being clicked (should be a distant one) + * * click_params - Miscellaneous click parameters, passed from Click itself + */ +/datum/element/swing_attack/proc/on_ranged_attack(mob/living/source, atom/clicked_atom, click_params) + SIGNAL_HANDLER + + if(!source.combat_mode) + return + + if(QDELETED(clicked_atom)) + return + + var/obj/item/held_item = source.get_active_held_item() + if(held_item && !held_item.can_swing()) + return + + var/atom/swing_result = source.melee_swing() + if(swing_result?.IsReachableBy(source, held_item ? held_item.reach : 1)) + //This is here to undo the +1 the click on the distant turf adds so we can click the mob near us + source.next_click = world.time - 1 + INVOKE_ASYNC(source, TYPE_PROC_REF(/mob, ClickOn), swing_result, get_turf(swing_result), click_params) diff --git a/tgstation.dme b/tgstation.dme index a43e0148c8f4..765ee3431ce9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7145,6 +7145,8 @@ #include "modular_darkpack\modules\clothes\code\neck.dm" #include "modular_darkpack\modules\clothes\code\suit.dm" #include "modular_darkpack\modules\clothes\code\under.dm" +#include "modular_darkpack\modules\combat\code\config.dm" +#include "modular_darkpack\modules\combat\code\directional_attack.dm" #include "modular_darkpack\modules\combat\code\swing.dm" #include "modular_darkpack\modules\company_logos\code\company_logos.dm" #include "modular_darkpack\modules\company_logos\code\pentex.dm" From 66830d981e57bb64b48188b58212dcf211197a5b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 1 May 2026 20:02:38 -0500 Subject: [PATCH 08/13] wolf out (also fix arg thing) --- .../modules/combat/code/directional_attack.dm | 2 +- modular_darkpack/modules/combat/code/swing.dm | 25 ++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/modular_darkpack/modules/combat/code/directional_attack.dm b/modular_darkpack/modules/combat/code/directional_attack.dm index 147831599975..ba9239c83aab 100644 --- a/modular_darkpack/modules/combat/code/directional_attack.dm +++ b/modular_darkpack/modules/combat/code/directional_attack.dm @@ -42,5 +42,5 @@ continue //This is here to undo the +1 the click on the distant turf adds so we can click the mob near us source.next_click = world.time - 1 - INVOKE_ASYNC(source, TYPE_PROC_REF(/mob, ClickOn), target_mob, turf_to_check, click_params) + INVOKE_ASYNC(source, TYPE_PROC_REF(/mob, ClickOn), target_mob, list2params(click_params)) return diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm index 49f15d57b80b..4ca2844198de 100644 --- a/modular_darkpack/modules/combat/code/swing.dm +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -1,5 +1,4 @@ -/mob/living/proc/melee_swing(visual_effect = /obj/effect/temp_visual/dir_setting/swing_effect) - new visual_effect(get_turf(src), dir) +/mob/living/proc/melee_swing(visual_effect) playsound(loc, 'modular_darkpack/modules/combat/sounds/swing.ogg', 50, TRUE) var/atom/hit_target var/turf/center_turf = get_step(src, dir) @@ -16,6 +15,10 @@ hit_target = swung_object break + if(!visual_effect) + visual_effect = get_swing_visual(hit_target) + new visual_effect(get_turf(src), dir) + // Originally this was in front of searching for turfs but SURELY you would want this after you get a target. Right? SEND_SIGNAL(src, COMSIG_LIVING_MELEE_SWING, hit_target, center_turf, left_turf, right_turf) @@ -25,6 +28,21 @@ else changeNext_move(CLICK_CD_RANGE) // Whiff punish (to avoid people spam clicking and the visuals looking dumb) +/mob/living/proc/get_swing_visual(atom/target) + return /obj/effect/temp_visual/dir_setting/swing_effect + +// unarmed_attack_effect = ATTACK_EFFECT_CLAW + + +/mob/living/carbon/get_swing_visual(atom/target) + . = ..() + + if(target) + var/obj/item/bodypart/attacking_bodypart = get_attacking_limb(target) + if(attacking_bodypart?.unarmed_attack_effect == ATTACK_EFFECT_CLAW) + return /obj/effect/temp_visual/dir_setting/claw_effect + + /obj/item/proc/can_swing() // Technicly meant for no flavor text but is semi widly used as a "noncombat" weapon check if(!(item_flags & NOBLUDGEON)) @@ -33,6 +51,7 @@ /obj/item/gun/can_swing() return FALSE + /obj/effect/temp_visual/dir_setting/swing_effect icon = 'modular_darkpack/modules/combat/icons/swing.dmi' icon_state = "swing1" @@ -88,4 +107,4 @@ if(swing_result?.IsReachableBy(source, held_item ? held_item.reach : 1)) //This is here to undo the +1 the click on the distant turf adds so we can click the mob near us source.next_click = world.time - 1 - INVOKE_ASYNC(source, TYPE_PROC_REF(/mob, ClickOn), swing_result, get_turf(swing_result), click_params) + INVOKE_ASYNC(source, TYPE_PROC_REF(/mob, ClickOn), swing_result, list2params(click_params)) From dcdbc524e53d51f53bd5c4167e087f775d12c0ff Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 1 May 2026 20:10:11 -0500 Subject: [PATCH 09/13] dont use claw animation if holding item --- modular_darkpack/modules/combat/code/swing.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm index 4ca2844198de..0b8174b83ea1 100644 --- a/modular_darkpack/modules/combat/code/swing.dm +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -1,4 +1,4 @@ -/mob/living/proc/melee_swing(visual_effect) +/mob/living/proc/melee_swing(visual_effect, atom/swung_item) playsound(loc, 'modular_darkpack/modules/combat/sounds/swing.ogg', 50, TRUE) var/atom/hit_target var/turf/center_turf = get_step(src, dir) @@ -16,7 +16,7 @@ break if(!visual_effect) - visual_effect = get_swing_visual(hit_target) + visual_effect = get_swing_visual(hit_target, swung_item) new visual_effect(get_turf(src), dir) // Originally this was in front of searching for turfs but SURELY you would want this after you get a target. Right? @@ -28,16 +28,16 @@ else changeNext_move(CLICK_CD_RANGE) // Whiff punish (to avoid people spam clicking and the visuals looking dumb) -/mob/living/proc/get_swing_visual(atom/target) +/mob/living/proc/get_swing_visual(atom/target, atom/swung_item) return /obj/effect/temp_visual/dir_setting/swing_effect // unarmed_attack_effect = ATTACK_EFFECT_CLAW -/mob/living/carbon/get_swing_visual(atom/target) +/mob/living/carbon/get_swing_visual(atom/target, atom/swung_item) . = ..() - if(target) + if(target && !swung_item) var/obj/item/bodypart/attacking_bodypart = get_attacking_limb(target) if(attacking_bodypart?.unarmed_attack_effect == ATTACK_EFFECT_CLAW) return /obj/effect/temp_visual/dir_setting/claw_effect @@ -103,7 +103,7 @@ if(held_item && !held_item.can_swing()) return - var/atom/swing_result = source.melee_swing() + var/atom/swing_result = source.melee_swing(swung_item = held_item) if(swing_result?.IsReachableBy(source, held_item ? held_item.reach : 1)) //This is here to undo the +1 the click on the distant turf adds so we can click the mob near us source.next_click = world.time - 1 From 11f2abffc0ee8f57feeb7c945b111b8bafd952e4 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 1 May 2026 20:18:25 -0500 Subject: [PATCH 10/13] fix --- code/modules/surgery/bodyparts/helpers.dm | 8 +++++++- modular_darkpack/modules/combat/code/swing.dm | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 73542be9b0c4..92f065898a80 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -181,7 +181,13 @@ /mob/living/carbon/get_attacking_limb(atom/target, datum/martial_art/attacker_style) var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) - var/obj/item/bodypart/attacking_bodypart = attacker_style?.get_attacking_limb(src, target) || brain?.get_attacking_limb(target) || get_active_hand() + // DARKPACK EDIT CHANGE START - COMBAT + var/obj/item/bodypart/attacking_bodypart + if(target) + attacking_bodypart = attacker_style?.get_attacking_limb(src, target) || brain?.get_attacking_limb(target) || get_active_hand() + else + attacking_bodypart = get_active_hand() + // DARKPACK EDIT CHANGE END if(attacking_bodypart.unarmed_attack_effect == ATTACK_EFFECT_BITE) if(is_mouth_covered(ITEM_SLOT_MASK)) diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm index 0b8174b83ea1..a13e47c1f6ab 100644 --- a/modular_darkpack/modules/combat/code/swing.dm +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -37,7 +37,7 @@ /mob/living/carbon/get_swing_visual(atom/target, atom/swung_item) . = ..() - if(target && !swung_item) + if(!swung_item) var/obj/item/bodypart/attacking_bodypart = get_attacking_limb(target) if(attacking_bodypart?.unarmed_attack_effect == ATTACK_EFFECT_CLAW) return /obj/effect/temp_visual/dir_setting/claw_effect From 86edd1756ebf472c73c7170e0f906e1f4d80bb4c Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 1 May 2026 20:19:35 -0500 Subject: [PATCH 11/13] wait this def needs human --- code/modules/surgery/bodyparts/helpers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 92f065898a80..08ca58518321 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -183,7 +183,7 @@ var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) // DARKPACK EDIT CHANGE START - COMBAT var/obj/item/bodypart/attacking_bodypart - if(target) + if(ishuman(target)) attacking_bodypart = attacker_style?.get_attacking_limb(src, target) || brain?.get_attacking_limb(target) || get_active_hand() else attacking_bodypart = get_active_hand() From 51063526b3ca88a7475d71cf3a1a724b2f616563 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 1 May 2026 20:35:51 -0500 Subject: [PATCH 12/13] yea --- modular_darkpack/modules/combat/code/swing.dm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm index a13e47c1f6ab..469363d0ac12 100644 --- a/modular_darkpack/modules/combat/code/swing.dm +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -6,14 +6,20 @@ var/turf/right_turf = get_step(center_turf, turn(dir, 90)) for(var/turf/swung_turf in list(center_turf, left_turf, right_turf)) - hit_target = locate(/mob/living) in swung_turf - if(hit_target) - break + var/mob/living/living_on_turf = locate() in swung_turf + if(!living_on_turf) + continue + if(living_on_turf.stat == DEAD) + continue + hit_target = living_on_turf + break + /* // More likely then not, not acctually what your trying to click on. Revisit if(!hit_target) for(var/obj/swung_object in center_turf) if(swung_object.obj_flags & CAN_BE_HIT) hit_target = swung_object break + */ if(!visual_effect) visual_effect = get_swing_visual(hit_target, swung_item) From 034e85da6f00db85718b4cf9d643e0c9a6167514 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 1 May 2026 22:55:21 -0500 Subject: [PATCH 13/13] preference --- modular_darkpack/modules/combat/code/combat_config.dm | 9 +++++++++ modular_darkpack/modules/combat/code/config.dm | 3 --- .../modules/combat/code/directional_attack.dm | 3 +++ modular_darkpack/modules/combat/code/swing.dm | 3 +++ tgstation.dme | 2 +- .../game_preferences/darkpack_melee_combat.tsx | 10 ++++++++++ 6 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 modular_darkpack/modules/combat/code/combat_config.dm delete mode 100644 modular_darkpack/modules/combat/code/config.dm create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_melee_combat.tsx diff --git a/modular_darkpack/modules/combat/code/combat_config.dm b/modular_darkpack/modules/combat/code/combat_config.dm new file mode 100644 index 000000000000..2fa2a24db3ff --- /dev/null +++ b/modular_darkpack/modules/combat/code/combat_config.dm @@ -0,0 +1,9 @@ +/datum/config_entry/flag/directional_combat + +/datum/config_entry/flag/swing_combat + + +/datum/preference/toggle/ranged_click_to_melee + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "ranged_click_to_melee" + savefile_identifier = PREFERENCE_PLAYER diff --git a/modular_darkpack/modules/combat/code/config.dm b/modular_darkpack/modules/combat/code/config.dm deleted file mode 100644 index 557895be4a27..000000000000 --- a/modular_darkpack/modules/combat/code/config.dm +++ /dev/null @@ -1,3 +0,0 @@ -/datum/config_entry/flag/directional_combat - -/datum/config_entry/flag/swing_combat diff --git a/modular_darkpack/modules/combat/code/directional_attack.dm b/modular_darkpack/modules/combat/code/directional_attack.dm index ba9239c83aab..c2c7f0f2555c 100644 --- a/modular_darkpack/modules/combat/code/directional_attack.dm +++ b/modular_darkpack/modules/combat/code/directional_attack.dm @@ -27,6 +27,9 @@ if(!source.combat_mode) return + if(!source?.client?.prefs?.read_preference(/datum/preference/toggle/ranged_click_to_melee)) + return + if(QDELETED(clicked_atom)) return diff --git a/modular_darkpack/modules/combat/code/swing.dm b/modular_darkpack/modules/combat/code/swing.dm index 469363d0ac12..6e0a4bc94619 100644 --- a/modular_darkpack/modules/combat/code/swing.dm +++ b/modular_darkpack/modules/combat/code/swing.dm @@ -102,6 +102,9 @@ if(!source.combat_mode) return + if(!source?.client?.prefs?.read_preference(/datum/preference/toggle/ranged_click_to_melee)) + return + if(QDELETED(clicked_atom)) return diff --git a/tgstation.dme b/tgstation.dme index 765ee3431ce9..c571b10bdf44 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7145,7 +7145,7 @@ #include "modular_darkpack\modules\clothes\code\neck.dm" #include "modular_darkpack\modules\clothes\code\suit.dm" #include "modular_darkpack\modules\clothes\code\under.dm" -#include "modular_darkpack\modules\combat\code\config.dm" +#include "modular_darkpack\modules\combat\code\combat_config.dm" #include "modular_darkpack\modules\combat\code\directional_attack.dm" #include "modular_darkpack\modules\combat\code\swing.dm" #include "modular_darkpack\modules\company_logos\code\company_logos.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_melee_combat.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_melee_combat.tsx new file mode 100644 index 000000000000..b672e8ff389f --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_melee_combat.tsx @@ -0,0 +1,10 @@ +import { CheckboxInput, type FeatureToggle } from '../base'; + +export const ranged_click_to_melee: FeatureToggle = { + name: 'Distant clicks trigger melee swings', + category: 'GAMEPLAY', + description: ` + Clicking on a tile out of your range creates a swing or directional attack. + `, + component: CheckboxInput, +};