* part 1 - resist out of resting, move and interact with the world while resting, and stamina regen nerf * makes beepsky check for stuns instead of knockdowns, adds message for getting up, makes gravity reduce standup time, and more * sprinting, staminacrit, balance changes, and more * adds stamina modifier to clickdelay, makes items deal stamina damage to the user when attacking, buffs resting stamina regen * combat mode, ability to toggle right-click context menu on/off, basic combat mode QOL, lays groundwork for 2-handing any item combat mode toggle sound is from Interbay. * commits dme changes * unarmed combat stamina, ability to right click in combat mode, balance changes * tosses in the HUD icons for later-ish * rolls back admin.txt * lotsa UI stuff * stamina checks, some balance stuff * adds support for best ui, adds right click to flush disposals, removes aggressive grab pinning in favor of neckgrab chokeholding * quick dogborg patch while i figure out what do do with them * oops - fixes prefbreaking for screenshake * trying to sprint from an elevated surface onto lower ground will now knock you down * right click to pull fire alarm, lets you bully people by pulling chairs out form under them, makes attacking objects cost stamina * makes accidents during slipping less likely to occur while combat mode is active, makes tripping off elevated surfaces cause accidents * makes pumping shotguns cost a tiiiny bit of stamina * makes eyestabbing and batoning cost stamina * makes failing stamina checks error out properly, adds stamina check to shotgun pumping * adds stamina check for chair pulling * readds aggressive grab pinning * fixes bug with being buckled preventing interaction * adds recoveringstam check to incapacitated * reduces stamina cost for attacking * oh this too * fixes bug where you can get stuck in recoveringstam if your stamina suddenly becomes 0 while you're in staminacrit * makes monkey transformation inherit staminaloss * adds the ability to wave or shake your fist at someone via right click * grammar and span closing * 99 annoying little bugs on the wall, 99 annoying little bugs. take one down, pass it around, 864 gamebreaking bugs on the wall * more distant right-click emotes. * buffs standing stamina regen a tiiiiiiny bit * adds aiming down sights for guns, makes firing guns cause trace amounts of staminaloss * crusher powercreep - gives crushers the ability to heal staminaloss * item throwing buff * adds 1:1 HUD layout * hopefully fixes issue with recoveringstamcrit not updating * giant hipfire nerf * halves the effect of staminaloss on movement speed * makes stamina recover faster in staminacrit, makes it easier to get disarmed out of combat mode * get_weight(), movedelay health_deficiency tweaking, combat and resting checks for item attacking * makes staminacrit automatically disable combat mode, it's now impossible to enter combat mode while in stamcrit * adds stamina buffer, halves the time needed to stand up after resting, increases stam penalty for firing weapons, and more * tweaks stamina buffer drain rate a little * makes buffered staminaloss redirect stamina to the actual stamloss proc when empty, makes stamina buffer stat() more precise * removes stamina modifier for clickdelays, makes stunbatons deal extra staminaloss * makes electrodes deal a lil extra staminaloss * drones cannot resist a rest, so now only carbons are forced to rest * restricts aiming down sights to carbon mobs, adds stamina display to stat() * makes gun accuracy and stamcosts more flexible, decreases base inaccuracy penalty, makes borgs immune to inaccuracy penalties * nerfs inaccuracy penalties just a lil more, fixes blooddrunk miner eye depleting all your stamina * getting used to tortoisegit * readds temp dogborg buff * stamina and stamina buffer HUD displays. Stamina sprite from hippiestation * makes afterattack call properly again * decreases stamina buffer regen time to 3 seconds * Yknow what? decreases it to 2 seconds. That's 3 entire attacks worth of waiting * makes stamina buffer influence movespeed a lil * nerfs compiling errors * tweaks the icons a little * adds autostanding, adds delimiters to attempts to stand * makes automatic standup attempts a little clearer * rest button now toggles intent to rest, fixes perma rest * oop - quick fixes * Makes crushers ignore recoil stamina on lavaland, makes burstfiring weapons deal less staminaloss * buffs highlander sword * makes stamina have less of an impact on the health display * fixes dogborgs shoving other borgs into infinite stuns * You can no longer shoot over tables or shoot through windows while resting. Also buffs turrets
240 lines
7.2 KiB
Plaintext
240 lines
7.2 KiB
Plaintext
|
|
|
|
/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE)
|
|
var/hit_percent = (100-blocked)/100
|
|
if(!damage || hit_percent <= 0)
|
|
return 0
|
|
|
|
var/obj/item/bodypart/BP = null
|
|
if(isbodypart(def_zone)) //we specified a bodypart object
|
|
BP = def_zone
|
|
else
|
|
if(!def_zone)
|
|
def_zone = ran_zone(def_zone)
|
|
BP = get_bodypart(check_zone(def_zone))
|
|
if(!BP)
|
|
BP = bodyparts[1]
|
|
|
|
switch(damagetype)
|
|
if(BRUTE)
|
|
if(BP)
|
|
if(BP.receive_damage(damage * hit_percent, 0))
|
|
update_damage_overlays()
|
|
else //no bodypart, we deal damage with a more general method.
|
|
adjustBruteLoss(damage * hit_percent)
|
|
if(BURN)
|
|
if(BP)
|
|
if(BP.receive_damage(0, damage * hit_percent))
|
|
update_damage_overlays()
|
|
else
|
|
adjustFireLoss(damage * hit_percent)
|
|
if(TOX)
|
|
adjustToxLoss(damage * hit_percent)
|
|
if(OXY)
|
|
adjustOxyLoss(damage * hit_percent)
|
|
if(CLONE)
|
|
adjustCloneLoss(damage * hit_percent)
|
|
if(STAMINA)
|
|
adjustStaminaLoss(damage * hit_percent)
|
|
if(BRAIN)
|
|
adjustBrainLoss(damage * hit_percent)
|
|
//citadel code
|
|
if(AROUSAL)
|
|
adjustArousalLoss(damage * hit_percent)
|
|
return 1
|
|
|
|
|
|
//These procs fetch a cumulative total damage from all bodyparts
|
|
/mob/living/carbon/getBruteLoss()
|
|
var/amount = 0
|
|
for(var/X in bodyparts)
|
|
var/obj/item/bodypart/BP = X
|
|
amount += BP.brute_dam
|
|
return amount
|
|
|
|
/mob/living/carbon/getFireLoss()
|
|
var/amount = 0
|
|
for(var/X in bodyparts)
|
|
var/obj/item/bodypart/BP = X
|
|
amount += BP.burn_dam
|
|
return amount
|
|
|
|
|
|
/mob/living/carbon/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(!forced && (status_flags & GODMODE))
|
|
return FALSE
|
|
if(amount > 0)
|
|
take_overall_damage(amount, 0, updating_health)
|
|
else
|
|
heal_overall_damage(-amount, 0, 0, 1, updating_health)
|
|
return amount
|
|
|
|
/mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(!forced && (status_flags & GODMODE))
|
|
return FALSE
|
|
if(amount > 0)
|
|
take_overall_damage(0, amount, updating_health)
|
|
else
|
|
heal_overall_damage(0, -amount, 0, 1, updating_health)
|
|
return amount
|
|
|
|
|
|
/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(!forced && has_trait(TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage
|
|
amount = -amount
|
|
if(amount > 0)
|
|
blood_volume -= 5*amount
|
|
else
|
|
blood_volume -= amount
|
|
return ..()
|
|
|
|
////////////////////////////////////////////
|
|
|
|
//Returns a list of damaged bodyparts
|
|
/mob/living/carbon/proc/get_damaged_bodyparts(brute, burn)
|
|
var/list/obj/item/bodypart/parts = list()
|
|
for(var/X in bodyparts)
|
|
var/obj/item/bodypart/BP = X
|
|
if((brute && BP.brute_dam) || (burn && BP.burn_dam))
|
|
parts += BP
|
|
return parts
|
|
|
|
//Returns a list of damageable bodyparts
|
|
/mob/living/carbon/proc/get_damageable_bodyparts()
|
|
var/list/obj/item/bodypart/parts = list()
|
|
for(var/X in bodyparts)
|
|
var/obj/item/bodypart/BP = X
|
|
if(BP.brute_dam + BP.burn_dam < BP.max_damage)
|
|
parts += BP
|
|
return parts
|
|
|
|
//Heals ONE bodypart randomly selected from damaged ones.
|
|
//It automatically updates damage overlays if necessary
|
|
//It automatically updates health status
|
|
/mob/living/carbon/heal_bodypart_damage(brute, burn, only_robotic = 0, only_organic = 1)
|
|
var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute,burn)
|
|
if(!parts.len)
|
|
return
|
|
var/obj/item/bodypart/picked = pick(parts)
|
|
if(picked.heal_damage(brute, burn, only_robotic, only_organic))
|
|
update_damage_overlays()
|
|
|
|
//Damages ONE bodypart randomly selected from damagable ones.
|
|
//It automatically updates damage overlays if necessary
|
|
//It automatically updates health status
|
|
/mob/living/carbon/take_bodypart_damage(brute, burn)
|
|
var/list/obj/item/bodypart/parts = get_damageable_bodyparts()
|
|
if(!parts.len)
|
|
return
|
|
var/obj/item/bodypart/picked = pick(parts)
|
|
if(picked.receive_damage(brute,burn))
|
|
update_damage_overlays()
|
|
|
|
|
|
//Heal MANY bodyparts, in random order
|
|
/mob/living/carbon/heal_overall_damage(brute, burn, only_robotic = 0, only_organic = 1, updating_health = 1)
|
|
var/list/obj/item/bodypart/parts = get_damaged_bodyparts(brute,burn)
|
|
|
|
var/update = 0
|
|
while(parts.len && (brute>0 || burn>0) )
|
|
var/obj/item/bodypart/picked = pick(parts)
|
|
|
|
var/brute_was = picked.brute_dam
|
|
var/burn_was = picked.burn_dam
|
|
|
|
update |= picked.heal_damage(brute,burn, only_robotic, only_organic, 0)
|
|
|
|
brute -= (brute_was-picked.brute_dam)
|
|
burn -= (burn_was-picked.burn_dam)
|
|
|
|
parts -= picked
|
|
if(updating_health)
|
|
updatehealth()
|
|
if(update)
|
|
update_damage_overlays()
|
|
|
|
// damage MANY bodyparts, in random order
|
|
/mob/living/carbon/take_overall_damage(brute, burn, updating_health = 1)
|
|
if(status_flags & GODMODE)
|
|
return //godmode
|
|
|
|
var/list/obj/item/bodypart/parts = get_damageable_bodyparts()
|
|
var/update = 0
|
|
while(parts.len && (brute>0 || burn>0) )
|
|
var/obj/item/bodypart/picked = pick(parts)
|
|
var/brute_per_part = round(brute/parts.len, 0.01)
|
|
var/burn_per_part = round(burn/parts.len, 0.01)
|
|
|
|
var/brute_was = picked.brute_dam
|
|
var/burn_was = picked.burn_dam
|
|
|
|
|
|
update |= picked.receive_damage(brute_per_part,burn_per_part, 0)
|
|
|
|
brute -= (picked.brute_dam - brute_was)
|
|
burn -= (picked.burn_dam - burn_was)
|
|
|
|
parts -= picked
|
|
if(updating_health)
|
|
updatehealth()
|
|
if(update)
|
|
update_damage_overlays()
|
|
|
|
|
|
|
|
/mob/living/carbon/adjustStaminaLoss(amount, updating_stamina = 1)
|
|
if(status_flags & GODMODE)
|
|
return 0
|
|
staminaloss = CLAMP(staminaloss + amount, 0, maxHealth*2)
|
|
//if(updating_stamina) CIT CHANGE - makes staminaloss changes always call update_stamina
|
|
update_stamina()
|
|
|
|
|
|
/mob/living/carbon/setStaminaLoss(amount, updating_stamina = 1)
|
|
if(status_flags & GODMODE)
|
|
return 0
|
|
staminaloss = amount
|
|
//if(updating_stamina) CIT CHANGE - makes staminaloss changes always call update_stamina
|
|
update_stamina()
|
|
|
|
/mob/living/carbon/getBrainLoss()
|
|
. = 0
|
|
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
|
if(B)
|
|
. = B.get_brain_damage()
|
|
|
|
//Some sources of brain damage shouldn't be deadly
|
|
/mob/living/carbon/adjustBrainLoss(amount, maximum = BRAIN_DAMAGE_DEATH)
|
|
if(status_flags & GODMODE)
|
|
return 0
|
|
var/prev_brainloss = getBrainLoss()
|
|
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
|
if(!B)
|
|
return
|
|
B.adjust_brain_damage(amount, maximum)
|
|
if(amount <= 0) //cut this early
|
|
return
|
|
var/brainloss = getBrainLoss()
|
|
if(brainloss > BRAIN_DAMAGE_MILD)
|
|
if(prob((amount * 2) + (brainloss - BRAIN_DAMAGE_MILD - (20 * LAZYLEN(get_traumas())) / 5))) //1 damage|50 brain damage = 4% chance
|
|
gain_trauma_type(BRAIN_TRAUMA_MILD)
|
|
if(brainloss > BRAIN_DAMAGE_SEVERE)
|
|
if(prob(amount + (brainloss - BRAIN_DAMAGE_SEVERE - (20 * LAZYLEN(get_traumas())) / 15))) //1 damage|150 brain damage = 3% chance
|
|
if(prob(20))
|
|
gain_trauma_type(BRAIN_TRAUMA_SPECIAL)
|
|
else
|
|
gain_trauma_type(BRAIN_TRAUMA_SEVERE)
|
|
|
|
if(prev_brainloss < 40 && brainloss >= 40)
|
|
to_chat(src, "<span class='warning'>You feel lightheaded.</span>")
|
|
else if(prev_brainloss < 120 && brainloss >= 120)
|
|
to_chat(src, "<span class='warning'>You feel less in control of your thoughts.</span>")
|
|
else if(prev_brainloss < 180 && brainloss >= 180)
|
|
to_chat(src, "<span class='warning'>You can feel your mind flickering on and off...</span>")
|
|
|
|
/mob/living/carbon/setBrainLoss(amount)
|
|
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
|
if(B)
|
|
var/adjusted_amount = amount - B.get_brain_damage()
|
|
B.adjust_brain_damage(adjusted_amount, null)
|