mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-20 05:55:11 +00:00
## About The Pull Request This takes all the gib related procs: - `gib()` - `spawn_gibs()` - `spill_organs()` - `spread_bodyparts()` And adds heavy documentation that communicates what the procs are used for and how the different bitflags affect them. The difference is noticeable: `gib(TRUE, FALSE, FALSE, null)` vs `gib(DROP_ORGANS|DROP_BODYPARTS)` The code is now much more legible which is important considering it's used in a lot of places! Another robust change, is that we had several places in the code where there were double negatives like so: ``` /mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts) if(!no_bodyparts) // DOUBLE NEGATIVES ARE BAD M'KAY?!? // do stuff here ``` This is a mindfuck to untangle. I inverted a lot of these parts so we don't lose our sanity. Last thing that was changed was a big `if()` loop in the `spill_organ()` proc. This was refactored to just be a simple `for` loop with `continue` statements where we needed to skip enabled bitflags. It's now shorter and cleaner than before. The only slight gameplay change this affects is that gibbing a mob now guarantees to drop all items unless the `DROP_ITEMS` bitflag is deliberately omitted. Some places like admin gib self, we don't want this to happen. ## Why It's Good For The Game Gib code is very old. (~15 years) People kept adding more arguments to the procs when it should have been a bitflag initially. By doing it this way, there is more flexibility and readability when it comes to adding new code in the future. ## Changelog 🆑 refactor: Refactor gib code to be more robust. qol: Gibbing a mob will result in all items being dropped instead of getting deleted. There are a few exceptions (like admin gib self) where this will not take place. /🆑
207 lines
7.4 KiB
Plaintext
207 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 = (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()
|
|
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(DROP_ALL_REMAINS)
|
|
|
|
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)
|
|
. = ..()
|
|
if (!.)
|
|
return
|
|
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)
|