From 238665f4643500443b588bc5e0cbea7ef68bb8dc Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 11 Apr 2020 09:13:10 -0700 Subject: [PATCH] progress --- code/__DEFINES/combat/block_parry.dm | 4 +- code/game/objects/items/shields.dm | 6 ++- .../modules/mob/living/living_active_block.dm | 4 +- .../mob/living/living_blocking_parrying.dm | 41 ++++++++++++++----- 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/code/__DEFINES/combat/block_parry.dm b/code/__DEFINES/combat/block_parry.dm index 1ec5b8ebd9..5b090be9c7 100644 --- a/code/__DEFINES/combat/block_parry.dm +++ b/code/__DEFINES/combat/block_parry.dm @@ -50,5 +50,5 @@ GLOBAL_LIST_INIT(dir2blockdir, list( #define PARRY_KNOCKDOWN_ATTACKER "knockdown_attacker" /// List association should be duration. #define PARRY_STAGGER_ATTACKER "stagger_attacker" -/// List association should be amount to increase clickcd of attacker to. -#define PARRY_CLICKCD_ATTACKER "clickcd_attacker" +/// List association should be amount of time to daze attacker. +#define PARRY_DAZE_ATTACKER "daze_attacker" diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 37dfc417d5..9e9a982781 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -2,6 +2,7 @@ name = "shield" icon = 'icons/obj/items_and_weapons.dmi' block_chance = 50 + item_flags = ITEM_CAN_BLOCK armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) var/transparent = FALSE // makes beam projectiles pass through the shield @@ -182,13 +183,16 @@ throw_speed = 3 throw_range = 4 w_class = WEIGHT_CLASS_NORMAL - var/active = 0 + var/active = FALSE /obj/item/shield/riot/tele/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(!active) return BLOCK_NONE return ..() +/obj/item/shield/riot/tele/can_active_block() + return ..() && active + /obj/item/shield/riot/tele/attack_self(mob/living/user) active = !active icon_state = "teleriot[active]" diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm index db9717a87c..84e2f06329 100644 --- a/code/modules/mob/living/living_active_block.dm +++ b/code/modules/mob/living/living_active_block.dm @@ -95,7 +95,7 @@ if(!I) to_chat(src, "You can't block with your bare hands!") return - if(!(I.can_active_block()) + if(!I.can_active_block()) to_chat(src, "[I] is not capable of actively being used to block!") return var/datum/block_parry_data/data = I.get_block_parry_data() @@ -123,7 +123,7 @@ * Gets our datum/block_parry_data */ /obj/item/proc/get_block_parry_data() - return get_block_parray_data(block_parry_data) + return get_block_parry_data(block_parry_data) /** * Returns if we can actively block. diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm index 4d79eb8c93..2d4547e10b 100644 --- a/code/modules/mob/living/living_blocking_parrying.dm +++ b/code/modules/mob/living/living_blocking_parrying.dm @@ -133,13 +133,19 @@ GLOBAL_LIST_EMPTY(block_parry_data) return /// Yadda yadda WIP access block/parry data... +/obj/item/proc/active_parry_reflex_counter(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list) + +/mob/living/proc/active_parry_reflex_counter(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list) + +/datum/martial_art/proc/active_parry_reflex_counter(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list) + /mob/living/proc/get_parry_stage() if(!parrying) return NOT_PARRYING var/datum/block_parry_data/data = get_parry_data() var/windup_end = data.parry_time_windup - var/active_end = windup + data.parry_time_active - var/spindown_end = active + data.parry_time_spindown + var/active_end = windup_end + data.parry_time_active + var/spindown_end = active_end + data.parry_time_spindown switch(get_parry_time()) if(0 to windup_end) return PARRY_WINDUP @@ -174,26 +180,41 @@ GLOBAL_LIST_EMPTY(block_parry_data) /// Run counterattack if any /mob/living/proc/run_parry_countereffects(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list()) + if(!isliving(attacker)) + return + var/mob/living/L = attacker var/datum/block_parry_data/data = get_parry_data() + var/list/effect_text = list() if(data.parry_data[PARRY_REFLEX_COUNTERATTACK]) switch(data.parry_data[PARRY_REFLEX_COUNTERATTACK]) if(PARRY_COUNTERATTACK_PROC) - + switch(parrying) + if(ITEM_PARRY) + active_parry_item.active_parry_reflex_counter(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list) + if(UNARMED_PARRY) + active_parry_reflex_counter(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list) + if(MARTIAL_PARRY) + mind.martial_art.active_parry_reflex_counter(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list) if(PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN) switch(parrying) if(ITEM_PARRY) - + active_parry_item.melee_attack_chain(src, attacker, null) if(UNARMED_PARRY) - + UnarmedAttack(attacker) if(MARTIAL_PARRY) - + UnarmedAttack(attacker) if(data.parry_data[PARRY_DISARM_ATTACKER]) - + L.drop_all_held_items() + effect_text += "disarming" if(data.parry_data[PARRY_KNOCKDOWN_ATTACKER]) - + L.DefaultCombatKnockdown(data[parry_data[PARRY_KNOCKDOWN_ATTACKER]) + effect_text += "knocking them to the ground" if(data.parry_data[PARRY_STAGGER_ATTACKER]) - - if(data.parry_data[PARRY_CLICKCD_ATTACKER]) + L.Stagger(data.parry_data[PARRY_STAGGER_ATTACKER]) + effect_text += "staggering" + if(data.parry_data[PARRY_DAZE_ATTACKER]) + L.Daze(data.parry_data[PARRY_DAZE_ATTACKER]) + effect_text += "dazing" /// Gets the datum/block_parry_data we're going to use to parry. /mob/living/proc/get_parry_data()