diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm index 3a31eebb19..0734feaa42 100644 --- a/code/__DEFINES/_flags/_flags.dm +++ b/code/__DEFINES/_flags/_flags.dm @@ -138,14 +138,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_PICKUP | MOBILITY_USE | MOBILITY_UI | MOBILITY_STORAGE | MOBILITY_PULL | MOBILITY_RESIST) #define MOBILITY_FLAGS_ANY_INTERACTION (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_UI | MOBILITY_STORAGE) -// melee_attack_chain() attackchain_flags -/// The attack is from a parry counterattack. -#define ATTACKCHAIN_PARRY_COUNTERATTACK (1<<0) - -// UnarmedAttack() flags -/// Attack is from a parry counterattack -#define UNARMED_ATTACK_PARRY (1<<0) - /// If the thing can reflect light (lasers/energy) #define RICOCHET_SHINY (1<<0) /// If the thing can reflect matter (bullets/bomb shrapnel) diff --git a/code/__DEFINES/_flags/return_values.dm b/code/__DEFINES/_flags/return_values.dm new file mode 100644 index 0000000000..dd15ff6268 --- /dev/null +++ b/code/__DEFINES/_flags/return_values.dm @@ -0,0 +1,17 @@ +// melee_attack_chain() attackchain_flags +/// The attack is from a parry counterattack. +#define ATTACKCHAIN_PARRY_COUNTERATTACK (1<<0) + +// melee_attack_chain(), attackby(), pre_attack(), afterattack(), and tool_act() return values. +/// Stop the attack chain if still in melee_attack_chain() +#define STOP_ATTACK_PROC_CHAIN (1<<0) +/// This attack should discard last_action instead of flushing (storing) it). You should probably know what you're doing if you use this considering this is how clickdelay is enforced. +#define DISCARD_LAST_ACTION (1<<1) + +// UnarmedAttack() flags +/// Attack is from a parry counterattack +#define UNARMED_ATTACK_PARRY (1<<0) + +// obj/item/dropped() +/// dropped() relocated this item, return FALSE for doUnEquip. +#define ITEM_RELOCATED_BY_DROPPED "relocated_by_dropped" diff --git a/code/__DEFINES/misc/return_values.dm b/code/__DEFINES/misc/return_values.dm deleted file mode 100644 index d55f603de9..0000000000 --- a/code/__DEFINES/misc/return_values.dm +++ /dev/null @@ -1,3 +0,0 @@ -// obj/item/dropped -/// dropped() relocated this item, return FALSE for doUnEquip. -#define ITEM_RELOCATED_BY_DROPPED "relocated_by_dropped" diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 45fc2187e6..5d11889ad3 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -111,7 +111,7 @@ //User itself, current loc, and user inventory if(A in DirectAccess()) if(W) - W.melee_attack_chain(src, A, params) + . = !(W.melee_attack_chain(src, A, params) & DISCARD_LAST_ACTION) else UnarmedAttack(A) return @@ -123,15 +123,13 @@ //Standard reach turf to turf or reaching inside storage if(CanReach(A,W)) if(W) - W.melee_attack_chain(src, A, params) + . = !(W.melee_attack_chain(src, A, params) & DISCARD_LAST_ACTION) else - DelayNextAction(ismob(A)? 8 : 0) UnarmedAttack(A, 1) else if(W) W.ranged_attack_chain(src, A, params) else - DelayNextAction(ismob(A)? 8 : 0) RangedAttack(A,params) //Is the atom obscured by a PREVENT_CLICK_UNDER_1 object above it diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 49941237f6..0bd085d506 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -77,7 +77,7 @@ // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents) if(A == loc || (A in loc) || (A in contents)) - W.melee_attack_chain(src, A, params) + . = !(W.melee_attack_chain(src, A, params) & DISCARD_LAST_ACTION) return if(!isturf(loc)) @@ -86,7 +86,7 @@ // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc)) if(isturf(A) || isturf(A.loc)) if(A.Adjacent(src)) // see adjacent.dm - W.melee_attack_chain(src, A, params) + . = !(W.melee_attack_chain(src, A, params) & DISCARD_LAST_ACTION) return else W.afterattack(A, src, 0, params) diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/code/_onclick/hud/screen_objects/sprint.dm similarity index 100% rename from modular_citadel/code/_onclick/hud/sprint.dm rename to code/_onclick/hud/screen_objects/sprint.dm diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/code/_onclick/hud/screen_objects/stamina.dm similarity index 100% rename from modular_citadel/code/_onclick/hud/stamina.dm rename to code/_onclick/hud/screen_objects/stamina.dm diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects/vore.dm similarity index 100% rename from modular_citadel/code/_onclick/hud/screen_objects.dm rename to code/_onclick/hud/screen_objects/vore.dm diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 8bbefff9a2..b66118d3a8 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -13,15 +13,15 @@ if(!CHECK_MOBILITY(L, MOBILITY_USE) && !(flags & ATTACKCHAIN_PARRY_COUNTERATTACK)) to_chat(L, "You are unable to swing [src] right now!") return - if(tool_behaviour && target.tool_act(user, src, tool_behaviour)) + if(tool_behaviour && ((. = target.tool_act(user, src, tool_behaviour)) & STOP_ATTACK_PROC_CHAIN)) return - if(pre_attack(target, user, params)) + if((. |= pre_attack(target, user, params)) & STOP_ATTACK_PROC_CHAIN) return - if(target.attackby(src, user, params, flags, damage_multiplier)) + if((. |= target.attackby(src, user, params, flags, damage_multiplier)) & STOP_ATTACK_PROC_CHAIN) return if(QDELETED(src) || QDELETED(target)) return - afterattack(target, user, TRUE, params) + . |= afterattack(target, user, TRUE, params) /// Like melee_attack_chain but for ranged. /obj/item/proc/ranged_attack_chain(mob/user, atom/target, params) @@ -40,25 +40,25 @@ /obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby! if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK) - return TRUE - if(!PreatackClickdelayCheck(user, A)) - return TRUE - PreattackClickdelaySet(user, A) - return FALSE //return TRUE to avoid calling attackby after this proc does stuff + return STOP_ATTACK_PROC_CHAIN + if(!CheckAttackCooldown(user, A)) + return STOP_ATTACK_PROC_CHAIN // No comment /atom/proc/attackby(obj/item/W, mob/user, params) if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK) - return TRUE - return FALSE + return STOP_ATTACK_PROC_CHAIN /obj/attackby(obj/item/I, mob/living/user, params) - return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user)) + . = ..() + if(obj_flags & CAN_BE_HIT) + . |= I.attack_obj(src, user) /mob/living/attackby(obj/item/I, mob/living/user, params, attackchain_flags, damage_multiplier) - if(..()) - return TRUE - . = I.attack(src, user, attackchain_flags, damage_multiplier) + . = ..() + if(. & STOP_ATTACK_PROC_CHAIN) + return + . |= I.attack(src, user, attackchain_flags, damage_multiplier) /obj/item/proc/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_ITEM_NO_ATTACK) @@ -80,7 +80,7 @@ user.do_attack_animation(M) M.attacked_by(src, user, attackchain_flags, damage_multiplier) - PostattackClickdelaySet(user, M) + SetAttackCooldown(user, M) log_combat(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) @@ -97,7 +97,7 @@ return user.do_attack_animation(O) O.attacked_by(src, user) - PostattackClickdelaySet(user, O) + SetAttackCooldown(user, O) var/weight = getweight(user, STAM_COST_ATTACK_OBJ_MULT) if(weight) user.adjustStaminaLossBuffered(weight)//CIT CHANGE - makes attacking things cause stamina loss diff --git a/modular_citadel/code/_onclick/click.dm b/code/_onclick/right_click.dm similarity index 95% rename from modular_citadel/code/_onclick/click.dm rename to code/_onclick/right_click.dm index 2b48d5474a..cba4dac263 100644 --- a/modular_citadel/code/_onclick/click.dm +++ b/code/_onclick/right_click.dm @@ -38,7 +38,6 @@ if(W) W.rightclick_melee_attack_chain(src, A, params) else - DelayNextAction(ismob(A)? 8 : 0) if(!AltUnarmedAttack(A)) UnarmedAttack(A) return @@ -52,7 +51,6 @@ if(W) W.rightclick_melee_attack_chain(src, A, params) else - DelayNextAction(ismob(A)? 8 : 0) if(!AltUnarmedAttack(A,1)) UnarmedAttack(A,1) else diff --git a/modular_citadel/code/_onclick/item_attack.dm b/code/_onclick/right_item_attack.dm similarity index 100% rename from modular_citadel/code/_onclick/item_attack.dm rename to code/_onclick/right_item_attack.dm diff --git a/modular_citadel/code/_onclick/other_mobs.dm b/code/_onclick/right_other_mobs.dm similarity index 100% rename from modular_citadel/code/_onclick/other_mobs.dm rename to code/_onclick/right_other_mobs.dm diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm index c77050c530..c8d4b8618e 100644 --- a/code/modules/cargo/coupon.dm +++ b/code/modules/cargo/coupon.dm @@ -8,6 +8,7 @@ icon = 'icons/obj/card.dmi' item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_TINY + attack_cooldown = CLICK_CD_MELEE var/datum/supply_pack/discounted_pack var/discount_pct_off = 0.05 var/obj/machinery/computer/cargo/inserted_console diff --git a/code/modules/mob/clickdelay.dm b/code/modules/mob/clickdelay.dm index 82b0e851af..80fe01a2da 100644 --- a/code/modules/mob/clickdelay.dm +++ b/code/modules/mob/clickdelay.dm @@ -133,34 +133,25 @@ /obj/item // Standard clickdelay variables - /// Amount of time to check for from a mob's last attack, checked before an attack happens - var/preattack_cooldown_check = CLICK_CD_MELEE - /// Amount of time to delay a mob's next attack, added after an attack happens - var/postattack_cooldown_penalty = 0 + /// Amount of time to check for from a mob's last attack, checked before an attack happens. Lower = faster attacks + var/attack_speed = CLICK_CD_MELEE + /// Amount of time to hard-stagger (no clicking at all) the mob when attacking. Lower = better + var/attack_unwieldlyness = 0 /// This item bypasses any click delay mods var/clickdelay_mod_bypass = FALSE /// This item checks clickdelay from a user's delayed next action variable rather than the last time they attacked. var/clickdelay_from_next_action = FALSE /// This item ignores next action delays. var/clickdelay_ignores_next_action = FALSE - /// This item sets clickdelay in preattack rather than post attack. This means it's set in a melee attack even if the user doesn't bash or bop it against something. - var/clickdelay_set_on_pre_attack = FALSE /** - * Checks if a user's clickdelay is met for a standard attack + * Checks if a user's clickdelay is met for a standard attack, this is called before an attack happens. */ -/obj/item/proc/PreattackClickdelayCheck(mob/user, atom/target) +/obj/item/proc/CheckAttackCooldown(mob/user, atom/target) return user.CheckActionCooldown(action_cooldown_preattack, clickdelay_from_next_action, clickdelay_mod_bypass, clickdelay_ignores_next_action) -/** - * Called if check is successful before the attack happens. - */ -/obj/item/proc/PreattackClickdelaySet(mob/user, atom/target) - if(clickdelay_set_on_pre_attack) - user.DelayNextAction(0, FALSE, TRUE) - /** * Called after a successful attack to set a mob's clickdelay. */ -/obj/item/proc/PostattackClickdelaySet(mob/user, atom/target) +/obj/item/proc/ApplyAttackCooldown(mob/user, atom/target) user.DelayNextAction(postattack_cooldown_penalty, clickdelay_mod_bypass, FALSE) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index f911a6a4e4..77e41f5f57 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -812,11 +812,11 @@ return /obj/item/light/attack(mob/living/M, mob/living/user, def_zone) - ..() + . = ..() shatter() /obj/item/light/attack_obj(obj/O, mob/living/user) - ..() + . = ..() shatter() /obj/item/light/proc/shatter() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index b90f0aee0d..21bc3da4ba 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -366,8 +366,7 @@ /obj/item/gun/attack_obj(obj/O, mob/user) if(user.a_intent == INTENT_HARM) if(bayonet) - O.attackby(bayonet, user) - return TRUE + return O.attackby(bayonet, user) return ..() /obj/item/gun/attackby(obj/item/I, mob/user, params) diff --git a/tgstation.dme b/tgstation.dme index 53fb12e152..f72dcc0f65 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -123,6 +123,7 @@ #include "code\__DEFINES\_flags\do_after.dm" #include "code\__DEFINES\_flags\item_flags.dm" #include "code\__DEFINES\_flags\obj_flags.dm" +#include "code\__DEFINES\_flags\return_values.dm" #include "code\__DEFINES\_flags\shields.dm" #include "code\__DEFINES\admin\keybindings.dm" #include "code\__DEFINES\chemistry\reactions.dm" @@ -134,7 +135,6 @@ #include "code\__DEFINES\dcs\signals.dm" #include "code\__DEFINES\mapping\maploader.dm" #include "code\__DEFINES\material\worth.dm" -#include "code\__DEFINES\misc\return_values.dm" #include "code\__DEFINES\mobs\slowdowns.dm" #include "code\__DEFINES\research\stock_parts.dm" #include "code\__DEFINES\skills\defines.dm" @@ -219,6 +219,8 @@ #include "code\_onclick\observer.dm" #include "code\_onclick\other_mobs.dm" #include "code\_onclick\overmind.dm" +#include "code\_onclick\right_click.dm" +#include "code\_onclick\right_item_attack.dm" #include "code\_onclick\telekinesis.dm" #include "code\_onclick\hud\_defines.dm" #include "code\_onclick\hud\action_button.dm" @@ -251,6 +253,7 @@ #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\swarmer.dm" +#include "code\_onclick\hud\screen_objects\sprint.dm" #include "code\_onclick\hud\screen_objects\storage.dm" #include "code\controllers\admin.dm" #include "code\controllers\configuration_citadel.dm" @@ -3424,12 +3427,6 @@ #include "interface\menu.dm" #include "interface\stylesheet.dm" #include "interface\skin.dmf" -#include "modular_citadel\code\_onclick\click.dm" -#include "modular_citadel\code\_onclick\item_attack.dm" -#include "modular_citadel\code\_onclick\other_mobs.dm" -#include "modular_citadel\code\_onclick\hud\screen_objects.dm" -#include "modular_citadel\code\_onclick\hud\sprint.dm" -#include "modular_citadel\code\_onclick\hud\stamina.dm" #include "modular_citadel\code\datums\components\souldeath.dm" #include "modular_citadel\code\datums\status_effects\chems.dm" #include "modular_citadel\code\game\objects\cit_screenshake.dm"