mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
147 lines
4.6 KiB
Plaintext
147 lines
4.6 KiB
Plaintext
/mob/living/silicon/robot/updatehealth()
|
|
if(status_flags & GODMODE)
|
|
health = 200
|
|
stat = CONSCIOUS
|
|
return
|
|
health = 200 - (getBruteLoss() + getFireLoss())
|
|
return
|
|
|
|
/mob/living/silicon/robot/getBruteLoss()
|
|
var/amount = 0
|
|
for(var/V in components)
|
|
var/datum/robot_component/C = components[V]
|
|
if(C.installed != 0) amount += C.brute_damage
|
|
return amount
|
|
|
|
/mob/living/silicon/robot/getFireLoss()
|
|
var/amount = 0
|
|
for(var/V in components)
|
|
var/datum/robot_component/C = components[V]
|
|
if(C.installed != 0) amount += C.electronics_damage
|
|
return amount
|
|
|
|
/mob/living/silicon/robot/adjustBruteLoss(var/amount)
|
|
if(amount > 0)
|
|
take_overall_damage(amount, 0)
|
|
else
|
|
heal_overall_damage(-amount, 0)
|
|
|
|
/mob/living/silicon/robot/adjustFireLoss(var/amount)
|
|
if(amount > 0)
|
|
take_overall_damage(0, amount)
|
|
else
|
|
heal_overall_damage(0, -amount)
|
|
|
|
/mob/living/silicon/robot/proc/get_damaged_components(var/brute, var/burn)
|
|
var/list/datum/robot_component/parts = list()
|
|
for(var/V in components)
|
|
var/datum/robot_component/C = components[V]
|
|
if(C.installed == 1) if((brute && C.brute_damage) || (burn && C.electronics_damage))
|
|
parts += C
|
|
return parts
|
|
|
|
/mob/living/silicon/robot/proc/get_damageable_components()
|
|
var/list/rval = new
|
|
for(var/V in components)
|
|
var/datum/robot_component/C = components[V]
|
|
if(C.installed == 1) rval += C
|
|
return rval
|
|
|
|
/mob/living/silicon/robot/proc/get_armour()
|
|
|
|
if(!components.len) return 0
|
|
var/datum/robot_component/C = components["armour"]
|
|
if(C && C.installed == 1)
|
|
return C
|
|
return 0
|
|
|
|
/mob/living/silicon/robot/heal_organ_damage(var/brute, var/burn)
|
|
var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
|
|
if(!parts.len) return
|
|
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/list/components = get_damageable_components()
|
|
if(!components.len)
|
|
return
|
|
|
|
//Combat shielding absorbs a percentage of damage directly into the cell.
|
|
if(module_active && istype(module_active,/obj/item/borg/combat/shield))
|
|
var/obj/item/borg/combat/shield/shield = module_active
|
|
//Shields absorb a certain percentage of damage based on their power setting.
|
|
var/absorb_brute = brute*shield.shield_level
|
|
var/absorb_burn = burn*shield.shield_level
|
|
var/cost = (absorb_brute+absorb_burn)*100
|
|
|
|
cell.charge -= cost
|
|
if(cell.charge <= 0)
|
|
cell.charge = 0
|
|
src << "\red Your shield has overloaded!"
|
|
else
|
|
brute -= absorb_brute
|
|
burn -= absorb_burn
|
|
src << "\red Your shield absorbs some of the impact!"
|
|
|
|
var/datum/robot_component/armour/A = get_armour()
|
|
if(A)
|
|
A.take_damage(brute,burn,sharp)
|
|
return
|
|
|
|
var/datum/robot_component/C = pick(components)
|
|
C.take_damage(brute,burn,sharp)
|
|
|
|
/mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn)
|
|
var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
|
|
|
|
while(parts.len && (brute>0 || burn>0) )
|
|
var/datum/robot_component/picked = pick(parts)
|
|
|
|
var/brute_was = picked.brute_damage
|
|
var/burn_was = picked.electronics_damage
|
|
|
|
picked.heal_damage(brute,burn)
|
|
|
|
brute -= (brute_was-picked.brute_damage)
|
|
burn -= (burn_was-picked.electronics_damage)
|
|
|
|
parts -= picked
|
|
|
|
/mob/living/silicon/robot/take_overall_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/used_weapon = null)
|
|
if(status_flags & GODMODE) return //godmode
|
|
var/list/datum/robot_component/parts = get_damageable_components()
|
|
|
|
//Combat shielding absorbs a percentage of damage directly into the cell.
|
|
if(module_active && istype(module_active,/obj/item/borg/combat/shield))
|
|
var/obj/item/borg/combat/shield/shield = module_active
|
|
//Shields absorb a certain percentage of damage based on their power setting.
|
|
var/absorb_brute = brute*shield.shield_level
|
|
var/absorb_burn = burn*shield.shield_level
|
|
var/cost = (absorb_brute+absorb_burn)*100
|
|
|
|
cell.charge -= cost
|
|
if(cell.charge <= 0)
|
|
cell.charge = 0
|
|
src << "\red Your shield has overloaded!"
|
|
else
|
|
brute -= absorb_brute
|
|
burn -= absorb_burn
|
|
src << "\red Your shield absorbs some of the impact!"
|
|
|
|
var/datum/robot_component/armour/A = get_armour()
|
|
if(A)
|
|
A.take_damage(brute,burn,sharp)
|
|
return
|
|
|
|
while(parts.len && (brute>0 || burn>0) )
|
|
var/datum/robot_component/picked = pick(parts)
|
|
|
|
var/brute_was = picked.brute_damage
|
|
var/burn_was = picked.electronics_damage
|
|
|
|
picked.take_damage(brute,burn)
|
|
|
|
brute -= (picked.brute_damage - brute_was)
|
|
burn -= (picked.electronics_damage - burn_was)
|
|
|
|
parts -= picked |