Remove sharp/edge in procs and consolidate them into damage flags. (#8672)

This commit is contained in:
Matt Atlas
2020-04-30 20:29:35 +02:00
committed by GitHub
parent bf4e3d939d
commit 105cb5d64e
41 changed files with 194 additions and 176 deletions
@@ -98,13 +98,12 @@
effective_force *= 2
//Apply weapon damage
var/weapon_sharp = is_sharp(I)
var/weapon_edge = has_edge(I)
var/damage_flags = I.damage_flags()
if(prob(blocked)) //armour provides a chance to turn sharp/edge weapon attacks into blunt ones
weapon_sharp = 0
weapon_edge = 0
damage_flags &= ~DAM_SHARP
damage_flags &= ~DAM_EDGE
apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
apply_damage(effective_force, I.damtype, hit_zone, blocked, used_weapon=I, damage_flags = damage_flags)
//Melee weapon embedded object code.
if (I && I.damtype == BRUTE && !I.anchored && !is_robot_module(I))
@@ -114,11 +113,13 @@
if (I.can_embed)//If this weapon is allowed to embed in people
//blunt objects should really not be embedding in things unless a huge amount of force is involved
var/embed_chance = weapon_sharp? damage/I.w_class : damage/(I.w_class*3)
var/embed_threshold = weapon_sharp? 5*I.w_class : 15*I.w_class
var/sharp = damage_flags & DAM_SHARP
var/edge = damage_flags & DAM_EDGE
var/embed_chance = sharp? damage/I.w_class : damage/(I.w_class*3)
var/embed_threshold = edge? 5*I.w_class : 15*I.w_class
//Sharp objects will always embed if they do enough damage.
if((weapon_sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance)))
if((sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance)))
src.embed(I, hit_zone)
return 1
@@ -134,9 +135,9 @@
// Knifing
/mob/living/carbon/proc/attack_throat(obj/item/W, obj/item/grab/G, mob/user)
if(!W.edge || !W.force || W.damtype != BRUTE)
return 0 //unsuitable weapon
var/damage_flags = W.damage_flags()
if(!(damage_flags & (DAM_SHARP|DAM_EDGE)) || W.damtype != BRUTE)
return FALSE //unsuitable weapon
user.visible_message("<span class='danger'>\The [user] begins to slit [src]'s throat with \the [W]!</span>")
@@ -156,7 +157,7 @@
var/total_damage = 0
for(var/i in 1 to 3)
var/damage = min(W.force*1.5, 20)*damage_mod
apply_damage(damage, W.damtype, BP_HEAD, 0, sharp=W.sharp, edge=W.edge)
apply_damage(damage, W.damtype, BP_HEAD, 0, used_weapon = W, damage_flags = damage_flags)
total_damage += damage
var/oxyloss = total_damage
@@ -308,8 +308,7 @@
var/real_damage = rand_damage
var/hit_dam_type = attack.damage_type
var/is_sharp = 0
var/is_edge = 0
var/damage_flags = attack.damage_flags()
real_damage += attack.get_unarmed_damage(H)
real_damage *= damage_multiplier
@@ -329,28 +328,16 @@
if(H.pulling_punches)
hit_dam_type = PAIN
if(G.sharp)
is_sharp = 1
if(G.edge)
is_edge = 1
if(istype(H.gloves,/obj/item/clothing/gloves/force))
var/obj/item/clothing/gloves/force/X = H.gloves
real_damage *= X.amplification
if(attack.sharp)
is_sharp = 1
if(attack.edge)
is_edge = 1
var/armour = run_armor_check(hit_zone, "melee")
// Apply additional unarmed effects.
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
// Finally, apply damage to target
apply_damage(real_damage, hit_dam_type, hit_zone, armour, sharp=is_sharp, edge=is_edge)
apply_damage(real_damage, hit_dam_type, hit_zone, armour, damage_flags = damage_flags)
if(M.resting && src.help_up_offer)
@@ -75,7 +75,6 @@
amount += O.burn_dam
return amount
/mob/living/carbon/human/adjustBruteLoss(var/amount)
if(amount > 0)
take_overall_damage(amount, 0)
@@ -90,32 +89,6 @@
heal_overall_damage(0, -amount)
BITSET(hud_updateflag, HEALTH_HUD)
/mob/living/carbon/human/proc/adjustBruteLossByPart(var/amount, var/organ_name, var/obj/damage_source = null)
if (organ_name in organs_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
if(amount > 0)
amount *= brute_mod
O.take_damage(amount, 0, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source)
else
//if you don't want to heal robot organs, they you will have to check that yourself before using this proc.
O.heal_damage(-amount, 0, internal=0, robo_repair=(O.status & ORGAN_ROBOT))
BITSET(hud_updateflag, HEALTH_HUD)
/mob/living/carbon/human/proc/adjustFireLossByPart(var/amount, var/organ_name, var/obj/damage_source = null)
if (organ_name in organs_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
if(amount > 0)
amount *= burn_mod
O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source)
else
//if you don't want to heal robot organs, they you will have to check that yourself before using this proc.
O.heal_damage(0, -amount, internal=0, robo_repair=(O.status & ORGAN_ROBOT))
BITSET(hud_updateflag, HEALTH_HUD)
/mob/living/carbon/human/Stun(amount)
if(HULK in mutations)
return
@@ -307,15 +280,16 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
//Damages ONE external organ, organ gets randomly selected from damagable ones.
//It automatically updates damage overlays if necesary
//It automatically updates health status
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0)
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/damage_flags)
var/list/obj/item/organ/external/parts = get_damageable_organs()
if(!parts.len) return
if(!parts.len)
return
var/obj/item/organ/external/picked = pick(parts)
if(picked.take_damage(brute,burn,sharp,edge))
if(picked.take_damage(brute, burn, damage_flags))
UpdateDamageIcon()
BITSET(hud_updateflag, HEALTH_HUD)
updatehealth()
speech_problem_flag = 1
speech_problem_flag = TRUE
//Heal MANY external organs, in random order
@@ -341,8 +315,9 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
if(update) UpdateDamageIcon()
// damage MANY external organs, in random order
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null)
if(status_flags & GODMODE) return //godmode
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/damage_flags, var/used_weapon = null)
if(status_flags & GODMODE)
return //godmode
var/list/obj/item/organ/external/parts = get_damageable_organs()
var/update = 0
while(parts.len && (brute>0 || burn>0) )
@@ -351,14 +326,15 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
update |= picked.take_damage(brute,burn,sharp,edge,used_weapon)
update |= picked.take_damage(brute, burn, damage_flags, used_weapon)
brute -= (picked.brute_dam - brute_was)
burn -= (picked.burn_dam - burn_was)
parts -= picked
updatehealth()
BITSET(hud_updateflag, HEALTH_HUD)
if(update) UpdateDamageIcon()
if(update)
UpdateDamageIcon()
////////////////////////////////////////////
@@ -396,8 +372,7 @@ This function restores all organs.
zone = BP_HEAD
return organs_by_name[zone]
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null, var/damage_flags)
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/obj/used_weapon = null, var/damage_flags)
//visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]")
if (invisibility == INVISIBILITY_LEVEL_TWO && back && (istype(back, /obj/item/rig)))
if(damage > 0)
@@ -440,14 +415,14 @@ This function restores all organs.
damageoverlaytemp = 20
if(damage > 0)
damage *= species.brute_mod
if(organ.take_damage(damage, 0, sharp, edge, used_weapon, damage_flags = damage_flags))
if(organ.take_damage(damage, 0, damage_flags, used_weapon))
UpdateDamageIcon()
if(BURN)
damageoverlaytemp = 20
if(damage > 0)
damage *= species.burn_mod
if(organ.take_damage(0, damage, sharp, edge, used_weapon, damage_flags = damage_flags))
if(organ.take_damage(0, damage, damage_flags, used_weapon))
UpdateDamageIcon()
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
@@ -390,7 +390,8 @@ emp_act
var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened the hit to your [hit_area].") //I guess "melee" is the best fit here
if(armor < 100)
apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O)
var/damage_flags = O.damage_flags()
apply_damage(throw_damage, dtype, zone, armor, O, damage_flags = damage_flags)
if(ismob(O.thrower))
var/mob/M = O.thrower
@@ -369,14 +369,14 @@ mob/living/carbon/human/proc/change_monitor()
to_chat(H, SPAN_WARNING("They are missing that limb!"))
return
H.apply_damage(25, BRUTE, hit_zone, sharp = TRUE, edge = TRUE)
H.apply_damage(25, BRUTE, hit_zone, damage_flags = DAM_SHARP|DAM_EDGE)
visible_message(SPAN_WARNING("<b>\The [src]</b> rips viciously at \the [G.affecting]'s [affected] with its mandibles!"))
msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(H)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)",ckey=key_name(src),ckey_target=key_name(H))
else
var/mob/living/M = G.affecting
if(!istype(M))
return
M.apply_damage(25, BRUTE, sharp = TRUE, edge = TRUE)
M.apply_damage(25, BRUTE, damage_flags = DAM_SHARP|DAM_EDGE)
visible_message(SPAN_WARNING("<b>\The [src]</b> rips viciously at \the [G.affecting]'s flesh with its mandibles!"))
msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(M)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)",ckey=key_name(src),ckey_target=key_name(M))
playsound(get_turf(src), 'sound/weapons/slash.ogg', 50, TRUE)
@@ -115,6 +115,13 @@ var/global/list/sparring_attack_cache = list()
user.visible_message("<span class='danger'>[user] presses \his [eye_attack_text] into [target]'s [eyes.name]!</span>")
to_chat(target, "<span class='danger'>You experience[(!target.can_feel_pain())? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(!target.can_feel_pain())? "." : "!"]</span>")
/datum/unarmed_attack/proc/damage_flags()
. = 0
if(sharp)
. |= DAM_SHARP
if(edge)
. |= DAM_EDGE
/datum/unarmed_attack/bite
attack_verb = list("bit")
attack_sound = 'sound/weapons/bite.ogg'
+1 -1
View File
@@ -8,7 +8,7 @@
standard 0 if fail
*/
/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0, var/damage_flags)
/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null, var/damage_flags)
if(!damage || (blocked >= 100))
return 0
switch(damagetype)
+10 -12
View File
@@ -89,15 +89,13 @@
//Armor
var/absorb = run_armor_check(def_zone, P.check_armour, P.armor_penetration)
var/proj_sharp = is_sharp(P)
var/proj_edge = has_edge(P)
var/damaged
if ((proj_sharp || proj_edge) && prob(absorb))
proj_sharp = 0
proj_edge = 0
if ((P.damage_flags & DAM_SHARP || P.damage_flags & DAM_SHARP) && prob(absorb))
P.damage_flags &= ~DAM_SHARP
P.damage_flags &= ~DAM_EDGE
if(!P.nodamage)
damaged = apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=proj_sharp, edge=proj_edge, damage_flags = P.damage_flags, used_weapon = "\a [P.name]")
damaged = apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, damage_flags = P.damage_flags, used_weapon = "\a [P.name]")
bullet_impact_visuals(P, def_zone, damaged)
P.on_hit(src, absorb, def_zone)
return absorb
@@ -161,13 +159,12 @@
effective_force *= 2
//Apply weapon damage
var/weapon_sharp = is_sharp(I)
var/weapon_edge = has_edge(I)
var/damage_flags = I.damage_flags()
if(prob(blocked)) //armour provides a chance to turn sharp/edge weapon attacks into blunt ones
weapon_sharp = 0
weapon_edge = 0
damage_flags &= ~DAM_SHARP
damage_flags &= ~DAM_EDGE
apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
apply_damage(effective_force, I.damtype, hit_zone, blocked, used_weapon=I, damage_flags = damage_flags)
return 1
@@ -190,7 +187,8 @@
src.visible_message("<span class='warning'>[src] has been hit by [O].</span>")
var/armor = run_armor_check(null, "melee")
apply_damage(throw_damage, dtype, null, armor, is_sharp(O), has_edge(O), O)
var/damage_flags = O.damage_flags()
apply_damage(throw_damage, dtype, null, armor, O, damage_flags = damage_flags)
O.throwing = 0 //it hit, so stop moving
@@ -44,13 +44,15 @@
/datum/robot_component/proc/get_damage(var/type)
return Clamp(brute_damage + electronics_damage,0,max_damage)
/datum/robot_component/proc/take_damage(brute, electronics, sharp, edge)
if(installed != 1) return
/datum/robot_component/proc/take_damage(brute, electronics, damage_flags)
if(installed != 1)
return
brute_damage += brute
electronics_damage += electronics
if(brute_damage + electronics_damage >= max_damage) destroy()
if(brute_damage + electronics_damage >= max_damage)
destroy()
/datum/robot_component/proc/heal_damage(brute, electronics)
if(installed != 1)
@@ -3,7 +3,7 @@
var/fireloss = 0
var/bruteloss = 0
/mob/living/silicon/robot/drone/take_overall_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/used_weapon = null)
/mob/living/silicon/robot/drone/take_overall_damage(var/brute = 0, var/burn = 0, var/damage_flags, var/used_weapon = null)
bruteloss += brute
fireloss += burn
@@ -16,8 +16,8 @@
if(fireloss < 0)
fireloss = 0
/mob/living/silicon/robot/drone/take_organ_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/emp = 0)
take_overall_damage(brute,burn)
/mob/living/silicon/robot/drone/take_organ_damage(var/brute = 0, var/burn, var/damage_flags, var/emp = 0)
take_overall_damage(brute, burn)
/mob/living/silicon/robot/drone/heal_organ_damage(var/brute, var/burn)
heal_overall_damage(brute,burn)
@@ -69,7 +69,7 @@
var/datum/robot_component/picked = pick(parts)
picked.heal_damage(brute, burn)
/mob/living/silicon/robot/take_organ_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/edge = 0, var/emp = 0)
/mob/living/silicon/robot/take_organ_damage(var/brute = 0, var/burn = 0, var/damage_flags, var/emp = 0)
var/list/components = get_damageable_components()
if(!length(components))
return
@@ -94,11 +94,11 @@
if(!emp)
var/datum/robot_component/armor/A = get_armour()
if(A)
A.take_damage(brute, burn, sharp, edge)
A.take_damage(brute, burn, damage_flags)
return
var/datum/robot_component/C = pick(components)
C.take_damage(brute, burn, sharp, edge)
C.take_damage(brute, burn, damage_flags)
/mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn)
var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
@@ -116,7 +116,7 @@
parts -= picked
/mob/living/silicon/robot/take_overall_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/used_weapon = null)
/mob/living/silicon/robot/take_overall_damage(var/brute = 0, var/burn = 0, var/damage_flags, var/used_weapon = null)
if(status_flags & GODMODE)
return
@@ -140,7 +140,7 @@
var/datum/robot_component/armor/A = get_armour()
if(A)
A.take_damage(brute, burn, sharp)
A.take_damage(brute, burn, damage_flags)
return
while(length(parts) && (brute > 0 || burn > 0))
@@ -92,7 +92,7 @@
else
prob_mult -= 0.01 *(min(LAZYACCESS(worn_helmet.armor, "bio"), 30))// Is your helmet sealed? I can't get to 30% of your body.
if( prob(sting_prob*prob_mult) && (M.stat == CONSCIOUS || (M.stat == UNCONSCIOUS && prob(25*prob_mult))) ) // Try to sting! If you're not moving, think about stinging.
M.apply_damage(min(strength*0.85,2)+mut, BURN, sharp=1) // Stinging. The more mutated I am, the harder I sting.
M.apply_damage(min(strength*0.85,2)+mut, BURN, damage_flags = DAM_SHARP) // Stinging. The more mutated I am, the harder I sting.
M.apply_damage(max(strength*0.2,(round(feral/10,1)*(max((round(strength/20,1)),1)))+toxic), TOX) // Bee venom based on how angry I am and how many there are of me!
to_chat(M, "<span class='warning'>You have been stung!</span>")
M.flash_pain()
@@ -481,7 +481,7 @@
var/mob/living/carbon/human/H = parrot_interest
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone)))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1)
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), damage_flags = DAM_SHARP)
visible_emote(pick("pecks [H]'s [affecting].", "cuts [H]'s [affecting] with its talons."))
else
@@ -92,7 +92,7 @@
var/datum/weakref/original_body
var/datum/weakref/possessed_body
/mob/living/simple_animal/shade/bluespace/apply_damage(var/damage_flags, var/def_zone, var/edge, var/sharp, var/used_weapon)
/mob/living/simple_animal/shade/bluespace/apply_damage(var/damage_flags, var/def_zone, var/used_weapon)
return 0
/mob/living/simple_animal/shade/bluespace/adjustBruteLoss()