mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 03:02:54 +00:00
Fixes a few issues with the organ system.
git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4722 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -74,8 +74,8 @@
|
|||||||
var/organ_health_multiplier = 1
|
var/organ_health_multiplier = 1
|
||||||
var/organ_regeneration_multiplier = 1
|
var/organ_regeneration_multiplier = 1
|
||||||
|
|
||||||
var/bones_can_break = 1
|
var/bones_can_break = 0
|
||||||
var/limbs_can_break = 1
|
var/limbs_can_break = 0
|
||||||
|
|
||||||
var/revival_pod_plants = 1
|
var/revival_pod_plants = 1
|
||||||
var/revival_cloning = 1
|
var/revival_cloning = 1
|
||||||
|
|||||||
@@ -59,6 +59,13 @@
|
|||||||
if(!(status & ORGAN_ROBOT))
|
if(!(status & ORGAN_ROBOT))
|
||||||
owner << "You feel something wet on your [display_name]"
|
owner << "You feel something wet on your [display_name]"
|
||||||
|
|
||||||
|
else if(brute_dam > 15)
|
||||||
|
if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier)
|
||||||
|
if(prob(5 * brute))
|
||||||
|
status |= ORGAN_DESTROYED
|
||||||
|
droplimb()
|
||||||
|
return
|
||||||
|
|
||||||
// If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking
|
// If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking
|
||||||
if((brute_dam + burn_dam + brute + burn) < max_damage || !config.limbs_can_break)
|
if((brute_dam + burn_dam + brute + burn) < max_damage || !config.limbs_can_break)
|
||||||
if(brute)
|
if(brute)
|
||||||
@@ -208,7 +215,7 @@
|
|||||||
if(parent)
|
if(parent)
|
||||||
if(parent.status & ORGAN_DESTROYED)
|
if(parent.status & ORGAN_DESTROYED)
|
||||||
status |= ORGAN_DESTROYED
|
status |= ORGAN_DESTROYED
|
||||||
owner:update_body()
|
owner.update_body(1)
|
||||||
return
|
return
|
||||||
if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT))
|
if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT))
|
||||||
if(!(status & ORGAN_BROKEN))
|
if(!(status & ORGAN_BROKEN))
|
||||||
@@ -222,6 +229,9 @@
|
|||||||
// new damage icon system
|
// new damage icon system
|
||||||
// returns just the brute/burn damage code
|
// returns just the brute/burn damage code
|
||||||
proc/damage_state_text()
|
proc/damage_state_text()
|
||||||
|
if(status & ORGAN_DESTROYED)
|
||||||
|
return "--"
|
||||||
|
|
||||||
var/tburn = 0
|
var/tburn = 0
|
||||||
var/tbrute = 0
|
var/tbrute = 0
|
||||||
|
|
||||||
@@ -251,7 +261,7 @@
|
|||||||
var/n_is = damage_state_text()
|
var/n_is = damage_state_text()
|
||||||
if (n_is != damage_state)
|
if (n_is != damage_state)
|
||||||
damage_state = n_is
|
damage_state = n_is
|
||||||
owner.update_body()
|
owner.update_body(1)
|
||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@@ -266,9 +276,11 @@
|
|||||||
del(implants)
|
del(implants)
|
||||||
//owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy")
|
//owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy")
|
||||||
|
|
||||||
for(var/datum/organ/external/I in children)
|
// If any organs are attached to this, destroy them
|
||||||
if(I && !(I.status & ORGAN_DESTROYED))
|
for(var/datum/organ/external/O in owner.organs)
|
||||||
I.droplimb(1,1)
|
if(O.parent == src)
|
||||||
|
O.droplimb(1)
|
||||||
|
|
||||||
var/obj/item/weapon/organ/H
|
var/obj/item/weapon/organ/H
|
||||||
switch(body_part)
|
switch(body_part)
|
||||||
if(UPPER_TORSO)
|
if(UPPER_TORSO)
|
||||||
@@ -286,10 +298,13 @@
|
|||||||
H.pixel_y = 6
|
H.pixel_y = 6
|
||||||
H.name = "[owner.real_name]'s head"
|
H.name = "[owner.real_name]'s head"
|
||||||
|
|
||||||
// TODO: re-add this when dismemberment has been ported properly
|
owner.u_equip(owner.glasses)
|
||||||
//if(ishuman(owner))
|
owner.u_equip(owner.head)
|
||||||
// owner.update_face()
|
owner.u_equip(owner.ears)
|
||||||
owner.update_body()
|
owner.u_equip(owner.wear_mask)
|
||||||
|
|
||||||
|
owner.regenerate_icons()
|
||||||
|
|
||||||
owner.death()
|
owner.death()
|
||||||
if(ARM_RIGHT)
|
if(ARM_RIGHT)
|
||||||
H = new /obj/item/weapon/organ/r_arm(owner.loc, owner)
|
H = new /obj/item/weapon/organ/r_arm(owner.loc, owner)
|
||||||
@@ -311,18 +326,22 @@
|
|||||||
H = new /obj/item/weapon/organ/r_hand(owner.loc, owner)
|
H = new /obj/item/weapon/organ/r_hand(owner.loc, owner)
|
||||||
if(ismonkey(owner))
|
if(ismonkey(owner))
|
||||||
H.icon_state = "r_hand_l"
|
H.icon_state = "r_hand_l"
|
||||||
|
owner.u_equip(owner.gloves)
|
||||||
if(HAND_LEFT)
|
if(HAND_LEFT)
|
||||||
H = new /obj/item/weapon/organ/l_hand(owner.loc, owner)
|
H = new /obj/item/weapon/organ/l_hand(owner.loc, owner)
|
||||||
if(ismonkey(owner))
|
if(ismonkey(owner))
|
||||||
H.icon_state = "l_hand_l"
|
H.icon_state = "l_hand_l"
|
||||||
|
owner.u_equip(owner.gloves)
|
||||||
if(FOOT_RIGHT)
|
if(FOOT_RIGHT)
|
||||||
H = new /obj/item/weapon/organ/r_foot/(owner.loc, owner)
|
H = new /obj/item/weapon/organ/r_foot/(owner.loc, owner)
|
||||||
if(ismonkey(owner))
|
if(ismonkey(owner))
|
||||||
H.icon_state = "r_foot_l"
|
H.icon_state = "r_foot_l"
|
||||||
|
owner.u_equip(owner.shoes)
|
||||||
if(FOOT_LEFT)
|
if(FOOT_LEFT)
|
||||||
H = new /obj/item/weapon/organ/l_foot(owner.loc, owner)
|
H = new /obj/item/weapon/organ/l_foot(owner.loc, owner)
|
||||||
if(ismonkey(owner))
|
if(ismonkey(owner))
|
||||||
H.icon_state = "l_foot_l"
|
H.icon_state = "l_foot_l"
|
||||||
|
owner.u_equip(owner.shoes)
|
||||||
if(ismonkey(owner))
|
if(ismonkey(owner))
|
||||||
H.icon = 'monkey.dmi'
|
H.icon = 'monkey.dmi'
|
||||||
var/lol = pick(cardinal)
|
var/lol = pick(cardinal)
|
||||||
@@ -344,8 +363,9 @@
|
|||||||
owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.",\
|
owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.",\
|
||||||
"<span class='moderate'><b>Your [display_name] goes flying off!</b></span>",\
|
"<span class='moderate'><b>Your [display_name] goes flying off!</b></span>",\
|
||||||
"You hear a terrible sound of ripping tendons and flesh.")
|
"You hear a terrible sound of ripping tendons and flesh.")
|
||||||
owner.update_body()
|
|
||||||
// TODO: also add stuff to update the appropriate clothing
|
// force the icon to rebuild
|
||||||
|
owner.regenerate_icons()
|
||||||
|
|
||||||
proc/createwound(var/type = CUT, var/damage)
|
proc/createwound(var/type = CUT, var/damage)
|
||||||
if(hasorgans(owner))
|
if(hasorgans(owner))
|
||||||
|
|||||||
@@ -290,9 +290,9 @@
|
|||||||
flavor_text_string += ","
|
flavor_text_string += ","
|
||||||
flavor_text_string += flavor_text[text]
|
flavor_text_string += flavor_text[text]
|
||||||
flavor_text_string += " on [t_his] [temp.display_name].</span><br>"
|
flavor_text_string += " on [t_his] [temp.display_name].</span><br>"
|
||||||
wound_flavor_text["[temp.name]"] = flavor_text_string
|
wound_flavor_text["[temp.display_name]"] = flavor_text_string
|
||||||
if(temp.status & ORGAN_BLEEDING)
|
if(temp.status & ORGAN_BLEEDING)
|
||||||
is_bleeding["[temp.name]"] = 1
|
is_bleeding["[temp.display_name]"] = 1
|
||||||
else
|
else
|
||||||
wound_flavor_text["[temp.display_name]"] = ""
|
wound_flavor_text["[temp.display_name]"] = ""
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,18 @@
|
|||||||
organ.parent = organs_by_name["l_leg"]
|
organ.parent = organs_by_name["l_leg"]
|
||||||
organ = organs_by_name["r_foot"]
|
organ = organs_by_name["r_foot"]
|
||||||
organ.parent = organs_by_name["r_leg"]
|
organ.parent = organs_by_name["r_leg"]
|
||||||
|
organ = organs_by_name["r_foot"]
|
||||||
|
organ.parent = organs_by_name["r_leg"]
|
||||||
|
organ = organs_by_name["head"]
|
||||||
|
organ.parent = organs_by_name["chest"]
|
||||||
|
organ = organs_by_name["r_leg"]
|
||||||
|
organ.parent = organs_by_name["chest"]
|
||||||
|
organ = organs_by_name["l_leg"]
|
||||||
|
organ.parent = organs_by_name["chest"]
|
||||||
|
organ = organs_by_name["r_arm"]
|
||||||
|
organ.parent = organs_by_name["chest"]
|
||||||
|
organ = organs_by_name["l_arm"]
|
||||||
|
organ.parent = organs_by_name["chest"]
|
||||||
|
|
||||||
for(var/name in organs_by_name)
|
for(var/name in organs_by_name)
|
||||||
organs += organs_by_name[name]
|
organs += organs_by_name[name]
|
||||||
@@ -218,6 +230,15 @@
|
|||||||
Paralyse(10)
|
Paralyse(10)
|
||||||
|
|
||||||
var/update = 0
|
var/update = 0
|
||||||
|
|
||||||
|
// focus most of the blast on one organ
|
||||||
|
var/datum/organ/external/take_blast = pick(organs)
|
||||||
|
update |= take_blast.take_damage(b_loss * 0.9, f_loss * 0.9)
|
||||||
|
|
||||||
|
// distribute the remaining 10% on all limbs equally
|
||||||
|
b_loss *= 0.1
|
||||||
|
f_loss *= 0.1
|
||||||
|
|
||||||
for(var/datum/organ/external/temp in organs)
|
for(var/datum/organ/external/temp in organs)
|
||||||
switch(temp.name)
|
switch(temp.name)
|
||||||
if("head")
|
if("head")
|
||||||
@@ -542,7 +563,7 @@
|
|||||||
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
|
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
|
||||||
/mob/living/carbon/human/proc/get_face_name()
|
/mob/living/carbon/human/proc/get_face_name()
|
||||||
var/datum/organ/external/head/head = get_organ("head")
|
var/datum/organ/external/head/head = get_organ("head")
|
||||||
if( !head || head.disfigured || !real_name ) //disfigured. use id-name if possible
|
if( !head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name ) //disfigured. use id-name if possible
|
||||||
return "Unknown"
|
return "Unknown"
|
||||||
return real_name
|
return real_name
|
||||||
|
|
||||||
|
|||||||
@@ -152,15 +152,13 @@
|
|||||||
if(!zone) zone = "chest"
|
if(!zone) zone = "chest"
|
||||||
return organs_by_name[zone]
|
return organs_by_name[zone]
|
||||||
|
|
||||||
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/obj/item/weapon)
|
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0)
|
||||||
if((damagetype != BRUTE) && (damagetype != BURN))
|
if((damagetype != BRUTE) && (damagetype != BURN))
|
||||||
..(damage, damagetype, def_zone, blocked)
|
..(damage, damagetype, def_zone, blocked)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
if(blocked >= 2) return 0
|
if(blocked >= 2) return 0
|
||||||
|
|
||||||
var/sharp = weapon.sharp
|
|
||||||
|
|
||||||
var/datum/organ/external/organ = null
|
var/datum/organ/external/organ = null
|
||||||
if(isorgan(def_zone))
|
if(isorgan(def_zone))
|
||||||
organ = def_zone
|
organ = def_zone
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ emp_act
|
|||||||
if(armor >= 2) return 0
|
if(armor >= 2) return 0
|
||||||
if(!I.force) return 0
|
if(!I.force) return 0
|
||||||
|
|
||||||
apply_damage(I.force, I.damtype, affecting, armor , I)
|
apply_damage(I.force, I.damtype, affecting, armor , I.sharp)
|
||||||
|
|
||||||
var/bloody = 0
|
var/bloody = 0
|
||||||
if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2)))
|
if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2)))
|
||||||
|
|||||||
@@ -19,6 +19,13 @@
|
|||||||
if(shoes)
|
if(shoes)
|
||||||
tally += shoes.slowdown
|
tally += shoes.slowdown
|
||||||
|
|
||||||
|
for(var/organ_name in list("l_foot","r_foot","l_leg","r_leg"))
|
||||||
|
var/datum/organ/external/E = get_organ(organ_name)
|
||||||
|
if(!E || (E.status & ORGAN_DESTROYED))
|
||||||
|
tally += 4
|
||||||
|
else if(E.status & ORGAN_BROKEN)
|
||||||
|
tally += 1.5
|
||||||
|
|
||||||
if(FAT in src.mutations)
|
if(FAT in src.mutations)
|
||||||
tally += 1.5
|
tally += 1.5
|
||||||
if (bodytemperature < 283.222)
|
if (bodytemperature < 283.222)
|
||||||
|
|||||||
@@ -6,6 +6,54 @@
|
|||||||
del(W)
|
del(W)
|
||||||
return null
|
return null
|
||||||
|
|
||||||
|
|
||||||
|
/mob/living/carbon/human/proc/has_organ(name)
|
||||||
|
var/datum/organ/external/O = organs_by_name[name]
|
||||||
|
|
||||||
|
return (O && !(O.status & ORGAN_DESTROYED) )
|
||||||
|
|
||||||
|
/mob/living/carbon/human/proc/has_organ_for_slot(slot)
|
||||||
|
switch(slot)
|
||||||
|
if(slot_back)
|
||||||
|
return has_organ("chest")
|
||||||
|
if(slot_wear_mask)
|
||||||
|
return has_organ("head")
|
||||||
|
if(slot_handcuffed)
|
||||||
|
return has_organ("l_hand") && has_organ("r_hand")
|
||||||
|
if(slot_legcuffed)
|
||||||
|
return has_organ("l_leg") && has_organ("r_leg")
|
||||||
|
if(slot_l_hand)
|
||||||
|
return has_organ("l_hand")
|
||||||
|
if(slot_r_hand)
|
||||||
|
return has_organ("r_hand")
|
||||||
|
if(slot_belt)
|
||||||
|
return has_organ("groin")
|
||||||
|
if(slot_wear_id)
|
||||||
|
// the only relevant check for this is the uniform check
|
||||||
|
return 1
|
||||||
|
if(slot_ears)
|
||||||
|
return has_organ("head")
|
||||||
|
if(slot_glasses)
|
||||||
|
return has_organ("head")
|
||||||
|
if(slot_gloves)
|
||||||
|
return has_organ("l_hand") && has_organ("r_hand")
|
||||||
|
if(slot_head)
|
||||||
|
return has_organ("head")
|
||||||
|
if(slot_shoes)
|
||||||
|
return has_organ("r_foot") && has_organ("l_foot")
|
||||||
|
if(slot_wear_suit)
|
||||||
|
return has_organ("chest")
|
||||||
|
if(slot_w_uniform)
|
||||||
|
return has_organ("chest")
|
||||||
|
if(slot_l_store)
|
||||||
|
return has_organ("groin")
|
||||||
|
if(slot_r_store)
|
||||||
|
return has_organ("chest")
|
||||||
|
if(slot_s_store)
|
||||||
|
return has_organ("chest")
|
||||||
|
if(slot_in_backpack)
|
||||||
|
return 1
|
||||||
|
|
||||||
/mob/living/carbon/human/u_equip(obj/item/W as obj)
|
/mob/living/carbon/human/u_equip(obj/item/W as obj)
|
||||||
if(!W) return 0
|
if(!W) return 0
|
||||||
|
|
||||||
@@ -124,6 +172,7 @@
|
|||||||
/mob/living/carbon/human/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1)
|
/mob/living/carbon/human/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1)
|
||||||
if(!slot) return
|
if(!slot) return
|
||||||
if(!istype(W)) return
|
if(!istype(W)) return
|
||||||
|
if(!has_organ_for_slot(slot)) return
|
||||||
|
|
||||||
if(W == src.l_hand)
|
if(W == src.l_hand)
|
||||||
src.l_hand = null
|
src.l_hand = null
|
||||||
@@ -550,7 +599,7 @@ It can still be worn/put on as normal.
|
|||||||
if(target.r_store)
|
if(target.r_store)
|
||||||
target.u_equip(target.r_store) //At this stage l_store is already processed by the code above, we only need to process r_store.
|
target.u_equip(target.r_store) //At this stage l_store is already processed by the code above, we only need to process r_store.
|
||||||
else
|
else
|
||||||
if(item) //Placing an item on the mob
|
if(item && target.has_organ_for_slot(slot_to_process)) //Placing an item on the mob
|
||||||
if(item.mob_can_equip(target, slot_to_process, 0))
|
if(item.mob_can_equip(target, slot_to_process, 0))
|
||||||
source.u_equip(item)
|
source.u_equip(item)
|
||||||
target.equip_to_slot_if_possible(item, slot_to_process, 0, 1, 1)
|
target.equip_to_slot_if_possible(item, slot_to_process, 0, 1, 1)
|
||||||
|
|||||||
@@ -228,8 +228,8 @@
|
|||||||
|| E.name == "r_leg" || E.name == "r_foot" && !lying)
|
|| E.name == "r_leg" || E.name == "r_foot" && !lying)
|
||||||
if(!(E.status & ORGAN_SPLINTED))
|
if(!(E.status & ORGAN_SPLINTED))
|
||||||
leg_tally-- // let it fail even if just foot&leg
|
leg_tally-- // let it fail even if just foot&leg
|
||||||
// can't stand
|
// standing is poor
|
||||||
if(leg_tally == 0 && !paralysis && !(lying || resting))
|
if(leg_tally <= 0 && !paralysis && !(lying || resting) && prob(5))
|
||||||
emote("scream")
|
emote("scream")
|
||||||
emote("collapse")
|
emote("collapse")
|
||||||
paralysis = 10
|
paralysis = 10
|
||||||
|
|||||||
@@ -295,6 +295,7 @@ Please contact me on #coderbus IRC. ~Carn x
|
|||||||
stand_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
|
stand_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
|
||||||
lying_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_l"), ICON_OVERLAY)
|
lying_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_l"), ICON_OVERLAY)
|
||||||
|
|
||||||
|
if(update_icons) update_icons()
|
||||||
|
|
||||||
|
|
||||||
//HAIR OVERLAY
|
//HAIR OVERLAY
|
||||||
@@ -303,8 +304,13 @@ Please contact me on #coderbus IRC. ~Carn x
|
|||||||
overlays_lying[HAIR_LAYER] = null
|
overlays_lying[HAIR_LAYER] = null
|
||||||
overlays_standing[HAIR_LAYER] = null
|
overlays_standing[HAIR_LAYER] = null
|
||||||
|
|
||||||
|
var/datum/organ/external/head/head = get_organ("head")
|
||||||
|
if( !head || (head.status & ORGAN_DESTROYED) )
|
||||||
|
if(update_icons) update_icons()
|
||||||
|
return
|
||||||
|
|
||||||
//mutants don't have hair. masks and helmets can obscure our hair too.
|
//mutants don't have hair. masks and helmets can obscure our hair too.
|
||||||
if( (dna && dna.mutantrace) || (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)) )
|
if( (dna && dna.mutantrace) || (head && (head.status & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
|
||||||
if(update_icons) update_icons()
|
if(update_icons) update_icons()
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -425,6 +431,7 @@ Please contact me on #coderbus IRC. ~Carn x
|
|||||||
update_inv_handcuffed(0)
|
update_inv_handcuffed(0)
|
||||||
update_inv_legcuffed(0)
|
update_inv_legcuffed(0)
|
||||||
update_inv_pockets(0)
|
update_inv_pockets(0)
|
||||||
|
UpdateDamageIcon()
|
||||||
update_icons()
|
update_icons()
|
||||||
//Hud Stuff
|
//Hud Stuff
|
||||||
update_hud()
|
update_hud()
|
||||||
|
|||||||
Reference in New Issue
Block a user