mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-01-03 05:51:56 +00:00
Shitton of bugfixes related to bryteloss/fireloss.
Note for coders: in order to help with seaching of health-related bugs I have moved many procs from /mob/ under /mob/living/. Also, done some clean up and rearranging. Results: -admin rejuvenating now works again; -people screams if getting creamated while still alive; -diseases actually loose your health; -monkeys wearing masks receive protection from acids as humans did; -and other minor fixes and improvements. Bugfix for imbuing a talisman. RD now spawns with only 2 pens instead of 3. Audible emotions can be heard by people outside of locker/other container. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1446 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -489,11 +489,8 @@ var/showadminmessages = 1
|
||||
|
||||
if (href_list["revive"])
|
||||
if ((src.rank in list( "Trial Admin", "Badmin", "Game Admin", "Game Master" )))
|
||||
var/mob/M = locate(href_list["revive"])
|
||||
var/mob/living/M = locate(href_list["revive"])
|
||||
if (ismob(M))
|
||||
if(istype(M, /mob/dead/observer))
|
||||
alert("Cannot revive a ghost")
|
||||
return
|
||||
if(config.allow_admin_rev)
|
||||
M.revive()
|
||||
message_admins("\red Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!", 1)
|
||||
@@ -1961,7 +1958,7 @@ var/showadminmessages = 1
|
||||
else
|
||||
alert("[M.name] is not prisoned.")
|
||||
|
||||
/mob/proc/revive()
|
||||
/mob/living/proc/revive()
|
||||
//src.fireloss = 0
|
||||
src.toxloss = 0
|
||||
//src.bruteloss = 0
|
||||
|
||||
@@ -394,7 +394,7 @@ TO DO: actually integrate random appearance and player preference save.
|
||||
command_alert("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert")
|
||||
world << sound('ionstorm.ogg')
|
||||
|
||||
/client/proc/cmd_admin_rejuvenate(mob/M as mob in world)
|
||||
/client/proc/cmd_admin_rejuvenate(mob/living/M as mob in world)
|
||||
set category = "Special Verbs"
|
||||
set name = "Rejuvenate"
|
||||
// All admins should be authenticated, but... what if?
|
||||
@@ -403,7 +403,7 @@ TO DO: actually integrate random appearance and player preference save.
|
||||
return
|
||||
if(!src.mob)
|
||||
return
|
||||
if(istype(M, /mob/dead/observer))
|
||||
if(!istype(M))
|
||||
alert("Cannot revive a ghost")
|
||||
return
|
||||
if(config.allow_admin_rev)
|
||||
@@ -614,7 +614,7 @@ TO DO: actually integrate random appearance and player preference save.
|
||||
// I will both remove their SVN access and permanently ban them from my servers.
|
||||
return
|
||||
|
||||
/client/proc/cmd_admin_check_contents(mob/M as mob in world)
|
||||
/client/proc/cmd_admin_check_contents(mob/living/M as mob in world)
|
||||
set category = "Special Verbs"
|
||||
set name = "Check Contents"
|
||||
|
||||
|
||||
@@ -800,13 +800,3 @@ In all, this is a lot like the monkey code. /N
|
||||
src.health = 100
|
||||
src.stat = 0
|
||||
|
||||
|
||||
/mob/living/carbon/alien/heal_organ_damage(var/brute, var/burn)
|
||||
bruteloss = max(0, bruteloss-brute) //HACK
|
||||
fireloss = max(0, fireloss-burn) //HACK
|
||||
src.updatehealth()
|
||||
|
||||
/mob/living/carbon/alien/take_organ_damage(var/brute, var/burn)
|
||||
bruteloss += brute //HACK
|
||||
fireloss += burn //HACK
|
||||
src.updatehealth()
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
else
|
||||
src.bruteloss += d
|
||||
src.take_organ_damage(d)
|
||||
for(var/mob/M in viewers(user, null))
|
||||
if(M.client)
|
||||
M.show_message(text("\red <B>[user] attacks [src]'s stomach wall with the [I.name]!"), 2)
|
||||
@@ -85,7 +85,8 @@
|
||||
shock_damage *= siemens_coeff
|
||||
if (shock_damage<1)
|
||||
return 0
|
||||
src.burn_skin(shock_damage)
|
||||
src.take_overall_damage(0,shock_damage)
|
||||
//src.burn_skin(shock_damage)
|
||||
//src.fireloss += shock_damage //burn_skin will do this for us
|
||||
//src.updatehealth()
|
||||
src.visible_message(
|
||||
@@ -96,4 +97,13 @@
|
||||
if(src.stunned < shock_damage) src.stunned = shock_damage
|
||||
if(src.weakened < 20*siemens_coeff) src.weakened = 20*siemens_coeff
|
||||
|
||||
return shock_damage
|
||||
return shock_damage
|
||||
|
||||
|
||||
/mob/living/carbon/proc/swap_hand()
|
||||
src.hand = !( src.hand )
|
||||
if (!( src.hand ))
|
||||
src.hands.dir = NORTH
|
||||
else
|
||||
src.hands.dir = SOUTH
|
||||
return
|
||||
|
||||
@@ -457,5 +457,5 @@
|
||||
for (var/mob/O in viewers(src, null))
|
||||
O.show_message(message, m_type)
|
||||
else if (m_type & 2)
|
||||
for (var/mob/O in hearers(src, null))
|
||||
for (var/mob/O in hearers(src.loc, null))
|
||||
O.show_message(message, m_type)
|
||||
|
||||
@@ -2607,54 +2607,49 @@ It can still be worn/put on as normal.
|
||||
|
||||
/mob/living/carbon/human/proc/UpdateDamage()
|
||||
|
||||
var/list/L = list( )
|
||||
for(var/t in src.organs)
|
||||
if (istype(src.organs[text("[]", t)], /datum/organ/external))
|
||||
L += src.organs[text("[]", t)]
|
||||
src.bruteloss = 0
|
||||
src.fireloss = 0
|
||||
for(var/datum/organ/external/O in L)
|
||||
src.bruteloss += O.brute_dam
|
||||
src.fireloss += O.burn_dam
|
||||
var/datum/organ/external/O
|
||||
for(var/t in src.organs)
|
||||
O = src.organs[t]
|
||||
if (istype(O, /datum/organ/external))
|
||||
src.bruteloss += O.brute_dam
|
||||
src.fireloss += O.burn_dam
|
||||
return
|
||||
|
||||
// new damage icon system
|
||||
// now constructs damage icon for each organ from mask * damage field
|
||||
|
||||
/mob/living/carbon/human/proc/UpdateDamageIcon()
|
||||
var/list/L = list( )
|
||||
for (var/t in src.organs)
|
||||
if (istype(src.organs[t], /datum/organ/external))
|
||||
L += src.organs[t]
|
||||
|
||||
del(src.body_standing)
|
||||
src.body_standing = list()
|
||||
del(src.body_lying)
|
||||
src.body_lying = list()
|
||||
|
||||
src.bruteloss = 0
|
||||
src.fireloss = 0
|
||||
var/datum/organ/external/O
|
||||
for(var/t in src.organs)
|
||||
O = src.organs[t]
|
||||
if (istype(O, /datum/organ/external))
|
||||
src.bruteloss += O.brute_dam
|
||||
src.fireloss += O.burn_dam
|
||||
|
||||
for (var/datum/organ/external/O in L)
|
||||
src.bruteloss += O.brute_dam
|
||||
src.fireloss += O.burn_dam
|
||||
var/icon/DI = new /icon('dam_human.dmi', O.damage_state) // the damage icon for whole human
|
||||
DI.Blend(new /icon('dam_mask.dmi', O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
|
||||
|
||||
var/icon/DI = new /icon('dam_human.dmi', O.damage_state) // the damage icon for whole human
|
||||
DI.Blend(new /icon('dam_mask.dmi', O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
|
||||
// world << "[O.icon_name] [O.damage_state] \icon[DI]"
|
||||
|
||||
// world << "[O.icon_name] [O.damage_state] \icon[DI]"
|
||||
body_standing += DI
|
||||
|
||||
body_standing += DI
|
||||
DI = new /icon('dam_human.dmi', "[O.damage_state]-2") // repeat for lying icons
|
||||
DI.Blend(new /icon('dam_mask.dmi', "[O.icon_name]2"), ICON_MULTIPLY)
|
||||
|
||||
DI = new /icon('dam_human.dmi', "[O.damage_state]-2") // repeat for lying icons
|
||||
DI.Blend(new /icon('dam_mask.dmi', "[O.icon_name]2"), ICON_MULTIPLY)
|
||||
// world << "[O.r_name]2 [O.d_i_state]-2 \icon[DI]"
|
||||
|
||||
// world << "[O.r_name]2 [O.d_i_state]-2 \icon[DI]"
|
||||
body_lying += DI
|
||||
|
||||
body_lying += DI
|
||||
|
||||
//src.body_standing += new /icon( 'dam_zones.dmi', text("[]", O.d_i_state) )
|
||||
//src.body_lying += new /icon( 'dam_zones.dmi', text("[]2", O.d_i_state) )
|
||||
//src.body_standing += new /icon( 'dam_zones.dmi', text("[]", O.d_i_state) )
|
||||
//src.body_lying += new /icon( 'dam_zones.dmi', text("[]2", O.d_i_state) )
|
||||
|
||||
/mob/living/carbon/human/show_inv(mob/user as mob)
|
||||
|
||||
@@ -2755,12 +2750,79 @@ It can still be worn/put on as normal.
|
||||
siemens_coeff = G.siemens_coefficient
|
||||
return ..(shock_damage,source,siemens_coeff)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn)
|
||||
var/list/datum/organ/external/parts = list()
|
||||
for(var/organ_name in src.organs)
|
||||
var/datum/organ/external/organ = src.organs[organ_name]
|
||||
if((brute && organ.brute_dam) || (burn && organ.burn_dam))
|
||||
parts += organ
|
||||
return parts
|
||||
|
||||
/mob/living/carbon/human/proc/get_damageable_organs()
|
||||
var/list/datum/organ/external/parts = list()
|
||||
for(var/organ_name in src.organs)
|
||||
var/datum/organ/external/organ = src.organs[organ_name]
|
||||
if(organ.brute_dam + organ.burn_dam < organ.max_damage)
|
||||
parts += organ
|
||||
return parts
|
||||
|
||||
// heal ONE external organ, organ gets randomly selected from damaged ones.
|
||||
/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn)
|
||||
..()
|
||||
var/list/datum/organ/external/parts = get_damaged_organs(brute,burn)
|
||||
if(!parts.len)
|
||||
return
|
||||
var/datum/organ/external/picked = pick(parts)
|
||||
picked.heal_damage(brute,burn)
|
||||
src.updatehealth()
|
||||
src.UpdateDamageIcon()
|
||||
|
||||
// damage ONE external organ, organ gets randomly selected from damaged ones.
|
||||
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn)
|
||||
..()
|
||||
var/list/datum/organ/external/parts = get_damageable_organs()
|
||||
if(!parts.len)
|
||||
return
|
||||
var/datum/organ/external/picked = pick(parts)
|
||||
picked.take_damage(brute,burn)
|
||||
src.updatehealth()
|
||||
src.UpdateDamageIcon()
|
||||
|
||||
// heal MANY external organs, in random order
|
||||
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn)
|
||||
var/list/datum/organ/external/parts = get_damaged_organs(brute,burn)
|
||||
|
||||
while(parts.len && (brute>0 || burn>0) )
|
||||
var/datum/organ/external/picked = pick(parts)
|
||||
|
||||
var/brute_was = picked.brute_dam
|
||||
var/burn_was = picked.burn_dam
|
||||
|
||||
picked.heal_damage(brute,burn)
|
||||
|
||||
brute -= (brute_was-picked.brute_dam)
|
||||
burn -= (burn_was-picked.burn_dam)
|
||||
|
||||
parts -= picked
|
||||
src.updatehealth()
|
||||
src.UpdateDamageIcon()
|
||||
|
||||
// damage MANY external organs, in random order
|
||||
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn)
|
||||
var/list/datum/organ/external/parts = get_damageable_organs()
|
||||
|
||||
while(parts.len && (brute>0 || burn>0) )
|
||||
var/datum/organ/external/picked = pick(parts)
|
||||
|
||||
var/brute_was = picked.brute_dam
|
||||
var/burn_was = picked.burn_dam
|
||||
|
||||
picked.take_damage(brute,burn)
|
||||
|
||||
brute -= (picked.brute_dam-brute_was)
|
||||
burn -= (picked.burn_dam-burn_was)
|
||||
|
||||
parts -= picked
|
||||
src.updatehealth()
|
||||
src.UpdateDamageIcon()
|
||||
|
||||
/mob/living/carbon/human/proc/isarmored(var/datum/organ/external/def_zone)
|
||||
@@ -2775,3 +2837,24 @@ It can still be worn/put on as normal.
|
||||
return 1
|
||||
//If wearing armor that covers the targetted bodypart, armored.
|
||||
return 0
|
||||
|
||||
|
||||
/mob/living/carbon/human/Topic(href, href_list)
|
||||
if (href_list["mach_close"])
|
||||
var/t1 = text("window=[]", href_list["mach_close"])
|
||||
src.machine = null
|
||||
src << browse(null, t1)
|
||||
if ((href_list["item"] && !( usr.stat ) && usr.canmove && !( usr.restrained() ) && in_range(src, usr) && ticker)) //if game hasn't started, can't make an equip_e
|
||||
var/obj/equip_e/human/O = new /obj/equip_e/human( )
|
||||
O.source = usr
|
||||
O.target = src
|
||||
O.item = usr.equipped()
|
||||
O.s_loc = usr.loc
|
||||
O.t_loc = src.loc
|
||||
O.place = href_list["item"]
|
||||
src.requests += O
|
||||
spawn( 0 )
|
||||
O.process()
|
||||
return
|
||||
..()
|
||||
return
|
||||
@@ -105,7 +105,7 @@
|
||||
src.fireloss += 40
|
||||
src.health = 100 - src.oxyloss - src.toxloss - src.fireloss - src.bruteloss
|
||||
return
|
||||
|
||||
/*
|
||||
/mob/living/carbon/monkey/bullet_act(flag)
|
||||
|
||||
if (flag == PROJECTILE_BULLET)
|
||||
@@ -140,7 +140,7 @@
|
||||
src.stuttering += 5
|
||||
src.drowsyness += 5
|
||||
return
|
||||
|
||||
*/
|
||||
/mob/living/carbon/monkey/hand_p(mob/M as mob)
|
||||
if ((M.a_intent == "hurt" && !( istype(src.wear_mask, /obj/item/clothing/mask/muzzle) )))
|
||||
if ((prob(75) && src.health > 0))
|
||||
@@ -704,12 +704,3 @@
|
||||
del(src)
|
||||
return
|
||||
|
||||
/mob/living/carbon/monkey/heal_organ_damage(var/brute, var/burn)
|
||||
bruteloss = max(0, bruteloss-brute) //HACK
|
||||
fireloss = max(0, fireloss-burn) //HACK
|
||||
src.updatehealth()
|
||||
|
||||
/mob/living/carbon/monkey/take_organ_damage(var/brute, var/burn)
|
||||
bruteloss += brute //HACK
|
||||
fireloss += burn //HACK
|
||||
src.updatehealth()
|
||||
201
code/modules/mob/living/living.dm
Normal file
201
code/modules/mob/living/living.dm
Normal file
@@ -0,0 +1,201 @@
|
||||
/mob/living/verb/succumb()
|
||||
set hidden = 1
|
||||
|
||||
if ((src.health < 0 && src.health > -95.0))
|
||||
src.oxyloss += src.health + 200
|
||||
src.health = 100 - src.oxyloss - src.toxloss - src.fireloss - src.bruteloss
|
||||
src << "\blue You have given up life and succumbed to death."
|
||||
|
||||
|
||||
/mob/living/bullet_act(flag)
|
||||
if (flag == PROJECTILE_BULLET)
|
||||
if (istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/dam_zone = pick("chest", "chest", "chest", "groin", "head")
|
||||
if (H.organs[text("[]", dam_zone)])
|
||||
var/datum/organ/external/affecting = H.organs[text("[]", dam_zone)]
|
||||
if (affecting.take_damage(51, 0))
|
||||
H.UpdateDamageIcon()
|
||||
else
|
||||
H.UpdateDamage()
|
||||
else
|
||||
src.take_organ_damage(51)
|
||||
src.updatehealth()
|
||||
if (prob(80) && src.weakened <= 2)
|
||||
src.weakened = 2
|
||||
else if (flag == PROJECTILE_TASER)
|
||||
if (prob(75) && src.stunned <= 10)
|
||||
src.stunned = 10
|
||||
else
|
||||
src.weakened = 10
|
||||
else if (flag == PROJECTILE_DART)
|
||||
src.weakened += 5
|
||||
src.toxloss += 10
|
||||
else if(flag == PROJECTILE_LASER)
|
||||
if (istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/dam_zone = pick("chest", "chest", "chest", "groin", "head")
|
||||
if (H.organs[text("[]", dam_zone)])
|
||||
var/datum/organ/external/affecting = H.organs[text("[]", dam_zone)]
|
||||
if (affecting.take_damage(20, 0))
|
||||
H.UpdateDamageIcon()
|
||||
else
|
||||
H.UpdateDamage()
|
||||
src.updatehealth()
|
||||
else
|
||||
src.take_organ_damage(20)
|
||||
if (prob(25) && src.stunned <= 2)
|
||||
src.stunned = 2
|
||||
else if(flag == PROJECTILE_PULSE)
|
||||
if (istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/dam_zone = pick("chest", "chest", "chest", "groin", "head")
|
||||
if (H.organs[text("[]", dam_zone)])
|
||||
var/datum/organ/external/affecting = H.organs[text("[]", dam_zone)]
|
||||
if (affecting.take_damage(40, 0))
|
||||
H.UpdateDamageIcon()
|
||||
else
|
||||
H.UpdateDamage()
|
||||
src.updatehealth()
|
||||
else
|
||||
src.take_organ_damage(40)
|
||||
if (prob(50))
|
||||
src.stunned = min(src.stunned, 5)
|
||||
else if(flag == PROJECTILE_BOLT)
|
||||
src.toxloss += 3
|
||||
src.radiation += 100
|
||||
src.updatehealth()
|
||||
src.stuttering += 5
|
||||
src.drowsyness += 5
|
||||
if (prob(10))
|
||||
src.weakened = min(src.weakened, 2)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/proc/updatehealth()
|
||||
if (src.nodamage == 0)
|
||||
src.health = 100 - src.oxyloss - src.toxloss - src.fireloss - src.bruteloss
|
||||
else
|
||||
src.health = 100
|
||||
src.stat = 0
|
||||
|
||||
//sort of a legacy burn method for /electrocute, /shock, and the e_chair
|
||||
/mob/living/proc/burn_skin(burn_amount)
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
//world << "DEBUG: burn_skin(), mutations=[mutations]"
|
||||
if (src.mutations & 2) //fireproof
|
||||
return 0
|
||||
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
|
||||
var/divided_damage = (burn_amount)/(H.organs.len)
|
||||
var/datum/organ/external/affecting = null
|
||||
var/extradam = 0 //added to when organ is at max dam
|
||||
for(var/A in H.organs)
|
||||
if(!H.organs[A]) continue
|
||||
affecting = H.organs[A]
|
||||
if(!istype(affecting, /datum/organ/external)) continue
|
||||
if(affecting.take_damage(0, divided_damage+extradam))
|
||||
extradam = 0
|
||||
else
|
||||
extradam += divided_damage
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
return 1
|
||||
else if(istype(src, /mob/living/carbon/monkey))
|
||||
if (src.mutations & 2) //fireproof
|
||||
return 0
|
||||
var/mob/living/carbon/monkey/M = src
|
||||
M.fireloss += burn_amount
|
||||
M.updatehealth()
|
||||
return 1
|
||||
else if(istype(src, /mob/living/silicon/ai))
|
||||
return 0
|
||||
|
||||
/mob/living/proc/adjustBodyTemp(actual, desired, incrementboost)
|
||||
var/temperature = actual
|
||||
var/difference = abs(actual-desired) //get difference
|
||||
var/increments = difference/10 //find how many increments apart they are
|
||||
var/change = increments*incrementboost // Get the amount to change by (x per increment)
|
||||
|
||||
// Too cold
|
||||
if(actual < desired)
|
||||
temperature += change
|
||||
if(actual > desired)
|
||||
temperature = desired
|
||||
// Too hot
|
||||
if(actual > desired)
|
||||
temperature -= change
|
||||
if(actual < desired)
|
||||
temperature = desired
|
||||
// if(istype(src, /mob/living/carbon/human))
|
||||
// world << "[src] ~ [src.bodytemperature] ~ [temperature]"
|
||||
return temperature
|
||||
|
||||
|
||||
/mob/living/proc/get_contents()
|
||||
var/list/L = list()
|
||||
L += src.contents
|
||||
for(var/obj/item/weapon/storage/S in src.contents)
|
||||
L += S.return_inv()
|
||||
for(var/obj/item/weapon/gift/G in src.contents)
|
||||
L += G.gift
|
||||
if (istype(G.gift, /obj/item/weapon/storage))
|
||||
L += G.gift:return_inv()
|
||||
return L
|
||||
|
||||
/mob/living/proc/check_contents_for(A)
|
||||
var/list/L = list()
|
||||
L += src.contents
|
||||
for(var/obj/item/weapon/storage/S in src.contents)
|
||||
L += S.return_inv()
|
||||
for(var/obj/item/weapon/gift/G in src.contents)
|
||||
L += G.gift
|
||||
if (istype(G.gift, /obj/item/weapon/storage))
|
||||
L += G.gift:return_inv()
|
||||
|
||||
for(var/obj/B in L)
|
||||
if(B.type == A)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/mob/living/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0)
|
||||
return 0 //only carbon liveforms have this proc
|
||||
|
||||
/mob/living/emp_act(severity)
|
||||
var/list/L = src.get_contents()
|
||||
for(var/obj/O in L)
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
|
||||
/mob/living/proc/get_organ_target()
|
||||
var/mob/shooter = src
|
||||
var/t = shooter:zone_sel.selecting
|
||||
if ((t in list( "eyes", "mouth" )))
|
||||
t = "head"
|
||||
var/datum/organ/external/def_zone = ran_zone(t)
|
||||
return def_zone
|
||||
|
||||
|
||||
// heal ONE external organ, organ gets randomly selected from damaged ones.
|
||||
/mob/living/proc/heal_organ_damage(var/brute, var/burn)
|
||||
bruteloss = max(0, bruteloss-brute)
|
||||
fireloss = max(0, fireloss-burn)
|
||||
src.updatehealth()
|
||||
|
||||
// damage ONE external organ, organ gets randomly selected from damaged ones.
|
||||
/mob/living/proc/take_organ_damage(var/brute, var/burn)
|
||||
bruteloss += brute
|
||||
fireloss += burn
|
||||
src.updatehealth()
|
||||
|
||||
// heal MANY external organs, in random order
|
||||
/mob/living/proc/heal_overall_damage(var/brute, var/burn)
|
||||
bruteloss = max(0, bruteloss-brute)
|
||||
fireloss = max(0, fireloss-burn)
|
||||
src.updatehealth()
|
||||
|
||||
// damage MANY external organs, in random order
|
||||
/mob/living/proc/take_overall_damage(var/brute, var/burn)
|
||||
bruteloss += brute
|
||||
fireloss += burn
|
||||
src.updatehealth()
|
||||
@@ -96,8 +96,8 @@ obj/item/weapon/robot_module/syndicate
|
||||
/obj/item/weapon/robot_module/medical/New()
|
||||
..()
|
||||
src.modules += new /obj/item/device/healthanalyzer(src)
|
||||
src.modules += new /obj/item/weapon/medical/ointment/medbot(src)
|
||||
src.modules += new /obj/item/weapon/medical/bruise_pack/medbot(src)
|
||||
src.modules += new /obj/item/stack/medical/ointment/medbot(src)
|
||||
src.modules += new /obj/item/stack/medical/bruise_pack/medbot(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/syringe/robot(src)
|
||||
src.modules += new /obj/item/weapon/scalpel(src)
|
||||
src.modules += new /obj/item/weapon/circular_saw(src)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
return
|
||||
|
||||
/mob/living/silicon/emp_act(severity)
|
||||
src.fireloss += 25
|
||||
src.take_organ_damage(25)
|
||||
flick("noise", src:flash)
|
||||
src << "\red <B>*BZZZT*</B>"
|
||||
src << "\red Warning: Electromagnetic pulse detected."
|
||||
|
||||
@@ -20,12 +20,12 @@
|
||||
|
||||
// fun if you want to typecast humans/monkeys/etc without writing long path-filled lines.
|
||||
/proc/ishuman(A)
|
||||
if(A && istype(A, /mob/living/carbon/human))
|
||||
if(istype(A, /mob/living/carbon/human))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isalien(A)
|
||||
if(A && istype(A, /mob/living/carbon/alien))
|
||||
if(istype(A, /mob/living/carbon/alien))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
return 0
|
||||
|
||||
/proc/isrobot(A)
|
||||
if(A && istype(A, /mob/living/silicon/robot))
|
||||
if(istype(A, /mob/living/silicon/robot))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -45,17 +45,17 @@
|
||||
return 0
|
||||
|
||||
/proc/isAI(A)
|
||||
if(A && istype(A, /mob/living/silicon/ai))
|
||||
if(istype(A, /mob/living/silicon/ai))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/iscarbon(A)
|
||||
if(A && istype(A, /mob/living/carbon))
|
||||
if(istype(A, /mob/living/carbon))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/issilicon(A)
|
||||
if(A && istype(A, /mob/living/silicon))
|
||||
if(istype(A, /mob/living/silicon))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -983,26 +983,6 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/Topic(href, href_list)
|
||||
if (href_list["mach_close"])
|
||||
var/t1 = text("window=[]", href_list["mach_close"])
|
||||
src.machine = null
|
||||
src << browse(null, t1)
|
||||
if ((href_list["item"] && !( usr.stat ) && usr.canmove && !( usr.restrained() ) && in_range(src, usr) && ticker)) //if game hasn't started, can't make an equip_e
|
||||
var/obj/equip_e/human/O = new /obj/equip_e/human( )
|
||||
O.source = usr
|
||||
O.target = src
|
||||
O.item = usr.equipped()
|
||||
O.s_loc = usr.loc
|
||||
O.t_loc = src.loc
|
||||
O.place = href_list["item"]
|
||||
src.requests += O
|
||||
spawn( 0 )
|
||||
O.process()
|
||||
return
|
||||
..()
|
||||
return
|
||||
|
||||
/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
|
||||
if(!src.client) return
|
||||
if (type)
|
||||
@@ -1096,13 +1076,6 @@
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/proc/swap_hand()
|
||||
src.hand = !( src.hand )
|
||||
if (!( src.hand ))
|
||||
src.hands.dir = NORTH
|
||||
else
|
||||
src.hands.dir = SOUTH
|
||||
return
|
||||
|
||||
/mob/proc/drop_item_v()
|
||||
if (src.stat == 0)
|
||||
@@ -1383,14 +1356,6 @@
|
||||
src << browse('changelog.html', "window=changes;size=675x650")
|
||||
src.client.changes = 1
|
||||
|
||||
/mob/verb/succumb()
|
||||
set hidden = 1
|
||||
|
||||
if ((src.health < 0 && src.health > -95.0))
|
||||
src.oxyloss += src.health + 200
|
||||
src.health = 100 - src.oxyloss - src.toxloss - src.fireloss - src.bruteloss
|
||||
src << "\blue You have given up life and succumbed to death."
|
||||
|
||||
/mob/var/ghost_ears = 1
|
||||
/mob/verb/toggle_ghost_ears()
|
||||
set name = "Ghost ears"
|
||||
@@ -1582,69 +1547,6 @@
|
||||
if(LinkBlocked(usr.loc,src.loc)) return
|
||||
src.show_inv(usr)
|
||||
|
||||
/mob/bullet_act(flag)
|
||||
if (flag == PROJECTILE_BULLET)
|
||||
if (istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/dam_zone = pick("chest", "chest", "chest", "groin", "head")
|
||||
if (H.organs[text("[]", dam_zone)])
|
||||
var/datum/organ/external/affecting = H.organs[text("[]", dam_zone)]
|
||||
if (affecting.take_damage(51, 0))
|
||||
H.UpdateDamageIcon()
|
||||
else
|
||||
H.UpdateDamage()
|
||||
else
|
||||
src.bruteloss += 51
|
||||
src.updatehealth()
|
||||
if (prob(80) && src.weakened <= 2)
|
||||
src.weakened = 2
|
||||
else if (flag == PROJECTILE_TASER)
|
||||
if (prob(75) && src.stunned <= 10)
|
||||
src.stunned = 10
|
||||
else
|
||||
src.weakened = 10
|
||||
else if (flag == PROJECTILE_DART)
|
||||
src.weakened += 5
|
||||
src.toxloss += 10
|
||||
else if(flag == PROJECTILE_LASER)
|
||||
if (istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/dam_zone = pick("chest", "chest", "chest", "groin", "head")
|
||||
if (H.organs[text("[]", dam_zone)])
|
||||
var/datum/organ/external/affecting = H.organs[text("[]", dam_zone)]
|
||||
if (affecting.take_damage(20, 0))
|
||||
H.UpdateDamageIcon()
|
||||
else
|
||||
H.UpdateDamage()
|
||||
else
|
||||
src.bruteloss += 20
|
||||
src.updatehealth()
|
||||
if (prob(25) && src.stunned <= 2)
|
||||
src.stunned = 2
|
||||
else if(flag == PROJECTILE_PULSE)
|
||||
if (istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/dam_zone = pick("chest", "chest", "chest", "groin", "head")
|
||||
if (H.organs[text("[]", dam_zone)])
|
||||
var/datum/organ/external/affecting = H.organs[text("[]", dam_zone)]
|
||||
if (affecting.take_damage(40, 0))
|
||||
H.UpdateDamageIcon()
|
||||
else
|
||||
H.UpdateDamage()
|
||||
else
|
||||
src.bruteloss += 40
|
||||
src.updatehealth()
|
||||
if (prob(50))
|
||||
src.stunned = min(src.stunned, 5)
|
||||
else if(flag == PROJECTILE_BOLT)
|
||||
src.toxloss += 3
|
||||
src.radiation += 100
|
||||
src.updatehealth()
|
||||
src.stuttering += 5
|
||||
src.drowsyness += 5
|
||||
if (prob(10))
|
||||
src.weakened = min(src.weakened, 2)
|
||||
return
|
||||
|
||||
|
||||
/atom/movable/Move(NewLoc, direct)
|
||||
@@ -1961,64 +1863,6 @@
|
||||
for(var/mob/M in viewers())
|
||||
M.see(message)
|
||||
|
||||
/mob/proc/updatehealth()
|
||||
if (src.nodamage == 0)
|
||||
src.health = 100 - src.oxyloss - src.toxloss - src.fireloss - src.bruteloss
|
||||
else
|
||||
src.health = 100
|
||||
src.stat = 0
|
||||
|
||||
//sort of a legacy burn method for /electrocute, /shock, and the e_chair
|
||||
/mob/proc/burn_skin(burn_amount)
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
//world << "DEBUG: burn_skin(), mutations=[mutations]"
|
||||
if (src.mutations & 2) //fireproof
|
||||
return 0
|
||||
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
|
||||
var/divided_damage = (burn_amount)/(H.organs.len)
|
||||
var/datum/organ/external/affecting = null
|
||||
var/extradam = 0 //added to when organ is at max dam
|
||||
for(var/A in H.organs)
|
||||
if(!H.organs[A]) continue
|
||||
affecting = H.organs[A]
|
||||
if(!istype(affecting, /datum/organ/external)) continue
|
||||
if(affecting.take_damage(0, divided_damage+extradam))
|
||||
extradam = 0
|
||||
else
|
||||
extradam += divided_damage
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
return 1
|
||||
else if(istype(src, /mob/living/carbon/monkey))
|
||||
if (src.mutations & 2) //fireproof
|
||||
return 0
|
||||
var/mob/living/carbon/monkey/M = src
|
||||
M.fireloss += burn_amount
|
||||
M.updatehealth()
|
||||
return 1
|
||||
else if(istype(src, /mob/living/silicon/ai))
|
||||
return 0
|
||||
|
||||
/mob/proc/adjustBodyTemp(actual, desired, incrementboost)
|
||||
var/temperature = actual
|
||||
var/difference = abs(actual-desired) //get difference
|
||||
var/increments = difference/10 //find how many increments apart they are
|
||||
var/change = increments*incrementboost // Get the amount to change by (x per increment)
|
||||
|
||||
// Too cold
|
||||
if(actual < desired)
|
||||
temperature += change
|
||||
if(actual > desired)
|
||||
temperature = desired
|
||||
// Too hot
|
||||
if(actual > desired)
|
||||
temperature -= change
|
||||
if(actual < desired)
|
||||
temperature = desired
|
||||
// if(istype(src, /mob/living/carbon/human))
|
||||
// world << "[src] ~ [src.bodytemperature] ~ [temperature]"
|
||||
return temperature
|
||||
|
||||
//This is the proc for gibbing a mob. Cannot gib ghosts. Removed the medal reference,
|
||||
//added different sort of gibs and animations. N
|
||||
/mob/proc/gib()
|
||||
@@ -2081,8 +1925,6 @@ Originally created for wizard disintegrate. I've removed the virus code since it
|
||||
*/
|
||||
/mob/proc/dust()
|
||||
|
||||
if (istype(src, /mob/dead/observer))
|
||||
return
|
||||
src.death(1)
|
||||
var/atom/movable/overlay/animation = null
|
||||
src.monkeyizing = 1
|
||||
@@ -2118,32 +1960,6 @@ Originally created for wizard disintegrate. I've removed the virus code since it
|
||||
sleep(15)
|
||||
del(src)
|
||||
|
||||
/mob/proc/get_contents()
|
||||
var/list/L = list()
|
||||
L += src.contents
|
||||
for(var/obj/item/weapon/storage/S in src.contents)
|
||||
L += S.return_inv()
|
||||
for(var/obj/item/weapon/gift/G in src.contents)
|
||||
L += G.gift
|
||||
if (istype(G.gift, /obj/item/weapon/storage))
|
||||
L += G.gift:return_inv()
|
||||
return L
|
||||
|
||||
/mob/proc/check_contents_for(A)
|
||||
var/list/L = list()
|
||||
L += src.contents
|
||||
for(var/obj/item/weapon/storage/S in src.contents)
|
||||
L += S.return_inv()
|
||||
for(var/obj/item/weapon/gift/G in src.contents)
|
||||
L += G.gift
|
||||
if (istype(G.gift, /obj/item/weapon/storage))
|
||||
L += G.gift:return_inv()
|
||||
|
||||
for(var/obj/B in L)
|
||||
if(B.type == A)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/*
|
||||
adds a dizziness amount to a mob
|
||||
@@ -2270,92 +2086,3 @@ note dizziness decrements automatically in the mob's Life() proc.
|
||||
boom.icon_state = "loss_malf"
|
||||
else
|
||||
boom.icon_state = "loss_general"
|
||||
|
||||
/mob/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0)
|
||||
return 0 //only carbon liveforms has this proc
|
||||
|
||||
/mob/emp_act(severity)
|
||||
var/list/L = src.get_contents()
|
||||
for(var/obj/O in L)
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
|
||||
/mob/proc/get_organ_target()
|
||||
var/mob/shooter = src
|
||||
var/t = shooter:zone_sel.selecting
|
||||
if ((t in list( "eyes", "mouth" )))
|
||||
t = "head"
|
||||
var/datum/organ/external/def_zone = ran_zone(t)
|
||||
return def_zone
|
||||
|
||||
// heal ONE external organ, organ gets randomly selected from damaged ones.
|
||||
/mob/proc/heal_organ_damage(var/brute, var/burn)
|
||||
var/list/datum/organ/external/parts = list()
|
||||
for(var/organ_name in src.organs)
|
||||
var/datum/organ/external/organ = src.organs[organ_name]
|
||||
if((brute && organ.brute_dam) || (burn && organ.burn_dam))
|
||||
parts += organ
|
||||
|
||||
if(!parts.len)
|
||||
return
|
||||
var/datum/organ/external/picked = pick(parts)
|
||||
picked.heal_damage(brute,burn)
|
||||
src.updatehealth()
|
||||
|
||||
// damage ONE external organ, organ gets randomly selected from damaged ones.
|
||||
/mob/proc/take_organ_damage(var/brute, var/burn)
|
||||
var/list/datum/organ/external/parts = list()
|
||||
for(var/organ_name in src.organs)
|
||||
var/datum/organ/external/organ = src.organs[organ_name]
|
||||
if(organ.brute_dam + organ.burn_dam < organ.max_damage)
|
||||
parts += organ
|
||||
|
||||
if(!parts.len)
|
||||
return
|
||||
var/datum/organ/external/picked = pick(parts)
|
||||
picked.take_damage(brute,burn)
|
||||
src.updatehealth()
|
||||
|
||||
// heal MANY external organs, in random order
|
||||
/mob/proc/heal_overall_damage(var/brute, var/burn)
|
||||
var/list/datum/organ/external/parts = list()
|
||||
for(var/organ_name in src.organs)
|
||||
var/datum/organ/external/organ = src.organs[organ_name]
|
||||
if((brute && organ.brute_dam) || (burn && organ.burn_dam))
|
||||
parts += organ
|
||||
|
||||
while(parts.len && (brute>0 || burn>0) )
|
||||
var/datum/organ/external/picked = pick(parts)
|
||||
|
||||
var/brute_was = picked.brute_dam
|
||||
var/burn_was = picked.burn_dam
|
||||
|
||||
picked.heal_damage(brute,burn)
|
||||
|
||||
brute -= (brute_was-picked.brute_dam)
|
||||
burn -= (burn_was-picked.burn_dam)
|
||||
|
||||
parts -= picked
|
||||
src.updatehealth()
|
||||
|
||||
// damage MANY external organs, in random order
|
||||
/mob/proc/take_overall_damage(var/brute, var/burn)
|
||||
var/list/datum/organ/external/parts = list()
|
||||
for(var/organ_name in src.organs)
|
||||
var/datum/organ/external/organ = src.organs[organ_name]
|
||||
if(organ.brute_dam + organ.burn_dam < organ.max_damage)
|
||||
parts += organ
|
||||
|
||||
while(parts.len && (brute>0 || burn>0) )
|
||||
var/datum/organ/external/picked = pick(parts)
|
||||
|
||||
var/brute_was = picked.brute_dam
|
||||
var/burn_was = picked.burn_dam
|
||||
|
||||
picked.take_damage(brute,burn)
|
||||
|
||||
brute -= (picked.brute_dam-brute_was)
|
||||
burn -= (picked.burn_dam-burn_was)
|
||||
|
||||
parts -= picked
|
||||
src.updatehealth()
|
||||
|
||||
@@ -49,6 +49,13 @@
|
||||
src.spawning = 1
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/AIize()
|
||||
if (src.monkeyizing)
|
||||
return
|
||||
for(var/t in src.organs)
|
||||
del(src.organs[text("[]", t)])
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/AIize()
|
||||
if (src.monkeyizing)
|
||||
return
|
||||
@@ -59,10 +66,6 @@
|
||||
src.canmove = 0
|
||||
src.icon = null
|
||||
src.invisibility = 101
|
||||
for(var/t in src.organs)
|
||||
del(src.organs[text("[]", t)])
|
||||
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
@@ -277,9 +277,8 @@
|
||||
|
||||
affecting.take_damage( 0, 5 ) // 5 burn damage
|
||||
|
||||
H.UpdateDamageIcon()
|
||||
H.fireloss += 5
|
||||
H.updatehealth()
|
||||
H.UpdateDamageIcon()
|
||||
return // if burned, don't remove the light
|
||||
|
||||
// create a light tube/bulb item and put it in the user's hand
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
|
||||
proc
|
||||
shock(mob/user as mob)
|
||||
shock(mob/living/user as mob)
|
||||
if(!FG1 || !FG2)
|
||||
del(src)
|
||||
return 0
|
||||
@@ -76,8 +76,7 @@
|
||||
s.set_up(5, 1, user.loc)
|
||||
s.start()
|
||||
var/shock_damage = rand(15,30)
|
||||
user.fireloss += shock_damage
|
||||
user.updatehealth()
|
||||
user.take_overall_damage(0,shock_damage)
|
||||
user.visible_message("\red [user.name] was shocked by the [src.name]!", \
|
||||
"\red <B>Energy pulse detected, system damaged!</B>", \
|
||||
"\red You hear an electrical crack")
|
||||
|
||||
@@ -49,11 +49,14 @@
|
||||
|
||||
|
||||
proc
|
||||
toxmob(var/mob/M)
|
||||
toxmob(var/mob/living/M)
|
||||
var/radiation = (energy*2)
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
if(M:wear_suit) //TODO: check for radiation protection
|
||||
radiation = round(radiation/2,1)
|
||||
if(istype(M,/mob/living/carbon/monkey))
|
||||
if(M:wear_suit) //TODO: check for radiation protection
|
||||
radiation = round(radiation/2,1)
|
||||
M.radiation += radiation
|
||||
M.updatehealth()
|
||||
//M << "\red You feel odd."
|
||||
|
||||
Reference in New Issue
Block a user