mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-14 09:35:30 +01:00
Mob attackedby / check_block refactor, plus some minor cleanup of attack_x procs (#79563)
## About The Pull Request - Deletes `spec_attacked_by` - Elements simple/basic mob attack threshold - There was a skeleton mob that "mimics armor" but didn't use the actual mimicing armor thing we have, so I changed that. - Moves `check_shields` down to the living level, renames it to `check_block` - Martial art blocking is now signalized (only CQC uses it anyways) - Cleaned up a bit of `attack_x` procs, but not a lot. Should have an entire PR dedicated to this .... mess. - Deprecates `/obj/item/melee` ## Why It's Good For The Game Second verse, same as the first. - Less bad species related procs. - Largely brings a lot of code in line, making combat more consistent across types. - Makes it a lot easier to add new code relating to blocking or taking damage. ## Changelog 🆑 Melbert refactor: Refactored another large chuck of attack code, primarily involving melee item attacks and non-human mob attacks. Report if you see anything weird fix: Pacifists clicking on simple robots or silicons no longer causes sparks fix: Blocked thrown batons are now properly... blocked /🆑
This commit is contained in:
@@ -11,40 +11,58 @@
|
||||
var/shove_dir = get_dir(user, src)
|
||||
if(!Move(get_step(src, shove_dir), shove_dir))
|
||||
log_combat(user, src, "shoved", "failing to move it")
|
||||
user.visible_message(span_danger("[user.name] [response_disarm_continuous] [src]!"),
|
||||
span_danger("You [response_disarm_simple] [src]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, list(src))
|
||||
user.visible_message(
|
||||
span_danger("[user.name] [response_disarm_continuous] [src]!"),
|
||||
span_danger("You [response_disarm_simple] [src]!"),
|
||||
span_hear("You hear aggressive shuffling!"),
|
||||
COMBAT_MESSAGE_RANGE,
|
||||
list(src),
|
||||
)
|
||||
to_chat(src, span_userdanger("You're shoved by [user.name]!"))
|
||||
return TRUE
|
||||
log_combat(user, src, "shoved", "pushing it")
|
||||
user.visible_message(span_danger("[user.name] [response_disarm_continuous] [src], pushing [p_them()]!"),
|
||||
span_danger("You [response_disarm_simple] [src], pushing [p_them()]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, list(src))
|
||||
user.visible_message(
|
||||
span_danger("[user.name] [response_disarm_continuous] [src], pushing [p_them()]!"),
|
||||
span_danger("You [response_disarm_simple] [src], pushing [p_them()]!"),
|
||||
span_hear("You hear aggressive shuffling!"),
|
||||
COMBAT_MESSAGE_RANGE,
|
||||
list(src),
|
||||
)
|
||||
to_chat(src, span_userdanger("You're pushed by [user.name]!"))
|
||||
return TRUE
|
||||
|
||||
if(!user.combat_mode)
|
||||
if (stat == DEAD)
|
||||
return
|
||||
visible_message(span_notice("[user] [response_help_continuous] [src]."), \
|
||||
span_notice("[user] [response_help_continuous] you."), null, null, user)
|
||||
to_chat(user, span_notice("You [response_help_simple] [src]."))
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
|
||||
else
|
||||
if(HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
to_chat(user, span_warning("You don't want to hurt [src]!"))
|
||||
return
|
||||
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
|
||||
visible_message(span_danger("[user] [response_harm_continuous] [src]!"),\
|
||||
span_userdanger("[user] [response_harm_continuous] you!"), null, COMBAT_MESSAGE_RANGE, user)
|
||||
to_chat(user, span_danger("You [response_harm_simple] [src]!"))
|
||||
playsound(loc, attacked_sound, 25, TRUE, -1)
|
||||
var/obj/item/bodypart/arm/active_arm = user.get_active_hand()
|
||||
var/damage = (basic_mob_flags & IMMUNE_TO_FISTS) ? 0 : rand(active_arm.unarmed_damage_low, active_arm.unarmed_damage_high)
|
||||
|
||||
attack_threshold_check(damage)
|
||||
log_combat(user, src, "attacked")
|
||||
updatehealth()
|
||||
if (stat != DEAD)
|
||||
visible_message(
|
||||
span_notice("[user] [response_help_continuous] [src]."),
|
||||
span_notice("[user] [response_help_continuous] you."),
|
||||
ignored_mobs = user,
|
||||
)
|
||||
to_chat(user, span_notice("You [response_help_simple] [src]."))
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
|
||||
return TRUE
|
||||
|
||||
if(HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
to_chat(user, span_warning("You don't want to hurt [src]!"))
|
||||
return TRUE
|
||||
var/obj/item/bodypart/arm/active_arm = user.get_active_hand()
|
||||
var/damage = (basic_mob_flags & IMMUNE_TO_FISTS) ? 0 : rand(active_arm.unarmed_damage_low, active_arm.unarmed_damage_high)
|
||||
if(check_block(user, damage, "[user]'s punch", UNARMED_ATTACK, 0, BRUTE))
|
||||
return
|
||||
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
|
||||
visible_message(
|
||||
span_danger("[user] [response_harm_continuous] [src]!"),
|
||||
span_userdanger("[user] [response_harm_continuous] you!"),
|
||||
vision_distance = COMBAT_MESSAGE_RANGE,
|
||||
ignored_mobs = user,
|
||||
)
|
||||
to_chat(user, span_danger("You [response_harm_simple] [src]!"))
|
||||
playsound(loc, attacked_sound, 25, TRUE, -1)
|
||||
apply_damage(damage)
|
||||
log_combat(user, src, "attacked")
|
||||
updatehealth()
|
||||
return TRUE
|
||||
|
||||
/mob/living/basic/attack_hulk(mob/living/carbon/human/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
@@ -58,9 +76,8 @@
|
||||
/mob/living/basic/attack_paw(mob/living/carbon/human/user, list/modifiers)
|
||||
if(..()) //successful monkey bite.
|
||||
if(stat != DEAD)
|
||||
var/damage = rand(1, 3)
|
||||
attack_threshold_check(damage)
|
||||
return 1
|
||||
return apply_damage(rand(1, 3))
|
||||
|
||||
if (!user.combat_mode)
|
||||
if (health > 0)
|
||||
visible_message(span_notice("[user.name] [response_help_continuous] [src]."), \
|
||||
@@ -85,29 +102,22 @@
|
||||
span_userdanger("You're slashed at by [user]!"), null, COMBAT_MESSAGE_RANGE, user)
|
||||
to_chat(user, span_danger("You slash at [src]!"))
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, TRUE, -1)
|
||||
attack_threshold_check(damage)
|
||||
apply_damage(damage)
|
||||
log_combat(user, src, "attacked")
|
||||
|
||||
/mob/living/basic/attack_larva(mob/living/carbon/alien/larva/attacking_larva, list/modifiers)
|
||||
. = ..()
|
||||
if(. && stat != DEAD) //successful larva bite
|
||||
var/damage = rand(attacking_larva.melee_damage_lower, attacking_larva.melee_damage_upper)
|
||||
. = attack_threshold_check(damage)
|
||||
if(.)
|
||||
attacking_larva.amount_grown = min(attacking_larva.amount_grown + damage, attacking_larva.max_grown)
|
||||
|
||||
/mob/living/basic/attack_animal(mob/living/simple_animal/user, list/modifiers)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
|
||||
return attack_threshold_check(damage, user.melee_damage_type)
|
||||
var/damage_done = apply_damage(rand(attacking_larva.melee_damage_lower, attacking_larva.melee_damage_upper), BRUTE)
|
||||
if(damage_done > 0)
|
||||
attacking_larva.amount_grown = min(attacking_larva.amount_grown + damage_done, attacking_larva.max_grown)
|
||||
|
||||
/mob/living/basic/attack_slime(mob/living/simple_animal/slime/M, list/modifiers)
|
||||
if(..()) //successful slime attack
|
||||
var/damage = rand(15, 25)
|
||||
if(M.is_adult)
|
||||
damage = rand(20, 35)
|
||||
return attack_threshold_check(damage)
|
||||
return apply_damage(damage, M.melee_damage_type)
|
||||
|
||||
/mob/living/basic/attack_drone(mob/living/basic/drone/attacking_drone)
|
||||
if(attacking_drone.combat_mode) //No kicking dogs even as a rogue drone. Use a weapon.
|
||||
@@ -119,20 +129,6 @@
|
||||
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
|
||||
return ..()
|
||||
|
||||
/mob/living/basic/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = MELEE, actuallydamage = TRUE)
|
||||
var/temp_damage = damage
|
||||
if(!damage_coeff[damagetype])
|
||||
temp_damage = 0
|
||||
else
|
||||
temp_damage *= damage_coeff[damagetype]
|
||||
if(temp_damage >= 0 && temp_damage <= force_threshold)
|
||||
visible_message(span_warning("[src] looks unharmed!"))
|
||||
return FALSE
|
||||
else
|
||||
if(actuallydamage)
|
||||
apply_damage(damage, damagetype, blocked = getarmor(null, armorcheck))
|
||||
return TRUE
|
||||
|
||||
/mob/living/basic/check_projectile_armor(def_zone, obj/projectile/impacting_projectile, is_silent)
|
||||
return 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user