mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-27 09:31:54 +00:00
basically ex_act's implementation on basic mobs would call parent and then react to it's value, this is presumably to do the first check about space vine mutations and whatever. the problem is that the `/mob/living` implementation would itself also call parent, and that would always return null because `/atom/proc/ex_act` doesn't have a set return value. So, this simply would _always_ early return, with ex_act presumably *never* working on basic mobs for at least four months now. I decided to then change up the return values for pretty much all implementations of `ex_act()` since there was no rhyme or reason to returning null/FALSE/TRUE, and documenting why it's like that. Just to make sure I wasn't breaking anything doing this (at least on base implementations), I wrote a unit test for all of the three major physical types in game (objs, mobs, turfs) because i am a paranoid fuckar. we should be good to go now though. ## Why It's Good For The Game i noticed this because placing c4's on sargeant araneus wouldn't actually damage it whatsoever. now it actually does the stated 30 damage, but araneus has like 250 health so it doesn't actually matter in the long run. whatever at least it does the damn 30 now. also adds a unit test for this specific case as well as a range of other cases to ensure this stuff doesn't silently break in this way anymore
204 lines
7.4 KiB
Plaintext
204 lines
7.4 KiB
Plaintext
/mob/living/basic/attack_hand(mob/living/carbon/human/user, list/modifiers)
|
|
// so that martial arts don't double dip
|
|
if (..())
|
|
return TRUE
|
|
|
|
if(LAZYACCESS(modifiers, RIGHT_CLICK))
|
|
if(user.move_force < move_resist)
|
|
return
|
|
user.do_attack_animation(src, ATTACK_EFFECT_DISARM)
|
|
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
|
|
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] shoves [src]!"),
|
|
span_danger("You shove [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] shoves [src], pushing [p_them()]!"),
|
|
span_danger("You shove [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 = rand(active_arm.unarmed_damage_low, active_arm.unarmed_damage_high)
|
|
|
|
attack_threshold_check(damage)
|
|
log_combat(user, src, "attacked")
|
|
updatehealth()
|
|
return TRUE
|
|
|
|
/mob/living/basic/attack_hulk(mob/living/carbon/human/user)
|
|
. = ..()
|
|
if(!.)
|
|
return
|
|
playsound(loc, SFX_PUNCH, 25, TRUE, -1)
|
|
visible_message(span_danger("[user] punches [src]!"), \
|
|
span_userdanger("You're punched by [user]!"), null, COMBAT_MESSAGE_RANGE, user)
|
|
to_chat(user, span_danger("You punch [src]!"))
|
|
apply_damage(15, damagetype = BRUTE)
|
|
|
|
/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
|
|
if (!user.combat_mode)
|
|
if (health > 0)
|
|
visible_message(span_notice("[user.name] [response_help_continuous] [src]."), \
|
|
span_notice("[user.name] [response_help_continuous] you."), null, COMBAT_MESSAGE_RANGE, user)
|
|
to_chat(user, span_notice("You [response_help_simple] [src]."))
|
|
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
|
|
|
|
|
|
/mob/living/basic/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers)
|
|
. = ..()
|
|
if(!.)
|
|
return
|
|
if(LAZYACCESS(modifiers, RIGHT_CLICK))
|
|
playsound(loc, 'sound/weapons/pierce.ogg', 25, TRUE, -1)
|
|
visible_message(span_danger("[user] [response_disarm_continuous] [name]!"), \
|
|
span_userdanger("[user] [response_disarm_continuous] you!"), null, COMBAT_MESSAGE_RANGE, user)
|
|
to_chat(user, span_danger("You [response_disarm_simple] [name]!"))
|
|
log_combat(user, src, "disarmed")
|
|
return
|
|
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
|
|
visible_message(span_danger("[user] slashes at [src]!"), \
|
|
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)
|
|
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)
|
|
|
|
/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)
|
|
|
|
/mob/living/basic/attack_drone(mob/living/simple_animal/drone/attacking_drone)
|
|
if(attacking_drone.combat_mode) //No kicking dogs even as a rogue drone. Use a weapon.
|
|
return
|
|
return ..()
|
|
|
|
/mob/living/basic/attack_drone_secondary(mob/living/simple_animal/drone/attacking_drone)
|
|
if(attacking_drone.combat_mode)
|
|
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
|
|
|
|
/mob/living/basic/ex_act(severity, target, origin)
|
|
. = ..()
|
|
if(!. || QDELETED(src))
|
|
return FALSE
|
|
|
|
var/bomb_armor = getarmor(null, BOMB)
|
|
switch(severity)
|
|
if (EXPLODE_DEVASTATE)
|
|
if(prob(bomb_armor))
|
|
apply_damage(500, damagetype = BRUTE)
|
|
else
|
|
investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS)
|
|
gib()
|
|
|
|
if (EXPLODE_HEAVY)
|
|
var/bloss = 60
|
|
if(prob(bomb_armor))
|
|
bloss = bloss / 1.5
|
|
apply_damage(bloss, damagetype = BRUTE)
|
|
|
|
if (EXPLODE_LIGHT)
|
|
var/bloss = 30
|
|
if(prob(bomb_armor))
|
|
bloss = bloss / 1.5
|
|
apply_damage(bloss, damagetype = BRUTE)
|
|
|
|
return TRUE
|
|
|
|
/mob/living/basic/blob_act(obj/structure/blob/attacking_blob)
|
|
apply_damage(20, damagetype = BRUTE)
|
|
|
|
/mob/living/basic/do_attack_animation(atom/attacked_atom, visual_effect_icon, used_item, no_effect)
|
|
if(!no_effect && !visual_effect_icon && melee_damage_upper)
|
|
if(attack_vis_effect && !iswallturf(attacked_atom)) // override the standard visual effect.
|
|
visual_effect_icon = attack_vis_effect
|
|
else if(melee_damage_upper < 10)
|
|
visual_effect_icon = ATTACK_EFFECT_PUNCH
|
|
else
|
|
visual_effect_icon = ATTACK_EFFECT_SMASH
|
|
..()
|
|
|
|
/mob/living/basic/update_stat()
|
|
if(status_flags & GODMODE)
|
|
return
|
|
if(stat != DEAD)
|
|
if(health <= 0)
|
|
death()
|
|
else
|
|
set_stat(CONSCIOUS)
|
|
med_hud_set_status()
|
|
|
|
/mob/living/basic/emp_act(severity)
|
|
. = ..()
|
|
if(mob_biotypes & MOB_ROBOTIC)
|
|
emp_reaction(severity)
|
|
|
|
/mob/living/basic/proc/emp_reaction(severity)
|
|
switch(severity)
|
|
if(EMP_LIGHT)
|
|
visible_message(span_danger("[src] shakes violently, its parts coming loose!"))
|
|
apply_damage(maxHealth * 0.6)
|
|
Shake(duration = 1 SECONDS)
|
|
if(EMP_HEAVY)
|
|
visible_message(span_danger("[src] suddenly bursts apart!"))
|
|
apply_damage(maxHealth)
|