diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 4a33c74d95..0536ce772b 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -74,8 +74,8 @@ var/organ_health_multiplier = 1 var/organ_regeneration_multiplier = 1 - var/bones_can_break = 1 - var/limbs_can_break = 1 + var/bones_can_break = 0 + var/limbs_can_break = 0 var/revival_pod_plants = 1 var/revival_cloning = 1 diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 48bc49aaa6..7254f03e41 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -59,6 +59,13 @@ if(!(status & ORGAN_ROBOT)) 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((brute_dam + burn_dam + brute + burn) < max_damage || !config.limbs_can_break) if(brute) @@ -208,7 +215,7 @@ if(parent) if(parent.status & ORGAN_DESTROYED) status |= ORGAN_DESTROYED - owner:update_body() + owner.update_body(1) return if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT)) if(!(status & ORGAN_BROKEN)) @@ -222,6 +229,9 @@ // new damage icon system // returns just the brute/burn damage code proc/damage_state_text() + if(status & ORGAN_DESTROYED) + return "--" + var/tburn = 0 var/tbrute = 0 @@ -251,7 +261,7 @@ var/n_is = damage_state_text() if (n_is != damage_state) damage_state = n_is - owner.update_body() + owner.update_body(1) return 1 return 0 @@ -266,9 +276,11 @@ del(implants) //owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy") - for(var/datum/organ/external/I in children) - if(I && !(I.status & ORGAN_DESTROYED)) - I.droplimb(1,1) + // If any organs are attached to this, destroy them + for(var/datum/organ/external/O in owner.organs) + if(O.parent == src) + O.droplimb(1) + var/obj/item/weapon/organ/H switch(body_part) if(UPPER_TORSO) @@ -286,10 +298,13 @@ H.pixel_y = 6 H.name = "[owner.real_name]'s head" - // TODO: re-add this when dismemberment has been ported properly - //if(ishuman(owner)) - // owner.update_face() - owner.update_body() + owner.u_equip(owner.glasses) + owner.u_equip(owner.head) + owner.u_equip(owner.ears) + owner.u_equip(owner.wear_mask) + + owner.regenerate_icons() + owner.death() if(ARM_RIGHT) 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) if(ismonkey(owner)) H.icon_state = "r_hand_l" + owner.u_equip(owner.gloves) if(HAND_LEFT) H = new /obj/item/weapon/organ/l_hand(owner.loc, owner) if(ismonkey(owner)) H.icon_state = "l_hand_l" + owner.u_equip(owner.gloves) if(FOOT_RIGHT) H = new /obj/item/weapon/organ/r_foot/(owner.loc, owner) if(ismonkey(owner)) H.icon_state = "r_foot_l" + owner.u_equip(owner.shoes) if(FOOT_LEFT) H = new /obj/item/weapon/organ/l_foot(owner.loc, owner) if(ismonkey(owner)) H.icon_state = "l_foot_l" + owner.u_equip(owner.shoes) if(ismonkey(owner)) H.icon = 'monkey.dmi' var/lol = pick(cardinal) @@ -344,8 +363,9 @@ owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.",\ "Your [display_name] goes flying off!",\ "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) if(hasorgans(owner)) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 12160fcc26..0ad0c22348 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -290,9 +290,9 @@ flavor_text_string += "," flavor_text_string += flavor_text[text] flavor_text_string += " on [t_his] [temp.display_name].
" - wound_flavor_text["[temp.name]"] = flavor_text_string + wound_flavor_text["[temp.display_name]"] = flavor_text_string if(temp.status & ORGAN_BLEEDING) - is_bleeding["[temp.name]"] = 1 + is_bleeding["[temp.display_name]"] = 1 else wound_flavor_text["[temp.display_name]"] = "" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b2d5cf5862..84b96f9c62 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -42,6 +42,18 @@ organ.parent = organs_by_name["l_leg"] organ = organs_by_name["r_foot"] 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) organs += organs_by_name[name] @@ -218,6 +230,15 @@ Paralyse(10) 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) switch(temp.name) 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 /mob/living/carbon/human/proc/get_face_name() 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 real_name diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index e2110f90fa..09e160363c 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -152,15 +152,13 @@ if(!zone) zone = "chest" 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)) ..(damage, damagetype, def_zone, blocked) return 1 if(blocked >= 2) return 0 - var/sharp = weapon.sharp - var/datum/organ/external/organ = null if(isorgan(def_zone)) organ = def_zone diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 865031235d..d8d435a3d6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -126,7 +126,7 @@ emp_act if(armor >= 2) 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 if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2))) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index d516a2cb1e..a7e58ec5c8 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -19,6 +19,13 @@ if(shoes) 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) tally += 1.5 if (bodytemperature < 283.222) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 2f5bac9e1b..8cec13618f 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -6,6 +6,54 @@ del(W) 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) if(!W) return 0 @@ -124,6 +172,7 @@ /mob/living/carbon/human/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1) if(!slot) return if(!istype(W)) return + if(!has_organ_for_slot(slot)) return if(W == src.l_hand) src.l_hand = null @@ -550,7 +599,7 @@ It can still be worn/put on as normal. 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. 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)) source.u_equip(item) target.equip_to_slot_if_possible(item, slot_to_process, 0, 1, 1) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index e62aca4939..0620197076 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -228,8 +228,8 @@ || E.name == "r_leg" || E.name == "r_foot" && !lying) if(!(E.status & ORGAN_SPLINTED)) leg_tally-- // let it fail even if just foot&leg - // can't stand - if(leg_tally == 0 && !paralysis && !(lying || resting)) + // standing is poor + if(leg_tally <= 0 && !paralysis && !(lying || resting) && prob(5)) emote("scream") emote("collapse") paralysis = 10 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index eeaf1e23aa..37def85c43 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -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) lying_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_l"), ICON_OVERLAY) + if(update_icons) update_icons() //HAIR OVERLAY @@ -303,8 +304,13 @@ Please contact me on #coderbus IRC. ~Carn x overlays_lying[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. - 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() return @@ -425,6 +431,7 @@ Please contact me on #coderbus IRC. ~Carn x update_inv_handcuffed(0) update_inv_legcuffed(0) update_inv_pockets(0) + UpdateDamageIcon() update_icons() //Hud Stuff update_hud()