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:
rastaf.zero@gmail.com
2011-04-15 07:41:19 +00:00
parent 2a1818cc93
commit b58e465bbe
73 changed files with 1266 additions and 1210 deletions

View File

@@ -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

View File

@@ -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"

View File

@@ -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()

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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()

View 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()

View File

@@ -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)

View File

@@ -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."

View File

@@ -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()

View File

@@ -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 ..()

View File

@@ -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

View File

@@ -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")

View File

@@ -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."