Separates the sharp flag into edge and sharp

Now weapons can properly cause cuts without necessarily having a greater
chance to remove limbs.

Also separates is_sharp, has_edge, and can_puncture.
This commit is contained in:
mwerezak
2014-06-15 20:25:39 -04:00
parent cbec032ae3
commit 1b33ca943d
39 changed files with 94 additions and 74 deletions
@@ -138,11 +138,11 @@
//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)
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0)
var/list/datum/organ/external/parts = get_damageable_organs()
if(!parts.len) return
var/datum/organ/external/picked = pick(parts)
if(picked.take_damage(brute,burn,sharp))
if(picked.take_damage(brute,burn,sharp,edge))
UpdateDamageIcon()
hud_updateflag |= 1 << HEALTH_HUD
updatehealth()
@@ -172,7 +172,7 @@
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/used_weapon = null)
/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
var/list/datum/organ/external/parts = get_damageable_organs()
var/update = 0
@@ -182,7 +182,7 @@
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
update |= picked.take_damage(brute,burn,sharp,used_weapon)
update |= picked.take_damage(brute,burn,sharp,edge,used_weapon)
brute -= (picked.brute_dam - brute_was)
burn -= (picked.burn_dam - burn_was)
@@ -227,7 +227,7 @@ This function restores all organs.
zone = "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/obj/used_weapon = null)
/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)
//visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]")
if((damagetype != BRUTE) && (damagetype != BURN))
@@ -250,11 +250,11 @@ This function restores all organs.
switch(damagetype)
if(BRUTE)
damageoverlaytemp = 20
if(organ.take_damage(damage, 0, sharp, used_weapon))
if(organ.take_damage(damage, 0, sharp, edge, used_weapon))
UpdateDamageIcon()
if(BURN)
damageoverlaytemp = 20
if(organ.take_damage(0, damage, sharp, used_weapon))
if(organ.take_damage(0, damage, sharp, edge, 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().
@@ -232,7 +232,7 @@ emp_act
if(armor >= 2) return 0
if(!I.force) return 0
apply_damage(I.force, I.damtype, affecting, armor , is_sharp(I), I)
apply_damage(I.force, I.damtype, affecting, armor , is_sharp(I), has_edge(I), I)
var/bloody = 0
if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2)))
+1 -11
View File
@@ -86,14 +86,4 @@ mob/living/carbon/monkey/react_to_attack(mob/M)
emote("me", 2, "whimpers fearfully!")
npc_fleeing = M
fleeing_duration = 30
/*/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/slash = 0, var/used_weapon = null)
if(!client && !stat)
if(damage > 10)
if(prob(40) || health == 100)
emote("me", 2, pick("screams loudly!", "whimpers in pain!"))
else if(health == 100 || (damage > 0 && prob(10)))
emote("me", 1, pick("flails about wildly!", "cringes visibly!", "chimpers nervously."))
return ..()*/
fleeing_duration = 30
+1 -1
View File
@@ -72,7 +72,7 @@
src.visible_message("\red [src] has been hit by [O].")
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [zone].", "Your armor has softened hit to your [zone].")
if(armor < 2)
apply_damage(O.throwforce*(speed/5), dtype, zone, armor, O.sharp, O)
apply_damage(O.throwforce*(speed/5), dtype, zone, armor, O)
if(!O.fingerprintslast)
return
@@ -33,7 +33,7 @@
installed = -1
uninstall()
/datum/robot_component/proc/take_damage(brute, electronics, sharp)
/datum/robot_component/proc/take_damage(brute, electronics, sharp, edge)
if(installed != 1) return
brute_damage += brute
@@ -62,7 +62,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)
/mob/living/silicon/robot/take_organ_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/edge = 0)
var/list/components = get_damageable_components()
if(!components.len)
return
@@ -86,11 +86,11 @@
var/datum/robot_component/armour/A = get_armour()
if(A)
A.take_damage(brute,burn,sharp)
A.take_damage(brute,burn,sharp,edge)
return
var/datum/robot_component/C = pick(components)
C.take_damage(brute,burn,sharp)
C.take_damage(brute,burn,sharp,edge)
/mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn)
var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
@@ -41,7 +41,7 @@
if(worn_helmet)
sting_prob -= min(worn_helmet.armor["bio"],30) // Is your helmet sealed? I can't get to 30% of your body.
if( prob(sting_prob) && (M.stat == CONSCIOUS || (M.stat == UNCONSCIOUS && prob(25))) ) // Try to sting! If you're not moving, think about stinging.
M.apply_damage(min(strength,2)+mut, BRUTE) // Stinging. The more mutated I am, the harder I sting.
M.apply_damage(min(strength,2)+mut, BRUTE, sharp=1) // Stinging. The more mutated I am, the harder I sting.
M.apply_damage((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!
M << "\red You have been stung!"
M.flash_pain()
@@ -135,7 +135,7 @@
var/mob/living/carbon/human/H = target_mob
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/datum/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1, edge=1)
return H
else if(isliving(target_mob))
var/mob/living/L = target_mob
@@ -496,7 +496,7 @@
var/mob/living/carbon/human/H = parrot_interest
var/datum/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone)))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1)
emote(pick("pecks [H]'s [affecting]", "cuts [H]'s [affecting] with its talons"))
else
+6 -6
View File
@@ -70,9 +70,9 @@
if(prob(probability))
droplimb(1)
else
take_damage(damage, 0, 1, used_weapon = "EMP")
take_damage(damage, 0, 1, 1, used_weapon = "EMP")
/datum/organ/external/proc/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list())
/datum/organ/external/proc/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
if((brute <= 0) && (burn <= 0))
return 0
@@ -95,7 +95,7 @@
//If limb took enough damage, try to cut or tear it off
if(body_part != UPPER_TORSO && body_part != LOWER_TORSO) //as hilarious as it is, getting hit on the chest too much shouldn't effectively gib you.
if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier)
if( (sharp && prob(5 * brute)) || (brute > 20 && prob(2 * brute)) )
if( (edge && prob(5 * brute)) || (brute > 20 && prob(2 * brute)) )
droplimb(1)
return
@@ -159,7 +159,7 @@
if(possible_points.len)
//And pass the pain around
var/datum/organ/external/target = pick(possible_points)
target.take_damage(brute, burn, sharp, used_weapon, forbidden_limbs + src)
target.take_damage(brute, burn, sharp, edge, used_weapon, forbidden_limbs + src)
// sync the organ's damage with its wounds
src.update_damages()
@@ -803,8 +803,8 @@ This function completely restores a damaged organ to perfect condition.
else
. = new /icon(owner.race_icon, "[icon_name]_[g]")
/datum/organ/external/head/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list())
..(brute, burn, sharp, used_weapon, forbidden_limbs)
/datum/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
..(brute, burn, sharp, edge, used_weapon, forbidden_limbs)
if (!disfigured)
if (brute_dam > 40)
if (prob(50))
+1 -1
View File
@@ -201,7 +201,7 @@
in_chamber.on_hit(M)
if (in_chamber.damage_type != HALLOSS)
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]")
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1)
user.death()
else
user << "<span class = 'notice'>Ow...</span>"
+1
View File
@@ -5,6 +5,7 @@
name = "alloy spike"
desc = "It's about a foot of weird silver metal with a wicked point."
sharp = 1
edge = 0
throwforce = 5
w_class = 2
icon = 'icons/obj/weapons.dmi'
@@ -9,6 +9,7 @@
throwforce = 8
w_class = 3.0
sharp = 1
edge = 0
/obj/item/weapon/arrow/proc/removed() //Helper for metal rods falling apart.
return
@@ -183,7 +183,7 @@
playsound(user, fire_sound, 50, 1)
user.visible_message("<span class='danger'>[user.name] fires [src] at \his head!</span>", "<span class='danger'>You fire [src] at your head!</span>", "You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!")
if(!P.nodamage)
user.apply_damage(300, BRUTE, affecting) // You are dead, dead, dead.
user.apply_damage(300, BRUTE, affecting, sharp=1) // You are dead, dead, dead.
return
..()
@@ -77,7 +77,7 @@
armor_duration /= 10
//Apply the damage!
target.apply_damage(force, BRUTE, affecting, armor_block)
target.apply_damage(force, BRUTE, affecting, armor_block, sharp=0)
// You are going to knock someone out for longer if they are not wearing a helmet.
if(affecting == "head" && istype(target, /mob/living/carbon/))
@@ -125,6 +125,8 @@
throw_range = 5
item_state = "beer"
attack_verb = list("stabbed", "slashed", "attacked")
sharp = 1
edge = 0
var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken")
/obj/item/weapon/broken_bottle/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
@@ -16,6 +16,7 @@
possible_transfer_amounts = null //list(5,10,15)
volume = 15
w_class = 1
sharp = 1
var/mode = SYRINGE_DRAW
on_reagent_change()
+4 -4
View File
@@ -62,7 +62,7 @@
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \
"\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!")
target.apply_damage(50, BRUTE, "head", 1)
target.apply_damage(50, BRUTE, "head", 1, sharp=1)
/datum/surgery_step/brain/saw_spine
allowed_tools = list(
@@ -114,7 +114,7 @@
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \
"\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!")
target.apply_damage(30, BRUTE, "head", 1)
target.apply_damage(30, BRUTE, "head", 1, sharp=1)
if (ishuman(user))
user:bloody_body(target)
user:bloody_hands(target, 0)
@@ -151,7 +151,7 @@
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\red [user]'s hand slips, jabbing \the [tool] in [target]'s brain!", \
"\red Your hand slips, jabbing \the [tool] in [target]'s brain!")
target.apply_damage(30, BRUTE, "head", 1)
target.apply_damage(30, BRUTE, "head", 1, sharp=1)
/datum/surgery_step/brain/hematoma
allowed_tools = list(
@@ -181,7 +181,7 @@
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\red [user]'s hand slips, bruising [target]'s brain with \the [tool]!", \
"\red Your hand slips, bruising [target]'s brain with \the [tool]!")
target.apply_damage(20, BRUTE, "head", 1)
target.apply_damage(20, BRUTE, "head", 1, sharp=1)
//////////////////////////////////////////////////////////////////
// SLIME CORE EXTRACTION //
+1 -1
View File
@@ -104,7 +104,7 @@
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \
"\red Your hand slips, stabbing \the [tool] into [target]'s eye!")
target.apply_damage(10, BRUTE, affected)
target.apply_damage(10, BRUTE, affected, sharp=1)
eyes.take_damage(5, 0)
/datum/surgery_step/eye/cauterize
+1 -1
View File
@@ -98,7 +98,7 @@
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \
"\red Your hand slips, tearing skin on [target]'s face with \the [tool]!")
target.apply_damage(10, BRUTE, affected)
target.apply_damage(10, BRUTE, affected, sharp=1, sharp=1)
/datum/surgery_step/face/cauterize
allowed_tools = list(
+1 -1
View File
@@ -228,7 +228,7 @@
msg = "\red [user]'s hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]"
self_msg = "\red Your hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!"
user.visible_message(msg, self_msg)
target.apply_damage(12, BRUTE, affected)
target.apply_damage(12, BRUTE, affected, sharp=1)
/datum/surgery_step/generic/cauterize
allowed_tools = list(
+1 -1
View File
@@ -189,4 +189,4 @@
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s neck!", \
"\red Your hand slips, damaging connectors on [target]'s neck!")
target.apply_damage(10, BRUTE, affected)
target.apply_damage(10, BRUTE, affected, sharp=1)
+2 -2
View File
@@ -85,7 +85,7 @@
affected = affected.parent
user.visible_message("\red [user]'s hand slips, tearing flesh on [target]'s [affected.display_name]!", \
"\red Your hand slips, tearing flesh on [target]'s [affected.display_name]!")
target.apply_damage(10, BRUTE, affected)
target.apply_damage(10, BRUTE, affected, sharp=1)
/datum/surgery_step/limb/prepare
@@ -166,4 +166,4 @@
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \
"\red Your hand slips, damaging connectors on [target]'s [affected.display_name]!")
target.apply_damage(10, BRUTE, affected)
target.apply_damage(10, BRUTE, affected, sharp=1)