diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index af17dccaae..e7be540eb9 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -13,8 +13,6 @@ blocks_emissive = EMISSIVE_BLOCK_UNIQUE - active_block_enabled = TRUE - //Hair colour and style var/hair_color = "000" var/hair_style = "Bald" diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm index 9200dd3ca4..956b217f82 100644 --- a/code/modules/mob/living/living_active_block.dm +++ b/code/modules/mob/living/living_active_block.dm @@ -5,10 +5,10 @@ return ..() /mob/living/proc/stop_active_blocking(was_forced = FALSE) - if(!active_blocking) + if(!(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING))) return FALSE var/obj/item/I = active_block_item - active_blocking = FALSE + combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCKING | COMBAT_FLAG_ACTIVE_BLOCK_STARTING) active_block_effect_end() active_block_item = null REMOVE_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_BLOCK_TRAIT) @@ -19,14 +19,14 @@ return TRUE /mob/living/proc/start_active_blocking(obj/item/I) - if(active_blocking) + if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) return FALSE if(!(I in held_items)) return FALSE var/datum/block_parry_data/data = I.get_block_parry_data() if(!istype(data)) //Typecheck because if an admin/coder screws up varediting or something we do not want someone being broken forever, the CRASH logs feedback so we know what happened. CRASH("start_active_blocking called with an item with no valid data: [I] --> [I.block_parry_data]!") - active_blocking = TRUE + combat_flags |= COMBAT_FLAG_ACTIVE_BLOCKING active_block_item = I if(data.block_lock_attacking) ADD_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_BLOCK_TRAIT) //probably should be something else at some point @@ -47,11 +47,11 @@ /mob/living/proc/continue_starting_active_block() if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) return DO_AFTER_STOP - return (active_block_starting != ACTIVE_BLOCK_STARTING_INTERRUPT)? DO_AFTER_CONTINUE : DO_AFTER_STOP + return (combat_flags & COMBAT_FLAG_ACTIVE_BLOCK_STARTING)? DO_AFTER_CONTINUE : DO_AFTER_STOP /mob/living/get_standard_pixel_x_offset() . = ..() - if(active_blocking || active_block_starting) + if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) if(dir & EAST) . += 8 if(dir & WEST) @@ -59,7 +59,7 @@ /mob/living/get_standard_pixel_y_offset() . = ..() - if(active_blocking || active_block_starting) + if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) if(dir & NORTH) . += 8 if(dir & SOUTH) @@ -69,7 +69,7 @@ * Proc called by keybindings to toggle active blocking. */ /mob/living/proc/keybind_toggle_active_blocking() - if(active_blocking || active_block_starting) + if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) return keybind_stop_active_blocking() else return keybind_start_active_blocking() @@ -78,7 +78,7 @@ * Proc called by keybindings to start active blocking. */ /mob/living/proc/keybind_start_active_blocking() - if(active_blocking || active_block_starting) + if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) return FALSE if(!SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) to_chat(src, "You must be in combat mode to actively block!") @@ -92,23 +92,23 @@ return var/datum/block_parry_data/data = I.get_block_parry_data() var/delay = data.block_start_delay - active_block_starting = TRUE + combat_flags |= COMBAT_FLAG_ACTIVE_BLOCK_STARTING animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = delay, FALSE, SINE_EASING | EASE_IN) if(!do_after_advanced(src, delay, src, DO_AFTER_REQUIRES_USER_ON_TURF|DO_AFTER_NO_COEFFICIENT|DO_AFTER_DISALLOW_ACTIVE_ITEM_CHANGE, CALLBACK(src, .proc/continue_starting_active_block), MOBILITY_USE, null, null, I)) to_chat(src, "You fail to raise [I].") - active_block_starting = FALSE + combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING) animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN, ANIMATION_END_NOW) return - active_block_starting = FALSE + combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING) start_active_blocking(I) /** * Proc called by keybindings to stop active blocking. */ /mob/living/proc/keybind_stop_active_blocking() - if(active_block_starting) - active_block_starting = ACTIVE_BLOCK_STARTING_INTERRUPT - stop_active_blocking(FALSE) + combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING) + if(combat_flags & COMBAT_FLAG_ACTIVE_BLOCKING) + stop_active_blocking(FALSE) return TRUE /** diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm index ef23c28d70..00cc20f7bc 100644 --- a/code/modules/mob/living/living_active_parry.dm +++ b/code/modules/mob/living/living_active_parry.dm @@ -12,8 +12,11 @@ /mob/living/proc/initiate_parry_sequence() if(parrying) return // already parrying + if(!(combat_flags & COMBAT_FLAG_PARRY_CAPABLE)) + to_chat(src, "You are not something that can parry attacks.") + return if(!CHECK_MOBILITY(src, MOBILITY_USE)) - to_chat(src, "You are incapacitated, or otherwise unable to swing a weapon to parry with!") + to_chat(src, "You are incapacitated, or otherwise unable to swing a weapon to parry with!") return FALSE if(!SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) to_chat(src, "You must be in combat mode to parry!") @@ -29,7 +32,7 @@ else if(mind?.martial_art?.can_martial_parry) data = mind.martial_art.block_parry_data method = MARTIAL_PARRY - else if(parry_while_unarmed) + else if(combat_flags & COMBAT_FLAG_UNARMED_PARRY) data = block_parry_data method = UNARMED_PARRY else @@ -82,6 +85,7 @@ handle_parry_ending_effects(data, effect_text) parrying = NOT_PARRYING parry_start_time = 0 + parry_end_time_last = world.time successful_parries = null /** diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm index 0a4bf18768..1f4eae5ffb 100644 --- a/code/modules/mob/living/living_blocking_parrying.dm +++ b/code/modules/mob/living/living_blocking_parrying.dm @@ -156,7 +156,7 @@ GLOBAL_LIST_EMPTY(block_parry_data) * Called every life tick to handle blocking/parrying effects. */ /mob/living/proc/handle_block_parry(seconds = 1) - if(active_blocking) + if(combat_flags & COMBAT_FLAG_ACTIVE_BLOCKING) var/datum/block_parry_data/data = return_block_parry_datum(active_block_item.block_parry_data) adjustStaminaLossBuffered(data.block_stamina_cost_per_second * seconds) if(parrying) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index b9e8feee7f..8873e09170 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -44,7 +44,6 @@ var/obj/effect/abstract/parry/parry_visual_effect /// world.time of last parry end var/parry_end_time_last = 0 - #warn implement above /// Successful parries within the current parry cycle. It's a list of efficiency percentages. var/list/successful_parries diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index a6da43c63f..71bcef9aca 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -11,7 +11,7 @@ update_pixel_shifting() /mob/living/proc/update_pixel_shifting(moved = FALSE) - if(active_blocking) + if(combat_flags & COMBAT_FLAG_ACTIVE_BLOCKING) animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, flags = ANIMATION_END_NOW) else if(moved) if(is_shifted)