mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-18 02:25:06 +01:00
Soakn't (#18647)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
@@ -104,14 +104,12 @@
|
||||
desc = "A mesh armor plate made of steel-reinforced synthetic fibers, great for dealing with small blades. Attaches to a plate carrier."
|
||||
icon_state = "armor_stab"
|
||||
armor = list(melee = 30, bullet = 5, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0)
|
||||
armorsoak = list(melee = 7, bullet = 5, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/accessory/armor/armorplate/blast
|
||||
name = "gel armor plate"
|
||||
desc = "A gel armor plate made of high-grade polymers, great for dealing with localized blasts. Attaches to a plate carrier."
|
||||
icon_state = "armor_blast"
|
||||
armor = list(melee = 25, bullet = 25, laser = 10, energy = 0, bomb = 30, bio = 0, rad = 0)
|
||||
armorsoak = list(melee = 5, bullet = 7, laser = 0, energy = 0, bomb = 40, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/accessory/armor/armorplate/medium
|
||||
name = "medium armor plate"
|
||||
@@ -137,7 +135,6 @@
|
||||
icon_state = "armor_ballistic"
|
||||
slowdown = 0.5
|
||||
armor = list(melee = 10, bullet = 70, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
armorsoak = list(melee = 0, bullet = 10, laser = 0, energy = 5, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.7
|
||||
|
||||
/obj/item/clothing/accessory/armor/armorplate/riot
|
||||
@@ -146,7 +143,6 @@
|
||||
icon_state = "armor_riot"
|
||||
slowdown = 0.5
|
||||
armor = list(melee = 70, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
armorsoak = list(melee = 10, bullet = 0, laser = 0, energy = 5, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.7
|
||||
|
||||
/obj/item/clothing/accessory/armor/armorplate/laserproof
|
||||
@@ -155,7 +151,6 @@
|
||||
icon_state = "armor_ablative"
|
||||
slowdown = 0.5
|
||||
armor = list(melee = 10, bullet = 10, laser = 70, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
armorsoak = list(melee = 0, bullet = 0, laser = 10, energy = 15, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.1
|
||||
|
||||
/obj/item/clothing/accessory/armor/armorplate/ablative/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
|
||||
@@ -161,7 +161,6 @@
|
||||
piece.permeability_coefficient = permeability_coefficient
|
||||
piece.unacidable = unacidable
|
||||
if(islist(armor)) piece.armor = armor.Copy()
|
||||
if(islist(armorsoak)) piece.armorsoak = armorsoak.Copy()
|
||||
|
||||
update_icon(1)
|
||||
|
||||
|
||||
@@ -1143,7 +1143,6 @@
|
||||
/obj/item/clothing/under/explorer/armored
|
||||
desc = "A green uniform for operating in hazardous environments. This one looks like it's been modified."
|
||||
armor = list(melee = 10, bullet = 10, laser = 10,energy = 10, bomb = 10, bio = 10, rad = 30)
|
||||
armorsoak = list(melee = 5, bullet = 5, laser = 5,energy = 5, bomb = 5, bio = 5, rad = 0)
|
||||
|
||||
/obj/item/clothing/under/cohesion
|
||||
name = "black cohesion suit"
|
||||
|
||||
@@ -172,7 +172,6 @@
|
||||
return TRUE
|
||||
var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting))
|
||||
var/armor_block = target.run_armor_check(affecting, "melee")
|
||||
var/armor_soak = target.get_armor_soak(affecting, "melee")
|
||||
|
||||
if(HULK in user.mutations)
|
||||
damage += 5
|
||||
@@ -181,10 +180,7 @@
|
||||
|
||||
target.visible_message(span_bolddanger("[user] has punched [target]!"))
|
||||
|
||||
if(armor_soak >= damage)
|
||||
return TRUE
|
||||
|
||||
target.apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak)
|
||||
target.apply_damage(damage, HALLOSS, affecting, armor_block)
|
||||
if(damage >= 9)
|
||||
target.visible_message(span_bolddanger("[user] has weakened [target]!"))
|
||||
target.apply_effect(4, WEAKEN, armor_block)
|
||||
|
||||
@@ -129,7 +129,6 @@
|
||||
|
||||
if(!target_limb) target_limb = pick(BP_ALL)
|
||||
var/blocked = target.run_armor_check(target_limb, "melee")
|
||||
var/soaked = target.get_armor_soak(target_limb, "melee")
|
||||
|
||||
if(blocked >= 100)
|
||||
return
|
||||
@@ -143,7 +142,7 @@
|
||||
|
||||
if(affecting)
|
||||
to_chat(target, span_danger("\The [fruit]'s thorns pierce your [affecting.name] greedily!"))
|
||||
target.apply_damage(damage, BRUTE, target_limb, blocked, soaked, TRUE, has_edge)
|
||||
target.apply_damage(damage, BRUTE, target_limb, blocked, TRUE, has_edge)
|
||||
else
|
||||
to_chat(target, span_danger("\The [fruit]'s thorns pierce your flesh greedily!"))
|
||||
target.adjustBruteLoss(damage)
|
||||
@@ -152,7 +151,7 @@
|
||||
has_edge = prob(get_trait(TRAIT_POTENCY)/5)
|
||||
if(affecting)
|
||||
to_chat(target, span_danger("\The [fruit]'s thorns dig deeply into your [affecting.name]!"))
|
||||
target.apply_damage(damage, BRUTE, target_limb, blocked, soaked, TRUE, has_edge)
|
||||
target.apply_damage(damage, BRUTE, target_limb, blocked, TRUE, has_edge)
|
||||
else
|
||||
to_chat(target, span_danger("\The [fruit]'s thorns dig deeply into your flesh!"))
|
||||
target.adjustBruteLoss(damage)
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
|
||||
// Note that these are combined with the mob's real armor values additatively. You can also omit specific armor types.
|
||||
var/list/armor_percent = null // List of armor values to add to the holder when doing armor calculations. This is for percentage based armor. E.g. 50 = half damage.
|
||||
var/list/armor_flat = null // Same as above but only for flat armor calculations. E.g. 5 = 5 less damage (this comes after percentage).
|
||||
// Unlike armor, this is multiplicative. Two 50% protection modifiers will be combined into 75% protection (assuming no base protection on the mob).
|
||||
var/heat_protection = null // Modifies how 'heat' protection is calculated, like wearing a firesuit. 1 = full protection.
|
||||
var/cold_protection = null // Ditto, but for cold, like wearing a winter coat.
|
||||
|
||||
@@ -4,14 +4,10 @@
|
||||
return null
|
||||
..()
|
||||
|
||||
/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
|
||||
/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
|
||||
if(!effective_force || blocked >= 100)
|
||||
return 0
|
||||
|
||||
//If the armor soaks all of the damage, it just skips the rest of the checks
|
||||
if(effective_force <= soaked)
|
||||
return 0
|
||||
|
||||
//Apply weapon damage
|
||||
var/weapon_sharp = is_sharp(I)
|
||||
var/weapon_edge = has_edge(I)
|
||||
@@ -21,7 +17,7 @@
|
||||
weapon_edge = 0
|
||||
hit_embed_chance = I.force/(I.w_class*3)
|
||||
|
||||
apply_damage(effective_force, I.damtype, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
|
||||
apply_damage(effective_force, I.damtype, hit_zone, blocked, weapon_sharp, weapon_edge, I)
|
||||
|
||||
//Melee weapon embedded object code.
|
||||
if (I && I.damtype == BRUTE && !I.anchored && !is_robot_module(I) && I.embed_chance > 0)
|
||||
|
||||
@@ -222,11 +222,6 @@
|
||||
if (prob(50) && !shielded)
|
||||
Paralyse(10)
|
||||
|
||||
var/blastsoak = getsoak(null, "bomb")
|
||||
|
||||
b_loss = max(1, b_loss - blastsoak)
|
||||
f_loss = max(1, f_loss - blastsoak)
|
||||
|
||||
var/update = 0
|
||||
|
||||
// focus most of the blast on one organ
|
||||
|
||||
@@ -399,12 +399,11 @@
|
||||
real_damage = max(1, real_damage)
|
||||
|
||||
var/armour = run_armor_check(hit_zone, "melee")
|
||||
var/soaked = get_armor_soak(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, soaked, sharp=attack.sharp, edge=attack.edge)
|
||||
apply_damage(real_damage, hit_dam_type, hit_zone, armour, attack.sharp, attack.edge)
|
||||
|
||||
/// INTENTS END
|
||||
|
||||
@@ -432,8 +431,7 @@
|
||||
var/dam_zone = pick(organs_by_name)
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||
var/armor_block = run_armor_check(affecting, armor_type, armor_pen)
|
||||
var/armor_soak = get_armor_soak(affecting, armor_type, armor_pen)
|
||||
apply_damage(damage, BRUTE, affecting, armor_block, armor_soak, sharp = a_sharp, edge = a_edge)
|
||||
apply_damage(damage, BRUTE, affecting, armor_block, a_sharp, a_edge)
|
||||
updatehealth()
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -509,10 +509,10 @@ This function restores all organs.
|
||||
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/soaked = 0, var/sharp = FALSE, var/edge = FALSE, var/obj/used_weapon = null, var/projectile = FALSE)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, soaked, sharp, edge, used_weapon, projectile)
|
||||
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = FALSE, var/edge = FALSE, var/obj/used_weapon = null, var/projectile = FALSE)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, sharp, edge, used_weapon, projectile)
|
||||
if(GLOB.Debug2)
|
||||
log_world("## DEBUG: human/apply_damage() was called on [src], with [damage] damage, an armor value of [blocked], and a soak value of [soaked].")
|
||||
log_world("## DEBUG: human/apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked].")
|
||||
var/obj/item/organ/external/organ = null
|
||||
if(isorgan(def_zone))
|
||||
organ = def_zone
|
||||
@@ -573,7 +573,7 @@ This function restores all organs.
|
||||
if((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
|
||||
if(organ && organ.organ_can_feel_pain() && !isbelly(loc) && !istype(loc, /obj/item/dogborg/sleeper)) //VOREStation Add
|
||||
emote("scream")
|
||||
..(damage, damagetype, def_zone, blocked, soaked)
|
||||
..(damage, damagetype, def_zone, blocked)
|
||||
return 1
|
||||
|
||||
//Handle BRUTE and BURN damage
|
||||
@@ -582,18 +582,12 @@ This function restores all organs.
|
||||
if(blocked >= 100)
|
||||
return 0
|
||||
|
||||
if(soaked >= damage)
|
||||
return 0
|
||||
|
||||
if(!organ) return 0
|
||||
|
||||
if(blocked)
|
||||
blocked = (100-blocked)/100
|
||||
damage = (damage * blocked)
|
||||
|
||||
if(soaked)
|
||||
damage -= soaked
|
||||
|
||||
if(GLOB.Debug2)
|
||||
log_world("## DEBUG: [src] was hit for [damage].")
|
||||
|
||||
@@ -636,5 +630,5 @@ This function restores all organs.
|
||||
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
|
||||
updatehealth()
|
||||
BITSET(hud_updateflag, HEALTH_HUD)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, soaked, sharp, edge, used_weapon, projectile)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, sharp, edge, used_weapon, projectile)
|
||||
return 1
|
||||
|
||||
@@ -111,29 +111,6 @@ emp_act
|
||||
total += weight
|
||||
return (armorval/max(total, 1))
|
||||
|
||||
//Like getarmor, but the value it returns will be numerical damage reduction
|
||||
/mob/living/carbon/human/getsoak(var/def_zone, var/type)
|
||||
var/soakval = 0
|
||||
var/total = 0
|
||||
|
||||
if(def_zone)
|
||||
if(isorgan(def_zone))
|
||||
return getsoak_organ(def_zone, type)
|
||||
var/obj/item/organ/external/affecting = get_organ(def_zone)
|
||||
if(affecting)
|
||||
return getsoak_organ(affecting, type)
|
||||
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
|
||||
|
||||
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
|
||||
for(var/organ_name in organs_by_name)
|
||||
if (organ_name in organ_rel_size)
|
||||
var/obj/item/organ/external/organ = organs_by_name[organ_name]
|
||||
if(organ)
|
||||
var/weight = organ_rel_size[organ_name]
|
||||
soakval += getsoak_organ(organ, type) * weight
|
||||
total += weight
|
||||
return (soakval/max(total, 1))
|
||||
|
||||
//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ.
|
||||
/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone)
|
||||
if (!def_zone)
|
||||
@@ -199,21 +176,6 @@ emp_act
|
||||
|
||||
return protection
|
||||
|
||||
/mob/living/carbon/human/proc/getsoak_organ(var/obj/item/organ/external/def_zone, var/type)
|
||||
if(!type || !def_zone)
|
||||
return 0
|
||||
var/soaked = 0
|
||||
var/list/protective_gear = def_zone.get_covering_clothing()
|
||||
for(var/obj/item/clothing/gear in protective_gear)
|
||||
soaked += gear.armorsoak[type]
|
||||
|
||||
for(var/datum/modifier/M as anything in modifiers)
|
||||
var/modifier_armor = LAZYACCESS(M.armor_flat, type)
|
||||
if(modifier_armor)
|
||||
soaked += modifier_armor
|
||||
|
||||
return soaked
|
||||
|
||||
// Checked in borer code
|
||||
/mob/living/carbon/human/proc/check_head_coverage()
|
||||
var/obj/item/organ/external/H = organs_by_name[BP_HEAD]
|
||||
@@ -278,15 +240,13 @@ emp_act
|
||||
|
||||
visible_message(span_danger("[src] has been [LAZYLEN(I.attack_verb) ? pick(I.attack_verb) : "attacked"] in the [affecting.name] with [I.name] by [user]!"))
|
||||
|
||||
var/soaked = get_armor_soak(hit_zone, "melee", I.armor_penetration)
|
||||
|
||||
var/blocked = run_armor_check(hit_zone, "melee", I.armor_penetration, "Your armor has protected your [affecting.name].", "Your armor has softened the blow to your [affecting.name].")
|
||||
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone)
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone)
|
||||
|
||||
return blocked
|
||||
|
||||
/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
|
||||
/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
|
||||
var/obj/item/organ/external/affecting = get_organ(hit_zone)
|
||||
if(!affecting)
|
||||
return 0
|
||||
@@ -297,17 +257,15 @@ emp_act
|
||||
for(var/obj/item/clothing/C in clothing)
|
||||
C.clothing_impact(I, effective_force)
|
||||
|
||||
if(soaked >= round(effective_force*0.8))
|
||||
effective_force -= round(effective_force*0.8)
|
||||
// Handle striking to cripple.
|
||||
if(user.a_intent == I_DISARM)
|
||||
effective_force *= 0.5 //reduced effective force...
|
||||
if(!..(I, user, effective_force, blocked, soaked, hit_zone))
|
||||
if(!..(I, user, effective_force, blocked, hit_zone))
|
||||
return 0
|
||||
|
||||
//set the dislocate mult less than the effective force mult so that
|
||||
//dislocating limbs on disarm is a bit easier than breaking limbs on harm
|
||||
attack_joint(affecting, I, effective_force, 0.75, blocked, soaked) //...but can dislocate joints
|
||||
attack_joint(affecting, I, effective_force, 0.75, blocked) //...but can dislocate joints
|
||||
else if(!..())
|
||||
return 0
|
||||
|
||||
@@ -337,7 +295,7 @@ emp_act
|
||||
switch(hit_zone)
|
||||
if(BP_HEAD)//Harder to score a stun but if you do it lasts a bit longer
|
||||
if(prob(effective_force))
|
||||
apply_effect(20, PARALYZE, blocked, soaked)
|
||||
apply_effect(20, PARALYZE, blocked)
|
||||
visible_message(span_danger("\The [src] has been knocked unconscious!"))
|
||||
if(bloody)//Apply blood
|
||||
if(wear_mask)
|
||||
@@ -351,23 +309,20 @@ emp_act
|
||||
update_inv_glasses(0)
|
||||
if(BP_TORSO)//Easier to score a stun but lasts less time
|
||||
if(prob(effective_force + 10))
|
||||
apply_effect(6, WEAKEN, blocked, soaked)
|
||||
apply_effect(6, WEAKEN, blocked)
|
||||
visible_message(span_danger("\The [src] has been knocked down!"))
|
||||
if(bloody)
|
||||
bloody_body(src)
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked, var/soaked)
|
||||
/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked)
|
||||
if(!organ || (organ.dislocated == 1) || (organ.dislocated == -1) || blocked >= 100) //VOREStation Edit Bugfix
|
||||
return 0
|
||||
|
||||
if(W.damtype != BRUTE)
|
||||
return 0
|
||||
|
||||
if(soaked >= round(effective_force*0.8))
|
||||
effective_force -= round(effective_force*0.8)
|
||||
|
||||
//want the dislocation chance to be such that the limb is expected to dislocate after dealing a fraction of the damage needed to break the limb
|
||||
var/dislocate_chance = effective_force/(dislocate_mult * organ.min_broken_damage * CONFIG_GET(number/organ_health_multiplier))*100
|
||||
if(prob(dislocate_chance * (100 - blocked)/100))
|
||||
@@ -481,15 +436,9 @@ emp_act
|
||||
if(ismob(O.thrower))
|
||||
add_attack_logs(O.thrower,src,"Hit with thrown [O.name]")
|
||||
|
||||
//If the armor absorbs all of the damage, skip the rest of the calculations
|
||||
var/soaked = get_armor_soak(affecting, "melee", O.armor_penetration)
|
||||
if(soaked >= throw_damage)
|
||||
to_chat(src, span_warning("Your armor absorbs the force of [O.name]!"))
|
||||
return
|
||||
|
||||
var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
|
||||
if(armor < 100)
|
||||
apply_damage(throw_damage, O.damtype, zone, armor, soaked, is_sharp(O), has_edge(O), O)
|
||||
apply_damage(throw_damage, O.damtype, zone, armor, is_sharp(O), has_edge(O), O)
|
||||
|
||||
|
||||
//thrown weapon embedded object code.
|
||||
@@ -497,8 +446,6 @@ emp_act
|
||||
if (!is_robot_module(O))
|
||||
var/sharp = is_sharp(O)
|
||||
var/damage = throw_damage
|
||||
if(soaked)
|
||||
damage -= soaked
|
||||
if(armor)
|
||||
damage /= armor+1
|
||||
|
||||
|
||||
@@ -179,4 +179,4 @@
|
||||
selfdamagezone=pick(BP_L_ARM, BP_L_HAND)
|
||||
else
|
||||
selfdamagezone=pick(BP_R_ARM, BP_R_HAND)
|
||||
user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE)
|
||||
user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, FALSE, FALSE)
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
else
|
||||
src.visible_message(span_infoplain(span_red(span_italics("[src] suddenly extends their fangs and plunges them down into [B]'s neck!"))), range = 1)
|
||||
if(bleed)
|
||||
B.apply_damage(10, BRUTE, BP_HEAD, blocked = 0, soaked = 0, sharp = TRUE, edge = FALSE)
|
||||
B.apply_damage(10, BRUTE, BP_HEAD, blocked = 0, sharp = TRUE, edge = FALSE)
|
||||
var/obj/item/organ/external/E = B.get_organ(BP_HEAD)
|
||||
if(!(E.status & ORGAN_BLEEDING))
|
||||
E.status |= ORGAN_BLEEDING //If 10 points of piercing didn't make the organ bleed, we are making it bleed.
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
Returns
|
||||
standard 0 if fail
|
||||
*/
|
||||
/mob/living/proc/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/sharp = FALSE, var/edge = FALSE, var/obj/used_weapon = null, var/projectile = 0)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, soaked, sharp, edge, used_weapon, projectile)
|
||||
/mob/living/proc/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = FALSE, var/edge = FALSE, var/obj/used_weapon = null, var/projectile = 0)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, sharp, edge, used_weapon, projectile)
|
||||
if(GLOB.Debug2)
|
||||
log_world("## DEBUG: apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked].")
|
||||
if(!damage || (blocked >= 100))
|
||||
@@ -61,11 +61,6 @@
|
||||
else
|
||||
damage = damage * M.effective_tox_resistance
|
||||
continue
|
||||
if(soaked)
|
||||
if(soaked >= round(damage*0.8))
|
||||
damage -= round(damage*0.8)
|
||||
else
|
||||
damage -= soaked
|
||||
|
||||
var/initial_blocked = blocked
|
||||
|
||||
@@ -79,8 +74,8 @@
|
||||
adjustFireLoss(damage * blocked)
|
||||
attempt_multishock(SHOCKFLAG_BURNDAMAGE)
|
||||
if(SEARING)
|
||||
apply_damage(round(damage / 3), BURN, def_zone, initial_blocked, soaked, sharp, edge, used_weapon)
|
||||
apply_damage(round(damage / 3 * 2), BRUTE, def_zone, initial_blocked, soaked, sharp, edge, used_weapon)
|
||||
apply_damage(round(damage / 3), BURN, def_zone, initial_blocked, sharp, edge, used_weapon)
|
||||
apply_damage(round(damage / 3 * 2), BRUTE, def_zone, initial_blocked, sharp, edge, used_weapon)
|
||||
if(TOX)
|
||||
adjustToxLoss(damage * blocked)
|
||||
if(OXY)
|
||||
@@ -93,7 +88,7 @@
|
||||
electrocute_act(damage, used_weapon, 1.0, def_zone)
|
||||
if(BIOACID)
|
||||
if(isSynthetic())
|
||||
apply_damage(damage, BURN, def_zone, initial_blocked, soaked, sharp, edge, used_weapon) // Handle it as normal burn.
|
||||
apply_damage(damage, BURN, def_zone, initial_blocked, sharp, edge, used_weapon) // Handle it as normal burn.
|
||||
else
|
||||
adjustToxLoss(damage * blocked)
|
||||
if(ELECTROMAG)
|
||||
@@ -124,7 +119,7 @@
|
||||
emp_act(4)
|
||||
flash_weak_pain()
|
||||
updatehealth()
|
||||
SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, soaked, sharp, edge, used_weapon, projectile)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, sharp, edge, used_weapon, projectile)
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
@@ -77,21 +77,10 @@
|
||||
return 0
|
||||
*/
|
||||
|
||||
//Certain pieces of armor actually absorb flat amounts of damage from income attacks
|
||||
/mob/living/proc/get_armor_soak(var/def_zone = null, var/attack_flag = "melee", var/armour_pen = 0)
|
||||
var/soaked = getsoak(def_zone, attack_flag)
|
||||
//5 points of armor pen negate one point of soak
|
||||
if(armour_pen)
|
||||
soaked = max(soaked - (armour_pen/5), 0)
|
||||
return soaked
|
||||
|
||||
//if null is passed for def_zone, then this should return something appropriate for all zones (e.g. area effect damage)
|
||||
/mob/living/proc/getarmor(var/def_zone, var/type)
|
||||
return 0
|
||||
|
||||
/mob/living/proc/getsoak(var/def_zone, var/type)
|
||||
return 0
|
||||
|
||||
// Clicking with an empty hand
|
||||
/mob/living/attack_hand(mob/living/L)
|
||||
..()
|
||||
@@ -111,15 +100,10 @@
|
||||
ai_holder.react_to_attack(P.firer)
|
||||
|
||||
//Armor
|
||||
var/soaked = get_armor_soak(def_zone, P.check_armour, P.armor_penetration)
|
||||
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)
|
||||
|
||||
if ((proj_sharp || proj_edge) && (soaked >= round(P.damage*0.8)))
|
||||
proj_sharp = 0
|
||||
proj_edge = 0
|
||||
|
||||
if ((proj_sharp || proj_edge) && prob(getarmor(def_zone, P.check_armour)))
|
||||
proj_sharp = 0
|
||||
proj_edge = 0
|
||||
@@ -128,13 +112,13 @@
|
||||
if(P.taser_effect)
|
||||
stun_effect_act(0, P.agony, def_zone, P, electric = TRUE)
|
||||
if(!P.nodamage)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, sharp=proj_sharp, edge=proj_edge, used_weapon=P, projectile=TRUE)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, proj_sharp, proj_edge, P, TRUE)
|
||||
qdel(P)
|
||||
return
|
||||
|
||||
if(!P.nodamage)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, sharp=proj_sharp, edge=proj_edge, used_weapon=P, projectile=TRUE)
|
||||
P.on_hit(src, absorb, soaked, def_zone)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, proj_sharp, proj_edge, P, TRUE)
|
||||
P.on_hit(src, absorb, def_zone)
|
||||
|
||||
if(absorb == 100)
|
||||
return 2
|
||||
@@ -211,13 +195,12 @@
|
||||
playsound(src, 'sound/effects/attackblob.ogg', 50, 1)
|
||||
|
||||
//Armor
|
||||
var/soaked = get_armor_soak(def_zone, armor_check, armor_pen)
|
||||
var/absorb = run_armor_check(def_zone, armor_check, armor_pen)
|
||||
|
||||
if(ai_holder)
|
||||
ai_holder.react_to_attack(B)
|
||||
|
||||
apply_damage(damage, damage_type, def_zone, absorb, soaked)
|
||||
apply_damage(damage, damage_type, def_zone, absorb)
|
||||
|
||||
/mob/living/proc/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone)
|
||||
return target_zone
|
||||
@@ -229,10 +212,9 @@
|
||||
if(ai_holder)
|
||||
ai_holder.react_to_attack(user)
|
||||
|
||||
var/soaked = get_armor_soak(hit_zone, "melee")
|
||||
var/blocked = run_armor_check(hit_zone, "melee")
|
||||
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone)
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone)
|
||||
|
||||
if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too
|
||||
var/turf/simulated/location = get_turf(src)
|
||||
@@ -241,22 +223,18 @@
|
||||
return blocked
|
||||
|
||||
//returns 0 if the effects failed to apply for some reason, 1 otherwise.
|
||||
/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
|
||||
/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
|
||||
if(!effective_force || blocked >= 100)
|
||||
return 0
|
||||
//Apply weapon damage
|
||||
var/weapon_sharp = is_sharp(I)
|
||||
var/weapon_edge = has_edge(I)
|
||||
|
||||
if(getsoak(hit_zone, "melee",) - (I.armor_penetration/5) > round(effective_force*0.8)) //soaking a hit turns sharp attacks into blunt ones
|
||||
weapon_sharp = 0
|
||||
weapon_edge = 0
|
||||
|
||||
if(prob(max(getarmor(hit_zone, "melee") - I.armor_penetration, 0))) //melee armour provides a chance to turn sharp/edge weapon attacks into blunt ones
|
||||
weapon_sharp = 0
|
||||
weapon_edge = 0
|
||||
|
||||
apply_damage(effective_force, I.damtype, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
|
||||
apply_damage(effective_force, I.damtype, hit_zone, blocked, weapon_sharp, weapon_edge, I)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -282,10 +260,9 @@
|
||||
|
||||
src.visible_message(span_filter_warning("[span_red("[src] has been hit by [O].")]"))
|
||||
var/armor = run_armor_check(null, "melee")
|
||||
var/soaked = get_armor_soak(null, "melee")
|
||||
|
||||
|
||||
apply_damage(throw_damage, dtype, null, armor, soaked, is_sharp(O), has_edge(O), O)
|
||||
apply_damage(throw_damage, dtype, null, armor, is_sharp(O), has_edge(O), O)
|
||||
|
||||
O.throwing = 0 //it hit, so stop moving
|
||||
|
||||
@@ -310,8 +287,6 @@
|
||||
if(!O || !src) return
|
||||
|
||||
if(O.sharp) //Projectile is suitable for pinning.
|
||||
if(soaked >= round(throw_damage*0.8))
|
||||
return
|
||||
|
||||
//Handles embedding for non-humans and simple_animals.
|
||||
embed(O)
|
||||
|
||||
@@ -391,8 +391,7 @@
|
||||
return
|
||||
|
||||
var/armor_block = run_armor_check(T, "melee")
|
||||
var/armor_soak = get_armor_soak(T, "melee")
|
||||
T.apply_damage(20, HALLOSS,, armor_block, armor_soak)
|
||||
T.apply_damage(20, HALLOSS, null, armor_block)
|
||||
if(prob(75)) //75% chance to stun for 5 seconds, really only going to be 4 bcus click cooldown+animation.
|
||||
T.apply_effect(5, WEAKEN, armor_block)
|
||||
|
||||
|
||||
@@ -270,18 +270,6 @@
|
||||
|
||||
return armorval
|
||||
|
||||
/mob/living/simple_mob/getsoak(def_zone, attack_flag)
|
||||
var/armorval = armor_soak[attack_flag]
|
||||
if(isnull(armorval))
|
||||
armorval = 0
|
||||
|
||||
for(var/datum/modifier/M as anything in modifiers)
|
||||
var/modifier_armor = LAZYACCESS(M.armor_flat, attack_flag)
|
||||
if(modifier_armor)
|
||||
armorval += modifier_armor
|
||||
|
||||
return armorval
|
||||
|
||||
// Lightning
|
||||
/mob/living/simple_mob/lightning_act()
|
||||
..()
|
||||
|
||||
@@ -122,16 +122,6 @@
|
||||
"bio" = 1000,
|
||||
"rad" = 1000)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 1000,
|
||||
"bullet" = 1000,
|
||||
"laser" = 1000,
|
||||
"energy" = 1000,
|
||||
"bomb" = 1000,
|
||||
"bio" = 1000,
|
||||
"rad" = 1000
|
||||
)
|
||||
|
||||
var/scanner_desc
|
||||
var/obj/effect/overmap/visitable/simplemob/child_om_marker
|
||||
var/om_child_type
|
||||
|
||||
@@ -140,15 +140,6 @@
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
var/list/armor_soak = list( // Values for getsoak() checks.
|
||||
"melee" = 0,
|
||||
"bullet" = 0,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
// Protection against heat/cold/electric/water effects.
|
||||
// 0 is no protection, 1 is total protection. Negative numbers increase vulnerability.
|
||||
var/heat_resist = 0.0
|
||||
|
||||
@@ -472,7 +472,6 @@
|
||||
H.Weaken(3)
|
||||
return
|
||||
var/armor_block = run_armor_check(T, "melee")
|
||||
var/armor_soak = get_armor_soak(T, "melee")
|
||||
T.apply_damage(20, HALLOSS,, armor_block, armor_soak)
|
||||
T.apply_damage(20, HALLOSS, null, armor_block)
|
||||
if(prob(75))
|
||||
T.apply_effect(3, WEAKEN, armor_block)
|
||||
|
||||
@@ -61,16 +61,6 @@
|
||||
"bio" = 0,
|
||||
"rad" = 100)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 100,
|
||||
"bullet" = 100,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
loot_list = list(/obj/item/ore/diamond = 100, /obj/item/ectoplasm = 3)
|
||||
|
||||
speak_emote = list("rumbles")
|
||||
@@ -175,16 +165,6 @@
|
||||
"bio" = 0,
|
||||
"rad" = 100)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 100,
|
||||
"bullet" = 100,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
speak_emote = list("rumbles")
|
||||
|
||||
vore_active = 0
|
||||
|
||||
@@ -48,16 +48,6 @@
|
||||
"bio" = 1000,
|
||||
"rad" = 1000)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 1000,
|
||||
"bullet" = 1000,
|
||||
"laser" = 1000,
|
||||
"energy" = 1000,
|
||||
"bomb" = 1000,
|
||||
"bio" = 1000,
|
||||
"rad" = 1000
|
||||
)
|
||||
|
||||
movement_cooldown = 5
|
||||
copy_prefs_to_mob = FALSE
|
||||
player_msg = "The dog accepts you into itself, allowing you to dictate what will happen. The dog occasionally thinks unknowable thoughts, though you can understand some of its needs and desires. The dog shares its experience with you. You can navigate space, 'transition' to certain locations, and you can dine upon some of the space weather. The dog doesn't seem to know how any of this works exactly, this is just how things are for the dog, they come as naturally to the dog as blinking."
|
||||
|
||||
@@ -58,16 +58,6 @@
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 30,
|
||||
"bullet" = 30,
|
||||
"laser" = 10,
|
||||
"energy" = 10,
|
||||
"bomb" = 0,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
speak_emote = list("rumbles")
|
||||
|
||||
say_list_type = /datum/say_list/startreader
|
||||
@@ -142,16 +132,6 @@
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 0,
|
||||
"bullet" = 0,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
icon_living = "startreader_flipped"
|
||||
AdjustStunned(flip_cooldown)
|
||||
else
|
||||
@@ -163,16 +143,6 @@
|
||||
"bomb" = 0,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 30,
|
||||
"bullet" = 30,
|
||||
"laser" = 10,
|
||||
"energy" = 10,
|
||||
"bomb" = 0,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
icon_living = "startreader"
|
||||
SetStunned(0)
|
||||
|
||||
|
||||
@@ -65,17 +65,6 @@
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
// The frostfly's body is incredibly cold at all times, natural resistance to things trying to burn it.
|
||||
armor_soak = list(
|
||||
"melee" = 0,
|
||||
"bullet" = 0,
|
||||
"laser" = 15,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
var/datum/effect/effect/system/smoke_spread/frost/smoke_special
|
||||
|
||||
say_list_type = /datum/say_list/frostfly
|
||||
|
||||
@@ -37,16 +37,6 @@
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 5,
|
||||
"bullet" = 0,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
movement_cooldown = -1
|
||||
|
||||
mob_size = MOB_SMALL
|
||||
|
||||
@@ -53,15 +53,6 @@
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
armor_soak = list(
|
||||
"melee" = 10,
|
||||
"bullet" = 5,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
mob_size = MOB_LARGE
|
||||
|
||||
|
||||
@@ -60,16 +60,6 @@
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 5,
|
||||
"bullet" = 5,
|
||||
"laser" = 5,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
say_list_type = /datum/say_list/kururak
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/kururak
|
||||
|
||||
@@ -213,7 +203,7 @@
|
||||
to_chat(H, span_alien("You are disoriented by \the [src]!"))
|
||||
H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
|
||||
H.flash_eyes()
|
||||
H.apply_damage(flash_strength * H.species.flash_burn/5, BURN, BP_HEAD, 0, 0)
|
||||
H.apply_damage(flash_strength * H.species.flash_burn/5, BURN, BP_HEAD, 0)
|
||||
|
||||
else if(issilicon(L))
|
||||
if(isrobot(L))
|
||||
@@ -291,7 +281,7 @@
|
||||
var/mob/living/L = A
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.apply_damage(damage_to_apply, BRUTE, BP_TORSO, 0, 0)
|
||||
H.apply_damage(damage_to_apply, BRUTE, BP_TORSO, 0)
|
||||
|
||||
else
|
||||
L.adjustBruteLoss(damage_to_apply)
|
||||
|
||||
@@ -81,16 +81,6 @@
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 5,
|
||||
"bullet" = 5,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
say_list_type = /datum/say_list/leech
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/leech
|
||||
|
||||
|
||||
@@ -41,15 +41,5 @@
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 10,
|
||||
"bullet" = 0,
|
||||
"laser" = 10,
|
||||
"energy" = 10,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
/decl/mob_organ_names/pillbug
|
||||
hit_zones = list("cephalon", "pereon", "pleon", "left forelegs", "right forelegs", "left hind legs", "right hind legs")
|
||||
|
||||
@@ -52,16 +52,6 @@
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 2,
|
||||
"bullet" = 2,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
say_list_type = /datum/say_list/sakimm
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative/sakimm
|
||||
|
||||
|
||||
@@ -33,15 +33,6 @@
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
maxHealth = 75
|
||||
armor_soak = list(
|
||||
"melee" = 5,
|
||||
"bullet" = 0,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
heat_resist = -0.50
|
||||
cold_resist = 0.75
|
||||
movement_cooldown = -1
|
||||
|
||||
@@ -67,15 +67,6 @@
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
armor_soak = list(
|
||||
"melee" = 15,
|
||||
"bullet" = 10,
|
||||
"laser" = 15,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/tank/armored/anti_melee
|
||||
name = "riot hivebot"
|
||||
@@ -90,15 +81,6 @@
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
armor_soak = list(
|
||||
"melee" = 20,
|
||||
"bullet" = 0,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/tank/armored/anti_bullet
|
||||
name = "bulletproof hivebot"
|
||||
@@ -113,15 +95,6 @@
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
armor_soak = list(
|
||||
"melee" = 0,
|
||||
"bullet" = 20,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/tank/armored/anti_laser
|
||||
name = "ablative hivebot"
|
||||
@@ -136,15 +109,6 @@
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
armor_soak = list(
|
||||
"melee" = 0,
|
||||
"bullet" = 0,
|
||||
"laser" = 20,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
var/reflect_chance = 40 // Same as regular ablative.
|
||||
|
||||
// Ablative Hivebots can reflect lasers just like humans.
|
||||
|
||||
@@ -53,7 +53,6 @@
|
||||
var/projectile_dam_type = P.damage_type
|
||||
var/incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3)))
|
||||
var/armorcheck = run_armor_check(null, P.check_armour)
|
||||
var/soakedcheck = get_armor_soak(null, P.check_armour)
|
||||
if(!(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)))
|
||||
visible_message(span_danger("The [P.name] bounces off of [src]'s shell!"), \
|
||||
span_userdanger("The [P.name] bounces off of [src]'s shell!"))
|
||||
@@ -61,7 +60,7 @@
|
||||
if(!(P.damage_type == BRUTE || P.damage_type == BURN))
|
||||
projectile_dam_type = BRUTE
|
||||
incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to brute for physical projectiles, though severely decreased.
|
||||
apply_damage(incoming_damage, projectile_dam_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P)
|
||||
apply_damage(incoming_damage, projectile_dam_type, null, armorcheck, is_sharp(P), has_edge(P), P)
|
||||
return -1 //Doesn't reflect non-beams or non-energy projectiles. They just smack and drop with little to no effect.
|
||||
else
|
||||
visible_message(span_danger("The [P.name] gets reflected by [src]'s shell!"), \
|
||||
@@ -71,7 +70,7 @@
|
||||
if(!(P.damage_type == BRUTE || P.damage_type == BURN))
|
||||
projectile_dam_type = BURN
|
||||
incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to burn for energy-type projectiles, though severely decreased.
|
||||
apply_damage(incoming_damage, P.damage_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P)
|
||||
apply_damage(incoming_damage, P.damage_type, null, armorcheck, is_sharp(P), has_edge(P), P)
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
if(P.starting)
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
var/projectile_dam_type = P.damage_type
|
||||
var/incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3)))
|
||||
var/armorcheck = run_armor_check(null, P.check_armour)
|
||||
var/soakedcheck = get_armor_soak(null, P.check_armour)
|
||||
if(!(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)))
|
||||
visible_message(span_danger("The [P.name] bounces off of [src]'s shell!"), \
|
||||
span_userdanger("The [P.name] bounces off of [src]'s shell!"))
|
||||
@@ -65,7 +64,7 @@
|
||||
if(!(P.damage_type == BRUTE || P.damage_type == BURN))
|
||||
projectile_dam_type = BRUTE
|
||||
incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to brute for physical projectiles, though severely decreased.
|
||||
apply_damage(incoming_damage, projectile_dam_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P)
|
||||
apply_damage(incoming_damage, projectile_dam_type, null, armorcheck, is_sharp(P), has_edge(P), P)
|
||||
return -1 //Doesn't reflect non-beams or non-energy projectiles. They just smack and drop with little to no effect.
|
||||
else
|
||||
visible_message(span_danger("The [P.name] gets reflected by [src]'s shell!"), \
|
||||
@@ -75,7 +74,7 @@
|
||||
if(!(P.damage_type == BRUTE || P.damage_type == BURN))
|
||||
projectile_dam_type = BURN
|
||||
incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to burn for energy-type projectiles, though severely decreased.
|
||||
apply_damage(incoming_damage, P.damage_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P)
|
||||
apply_damage(incoming_damage, P.damage_type, null, armorcheck, is_sharp(P), has_edge(P), P)
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
if(P.starting)
|
||||
|
||||
@@ -98,16 +98,6 @@
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 5,
|
||||
"bullet" = 5,
|
||||
"laser" = 5,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
slime_mutation = list(
|
||||
/mob/living/simple_mob/slime/xenobio/silver,
|
||||
/mob/living/simple_mob/slime/xenobio/yellow,
|
||||
|
||||
@@ -29,15 +29,6 @@
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
armor_soak = list(
|
||||
"melee" = 80,
|
||||
"bullet" = 20,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
has_langs = list(LANGUAGE_ANIMAL)
|
||||
|
||||
@@ -80,15 +71,6 @@
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
armor_soak = list(
|
||||
"melee" = 80,
|
||||
"bullet" = 20,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/passive/mimepet/attack_hand(mob/living/user as mob)
|
||||
if(user.a_intent == I_DISARM)
|
||||
|
||||
@@ -228,16 +228,6 @@
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
armor_soak = list(
|
||||
"melee" = 10,
|
||||
"bullet" = 5,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
|
||||
/mob/living/simple_mob/clowns/big/chlown
|
||||
name = "A Clown?"
|
||||
|
||||
@@ -228,15 +228,6 @@
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
armor_soak = list(
|
||||
"melee" = 10,
|
||||
"bullet" = 5,
|
||||
"laser" = 0,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
|
||||
/mob/living/simple_mob/clowns/big/c_shift/chlown
|
||||
|
||||
@@ -55,8 +55,7 @@
|
||||
return
|
||||
|
||||
var/armor = target.run_armor_check(target, "melee")
|
||||
var/soaked = target.get_armor_soak(target, "melee")
|
||||
if(armor + soaked < 60)
|
||||
if(armor < 60)
|
||||
to_chat(target, span_danger("You feel extreme pain!"))
|
||||
|
||||
var/max_halloss = round(target.species.total_health * 0.8) //up to 80% of passing out
|
||||
@@ -98,9 +97,8 @@
|
||||
damage += hat.force * 3
|
||||
|
||||
var/armor = target.run_armor_check(BP_HEAD, "melee")
|
||||
var/soaked = target.get_armor_soak(BP_HEAD, "melee")
|
||||
target.apply_damage(damage, BRUTE, BP_HEAD, armor, soaked)
|
||||
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD), attacker.get_armor_soak(BP_HEAD))
|
||||
target.apply_damage(damage, BRUTE, BP_HEAD, armor)
|
||||
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD))
|
||||
|
||||
if(!armor && target.headcheck(BP_HEAD) && prob(damage))
|
||||
target.apply_effect(20, PARALYZE)
|
||||
|
||||
@@ -421,7 +421,6 @@ var/datum/planet/sif/planet_sif = null
|
||||
|
||||
var/target_zone = pick(BP_ALL)
|
||||
var/amount_blocked = H.run_armor_check(target_zone, "melee")
|
||||
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
|
||||
|
||||
var/damage = rand(1,3)
|
||||
|
||||
@@ -429,10 +428,7 @@ var/datum/planet/sif/planet_sif = null
|
||||
return // No need to apply damage. Hardhats are 30. They should probably protect you from hail on your head.
|
||||
//Voidsuits are likewise 40, and riot, 80. Clothes are all less than 30.
|
||||
|
||||
if(amount_soaked >= damage)
|
||||
return // No need to apply damage.
|
||||
|
||||
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
|
||||
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, used_weapon = "hail")
|
||||
if(show_message)
|
||||
to_chat(H, effect_message)
|
||||
|
||||
|
||||
@@ -416,7 +416,6 @@ var/datum/planet/virgo3b/planet_virgo3b = null
|
||||
|
||||
var/target_zone = pick(BP_ALL)
|
||||
var/amount_blocked = H.run_armor_check(target_zone, "melee")
|
||||
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
|
||||
|
||||
var/damage = rand(1,3)
|
||||
|
||||
@@ -424,10 +423,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null
|
||||
return // No need to apply damage. Hardhats are 30. They should probably protect you from hail on your head.
|
||||
//Voidsuits are likewise 40, and riot, 80. Clothes are all less than 30.
|
||||
|
||||
if(amount_soaked >= damage)
|
||||
return // No need to apply damage.
|
||||
|
||||
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked)
|
||||
H.apply_damage(damage, BRUTE, target_zone, amount_blocked)
|
||||
if(show_message)
|
||||
to_chat(H, effect_message)
|
||||
|
||||
|
||||
@@ -406,7 +406,6 @@ var/datum/planet/virgo3c/planet_virgo3c = null
|
||||
|
||||
var/target_zone = pick(BP_ALL)
|
||||
var/amount_blocked = H.run_armor_check(target_zone, "melee")
|
||||
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
|
||||
|
||||
var/damage = rand(1,3)
|
||||
|
||||
@@ -414,10 +413,7 @@ var/datum/planet/virgo3c/planet_virgo3c = null
|
||||
return // No need to apply damage. Hardhats are 30. They should probably protect you from hail on your head.
|
||||
//Voidsuits are likewise 40, and riot, 80. Clothes are all less than 30.
|
||||
|
||||
if(amount_soaked >= damage)
|
||||
return // No need to apply damage.
|
||||
|
||||
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked)
|
||||
H.apply_damage(damage, BRUTE, target_zone, amount_blocked)
|
||||
if(show_message)
|
||||
to_chat(H, effect_message)
|
||||
|
||||
|
||||
@@ -390,7 +390,6 @@ var/datum/planet/virgo4/planet_virgo4 = null
|
||||
|
||||
var/target_zone = pick(BP_ALL)
|
||||
var/amount_blocked = H.run_armor_check(target_zone, "melee")
|
||||
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
|
||||
|
||||
var/damage = rand(1,3)
|
||||
|
||||
@@ -398,10 +397,7 @@ var/datum/planet/virgo4/planet_virgo4 = null
|
||||
return // No need to apply damage. Hardhats are 30. They should probably protect you from hail on your head.
|
||||
//Voidsuits are likewise 40, and riot, 80. Clothes are all less than 30.
|
||||
|
||||
if(amount_soaked >= damage)
|
||||
return // No need to apply damage.
|
||||
|
||||
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked)
|
||||
H.apply_damage(damage, BRUTE, target_zone, amount_blocked)
|
||||
if(show_message)
|
||||
to_chat(H, effect_message)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user