Refactors human ex_act

This commit is contained in:
datlo
2021-02-10 11:25:59 +01:00
parent 63aa764241
commit 8d08592adc
2 changed files with 35 additions and 71 deletions
+1
View File
@@ -122,6 +122,7 @@
#define EXPLODE_DEVASTATE 1
#define EXPLODE_HEAVY 2
#define EXPLODE_LIGHT 3
#define EXPLODE_GIB_THRESHOLD 50 //How much bomb armor you need to resist gibbing from max severity boom
#define EMP_HEAVY 1
#define EMP_LIGHT 2
+34 -71
View File
@@ -200,91 +200,54 @@
stat("Spacepod Integrity", "[!S.health ? "0" : "[(S.health / initial(S.health)) * 100]"]%")
/mob/living/carbon/human/ex_act(severity)
var/shielded = 0
var/b_loss = null
var/f_loss = null
if(status_flags & GODMODE)
return 0
return FALSE
var/brute_loss = 0
var/burn_loss = 0
var/bomb_armor = getarmor(null, "bomb")
switch(severity)
if(1)
b_loss += 500
if(!prob(getarmor(null, "bomb")))
if(EXPLODE_DEVASTATE)
if(bomb_armor < EXPLODE_GIB_THRESHOLD)
gib()
return 0
return
else
brute_loss = 250
burn_loss = 250
var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
throw_at(target, 200, 4)
var/limbs_affected = pick(2,3,4)
var/obj/item/organ/external/processing_dismember
var/list/valid_limbs = bodyparts.Copy()
while(limbs_affected != 0 && valid_limbs.len > 0)
processing_dismember = pick(valid_limbs)
if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
processing_dismember.droplimb(1,DROPLIMB_SHARP,0,1)
valid_limbs -= processing_dismember
limbs_affected -= 1
else valid_limbs -= processing_dismember
if(2)
if(!shielded) //literally nothing could change shielded before this so wth
b_loss += 60
f_loss += 60
var/limbs_affected = 0
var/obj/item/organ/external/processing_dismember
var/list/valid_limbs = bodyparts.Copy()
if(prob(getarmor(null, "bomb")))
b_loss = b_loss/1.5
f_loss = f_loss/1.5
limbs_affected = pick(1, 1, 2)
else
limbs_affected = pick(1, 2, 3)
while(limbs_affected != 0 && valid_limbs.len > 0)
processing_dismember = pick(valid_limbs)
if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
processing_dismember.droplimb(1,DROPLIMB_SHARP,0,1)
valid_limbs -= processing_dismember
limbs_affected -= 1
else valid_limbs -= processing_dismember
if(EXPLODE_HEAVY)
brute_loss = 60
burn_loss = 60
if(bomb_armor)
brute_loss = 30 * (2 - round(bomb_armor * 0.01, 0.05))
burn_loss = brute_loss //Damage gets reduced from 120 to up to 60 combined brute+burn
if(check_ear_prot() < HEARING_PROTECTION_TOTAL)
AdjustEarDamage(30, 120)
if(prob(70) && !shielded)
Paralyse(10)
if(3)
b_loss += 30
if(prob(getarmor(null, "bomb")))
b_loss = b_loss/2
else
var/limbs_affected = pick(0, 1)
var/obj/item/organ/external/processing_dismember
var/list/valid_limbs = bodyparts.Copy()
while(limbs_affected != 0 && valid_limbs.len > 0)
processing_dismember = pick(valid_limbs)
if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
processing_dismember.droplimb(1,DROPLIMB_SHARP,0,1)
valid_limbs -= processing_dismember
limbs_affected -= 1
else valid_limbs -= processing_dismember
Weaken(20 SECONDS_TO_LIFE_CYCLES - (bomb_armor * 1.6 / 10) SECONDS_TO_LIFE_CYCLES) //Between ~4 and ~20 seconds of knockdown depending on bomb armor
if(EXPLODE_LIGHT)
brute_loss = 30
if(bomb_armor)
brute_loss = 15 * (2 - round(bomb_armor * 0.01, 0.05)) //Reduced from 30 to up to 15
if(check_ear_prot() < HEARING_PROTECTION_TOTAL)
AdjustEarDamage(15, 60)
if(prob(50) && !shielded)
Paralyse(10)
Weaken(16 SECONDS_TO_LIFE_CYCLES - (bomb_armor * 1.6 / 10) SECONDS_TO_LIFE_CYCLES) //Between no knockdown to ~16 seconds depending on bomb armor
take_overall_damage(b_loss,f_loss, TRUE, used_weapon = "Explosive Blast")
take_overall_damage(brute_loss, burn_loss, TRUE, used_weapon = "Explosive Blast")
//attempt to dismember bodyparts
if(severity <= EXPLODE_HEAVY || !bomb_armor)
var/max_limb_loss = round(4 / severity) //so you don't lose four limbs at severity 3.
for(var/X in bodyparts)
var/obj/item/organ/external/BP = X
if(prob(50 / severity) && !prob(getarmor(BP, "bomb")) && BP.limb_name != "head" && BP.limb_name != "chest" && BP.limb_name != "groin")
BP.droplimb(TRUE, DROPLIMB_SHARP, FALSE, TRUE)
max_limb_loss--
if(!max_limb_loss)
break
..()