From a7b85707dddf9044f9f3d22ddc00c4fc1c1ab655 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Thu, 5 Jan 2012 17:15:29 -0500 Subject: [PATCH 01/16] porting in bones and dismemberment --- baystation12.dme | 1 + code/defines/obj.dm | 1 + code/defines/obj/weapon.dm | 8 + code/game/gamemodes/cult/cult_items.dm | 2 +- code/game/objects/items/item.dm | 20 +- code/game/objects/items/weapons/medical.dm | 24 +++ .../objects/items/weapons/swords_axes_etc.dm | 2 + code/game/objects/items/weapons/tools.dm | 1 + code/modules/chemical/Chemistry-Reagents.dm | 9 +- code/modules/mining/mine_items.dm | 1 + .../mob/living/carbon/human/examine.dm | 26 ++- code/modules/mob/living/carbon/human/human.dm | 59 ++++-- .../mob/living/carbon/human/human_damage.dm | 33 +-- .../mob/living/carbon/human/human_defense.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 42 ++++ code/modules/mob/living/damage_procs.dm | 2 +- code/modules/mob/living/living.dm | 14 ++ code/modules/mob/organ/organ.dm | 193 +++++++++++++++++- code/modules/mob/organ/organ_external.dm | 71 ++++++- code/modules/mob/organ/pain.dm | 48 +++++ 20 files changed, 494 insertions(+), 65 deletions(-) create mode 100644 code/modules/mob/organ/pain.dm diff --git a/baystation12.dme b/baystation12.dme index f58c6eba48c..87772158f71 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -928,6 +928,7 @@ #include "code\modules\mob\organ\organ.dm" #include "code\modules\mob\organ\organ_external.dm" #include "code\modules\mob\organ\organ_internal.dm" +#include "code\modules\mob\organ\pain.dm" #include "code\modules\power\apc.dm" #include "code\modules\power\cable.dm" #include "code\modules\power\cell.dm" diff --git a/code/defines/obj.dm b/code/defines/obj.dm index dd156c1695c..9f67387a9c0 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -294,6 +294,7 @@ var/icon_old = null // For when weapons get bloodied this saves their old icon. var/abstract = 0 var/force = 0 + var/slash = 0 var/item_state = null var/damtype = "brute" var/r_speed = 1.0 diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index d01409c9e4b..6e39b5b3523 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -208,6 +208,7 @@ throw_speed = 1 throw_range = 5 w_class = 3.0 + slash = 1 flags = FPRINT | CONDUCT | NOSHIELD | TABLEPASS origin_tech = "combat=3" @@ -243,6 +244,7 @@ throw_speed = 1 throw_range = 1 w_class = 4.0//So you can't hide it in your pocket or some such. + slash = 1 flags = FPRINT | TABLEPASS | NOSHIELD var/datum/effect/effect/system/spark_spread/spark_system @@ -622,6 +624,7 @@ desc = "A tool for breaking down those obstructions that stop you from fighting that fire." //Less ROBUST. --SkyMarshal force = 5 w_class = 4.0 + slash = 1 flags = ONBACK twohanded = 1 force_unwielded = 5 @@ -964,6 +967,7 @@ flags = FPRINT | TABLEPASS| CONDUCT force = 5.0 w_class = 1.0 + slash = 1 throwforce = 5.0 throw_speed = 3 throw_range = 5 @@ -977,6 +981,7 @@ desc = "Could probably be used as ... a throwing weapon?" w_class = 1.0 force = 5.0 + slash = 1 throwforce = 15.0 item_state = "shard-glass" g_amt = 3750 @@ -1353,6 +1358,7 @@ icon_state = "knife" force = 10.0 throwforce = 10.0 + slash = 1 /obj/item/weapon/kitchen/utensil/spoon name = "spoon" @@ -1367,6 +1373,7 @@ flags = FPRINT | TABLEPASS | CONDUCT force = 10.0 w_class = 1.0 + slash = 1 throwforce = 5.0 throw_speed = 3 throw_range = 5 @@ -1408,6 +1415,7 @@ icon_state = "drill" flags = FPRINT | TABLEPASS | CONDUCT w_class = 1.0 + slash = 1 origin_tech = "materials=1;biotech=1" /obj/item/weapon/circular_saw diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 694fed28ba9..efe21d281cc 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -6,7 +6,7 @@ flags = FPRINT | ONBELT | TABLEPASS force = 40 throwforce = 10 - + slash = 1 /obj/item/clothing/head/culthood diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm index 4a8d3c3b532..da113a8e0d7 100644 --- a/code/game/objects/items/item.dm +++ b/code/game/objects/items/item.dm @@ -127,9 +127,25 @@ user.next_move = world.time + 2 if (user.hand) - user.l_hand = src + if(ishuman(user)) + var/datum/organ/external/temp = user:organs["l_hand"] + if(!temp.destroyed) + user.l_hand = src + else + user << "\blue You pick \the [src] up with your ha- wait a minute." + return + else + user.l_hand = src else - user.r_hand = src + if(ishuman(user)) + var/datum/organ/external/temp = user:organs["r_hand"] + if(!temp.destroyed) + user.r_hand = src + else + user << "\blue You pick \the [src] up with your ha- wait a minute." + return + else + user.r_hand = src src.loc = user src.layer = 20 add_fingerprint(user) diff --git a/code/game/objects/items/weapons/medical.dm b/code/game/objects/items/weapons/medical.dm index cbf794b33a4..d1fee794bf7 100644 --- a/code/game/objects/items/weapons/medical.dm +++ b/code/game/objects/items/weapons/medical.dm @@ -57,6 +57,30 @@ MEDICAL if (affecting.heal_damage(src.heal_brute, src.heal_burn)) H.UpdateDamageIcon() + + if(H.bloodloss > 0 && heal_brute > 0) // fix wounds too if bruise pack + var/stoped = 0 + for(var/datum/organ/external/wound/W in affecting.wounds) + if(W.bleeding) + W.stopbleeding() + stoped = 0 + break + if(!stoped) + // user << "There is no bleeding wound at [t]" //code no longer in a dedicated obj, thus this doesn't really matter + return + if (user) + if (M != user) + for (var/mob/O in viewers(H, null)) + O.show_message("\red [H] has been bandaged with [src] by [user]", 1) + else + var/t_himself = "itself" + if (user.gender == MALE) + t_himself = "himself" + else if (user.gender == FEMALE) + t_himself = "herself" + for (var/mob/O in viewers(H, null)) + O.show_message("\red [H] bandaged [t_himself] with [src]", 1) + M.updatehealth() else M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 5f7185d72b6..1ecdff06ca1 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -33,6 +33,7 @@ STUN BATON else icon_state = "sword[color]" w_class = 4 + slash = 1 playsound(user, 'saberon.ogg', 50, 1) user << "\blue [src] is now active." else @@ -42,6 +43,7 @@ STUN BATON else icon_state = "sword0" w_class = 2 + slash = 0 playsound(user, 'saberoff.ogg', 50, 1) user << "\blue [src] can now be concealed." add_fingerprint(user) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index a6f00c091a0..232a374f489 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -290,6 +290,7 @@ WELDINGTOOOL icon_state = "cutters" flags = FPRINT | TABLEPASS| CONDUCT force = 6.0 + slash = 1 throw_speed = 2 throw_range = 9 w_class = 2.0 diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm index 683fcd0ab3e..ec511e28f00 100644 --- a/code/modules/chemical/Chemistry-Reagents.dm +++ b/code/modules/chemical/Chemistry-Reagents.dm @@ -667,8 +667,9 @@ datum return if(prob(15) && istype(M, /mob/living/carbon/human) && volume >= 30) - var/datum/organ/external/affecting = M:get_organ("head") + var/datum/organ/external/head/affecting = M:get_organ("head") if(affecting) + affecting.disfigured = 1 affecting.take_damage(25, 0) M:UpdateDamageIcon() M:emote("scream") @@ -714,7 +715,8 @@ datum del (M:head) M << "\red Your helmet melts into uselessness!" return - var/datum/organ/external/affecting = M:get_organ("head") + var/datum/organ/external/head/affecting = M:get_organ("head") + affecting.disfigured = 1 affecting.take_damage(35, 0) M:UpdateDamageIcon() M:emote("scream") @@ -729,7 +731,8 @@ datum M.take_organ_damage(min(15, volume * 4)) // same deal as sulphuric acid else if(istype(M, /mob/living/carbon/human)) - var/datum/organ/external/affecting = M:get_organ("head") + var/datum/organ/external/head/affecting = M:get_organ("head") + affecting.disfigured = 1 affecting.take_damage(30, 0) M:UpdateDamageIcon() M:emote("scream") diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index a49b639c21d..b527f6cb0a1 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -131,6 +131,7 @@ proc/move_mining_shuttle() throwforce = 4.0 item_state = "pickaxe" w_class = 4.0 + slash = 1 m_amt = 3750 //one sheet, but where can you make them? var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO origin_tech = "materials=1;engineering=1" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 1029a993577..71e9ba890d5 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -151,7 +151,31 @@ if (!src.client) usr << "\red [src.name] doesn't seem as though they want to talk." + for(var/name in organs) + var/datum/organ/external/temp = organs[name] + if(temp.destroyed) + usr << "\red [name] is missing [t_his] [temp.display_name]." + if(temp.wounds) + for(var/datum/organ/external/wound/w in temp.wounds) + var/size = w.wound_size + var/sizetext + switch(size) + if(1) + sizetext = "cut" + if(2) + sizetext = "deep cut" + if(3) + sizetext = "flesh wound" + if(4) + sizetext = "gaping wound" + if(5) + sizetext = "big gaping wound" + if(6) + sizetext = "massive wound" + if(w.bleeding) + usr << "\red [name] is bleeding from a [sizetext] on [t_his] [temp.display_name]." + continue + print_flavor_text() usr << "\blue *---------*" - diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ec6c2ee981d..320d77ea9c4 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -55,6 +55,7 @@ var/mutantrace = null var/list/organs = list() + var/bloodloss = 0 /mob/living/carbon/human/dummy real_name = "Test Dummy" @@ -69,24 +70,22 @@ if(!dna) dna = new /datum/dna(null) - var/datum/organ/external/chest/chest = new /datum/organ/external/chest(src) - var/datum/organ/external/head/head = new /datum/organ/external/head(src) - var/datum/organ/external/l_arm/l_arm = new /datum/organ/external/l_arm(src) - var/datum/organ/external/r_arm/r_arm = new /datum/organ/external/r_arm(src) - var/datum/organ/external/r_leg/r_leg = new /datum/organ/external/r_leg(src) - var/datum/organ/external/l_leg/l_leg = new /datum/organ/external/l_leg(src) - chest.owner = src - head.owner = src - r_arm.owner = src - l_arm.owner = src - r_leg.owner = src - l_leg.owner = src - organs += chest - organs += head - organs += r_arm - organs += l_arm - organs += r_leg - organs += l_leg + new /datum/organ/external/chest(src) + new /datum/organ/external/groin(src) + new /datum/organ/external/head(src) + new /datum/organ/external/l_arm(src) + new /datum/organ/external/r_arm(src) + new /datum/organ/external/r_leg(src) + new /datum/organ/external/l_leg(src) + + var/datum/organ/external/part = new /datum/organ/external/l_hand(src) + part.parent = organs["l_arm"] + part = new /datum/organ/external/l_foot(src) + part.parent = organs["l_leg"] + part = new /datum/organ/external/r_hand(src) + part.parent = organs["r_arm"] + part = new /datum/organ/external/r_foot(src) + part.parent = organs["r_leg"] var/g = "m" if (gender == MALE) @@ -170,6 +169,11 @@ var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80 if (hungry >= 70) tally += hungry/50 + for(var/organ in list("l_leg","l_foot","r_leg","r_foot")) + var/datum/organ/external/o = organs["[organ]"] + if(o.broken) + tally += 6 + if(wear_suit) tally += wear_suit.slowdown @@ -653,7 +657,7 @@ M.show_message(text("\red [] has been hit by []", src, O), 1) if (health > 0) var/datum/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head")) - if(!affecting) return + if(!affecting || affecting.destroyed) return if (istype(O, /obj/effect/immovablerod)) affecting.take_damage(101, 0) else @@ -1254,9 +1258,12 @@ stand_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY) lying_icon.Blend(new /icon('human.dmi', "chest_[g]_l"), ICON_OVERLAY) - for (var/part in list("head", "arm_left", "arm_right", "hand_left", "hand_right", "leg_left", "leg_right", "foot_left", "foot_right")) - stand_icon.Blend(new /icon('human.dmi', "[part]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('human.dmi', "[part]_l"), ICON_OVERLAY) + for(var/datum/organ/external/part in organs) + if(!istype(part, /datum/organ/external/groin) \ + && !istype(part, /datum/organ/external/chest) \ + && !part.destroyed) + stand_icon.Blend(new /icon('human.dmi', "[part.icon_name]_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "[part.icon_name]_l"), ICON_OVERLAY) stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY) lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY) @@ -1275,6 +1282,14 @@ lying_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_l"), ICON_OVERLAY) /mob/living/carbon/human/proc/update_face() + if(organs) + var/datum/organ/external/head = organs["head"] + if(head) + if(head.destroyed) + del(face_standing) + del(face_lying) + return + if(!facial_hair_style || !hair_style) return//Seems people like to lose their icons, this should stop the runtimes for now del(face_standing) del(face_lying) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 0cc56c0070b..bd9dff32812 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -15,26 +15,31 @@ body_standing = list() del(body_lying) body_lying = list() - for(var/datum/organ/external/O in organs) - 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]" - 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) - // world << "[O.r_name]2 [O.d_i_state]-2 \icon[DI]" - body_lying += DI + + for(var/name in organs) + var/datum/organ/external/O = organs[name] + if(!O.destroyed) + O.update_icon() + 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]" + 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) + // world << "[O.r_name]2 [O.d_i_state]-2 \icon[DI]" + body_lying += DI /mob/living/carbon/human/proc/get_organ(var/zone) if(!zone) zone = "chest" - for(var/datum/organ/external/O in organs) + for(var/name in organs) + var/datum/organ/external/O = organs[name] if(O.name == zone) return O return null -/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0) +/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/slash = 0) if((damagetype != BRUTE) && (damagetype != BURN)) ..(damage, damagetype, def_zone, blocked) return 1 @@ -47,15 +52,15 @@ else if(!def_zone) def_zone = ran_zone(def_zone) organ = get_organ(check_zone(def_zone)) - if(!organ) return 0 + if(!organ || organ.destroyed) return 0 if(blocked) damage = (damage/(blocked+1)) switch(damagetype) if(BRUTE) - organ.take_damage(damage, 0) + organ.take_damage(damage, 0, slash) if(BURN) - organ.take_damage(0, damage) + organ.take_damage(0, damage, slash) UpdateDamageIcon() updatehealth() return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 55e53680200..a4ddaf4e121 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -95,7 +95,7 @@ emp_act var/armor = run_armor_check(affecting, "melee", "Your armor has protected you from a hit to the [hit_area].", "Your armor has softened hit to your [hit_area].") if(armor >= 2) return 0 if(!I.force) return 0 - apply_damage(I.force, I.damtype, affecting, armor) + apply_damage(I.force, I.damtype, affecting, armor, I.slash) var/bloody = 0 if((I.damtype == BRUTE) && prob(25 + (I.force * 2))) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 60780b57203..e15bb76dae2 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -73,6 +73,8 @@ UpdateLuminosity() handle_regular_status_updates() + handle_pain() + // Update clothing update_clothing() @@ -667,6 +669,25 @@ return //TODO: DEFERRED handle_regular_status_updates() + for(var/name in organs) + var/datum/organ/external/E = organs[name] + E.process() + if(E.broken) + if(E.name == "l_hand" || E.name == "l_arm") + if(hand && equipped()) + drop_item() + emote("scream") + else if(E.name == "r_hand" || E.name == "r_arm") + if(!hand && equipped()) + drop_item() + emote("scream") + if(E.open && (!resting) && (!sleeping)) + emote("scream") + E.take_damage(20,0) + emote("collapse") + paralysis = 10 + + updatehealth() // health = 100 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) @@ -729,6 +750,27 @@ if (stuttering) stuttering-- if (slurring) slurring-- + var/datum/organ/external/head/head = organs["head"] + if(head && !head.disfigured) + if(head.brute_dam >= 45 || head.burn_dam >= 45) + head.disfigured = 1 + emote("scream") + real_name = "Unknown" + src << "\red Your face has become disfigured." + warn_flavor_changed() + for(var/datum/organ/external/temp in organs) + if(!temp.bleeding) + continue + else + if(prob(35)) + bloodloss += rand(1,10) + if(temp.wounds) + for(var/datum/organ/external/wound/W in temp.wounds) + if(!temp.bleeding) + continue + else + if(prob(25)) + bloodloss++ if (eye_blind) eye_blind-- blinded = 1 diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 2293f00dd3a..b253c4de1c8 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -8,7 +8,7 @@ Returns standard 0 if fail */ -/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0) +/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/slash = 0) if(!damage || (blocked >= 2)) return 0 switch(damagetype) if(BRUTE) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 7561307562c..cd50f05b7a5 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -134,6 +134,20 @@ src.updatehealth() /mob/living/proc/revive() + if(istype(src, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + for(var/A in H.organs) + var/datum/organ/external/affecting = null + if(!H.organs[A]) continue + affecting = H.organs[A] + if(!istype(affecting, /datum/organ/external)) continue + affecting.heal_damage(1000, 1000) //fixes getting hit after ingestion, killing you when game updates organ health + affecting.broken = 0 + affecting.destroyed = 0 + for(var/datum/organ/external/wound/W in affecting.wounds) + W.stopbleeding() + H.UpdateDamageIcon() + H.update_body() //src.fireloss = 0 src.setToxLoss(0) //src.bruteloss = 0 diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 0de3cd6ede2..6404cac6231 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -1,18 +1,15 @@ /datum/organ var name = "organ" - owner = null + mob/living/carbon/human/owner = null proc/process() return 0 - proc/receive_chem(chemical as obj) return 0 - - /**************************************************** EXTERNAL ORGANS ****************************************************/ @@ -29,11 +26,55 @@ max_damage = 0 wound_size = 0 max_size = 0 - var/obj/item/weapon/implant/implant = null + obj/item/weapon/implant/implant = null + display_name + list/wounds = list() + bleeding = 0 + perma_injury = 0 + perma_dmg = 0 + broken = 0 + destroyed = 0 + destspawn + min_broken_damage = 30 + datum/organ/external/parent + damage_msg = "\red You feel a intense pain" + + var/open = 0 + var/clean = 1 + var/stage = 0 + var/wound = 0 + var/split = 0 + + New(mob/living/carbon/human/H) + ..(H) + if(!display_name) + display_name = name + if(istype(H)) + owner = H + H.organs[name] = src + + proc/take_damage(brute, burn, slash) + if((brute <= 0) && (burn <= 0)) + return 0 + if(destroyed) + return 0 + + if(owner) owner.pain(display_name, (brute+burn)*3, 1) + if(slash) + var/chance = rand(1,5) + var/nux = brute * chance + if(brute_dam >= max_damage) + if(prob(5 * brute)) + for(var/mob/M in viewers(owner)) + M.show_message("\red [owner.name]'s [display_name] flies off.") + destroyed = 1 + droplimb() + return + else if(prob(nux)) + createwound(rand(1,5)) + owner << "You feel something wet on your [display_name]" - proc/take_damage(brute, burn) - if((brute <= 0) && (burn <= 0)) return 0 if((src.brute_dam + src.burn_dam + brute + burn) < src.max_damage) src.brute_dam += brute src.burn_dam += burn @@ -56,19 +97,57 @@ else return 0 + if(broken) + owner.emote("scream") + var/result = src.update_icon() return result - proc/heal_damage(brute, burn) - src.brute_dam = max(0, src.brute_dam - brute) - src.burn_dam = max(0, src.burn_dam - burn) + proc/heal_damage(brute, burn, internal = 0) + brute_dam = max(0, brute_dam - brute) + burn_dam = max(0, burn_dam - burn) + if(internal) + broken = 0 + perma_injury = 0 return update_icon() proc/get_damage() //returns total damage - return src.brute_dam + src.burn_dam //could use src.health? + return max(brute_dam + burn_dam - perma_injury,perma_injury) //could use health? + proc/get_damage_brute() + return max(brute_dam+perma_injury,perma_injury) + + proc/get_damage_fire() + return burn_dam + + process() + if(destroyed) + if(destspawn) + droplimb() + return + if(broken == 0) + perma_dmg = 0 + if(parent) + if(parent.destroyed) + destroyed = 1 + owner:update_body() + return + if(brute_dam > min_broken_damage) + if(broken == 0) + var/dmgmsg = "[damage_msg] in your [display_name]" + owner << dmgmsg + //owner.unlock_medal("Broke Yarrr Bones!", 0, "Break a bone.", "easy") + for(var/mob/M in viewers(owner)) + if(M != owner) + M.show_message("\red You hear a loud cracking sound coming from [owner.name].") + owner.emote("scream") + broken = 1 + wound = "broken" //Randomise in future + perma_injury = brute_dam + return + return // new damage icon system // returns just the brute/burn damage code @@ -105,7 +184,99 @@ return 1 return 0 + proc/droplimb() + if(destroyed) + //owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy") + switch(body_part) + if(UPPER_TORSO) + owner.gib() + if(HEAD) + var/obj/item/weapon/organ/head/H = new(owner.loc) + var/lol = pick(cardinal) + step(H,lol) + owner:update_face() + owner:update_body() + return + if(ARM_RIGHT) + var/obj/item/weapon/organ/r_arm/H = new(owner.loc) + if(owner:organs["r_hand"]) + var/datum/organ/external/S = owner:organs["r_hand"] + if(!S.destroyed) + var/obj/item/weapon/organ/r_hand/X = new(owner.loc) + for(var/mob/M in viewers(owner)) + M.show_message("\red [owner.name]'s [X.name] flies off.") + var/lol2 = pick(cardinal) + step(X,lol2) + var/lol = pick(cardinal) + step(H,lol) + destroyed = 1 + return + if(ARM_LEFT) + var/obj/item/weapon/organ/l_arm/H = new(owner.loc) + if(owner:organs["l_hand"]) + var/datum/organ/external/S = owner:organs["l_hand"] + if(!S.destroyed) + var/obj/item/weapon/organ/l_hand/X = new(owner.loc) + for(var/mob/M in viewers(owner)) + M.show_message("\red [owner.name]'s [X.name] flies off in arc.") + var/lol2 = pick(cardinal) + step(X,lol2) + var/lol = pick(cardinal) + step(H,lol) + destroyed = 1 + return + if(LEG_RIGHT) + var/obj/item/weapon/organ/r_leg/H = new(owner.loc) + if(owner:organs["r_foot"]) + var/datum/organ/external/S = owner:organs["r_foot"] + if(!S.destroyed) + var/obj/item/weapon/organ/l_foot/X = new(owner.loc) + for(var/mob/M in viewers(owner)) + M.show_message("\red [owner.name]'s [X.name] flies off flies off in arc.") + var/lol2 = pick(cardinal) + step(X,lol2) + var/lol = pick(cardinal) + step(H,lol) + destroyed = 1 + return + if(LEG_LEFT) + var/obj/item/weapon/organ/l_leg/H = new(owner.loc) + if(owner:organs["l_foot"]) + var/datum/organ/external/S = owner:organs["l_foot"] + if(!S.destroyed) + var/obj/item/weapon/organ/l_foot/X = new(owner.loc) + for(var/mob/M in viewers(owner)) + M.show_message("\red [owner.name]'s [X.name] flies off.") + var/lol2 = pick(cardinal) + step(X,lol2) + var/lol = pick(cardinal) + step(H,lol) + destroyed = 1 + return + proc/createwound(var/size = 1) + if(ishuman(src.owner)) + var/datum/organ/external/wound/W = new(src) + W.bleeding = 1 + src.owner:bloodloss += 10 * size + W.wound_size = size + W.owner = src.owner + src.wounds += W + +/datum/organ/external/wound + name = "wound" + wound_size = 1 + icon_name = "wound" + display_name = "wound" + parent = null + + proc/stopbleeding() + if(!src.bleeding) + return + var/t = 10 * src.wound_size + src.owner:bloodloss -= t + src.bleeding = 0 + del(src) /**************************************************** INTERNAL ORGANS diff --git a/code/modules/mob/organ/organ_external.dm b/code/modules/mob/organ/organ_external.dm index 029d28aa721..6fdeb413cdc 100644 --- a/code/modules/mob/organ/organ_external.dm +++ b/code/modules/mob/organ/organ_external.dm @@ -2,61 +2,114 @@ name = "chest" icon_name = "chest" max_damage = 150 + min_broken_damage = 75 body_part = UPPER_TORSO -/*/datum/organ/external/groin +/datum/organ/external/groin name = "groin" - icon_name = "groin" + icon_name = "diaper" + max_damage = 115 + min_broken_damage = 70 body_part = LOWER_TORSO -*/ + /datum/organ/external/head name = "head" icon_name = "head" max_damage = 125 + min_broken_damage = 70 body_part = HEAD + var/disfigured = 0 /datum/organ/external/l_arm name = "l_arm" + display_name = "left arm" icon_name = "l_arm" max_damage = 75 + min_broken_damage = 30 body_part = ARM_LEFT /datum/organ/external/l_leg name = "l_leg" + display_name = "left leg" icon_name = "l_leg" max_damage = 75 + min_broken_damage = 30 body_part = LEG_LEFT /datum/organ/external/r_arm name = "r_arm" + display_name = "right arm" icon_name = "r_arm" max_damage = 75 + min_broken_damage = 30 body_part = ARM_RIGHT /datum/organ/external/r_leg name = "r_leg" + display_name = "right leg" icon_name = "r_leg" max_damage = 75 + min_broken_damage = 30 body_part = LEG_RIGHT -/*Leaving these here in case we want to use them later /datum/organ/external/l_foot - name = "l foot" + name = "l_foot" + display_name = "left foot" icon_name = "l_foot" + max_damage = 40 + min_broken_damage = 15 body_part = FOOT_LEFT /datum/organ/external/r_foot - name = "r foot" + name = "r_foot" + display_name = "right foot" icon_name = "r_foot" + max_damage = 40 + min_broken_damage = 15 body_part = FOOT_RIGHT /datum/organ/external/r_hand - name = "r hand" + name = "r_hand" + display_name = "right hand" icon_name = "r_hand" + max_damage = 40 + min_broken_damage = 15 body_part = HAND_RIGHT /datum/organ/external/l_hand - name = "l hand" + name = "l_hand" + display_name = "left hand" icon_name = "l_hand" + max_damage = 40 + min_broken_damage = 15 body_part = HAND_LEFT -*/ \ No newline at end of file + +obj/item/weapon/organ/ + icon = 'human.dmi' +obj/item/weapon/organ/head + name = "head" + icon_state = "head_l" +obj/item/weapon/organ/l_arm + name = "left arm" + icon_state = "arm_left_l" +obj/item/weapon/organ/l_foot + name = "left foot" + icon_state = "foot_left_l" +obj/item/weapon/organ/l_hand + name = "left hand" + icon_state = "hand_left_l" +obj/item/weapon/organ/l_leg + name = "left leg" + icon_state = "leg_left_l" +obj/item/weapon/organ/r_arm + name = "right arm" + icon_state = "arm_right_l" +obj/item/weapon/organ/r_foot + name = "right foot" + icon_state = "foot_right_l" +obj/item/weapon/organ/r_hand + name = "right hand" + icon_state = "hand_right_l" +obj/item/weapon/organ/r_leg + name = "right leg" + icon_state = "leg_right_l" diff --git a/code/modules/mob/organ/pain.dm b/code/modules/mob/organ/pain.dm new file mode 100644 index 00000000000..0791211abc5 --- /dev/null +++ b/code/modules/mob/organ/pain.dm @@ -0,0 +1,48 @@ +mob/proc/flash_pain() + flick("pain",pain) + +mob/var/list/pain_stored = list() +mob/var/last_pain_message = "" +mob/var/next_pain_time = 0 + +// partname is the name of a body part +// amount is a num from 1 to 100 +mob/proc/pain(var/partname, var/amount, var/force) + if(stat >= 2) return + if(world.time < next_pain_time && !force) + return + if(amount > 10 && istype(src,/mob/living/carbon/human)) + if(src:paralysis) + src:paralysis = max(0, src:paralysis-round(amount/10)) + if(amount > 50 && prob(amount / 5)) + src:drop_item() + var/msg + switch(amount) + if(1 to 10) + msg = "Your [partname] hurts a bit." + if(11 to 90) + flash_weak_pain() + msg = "Ouch! Your [partname] hurts." + if(91 to 10000) + flash_pain() + msg = "OH GOD! Your [partname] is hurting terribly!" + if(msg && (msg != last_pain_message || prob(10))) + last_pain_message = msg + src << msg + next_pain_time = world.time + (100 - amount) + +mob/living/carbon/human/proc/handle_pain() + // not when sleeping + if(stat >= 2) return + var/maxdam = 0 + var/datum/organ/external/damaged_organ = null + for(var/name in organs) + var/datum/organ/external/E = organs[name] + var/dam = E.get_damage() + // make the choice of the organ depend on damage, + // but also sometimes use one of the less damaged ones + if(dam > maxdam && (maxdam == 0 || prob(70)) ) + damaged_organ = E + maxdam = dam + if(damaged_organ) + pain(damaged_organ.display_name, maxdam, 0) From c4f542985739388db587508e4412a59d5a6f629f Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Fri, 6 Jan 2012 16:41:47 -0500 Subject: [PATCH 02/16] furthur work on bones --- code/WorkInProgress/organs/organs.dm | 3 +- code/game/magic/cultist/runes.dm | 3 +- .../objects/items/weapons/surgery_tools.dm | 9 +++++ code/game/objects/storage/bible.dm | 3 +- code/modules/mob/living/carbon/human/human.dm | 39 +++++++++++-------- .../mob/living/carbon/human/human_defense.dm | 3 +- code/modules/mob/living/carbon/human/life.dm | 3 +- code/modules/mob/living/living.dm | 3 +- code/modules/mob/living/say.dm | 3 +- code/modules/mob/transform_procs.dm | 20 +++++----- code/modules/recycling/disposal.dm | 30 ++++++++++++++ 11 files changed, 85 insertions(+), 34 deletions(-) diff --git a/code/WorkInProgress/organs/organs.dm b/code/WorkInProgress/organs/organs.dm index 896f8eca06a..f2011005b45 100644 --- a/code/WorkInProgress/organs/organs.dm +++ b/code/WorkInProgress/organs/organs.dm @@ -52,7 +52,8 @@ set background = 1 var/list/organs = GetAllContents() - for(var/obj/organ/organ in organs) + for(var/name in organs) + var/obj/organ/organ = organs[name] organ.ProcessOrgan() return diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm index 2298af13fd9..54a441d994f 100644 --- a/code/game/magic/cultist/runes.dm +++ b/code/game/magic/cultist/runes.dm @@ -271,7 +271,8 @@ var/list/sacrificed = list() corpse_to_raise.mind.key = ghost.key corpse_to_raise.key = ghost.key del(ghost) - for(var/datum/organ/external/affecting in corpse_to_raise.organs) + for(var/name in corpse_to_raise.organs) + var/datum/organ/external/affecting = corpse_to_raise.organs[name] affecting.heal_damage(1000, 1000) corpse_to_raise.setToxLoss(0) corpse_to_raise.setOxyLoss(0) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index ed7acecb1f9..8c36fee1ca3 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -637,6 +637,15 @@ CIRCULAR SAW ..() return + else if(user.zone_sel.selecting != "chest" && user.zone_sel.selecting != "groin" && istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(S.destroyed) + return + for(var/mob/O in viewers(H, null)) + O.show_message(text("\red [H] gets \his [S.display_name] sawed off with [src] by [user]."), 1) + S.destroyed = 1 + H.update_body() else return ..() /* diff --git a/code/game/objects/storage/bible.dm b/code/game/objects/storage/bible.dm index f8d409bc87d..71232179582 100644 --- a/code/game/objects/storage/bible.dm +++ b/code/game/objects/storage/bible.dm @@ -10,7 +10,8 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M var/heal_amt = 10 - for(var/datum/organ/external/affecting in H.organs) + for(var/name in H.organs) + var/datum/organ/external/affecting = H.organs[name] if(affecting.heal_damage(heal_amt, heal_amt)) H.UpdateDamageIcon() return diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 320d77ea9c4..8eeb9b7cdb9 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -56,6 +56,8 @@ var/list/organs = list() var/bloodloss = 0 + var/debug_leftarm + var/debug_lefthand /mob/living/carbon/human/dummy real_name = "Test Dummy" @@ -87,6 +89,9 @@ part = new /datum/organ/external/r_foot(src) part.parent = organs["r_leg"] + debug_leftarm = organs["l_arm"] + debug_lefthand = organs["l_hand"] + var/g = "m" if (gender == MALE) g = "m" @@ -274,7 +279,8 @@ if (prob(50) && !shielded) Paralyse(10) - for(var/datum/organ/external/temp in organs) + for(var/name in organs) + var/datum/organ/external/temp = organs[name] switch(temp.name) if("head") temp.take_damage(b_loss * 0.2, f_loss * 0.2) @@ -1242,8 +1248,8 @@ else if (gender == FEMALE) g = "f" - stand_icon = new /icon('human.dmi', "blank") - lying_icon = new /icon('human.dmi', "blank") + stand_icon = new /icon('human.dmi', "body_[g]_s") + lying_icon = new /icon('human.dmi', "body_[g]_l") var/husk = (mutations & HUSK) //var/obese = (mutations & FAT) @@ -1255,18 +1261,13 @@ stand_icon.Blend(new /icon('human.dmi', "fatbody_s"), ICON_OVERLAY) lying_icon.Blend(new /icon('human.dmi', "fatbody_l"), ICON_OVERLAY)*/ else - stand_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('human.dmi', "chest_[g]_l"), ICON_OVERLAY) - - for(var/datum/organ/external/part in organs) + for(var/name in organs) + var/datum/organ/external/part = organs[name] if(!istype(part, /datum/organ/external/groin) \ && !istype(part, /datum/organ/external/chest) \ - && !part.destroyed) - stand_icon.Blend(new /icon('human.dmi', "[part.icon_name]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('human.dmi', "[part.icon_name]_l"), ICON_OVERLAY) - - stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY) + && part.destroyed) + stand_icon.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_OVERLAY) + lying_icon.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_OVERLAY) // Skin tone if (s_tone >= 0) @@ -2191,14 +2192,16 @@ It can still be worn/put on as normal. /mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn) var/list/datum/organ/external/parts = list() - for(var/datum/organ/external/organ in organs) + for(var/name in organs) + var/datum/organ/external/organ = organs[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/datum/organ/external/organ in organs) + for(var/name in organs) + var/datum/organ/external/organ = organs[name] if(organ.brute_dam + organ.burn_dam < organ.max_damage) parts += organ return parts @@ -2326,7 +2329,8 @@ It can still be worn/put on as normal. /mob/living/carbon/human/getBruteLoss() var/amount = 0.0 - for(var/datum/organ/external/O in organs) + for(var/name in organs) + var/datum/organ/external/O = organs[name] amount+= O.brute_dam return amount @@ -2338,7 +2342,8 @@ It can still be worn/put on as normal. /mob/living/carbon/human/getFireLoss() var/amount = 0.0 - for(var/datum/organ/external/O in organs) + for(var/name in organs) + var/datum/organ/external/O = organs[name] amount+= O.burn_dam return amount diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a4ddaf4e121..bf5e3345e19 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -27,7 +27,8 @@ emp_act //If a specific bodypart is targetted, check how that bodypart is protected and return the value. //If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values - for(var/datum/organ/external/organ in organs) + for(var/name in organs) + var/datum/organ/external/organ = organs[name] armorval += checkarmor(organ, type) organnum++ return (armorval/max(organnum, 1)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index e15bb76dae2..fb0a22a0502 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -758,7 +758,8 @@ real_name = "Unknown" src << "\red Your face has become disfigured." warn_flavor_changed() - for(var/datum/organ/external/temp in organs) + for(var/name in organs) + var/datum/organ/external/temp = organs[name] if(!temp.bleeding) continue else diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index cd50f05b7a5..24a2083bf8f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -23,7 +23,8 @@ 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/extradam = 0 //added to when organ is at max dam - for(var/datum/organ/external/affecting in H.organs) + for(var/name in H.organs) + var/datum/organ/external/affecting = H.organs[name] if(!affecting) continue if(affecting.take_damage(0, divided_damage+extradam)) extradam = 0 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index c96a9080eef..e37db79675d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -320,7 +320,8 @@ W |= M.contents if(ishuman(M)) var/mob/living/carbon/human/G = M - for(var/datum/organ/external/F in G.organs) + for(var/name in G.organs) + var/datum/organ/external/F = G.organs[name] W |= F.implant for (var/obj/item/device/pda/M in W) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 4e2ab637348..601f0cc256c 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -10,8 +10,8 @@ canmove = 0 icon = null invisibility = 101 - for(var/t in organs) - del(t) + for(var/name in organs) + del(organs[name]) var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) animation.icon_state = "blank" animation.icon = 'mob.dmi' @@ -51,8 +51,8 @@ /mob/living/carbon/human/AIize() if (monkeyizing) return - for(var/t in organs) - del(t) + for(var/name in organs) + del(organs[name]) return ..() /mob/living/carbon/AIize() @@ -153,8 +153,8 @@ canmove = 0 icon = null invisibility = 101 - for(var/t in organs) - del(t) + for(var/name in organs) + del(organs[name]) if(client) //client.screen -= main_hud1.contents client.screen -= hud_used.contents @@ -216,8 +216,8 @@ canmove = 0 icon = null invisibility = 101 - for(var/t in organs) - del(t) + for(var/name in organs) + del(organs[name]) var/alien_caste = pick("Hunter","Sentinel","Drone") var/mob/living/carbon/alien/humanoid/new_xeno @@ -256,8 +256,8 @@ canmove = 0 icon = null invisibility = 101 - for(var/t in organs) - del(t) + for(var/name in organs) + del(organs[name]) if(reproduce) var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index a1520ed1e95..8b516d77c33 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -664,6 +664,36 @@ H.merge(H2) H.loc = P + + if((P.dir & (P.dir - 1)) || istype(P,/obj/structure/disposalpipe/junction) || istype(P,/obj/structure/disposalpipe/sortjunction)) + for(var/mob/M in H) + M.weakened += 2 + if(prob(20)) + M.paralysis += 2 + if(istype(M,/mob/living/carbon/human)) + var/name = pick(M:organs) + var/datum/organ/external/temp = M:organs[name] + if (istype(temp, /datum/organ/external)) + temp.take_damage(4, 0) + if(temp.name == "head") + M.paralysis += 4 + M << "\red Your head smashes into a rogue piece of metal!" + else if(temp.name == "groin") + M.weakened += 4 + M << "\red You're gonna remember that one in the morning!" + M:UpdateDamageIcon() + M:UpdateDamage() + else + M.bruteloss += 4 + if(prob(2)) + M << "\red Your elbow doesn't bend that way, dammit!" + //else + // M << "\red You are tossed about in the pipes!" + M << 'clang.ogg' + for (var/mob/O in hearers(get_turf(src))) + O << "CLONG!" + + playsound(src.loc, 'clang.ogg', 50, 0, 0) else // if wasn't a pipe, then set loc to turf H.loc = T return null From ce9042ae20099ecebd836065a9c48a2e02d49b5c Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sun, 8 Jan 2012 20:05:54 -0500 Subject: [PATCH 03/16] bones and dismemberment --- code/defines/obj.dm | 1 - code/defines/obj/weapon.dm | 8 - code/game/gamemodes/cult/cult_items.dm | 1 - code/game/objects/items/item.dm | 4 + .../objects/items/weapons/surgery_tools.dm | 407 ++++++++++++++++-- .../objects/items/weapons/swords_axes_etc.dm | 2 - code/game/objects/items/weapons/tools.dm | 1 - code/modules/admin/verbs/randomverbs.dm | 18 + code/modules/mining/mine_items.dm | 1 - code/modules/mob/living/carbon/human/human.dm | 93 +++- .../mob/living/carbon/human/human_damage.dm | 6 +- .../mob/living/carbon/human/human_defense.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 12 +- code/modules/mob/organ/organ.dm | 32 +- code/modules/mob/organ/organ_external.dm | 33 +- code/unused/_debug.dm | 4 + icons/mob/human.dmi | Bin 17296 -> 18586 bytes icons/mob/limb_mask.dmi | Bin 0 -> 5667 bytes 18 files changed, 527 insertions(+), 98 deletions(-) create mode 100644 icons/mob/limb_mask.dmi diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 9f67387a9c0..dd156c1695c 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -294,7 +294,6 @@ var/icon_old = null // For when weapons get bloodied this saves their old icon. var/abstract = 0 var/force = 0 - var/slash = 0 var/item_state = null var/damtype = "brute" var/r_speed = 1.0 diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 6e39b5b3523..d01409c9e4b 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -208,7 +208,6 @@ throw_speed = 1 throw_range = 5 w_class = 3.0 - slash = 1 flags = FPRINT | CONDUCT | NOSHIELD | TABLEPASS origin_tech = "combat=3" @@ -244,7 +243,6 @@ throw_speed = 1 throw_range = 1 w_class = 4.0//So you can't hide it in your pocket or some such. - slash = 1 flags = FPRINT | TABLEPASS | NOSHIELD var/datum/effect/effect/system/spark_spread/spark_system @@ -624,7 +622,6 @@ desc = "A tool for breaking down those obstructions that stop you from fighting that fire." //Less ROBUST. --SkyMarshal force = 5 w_class = 4.0 - slash = 1 flags = ONBACK twohanded = 1 force_unwielded = 5 @@ -967,7 +964,6 @@ flags = FPRINT | TABLEPASS| CONDUCT force = 5.0 w_class = 1.0 - slash = 1 throwforce = 5.0 throw_speed = 3 throw_range = 5 @@ -981,7 +977,6 @@ desc = "Could probably be used as ... a throwing weapon?" w_class = 1.0 force = 5.0 - slash = 1 throwforce = 15.0 item_state = "shard-glass" g_amt = 3750 @@ -1358,7 +1353,6 @@ icon_state = "knife" force = 10.0 throwforce = 10.0 - slash = 1 /obj/item/weapon/kitchen/utensil/spoon name = "spoon" @@ -1373,7 +1367,6 @@ flags = FPRINT | TABLEPASS | CONDUCT force = 10.0 w_class = 1.0 - slash = 1 throwforce = 5.0 throw_speed = 3 throw_range = 5 @@ -1415,7 +1408,6 @@ icon_state = "drill" flags = FPRINT | TABLEPASS | CONDUCT w_class = 1.0 - slash = 1 origin_tech = "materials=1;biotech=1" /obj/item/weapon/circular_saw diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index efe21d281cc..60bc235f938 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -6,7 +6,6 @@ flags = FPRINT | ONBELT | TABLEPASS force = 40 throwforce = 10 - slash = 1 /obj/item/clothing/head/culthood diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm index 1892faa175d..e57fada6147 100644 --- a/code/game/objects/items/item.dm +++ b/code/game/objects/items/item.dm @@ -133,6 +133,8 @@ user.l_hand = src else user << "\blue You pick \the [src] up with your ha- wait a minute." + if(loc == user) + user.drop_from_slot(src) return else user.l_hand = src @@ -143,6 +145,8 @@ user.r_hand = src else user << "\blue You pick \the [src] up with your ha- wait a minute." + if(loc == user) + user.drop_from_slot(src) return else user.r_hand = src diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 8c36fee1ca3..be9bc290960 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -83,12 +83,12 @@ CIRCULAR SAW if(1.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his eyes retracted by [user].", 1) + O.show_message("\red [M] is having \his eyes retracted by [user].", 1) M << "\red [user] begins to seperate your eyes with [src]!" user << "\red You seperate [M]'s eyes with [src]!" else user.visible_message( \ - "\red [user] begins to have his eyes retracted.", \ + "\red [user] begins to have \his eyes retracted.", \ "\red You begin to pry open your eyes with [src]!" \ ) if(M == user && prob(25)) @@ -102,10 +102,56 @@ CIRCULAR SAW M:eye_op_stage = 2.0 - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..() + else + // bone surgery doable? + if(!try_bone_surgery(M, user)) + return ..() - return +/obj/item/weapon/retractor/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob) + if(!istype(H)) + return 0 + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(!S || !istype(S)) + return 0 + + if(S.destroyed) + user << "What [S.display_name]?" + if(!S.open) + user << "\red There is skin in the way!" + return 0 + if(S.bleeding) + user << "\red [H] is profusely bleeding in \his [S.display_name]!" + return 0 + + if(H != user) + H.visible_message( \ + "\red [user] is beginning to retract the flap in the wound in [H]'s [S.display_name] with [src].", \ + "\red [user] begins to retract the flap in the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] begins to retract the flap in the wound in \his [S.display_name] with [src]!", \ + "\red You begin to retract the flap in the wound in your [S.display_name] with [src]!") + + if(do_mob(user, H, 30)) + if(H != user) + H.visible_message( \ + "\red [user] retracts the flap in the wound in [H]'s [S.display_name] with [src]!", \ + "\red [user] retracts the flap in the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] retracts the flap in the wound in \his [S.display_name] with [src]!", \ + "\red You retract the flap in the wound in your [S.display_name] with [src]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.open = 2 + + H.updatehealth() + H.UpdateDamageIcon() + + return 1 //////////// //Hemostat// @@ -189,12 +235,12 @@ CIRCULAR SAW if(2.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his eyes mended by [user].", 1) + O.show_message("\red [M] is having \his eyes mended by [user].", 1) M << "\red [user] begins to mend your eyes with [src]!" user << "\red You mend [M]'s eyes with [src]!" else user.visible_message( \ - "\red [user] begins to have his eyes mended.", \ + "\red [user] begins to have \his eyes mended.", \ "\red You begin to mend your eyes with [src]!" \ ) if(M == user && prob(25)) @@ -206,11 +252,68 @@ CIRCULAR SAW else M.take_organ_damage(15) M:eye_op_stage = 3.0 + else if(user.zone_sel.selecting == "head") + if(istype(M, /mob/living/carbon/human) && M:brain_op_stage == 1) + M:brain_op_stage = 0 + var/datum/organ/external/S = M:organs["head"] + if(!S || !istype(S)) + return ..() + M:brain_op_stage = 0 + S.open = 1 + if(!try_bone_surgery(M, user)) + return ..() + else + return ..() + else + // bone surgery doable? + if(!try_bone_surgery(M, user)) + return ..() - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..() +/obj/item/weapon/hemostat/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob) + if(!istype(H)) + return 0 + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(!S || !istype(S)) + return 0 - return + if(S.destroyed) + user << "What [S.display_name]?" + if(!S.open) + user << "\red There is skin in the way!" + return 0 + if(!S.bleeding) + user << "\red [H] is not bleeding in \his [S.display_name]!" + return 0 + + if(H != user) + H.visible_message( \ + "\red [user] is beginning to clamp bleeders in the wound in [H]'s [S.display_name] with [src].", \ + "\red [user] begins to clamp bleeders in the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] begins to clamp bleeders in the wound in \his [S.display_name] with [src]!", \ + "\red You begin to clamp bleeders in the wound in your [S.display_name] with [src]!") + + if(do_mob(user, H, 50)) + if(H != user) + H.visible_message( \ + "\red [user] clamps bleeders in the wound in [H]'s [S.display_name] with [src]!", \ + "\red [user] clamps bleeders in the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] clamps bleeders in the wound in \his [S.display_name] with [src]!", \ + "\red You clamp bleeders in the wound in your [S.display_name] with [src]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.bleeding = 0 + + H.updatehealth() + H.UpdateDamageIcon() + + return 1 /////////// //Cautery// @@ -233,6 +336,8 @@ CIRCULAR SAW user << "\red You cauterize the incision in [M]'s torso with [src]!" M:embryo_op_stage = 0.0 return + else + try_bone_surgery(M, user) if(user.zone_sel.selecting == "groin") if(istype(M, /mob/living/carbon/human)) @@ -247,6 +352,8 @@ CIRCULAR SAW for(var/datum/disease/appendicitis in M.viruses) appendicitis.cure() M.resistances += appendicitis + else + try_bone_surgery(M, user) return if (user.zone_sel.selecting == "eyes") @@ -275,12 +382,12 @@ CIRCULAR SAW if(3.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his eyes cauterized by [user].", 1) + O.show_message("\red [M] is having \his eyes cauterized by [user].", 1) M << "\red [user] begins to cauterize your eyes!" user << "\red You cauterize [M]'s eyes with [src]!" else user.visible_message( \ - "\red [user] begins to have his eyes cauterized.", \ + "\red [user] begins to have \his eyes cauterized.", \ "\red You begin to cauterize your eyes!" \ ) if(M == user && prob(25)) @@ -294,11 +401,53 @@ CIRCULAR SAW M.sdisabilities &= ~1 M:eye_op_stage = 0.0 - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..() + else + // bone surgery doable? + if(!try_bone_surgery(M, user)) + return ..() - return +/obj/item/weapon/cautery/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob) + if(!istype(H)) + return 0 + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(!S || !istype(S)) + return 0 + if(S.destroyed) + user << "What [S.display_name]?" + if(!S.open) + user << "\red There is no wound to close up!" + return 0 + + if(H != user) + H.visible_message( \ + "\red [user] is beginning to cauterize the incision in [H]'s [S.display_name] with [src].", \ + "\red [user] begins to cut open the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] begins to cauterize the incision in \his [S.display_name] with [src]!", \ + "\red You begin to cauterize the incision in your [S.display_name] with [src]!") + + if(do_mob(user, H, 100)) + if(H != user) + H.visible_message( \ + "\red [user] cauterizes the incision in [H]'s [S.display_name] with [src]!", \ + "\red [user] cauterizes the incision in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] cauterizes the incision in \his [S.display_name] with [src]!", \ + "\red You cauterize the incision in your [S.display_name] with [src]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.open = 0 + + H.updatehealth() + H.UpdateDamageIcon() + + return 1 //obj/item/weapon/surgicaldrill @@ -327,7 +476,7 @@ CIRCULAR SAW if(0.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his torso cut open with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his torso cut open with [src] by [user].", 1) M << "\red [user] begins to cut open your torso with [src]!" user << "\red You cut [M]'s torso open with [src]!" M:embryo_op_stage = 1.0 @@ -335,7 +484,7 @@ CIRCULAR SAW if(3.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his stomach cut open with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his stomach cut open with [src] by [user].", 1) M << "\red [user] begins to cut open your stomach with [src]!" user << "\red You cut [M]'s stomach open with [src]!" for(var/datum/disease/D in M.viruses) @@ -352,14 +501,14 @@ CIRCULAR SAW if(0.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his abdomen cut open with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his abdomen cut open with [src] by [user].", 1) M << "\red [user] begins to cut open your abdomen with [src]!" user << "\red You cut [M]'s abdomen open with [src]!" M:appendix_op_stage = 1.0 if(3.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his appendix seperated with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his appendix seperated with [src] by [user].", 1) M << "\red [user] begins to seperate your appendix with [src]!" user << "\red You seperate [M]'s appendix with [src]!" M:appendix_op_stage = 4.0 @@ -397,12 +546,12 @@ CIRCULAR SAW if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his head cut open with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his head cut open with [src] by [user].", 1) M << "\red [user] begins to cut open your head with [src]!" user << "\red You cut [M]'s head open with [src]!" else user.visible_message( \ - "\red [user] begins to cut open his skull with [src]!", \ + "\red [user] begins to cut open \his skull with [src]!", \ "\red You begin to cut open your head with [src]!" \ ) @@ -443,12 +592,12 @@ CIRCULAR SAW if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his connections to the brain delicately severed with [src] by [user].", 1) + O.show_message("\red [M] is having \his connections to the brain delicately severed with [src] by [user].", 1) M << "\red [user] begins to cut open your head with [src]!" user << "\red You cut [M]'s head open with [src]!" else user.visible_message( \ - "\red [user] begin to delicately remove the connections to his brain with [src]!", \ + "\red [user] begin to delicately remove the connections to \his brain with [src]!", \ "\red You begin to cut open your head with [src]!" \ ) if(M == user && prob(25)) @@ -498,12 +647,12 @@ CIRCULAR SAW if(0.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his eyes incised with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his eyes incised with [src] by [user].", 1) M << "\red [user] begins to cut open your eyes with [src]!" user << "\red You make an incision around [M]'s eyes with [src]!" else user.visible_message( \ - "\red [user] begins to cut around his eyes with [src]!", \ + "\red [user] begins to cut around \his eyes with [src]!", \ "\red You begin to cut open your eyes with [src]!" \ ) if(M == user && prob(25)) @@ -519,13 +668,78 @@ CIRCULAR SAW M:eye_op_stage = 1.0 user << "\blue So far so good after." else - return ..() + // bone surgery doable? + if(!try_bone_surgery(M, user)) + return ..() + /* wat else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) return ..() */ return +/obj/item/weapon/scalpel/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob) + if(!istype(H)) + return 0 + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(!S || !istype(S)) + return 0 + + if(S.destroyed) + user << "What [S.display_name]?" + if(S.open) + user << "\red The wound is already open!" + return 0 + + if(H != user) + H.visible_message( \ + "\red [user] is beginning to cut open the wound in [H]'s [S.display_name] with [src].", \ + "\red [user] begins to cut open the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] begins to cut open the wound in \his [S.display_name] with [src]!", \ + "\red You begin to cut open the wound in your [S.display_name] with [src]!") + + if(do_mob(user, H, 100)) + if(H != user) + H.visible_message( \ + "\red [user] cuts open the wound in [H]'s [S.display_name] with [src]!", \ + "\red [user] cuts open the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] cuts open the wound in \his [S.display_name] with [src]!", \ + "\red You cut open the wound in your [S.display_name] with [src]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.open = 1 + S.bleeding = 1 + + H.updatehealth() + H.UpdateDamageIcon() + else + var/a = pick(1,2,3) + var/msg + if(a == 1) + msg = "\red [user]'s move slices open [H]'s wound, causing massive bleeding" + S.brute_dam += 35 + S.createwound(rand(1,3)) + else if(a == 2) + msg = "\red [user]'s move slices open [H]'s wound, and causes \him to accidentally stab himself" + S.brute_dam += 35 + var/datum/organ/external/userorgan = user:organs["chest"] + if(userorgan) + userorgan.brute_dam += 35 + else + user.take_organ_damage(35) + else if(a == 3) + msg = "\red [user] quickly stops the surgery" + for(var/mob/O in viewers(H)) + O.show_message(msg, 1) + + return 1 //////////////// //CIRCULAR SAW// @@ -567,12 +781,12 @@ CIRCULAR SAW return if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] has his skull sawed open with [src] by [user].", 1) + O.show_message("\red [M] has \his skull sawed open with [src] by [user].", 1) M << "\red [user] begins to saw open your head with [src]!" user << "\red You saw [M]'s head open with [src]!" else user.visible_message( \ - "\red [user] saws open his skull with [src]!", \ + "\red [user] saws open \his skull with [src]!", \ "\red You begin to saw open your head with [src]!" \ ) if(M == user && prob(25)) @@ -615,12 +829,12 @@ CIRCULAR SAW if(3.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] has his spine's connection to the brain severed with [src] by [user].", 1) + O.show_message("\red [M] has \his spine's connection to the brain severed with [src] by [user].", 1) M << "\red [user] severs your brain's connection to the spine with [src]!" user << "\red You sever [M]'s brain's connection to the spine with [src]!" else user.visible_message( \ - "\red [user] severs his brain's connection to the spine with [src]!", \ + "\red [user] severs \his brain's connection to the spine with [src]!", \ "\red You sever your brain's connection to the spine with [src]!" \ ) @@ -645,6 +859,7 @@ CIRCULAR SAW for(var/mob/O in viewers(H, null)) O.show_message(text("\red [H] gets \his [S.display_name] sawed off with [src] by [user]."), 1) S.destroyed = 1 + S.droplimb() H.update_body() else return ..() @@ -653,3 +868,135 @@ CIRCULAR SAW return ..() */ return + +/obj/item/weapon/surgical_tool + name = "surgical tool" + var/list/stage = list() //Stage to act on + var/time = 50 //Time it takes to use + var/wound //Wound type to act on + + proc/get_message(var/mnumber,var/M,var/user,var/datum/organ/external/organ)//=Start,2=finish,3=walk away,4=screw up, 5 = closed wound + proc/screw_up(mob/living/carbon/M as mob,mob/living/carbon/user as mob,var/datum/organ/external/organ) + organ.brute_dam += 30 +/obj/item/weapon/surgical_tool/proc/IsFinalStage(var/stage) + var/a + switch(wound) + if("broken") //Basic broken bone + a=3 + if("blood") + a=3 + return stage == a + +/obj/item/weapon/surgical_tool/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob) + if(!istype(M, /mob)) + return + if((usr.mutations & 16) && prob(50)) + M << "\red You stab yourself in the eye." + M.disabilities |= 128 + M.weakened += 4 + M.bruteloss += 10 + + src.add_fingerprint(user) + + if(!(locate(/obj/machinery/optable, M.loc) && M.resting)) + return ..() + + var/zone = user.zone_sel.selecting + if (istype(M.organs[zone], /datum/organ/external)) + var/datum/organ/external/temp = M.organs[zone] + var/msg + + // quickly convert embryo removal to bone surgery + if(zone == "chest" && M.embryo_op_stage == 3) + M.embryo_op_stage = 0 + temp.open = 2 + temp.bleeding = 0 + + // quickly convert appendectomy to bone surgery + if(zone == "groin" && M.appendix_op_stage == 3) + M.appendix_op_stage = 0 + temp.open = 2 + temp.bleeding = 0 + + msg = get_message(1,M,user,temp) + for(var/mob/O in viewers(M,null)) + O.show_message("\red [msg]",1) + if(do_mob(user,M,time)) + if(temp.open == 2 && !temp.bleeding) + if(temp.wound == wound) + if(temp.stage in stage) + temp.stage += 1 + + if(IsFinalStage(temp.stage)) + temp.broken = 0 + temp.stage = 0 + temp.perma_injury = 0 + temp.brute_dam = temp.min_broken_damage -1 + msg = get_message(2,M,user,temp) + else + msg = get_message(4,M,user,temp) + screw_up(M,user,temp) + else + msg = get_message(5,M,user,temp) + else + msg = get_message(3,M,user,temp) + + for(var/mob/O in viewers(M,null)) + O.show_message("\red [msg]",1) + + +//Broken bone +//Basic +//Open -> Clean -> Bone-gel -> pop-into-place -> Bone-gel -> close -> glue -> clean + +//Split +//Open -> Clean -> Tweasers -> bone-glue -> close -> glue -> clean + +// + +/obj/item/weapon/surgical_tool/bonegel + name = "Bone-gel" + icon = 'janitor.dmi' + icon_state = "cleaner" + +/obj/item/weapon/surgical_tool/bonegel/New() + stage += 0 + stage += 2 + wound = "broken" +/obj/item/weapon/surgical_tool/bonegel/get_message(var/n,var/m,var/usr,var/datum/organ/external/organ) + var/z + switch(n) + if(1) + z="[usr] starts applying bone-gel to [m]'s [organ.display_name]" + if(2) + z="[usr] finishes applying bone-gel to [m]'s [organ.display_name]" + if(3) + z="[usr] stops applying bone-gel to [m]'s [organ.display_name]" + if(4) + z="[usr] applies bone-gel incorrectly to [m]'s [organ.display_name]" + if(5) + z="[usr] lubricates [m]'s [organ.display_name]" + return z + +/obj/item/weapon/surgical_tool/bonecracker + name = "Bone-cracker" + icon = 'items.dmi' + icon_state = "wrench" + +/obj/item/weapon/surgical_tool/bonecracker/New() + stage += 1 + wound = "broken" +/obj/item/weapon/surgical_tool/bonecracker/get_message(var/n,var/m,var/usr,var/datum/organ/external/organ) + var/z + switch(n) + if(1) + z="[usr] starts popping [m]'s [organ.display_name] bone into place" + if(2) + z="[usr] finishes popping [m]'s [organ.display_name] bone into place" + if(3) + z="[usr] stops popping [m]'s [organ.display_name] bone into place" + if(4) + z="[usr] pops [m]'s [organ.display_name] bone into the wrong place" + if(5) + z="[usr] performs chiropractice on [m]'s [organ.display_name]" + return z diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 1ecdff06ca1..5f7185d72b6 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -33,7 +33,6 @@ STUN BATON else icon_state = "sword[color]" w_class = 4 - slash = 1 playsound(user, 'saberon.ogg', 50, 1) user << "\blue [src] is now active." else @@ -43,7 +42,6 @@ STUN BATON else icon_state = "sword0" w_class = 2 - slash = 0 playsound(user, 'saberoff.ogg', 50, 1) user << "\blue [src] can now be concealed." add_fingerprint(user) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 232a374f489..a6f00c091a0 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -290,7 +290,6 @@ WELDINGTOOOL icon_state = "cutters" flags = FPRINT | TABLEPASS| CONDUCT force = 6.0 - slash = 1 throw_speed = 2 throw_range = 9 w_class = 2.0 diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 1fd57987e36..680122d0167 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -494,6 +494,24 @@ Traitors and the like can also be revived with the previous role mostly intact. //M.updatehealth() M.buckled = initial(M.buckled) M.handcuffed = initial(M.handcuffed) + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + for(var/name in H.organs) + var/datum/organ/external/e = H.organs[name] + e.brute_dam = 0.0 + e.burn_dam = 0.0 + e.bandaged = 0.0 + e.wound_size = 0.0 + e.max_damage = initial(e.max_damage) + e.bleeding = 0 + e.open = 0 + e.broken = 0 + e.destroyed = 0 + e.perma_injury = 0 + e.update_icon() + H.update_body() + H.update_face() + H.UpdateDamageIcon() if (M.stat > 1) M.stat=0 ..() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index b527f6cb0a1..a49b639c21d 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -131,7 +131,6 @@ proc/move_mining_shuttle() throwforce = 4.0 item_state = "pickaxe" w_class = 4.0 - slash = 1 m_amt = 3750 //one sheet, but where can you make them? var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO origin_tech = "materials=1;engineering=1" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 8eeb9b7cdb9..0e629c7f274 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -891,17 +891,33 @@ //because theyre located on the 'other' inventory bar. // Gloves - if (gloves) - var/t1 = gloves.item_state - if (!t1) - t1 = gloves.icon_state - overlays += image("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER) - if (gloves.blood_DNA) + var/datum/organ/external/lo = organs["l_hand"] + var/datum/organ/external/ro = organs["r_hand"] + if (!lo.destroyed || !ro.destroyed) + if (gloves) + var/t1 = gloves.item_state + if (!t1) + t1 = gloves.icon_state + var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2"))) + if(lo.destroyed) + gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) + else if(ro.destroyed) + gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) + overlays += image(gloves_icon, "layer" = MOB_LAYER) + if (gloves.blood_DNA) + var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]") + if(lo.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) + else if(ro.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) + overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) + else if (blood_DNA) var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]") + if(lo.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) + else if(ro.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) - else if (blood_DNA) - var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]") - overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Glasses if (glasses) var/t1 = glasses.icon_state @@ -914,11 +930,22 @@ var/t1 = r_ear.icon_state overlays += image("icon" = 'ears.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER) // Shoes - if (shoes) + lo = organs["l_foot"] + ro = organs["r_foot"] + if ((!lo.destroyed || !ro.destroyed) && shoes) var/t1 = shoes.icon_state - overlays += image("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER) + var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2"))) + if(lo.destroyed && !lying) + shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY) + else if(ro.destroyed && !lying) + shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY) + overlays += image(shoes_icon, "layer" = MOB_LAYER) if (shoes.blood_DNA) var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]") + if(lo.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) + else if(ro.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Radio /* if (w_radio) overlays += image("icon" = 'ears.dmi', "icon_state" = "headset[!lying ? "" : "2"]", "layer" = MOB_LAYER) */ @@ -1248,26 +1275,50 @@ else if (gender == FEMALE) g = "f" - stand_icon = new /icon('human.dmi', "body_[g]_s") - lying_icon = new /icon('human.dmi', "body_[g]_l") + stand_icon = new /icon('human.dmi', "torso_s") + lying_icon = new /icon('human.dmi', "torso_l") var/husk = (mutations & HUSK) //var/obese = (mutations & FAT) + stand_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "chest_[g]_l"), ICON_OVERLAY) + + var/datum/organ/external/head = organs["head"] + if(!head.destroyed) + stand_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "head_[g]_l"), ICON_OVERLAY) + + for(var/name in organs) + var/datum/organ/external/part = organs[name] + if(!istype(part, /datum/organ/external/groin) \ + && !istype(part, /datum/organ/external/chest) \ + && !istype(part, /datum/organ/external/head) \ + && !part.destroyed) + stand_icon.Blend(new /icon('human.dmi', "[part.icon_name]_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "[part.icon_name]_l"), ICON_OVERLAY) + + stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY) + if (husk) - stand_icon.Blend(new /icon('human.dmi', "husk_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('human.dmi', "husk_l"), ICON_OVERLAY) - /*else if(obese) - stand_icon.Blend(new /icon('human.dmi', "fatbody_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('human.dmi', "fatbody_l"), ICON_OVERLAY)*/ - else + var/icon/husk_s = new /icon('human.dmi', "husk_s") + var/icon/husk_l = new /icon('human.dmi', "husk_l") + for(var/name in organs) var/datum/organ/external/part = organs[name] if(!istype(part, /datum/organ/external/groin) \ && !istype(part, /datum/organ/external/chest) \ + && !istype(part, /datum/organ/external/head) \ && part.destroyed) - stand_icon.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_OVERLAY) - lying_icon.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_OVERLAY) + husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT) + husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT) + + stand_icon.Blend(husk_s, ICON_OVERLAY) + lying_icon.Blend(husk_l, ICON_OVERLAY) + /*else if(obese) + stand_icon.Blend(new /icon('human.dmi', "fatbody_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "fatbody_l"), ICON_OVERLAY)*/ // Skin tone if (s_tone >= 0) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index bd9dff32812..e0f779fb7a2 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -39,7 +39,7 @@ return null -/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/slash = 0) +/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 @@ -58,9 +58,9 @@ switch(damagetype) if(BRUTE) - organ.take_damage(damage, 0, slash) + organ.take_damage(damage, 0, sharp) if(BURN) - organ.take_damage(0, damage, slash) + organ.take_damage(0, damage, sharp) UpdateDamageIcon() updatehealth() return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index bf5e3345e19..e03e9c15043 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -96,7 +96,7 @@ emp_act var/armor = run_armor_check(affecting, "melee", "Your armor has protected you from a hit to the [hit_area].", "Your armor has softened hit to your [hit_area].") if(armor >= 2) return 0 if(!I.force) return 0 - apply_damage(I.force, I.damtype, affecting, armor, I.slash) + apply_damage(I.force, I.damtype, affecting, armor, is_cut(I)) var/bloody = 0 if((I.damtype == BRUTE) && prob(25 + (I.force * 2))) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index fb0a22a0502..1df70ac599f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -669,10 +669,11 @@ return //TODO: DEFERRED handle_regular_status_updates() + var/leg_tally = 2 for(var/name in organs) var/datum/organ/external/E = organs[name] E.process() - if(E.broken) + if(E.broken || E.destroyed) if(E.name == "l_hand" || E.name == "l_arm") if(hand && equipped()) drop_item() @@ -681,12 +682,21 @@ if(!hand && equipped()) drop_item() emote("scream") + else if(E.name == "l_leg" || E.name == "l_foot" \ + || E.name == "r_leg" || E.name == "r_foot" && !lying) + leg_tally-- // let it fail even if just foot&leg if(E.open && (!resting) && (!sleeping)) emote("scream") E.take_damage(20,0) emote("collapse") paralysis = 10 + // can't stand + if(leg_tally == 0) + emote("scream") + emote("collapse") + paralysis = 10 + updatehealth() // health = 100 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 6404cac6231..845ec7dc8aa 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -41,10 +41,8 @@ damage_msg = "\red You feel a intense pain" var/open = 0 - var/clean = 1 var/stage = 0 var/wound = 0 - var/split = 0 New(mob/living/carbon/human/H) ..(H) @@ -54,14 +52,14 @@ owner = H H.organs[name] = src - proc/take_damage(brute, burn, slash) + proc/take_damage(brute, burn, sharp) if((brute <= 0) && (burn <= 0)) return 0 if(destroyed) return 0 if(owner) owner.pain(display_name, (brute+burn)*3, 1) - if(slash) + if(sharp) var/chance = rand(1,5) var/nux = brute * chance if(brute_dam >= max_damage) @@ -190,19 +188,25 @@ switch(body_part) if(UPPER_TORSO) owner.gib() + if(LOWER_TORSO) + owner << "\red You are now sterile." if(HEAD) - var/obj/item/weapon/organ/head/H = new(owner.loc) + var/obj/item/weapon/organ/head/H = new(owner.loc, owner) + if(owner.gender == FEMALE) + H.icon_state = "head_f_l" + H.overlays += owner.face_lying + var/lol = pick(cardinal) step(H,lol) - owner:update_face() - owner:update_body() - return + owner.update_face() + owner.update_body() + owner.death() if(ARM_RIGHT) var/obj/item/weapon/organ/r_arm/H = new(owner.loc) if(owner:organs["r_hand"]) var/datum/organ/external/S = owner:organs["r_hand"] if(!S.destroyed) - var/obj/item/weapon/organ/r_hand/X = new(owner.loc) + var/obj/item/weapon/organ/r_hand/X = new(owner.loc, owner) for(var/mob/M in viewers(owner)) M.show_message("\red [owner.name]'s [X.name] flies off.") var/lol2 = pick(cardinal) @@ -210,13 +214,12 @@ var/lol = pick(cardinal) step(H,lol) destroyed = 1 - return if(ARM_LEFT) var/obj/item/weapon/organ/l_arm/H = new(owner.loc) if(owner:organs["l_hand"]) var/datum/organ/external/S = owner:organs["l_hand"] if(!S.destroyed) - var/obj/item/weapon/organ/l_hand/X = new(owner.loc) + var/obj/item/weapon/organ/l_hand/X = new(owner.loc, owner) for(var/mob/M in viewers(owner)) M.show_message("\red [owner.name]'s [X.name] flies off in arc.") var/lol2 = pick(cardinal) @@ -224,13 +227,12 @@ var/lol = pick(cardinal) step(H,lol) destroyed = 1 - return if(LEG_RIGHT) var/obj/item/weapon/organ/r_leg/H = new(owner.loc) if(owner:organs["r_foot"]) var/datum/organ/external/S = owner:organs["r_foot"] if(!S.destroyed) - var/obj/item/weapon/organ/l_foot/X = new(owner.loc) + var/obj/item/weapon/organ/l_foot/X = new(owner.loc, owner) for(var/mob/M in viewers(owner)) M.show_message("\red [owner.name]'s [X.name] flies off flies off in arc.") var/lol2 = pick(cardinal) @@ -238,13 +240,12 @@ var/lol = pick(cardinal) step(H,lol) destroyed = 1 - return if(LEG_LEFT) var/obj/item/weapon/organ/l_leg/H = new(owner.loc) if(owner:organs["l_foot"]) var/datum/organ/external/S = owner:organs["l_foot"] if(!S.destroyed) - var/obj/item/weapon/organ/l_foot/X = new(owner.loc) + var/obj/item/weapon/organ/l_foot/X = new(owner.loc, owner) for(var/mob/M in viewers(owner)) M.show_message("\red [owner.name]'s [X.name] flies off.") var/lol2 = pick(cardinal) @@ -252,7 +253,6 @@ var/lol = pick(cardinal) step(H,lol) destroyed = 1 - return proc/createwound(var/size = 1) if(ishuman(src.owner)) diff --git a/code/modules/mob/organ/organ_external.dm b/code/modules/mob/organ/organ_external.dm index 6fdeb413cdc..6043c05ae94 100644 --- a/code/modules/mob/organ/organ_external.dm +++ b/code/modules/mob/organ/organ_external.dm @@ -15,8 +15,8 @@ /datum/organ/external/head name = "head" icon_name = "head" - max_damage = 125 - min_broken_damage = 70 + max_damage = 75 + min_broken_damage = 40 body_part = HEAD var/disfigured = 0 @@ -84,32 +84,41 @@ min_broken_damage = 15 body_part = HAND_LEFT -obj/item/weapon/organ/ +obj/item/weapon/organ icon = 'human.dmi' + +obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) + ..(loc) + if(!istype(H)) + return + if(H.dna) + blood_DNA = H.dna.unique_enzymes + blood_type = H.b_type + obj/item/weapon/organ/head name = "head" - icon_state = "head_l" + icon_state = "head_m_l" obj/item/weapon/organ/l_arm name = "left arm" - icon_state = "arm_left_l" + icon_state = "l_arm_l" obj/item/weapon/organ/l_foot name = "left foot" - icon_state = "foot_left_l" + icon_state = "l_foot_l" obj/item/weapon/organ/l_hand name = "left hand" - icon_state = "hand_left_l" + icon_state = "l_hand_l" obj/item/weapon/organ/l_leg name = "left leg" - icon_state = "leg_left_l" + icon_state = "l_leg_l" obj/item/weapon/organ/r_arm name = "right arm" - icon_state = "arm_right_l" + icon_state = "r_arm_l" obj/item/weapon/organ/r_foot name = "right foot" - icon_state = "foot_right_l" + icon_state = "r_foot_l" obj/item/weapon/organ/r_hand name = "right hand" - icon_state = "hand_right_l" + icon_state = "r_hand_l" obj/item/weapon/organ/r_leg name = "right leg" - icon_state = "leg_right_l" + icon_state = "r_leg_l" diff --git a/code/unused/_debug.dm b/code/unused/_debug.dm index 61ec522c9c2..b9cbcdf4306 100644 --- a/code/unused/_debug.dm +++ b/code/unused/_debug.dm @@ -486,9 +486,13 @@ Doing this because FindTurfs() isn't even used e.bandaged = 0.0 e.wound_size = 0.0 e.max_damage = initial(e.max_damage) + e.broken = 0 + e.destroyed = 0 + e.perma_injury = 0 e.update_icon() if(src.type == /mob/living/carbon/human) var/mob/living/carbon/human/H = src + H.update_body() H.UpdateDamageIcon() else alert("Debugging off") diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index e355f58934d9f73f31d3ff3b4226e46126ed1b75..ae8fd76d54b376ea2813c8eb346cbce52dc38026 100644 GIT binary patch literal 18586 zcmce;WmJ{j-z~f;5s{YeMp8heL)<8mQqmzUT>?@YP?1I&q`N`7yGy#eySvZY_x=3O z8E1?$-uFE3hxdcAy*7Ja*IK`rzd7g9?}OYsj3*>dAP@+~dr7Dw1cHzZetABA1pZ~` zcZD^0q2Qvd<^VOaH?aF`Z?rp;H^*qd^$obsgr0DDUZ37BDZXwGihA<Z3c^7)QhRx)&%&bURAjioh;oUsP~?Ri`L=iS*jKS5gA@Xc4` zwZ$iw?cBzx>5ggR4FzWF?Flb!&1I9G&!ry=ePOU?qvw|C>=BcX?FlvPGNOsY#h(df zMNDNxrrJ&=kQtrynx7QA~qSJFl1*?~G5zSkd&|a?&&gAX2 z@B#ZwiGf@h@sv;zVeDyhAvq{ECF>;>|t&4jzQ=}*T8lKe4fNdvgha8&%XZB&>; z-5`tn_5qR%=4+@Bufh3LVY}F)JK5=$iCNO~iHqe>8BTCI)`T=TE|KlCWApXP2=Ghm$Ur-InJHp``&D}vfSAY7F* zxZX=n(IJO^*Sg0{|2DI9?8Nk51m$Q!*x%w>074blQ26o+T6hQ^N!}LipwqZ z*i6A(i4GbWPW6h?onWTn0psqRV?M8L=LGh!;^=0)Pk3E%0DIFo;&lo3FKv0@{LY$5 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%0A@VBVN1w;K&~nfGW0RlDl>5aKqeX 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 E17(Ls!vFvP literal 0 HcmV?d00001 From 179ae3c2e4382e001827ac46ff36edb6cff49be6 Mon Sep 17 00:00:00 2001 From: CaelAislinn Date: Mon, 9 Jan 2012 14:30:22 +1000 Subject: [PATCH 04/16] made body bags orderable via qm Signed-off-by: CaelAislinn --- code/defines/obj/supplypacks.dm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm index 14570f59757..5ae12cd307e 100644 --- a/code/defines/obj/supplypacks.dm +++ b/code/defines/obj/supplypacks.dm @@ -31,6 +31,18 @@ containertype = "/obj/structure/closet/crate" containername = "Empty Box crate" +/datum/supply_packs/body_bags + name = "Body Bag supplies" + contains = list( + "/obj/item/weapon/bodybag", + "/obj/item/weapon/bodybag", + "/obj/item/weapon/bodybag", + "/obj/item/weapon/bodybag", + ) + cost = 10 + containertype = "/obj/structure/closet/crate" + containername = "Body Bag crate" + /datum/supply_packs/stationary name = "Stationary supplies" contains = list("/obj/item/device/taperecorder", @@ -54,7 +66,6 @@ /datum/supply_packs/artscrafts name = "Arts and Crafts supplies" contains = list("/obj/item/toy/crayonbox", - "/obj/item/weapon/c_tube", "/obj/item/weapon/camera_test", "/obj/item/weapon/storage/photo_album", "/obj/item/weapon/packageWrap", From 35a298c722caedfdce093162ec228159cb3f53e7 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sun, 8 Jan 2012 23:30:52 -0500 Subject: [PATCH 05/16] remove malf from secret for now --- config/config.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.txt b/config/config.txt index 7f3083f2b1e..61a91abec04 100644 --- a/config/config.txt +++ b/config/config.txt @@ -43,7 +43,7 @@ SQL_ENABLED 0 PROBABILITY EXTENDED 0 PROBABILITY TRAITOR 4 PROBABILITY METEOR 0 -PROBABILITY MALFUNCTION 1 +PROBABILITY MALFUNCTION 0 PROBABILITY BLOB 1 PROBABILITY NUCLEAR 0 PROBABILITY SANDBOX 0 From 409da960552b3363fa4f9a43781bc2441d696584 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Mon, 9 Jan 2012 01:06:16 -0500 Subject: [PATCH 06/16] can operate on heads to get the head out now, also skin color --- .../objects/items/weapons/surgery_tools.dm | 11 ++ code/modules/mob/living/carbon/human/life.dm | 5 - code/modules/mob/organ/organ.dm | 9 +- code/modules/mob/organ/organ_external.dm | 65 +++++++++ maps/tgstation.2.0.8.dmm | 126 +++++++++--------- 5 files changed, 144 insertions(+), 72 deletions(-) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index be9bc290960..2a2c0fc618a 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -776,6 +776,17 @@ CIRCULAR SAW return switch(M:brain_op_stage) + if(0) + if(!istype(H)) + return ..() + var/datum/organ/external/S = H.organs["head"] + if(S.destroyed) + return + for(var/mob/O in viewers(H, null)) + O.show_message(text("\red [H] gets \his [S.display_name] sawed off with [src] by [user]."), 1) + S.destroyed = 1 + S.droplimb() + H.update_body() if(1.0) if(istype(M, /mob/living/carbon/metroid)) return diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a963d0c88a2..f0c2f69ce58 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -685,11 +685,6 @@ else if(E.name == "l_leg" || E.name == "l_foot" \ || E.name == "r_leg" || E.name == "r_foot" && !lying) leg_tally-- // let it fail even if just foot&leg - if(E.open && (!resting) && (!sleeping)) - emote("scream") - E.take_damage(20,0) - emote("collapse") - paralysis = 10 // can't stand if(leg_tally == 0) diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 845ec7dc8aa..c2370b5b10e 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -195,6 +195,7 @@ if(owner.gender == FEMALE) H.icon_state = "head_f_l" H.overlays += owner.face_lying + H.transfer_identity(owner) var/lol = pick(cardinal) step(H,lol) @@ -202,7 +203,7 @@ owner.update_body() owner.death() if(ARM_RIGHT) - var/obj/item/weapon/organ/r_arm/H = new(owner.loc) + var/obj/item/weapon/organ/r_arm/H = new(owner.loc, owner) if(owner:organs["r_hand"]) var/datum/organ/external/S = owner:organs["r_hand"] if(!S.destroyed) @@ -215,7 +216,7 @@ step(H,lol) destroyed = 1 if(ARM_LEFT) - var/obj/item/weapon/organ/l_arm/H = new(owner.loc) + var/obj/item/weapon/organ/l_arm/H = new(owner.loc, owner) if(owner:organs["l_hand"]) var/datum/organ/external/S = owner:organs["l_hand"] if(!S.destroyed) @@ -228,7 +229,7 @@ step(H,lol) destroyed = 1 if(LEG_RIGHT) - var/obj/item/weapon/organ/r_leg/H = new(owner.loc) + var/obj/item/weapon/organ/r_leg/H = new(owner.loc, owner) if(owner:organs["r_foot"]) var/datum/organ/external/S = owner:organs["r_foot"] if(!S.destroyed) @@ -241,7 +242,7 @@ step(H,lol) destroyed = 1 if(LEG_LEFT) - var/obj/item/weapon/organ/l_leg/H = new(owner.loc) + var/obj/item/weapon/organ/l_leg/H = new(owner.loc, owner) if(owner:organs["l_foot"]) var/datum/organ/external/S = owner:organs["l_foot"] if(!S.destroyed) diff --git a/code/modules/mob/organ/organ_external.dm b/code/modules/mob/organ/organ_external.dm index 6043c05ae94..e70528e08f8 100644 --- a/code/modules/mob/organ/organ_external.dm +++ b/code/modules/mob/organ/organ_external.dm @@ -95,9 +95,74 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) blood_DNA = H.dna.unique_enzymes blood_type = H.b_type + var/icon/I = new /icon(icon, icon_state) + + if (H.s_tone >= 0) + I.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD) + else + I.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT) + icon = I + obj/item/weapon/organ/head name = "head" icon_state = "head_m_l" + var/mob/living/carbon/brain/brainmob + var/brain_op_stage = 0 + +obj/item/weapon/organ/head/proc/transfer_identity(var/mob/living/carbon/human/H)//Same deal as the regular brain proc. Used for human-->head + brainmob = new(src) + brainmob.name = H.real_name + brainmob.real_name = H.real_name + brainmob.dna = H.dna + brainmob.container = src + +obj/item/weapon/organ/head/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/weapon/scalpel)) + switch(brain_op_stage) + if(0) + for(var/mob/O in (oviewers(brainmob) - user)) + O.show_message("\red [brainmob] is beginning to have \his head cut open with [src] by [user].", 1) + brainmob << "\red [user] begins to cut open your head with [src]!" + user << "\red You cut [brainmob]'s head open with [src]!" + + brain_op_stage = 1 + + if(2) + for(var/mob/O in (oviewers(brainmob) - user)) + O.show_message("\red [brainmob] is having \his connections to the brain delicately severed with [src] by [user].", 1) + brainmob << "\red [user] begins to cut open your head with [src]!" + user << "\red You cut [brainmob]'s head open with [src]!" + + brain_op_stage = 3.0 + else + ..() + else if(istype(W,/obj/item/weapon/circular_saw)) + switch(brain_op_stage) + if(1) + for(var/mob/O in (oviewers(brainmob) - user)) + O.show_message("\red [brainmob] has \his skull sawed open with [src] by [user].", 1) + brainmob << "\red [user] begins to saw open your head with [src]!" + user << "\red You saw [brainmob]'s head open with [src]!" + + brain_op_stage = 2 + if(3) + for(var/mob/O in (oviewers(brainmob) - user)) + O.show_message("\red [brainmob] has \his spine's connection to the brain severed with [src] by [user].", 1) + brainmob << "\red [user] severs your brain's connection to the spine with [src]!" + user << "\red You sever [brainmob]'s brain's connection to the spine with [src]!" + + user.attack_log += "\[[time_stamp()]\] Debrained [brainmob.name] ([brainmob.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" + brainmob.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" + + var/obj/item/brain/B = new(loc) + B.transfer_identity(brainmob) + + brain_op_stage = 4.0 + else + ..() + else + ..() + obj/item/weapon/organ/l_arm name = "left arm" icon_state = "l_arm_l" diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm index e93e03320b5..30ea8d6fd51 100644 --- a/maps/tgstation.2.0.8.dmm +++ b/maps/tgstation.2.0.8.dmm @@ -4468,60 +4468,60 @@ "bHV" = (/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Obshutter"; name = "Observation Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/surgery) "bHW" = (/obj/structure/table,/obj/item/weapon/cigpacket,/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "bHX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"bHY" = (/obj/machinery/optable{id = "medbay"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"bHZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"bIa" = (/obj/structure/table,/obj/item/weapon/circular_saw,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"bIb" = (/obj/machinery/r_n_d/server{id_with_download_string = "1"; id_with_upload_string = "1"; name = "Core R&D Server"; server_id = 1},/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server) -"bIc" = (/obj/machinery/camera{c_tag = "Server Room"; dir = 2; network = "SS13"; pixel_x = 22},/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server) -"bId" = (/obj/machinery/camera{c_tag = "Server Room"; dir = 2; network = "RD"},/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server) -"bIe" = (/obj/machinery/blackbox_recorder,/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server) -"bIf" = (/obj/structure/disposalpipe/segment{dir = 1},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bIg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/sign/biohazard{pixel_x = 28},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bIh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/requests_console{department = "Xenobiology"; departmentType = 0; pixel_x = -30; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"bIi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"bIj" = (/obj/structure/stool/chair,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"bIk" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"bIl" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"bIm" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/apmaint) -"bIn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/apmaint) -"bIo" = (/turf/simulated/wall,/area/assembly/chargebay) -"bIp" = (/obj/machinery/recharge_station,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay) -"bIq" = (/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay) -"bIr" = (/obj/machinery/door/airlock/maintenance{name = "Assembly Line Maintenance"; req_access_txt = "12;29"},/turf/simulated/floor/plating,/area/maintenance/apmaint) -"bIs" = (/obj/effect/showcase{icon_state = "showcase_3"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/assembly/chargebay) -"bIt" = (/obj/machinery/light,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/assembly/chargebay) -"bIu" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "arrival"; dir = 8},/area/hallway/primary/aft) -"bIv" = (/obj/machinery/atmospherics/pipe/simple{color = "cyan"; dir = 10; icon_state = "intact-c"; initialize_directions = 10; level = 2},/turf/simulated/wall,/area/maintenance/asmaint) -"bIw" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{icon_state = "bot"},/area/atmos) -"bIx" = (/obj/machinery/light/small,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "bot"},/area/atmos) -"bIy" = (/obj/machinery/dispenser{pltanks = 0},/turf/simulated/floor,/area/atmos) -"bIz" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/atmos) -"bIA" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor{icon_state = "warning"},/area/atmos) -"bIB" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "warning"},/area/atmos) -"bIC" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/atmos) -"bID" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor,/area/atmos) -"bIE" = (/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/turf/simulated/floor,/area/atmos) -"bIF" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Access"; req_access_txt = "24"},/turf/simulated/floor,/area/atmos) -"bIG" = (/obj/machinery/atmospherics/pipe/manifold{color = "yellow"; dir = 8; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos) -"bIH" = (/obj/machinery/atmospherics/pipe/manifold{color = "yellow"; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos) -"bII" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos) -"bIJ" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "red"; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/atmos) -"bIK" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos) -"bIL" = (/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; icon_state = "intact_on"; name = "Mix to Tank/Distro"; on = 1},/turf/simulated/floor,/area/atmos) -"bIM" = (/obj/machinery/atmospherics/valve/digital{color = "yellow"; dir = 4; name = "Gas Mix Outlet Valve"},/turf/simulated/floor{icon_state = "green"; dir = 6},/area/atmos) -"bIN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; initialize_directions = 12; level = 1},/obj/machinery/atmospherics/pipe/simple{color = "cyan"; icon_state = "intact-c"},/turf/simulated/floor/plating,/area/atmos) -"bIO" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; initialize_directions = 12; level = 1},/turf/space,/area) -"bIP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) -"bIQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bIR" = (/obj/structure/stool/chair{dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) -"bIS" = (/obj/structure/stool/chair{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) -"bIT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/cmo) -"bIU" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Surgery Observation"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) -"bIV" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) -"bIW" = (/obj/structure/stool/chair{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) -"bIX" = (/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Obshutter"; name = "Observation Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/surgery) -"bIY" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"bIZ" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"bHY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"bHZ" = (/obj/structure/table,/obj/item/weapon/circular_saw,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"bIa" = (/obj/machinery/r_n_d/server{id_with_download_string = "1"; id_with_upload_string = "1"; name = "Core R&D Server"; server_id = 1},/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server) +"bIb" = (/obj/machinery/camera{c_tag = "Server Room"; dir = 2; network = "SS13"; pixel_x = 22},/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server) +"bIc" = (/obj/machinery/camera{c_tag = "Server Room"; dir = 2; network = "RD"},/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server) +"bId" = (/obj/machinery/blackbox_recorder,/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server) +"bIe" = (/obj/structure/disposalpipe/segment{dir = 1},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"bIf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/sign/biohazard{pixel_x = 28},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"bIg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/requests_console{department = "Xenobiology"; departmentType = 0; pixel_x = -30; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"bIh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"bIi" = (/obj/structure/stool/chair,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"bIj" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"bIk" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"bIl" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/apmaint) +"bIm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/apmaint) +"bIn" = (/turf/simulated/wall,/area/assembly/chargebay) +"bIo" = (/obj/machinery/recharge_station,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay) +"bIp" = (/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay) +"bIq" = (/obj/machinery/door/airlock/maintenance{name = "Assembly Line Maintenance"; req_access_txt = "12;29"},/turf/simulated/floor/plating,/area/maintenance/apmaint) +"bIr" = (/obj/effect/showcase{icon_state = "showcase_3"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/assembly/chargebay) +"bIs" = (/obj/machinery/light,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/assembly/chargebay) +"bIt" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "arrival"; dir = 8},/area/hallway/primary/aft) +"bIu" = (/obj/machinery/atmospherics/pipe/simple{color = "cyan"; dir = 10; icon_state = "intact-c"; initialize_directions = 10; level = 2},/turf/simulated/wall,/area/maintenance/asmaint) +"bIv" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{icon_state = "bot"},/area/atmos) +"bIw" = (/obj/machinery/light/small,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "bot"},/area/atmos) +"bIx" = (/obj/machinery/dispenser{pltanks = 0},/turf/simulated/floor,/area/atmos) +"bIy" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/atmos) +"bIz" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor{icon_state = "warning"},/area/atmos) +"bIA" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "warning"},/area/atmos) +"bIB" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/atmos) +"bIC" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor,/area/atmos) +"bID" = (/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/turf/simulated/floor,/area/atmos) +"bIE" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Access"; req_access_txt = "24"},/turf/simulated/floor,/area/atmos) +"bIF" = (/obj/machinery/atmospherics/pipe/manifold{color = "yellow"; dir = 8; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos) +"bIG" = (/obj/machinery/atmospherics/pipe/manifold{color = "yellow"; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos) +"bIH" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos) +"bII" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "red"; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/atmos) +"bIJ" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos) +"bIK" = (/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; icon_state = "intact_on"; name = "Mix to Tank/Distro"; on = 1},/turf/simulated/floor,/area/atmos) +"bIL" = (/obj/machinery/atmospherics/valve/digital{color = "yellow"; dir = 4; name = "Gas Mix Outlet Valve"},/turf/simulated/floor{icon_state = "green"; dir = 6},/area/atmos) +"bIM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; initialize_directions = 12; level = 1},/obj/machinery/atmospherics/pipe/simple{color = "cyan"; icon_state = "intact-c"},/turf/simulated/floor/plating,/area/atmos) +"bIN" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; initialize_directions = 12; level = 1},/turf/space,/area) +"bIO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) +"bIP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bIQ" = (/obj/structure/stool/chair{dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) +"bIR" = (/obj/structure/stool/chair{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) +"bIS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/cmo) +"bIT" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Surgery Observation"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) +"bIU" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) +"bIV" = (/obj/structure/stool/chair{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) +"bIW" = (/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Obshutter"; name = "Observation Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/surgery) +"bIX" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"bIY" = (/obj/machinery/optable{id = "medbay"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"bIZ" = (/obj/structure/table,/obj/item/weapon/surgical_tool/bonegel,/obj/item/weapon/surgical_tool/bonecracker,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "bJa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server) "bJb" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server) "bJc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; icon_state = "in"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server) @@ -4645,7 +4645,7 @@ "bLq" = (/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Obshutter"; name = "Observation Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/surgery) "bLr" = (/obj/structure/table,/obj/item/weapon/cautery{pixel_x = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "bLs" = (/obj/structure/table,/obj/machinery/light,/obj/item/device/radio/intercom{pixel_y = -25},/obj/item/weapon/cleaner,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"bLt" = (/obj/machinery/vending/wallmed2{pixel_y = -28},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"bLt" = (/obj/machinery/vending/wallmed2{pixel_y = -28},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "bLu" = (/obj/structure/closet/crate/freezer,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "bLv" = (/turf/simulated/wall/r_wall,/area/medical/virology) "bLw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/window/reinforced,/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/medical/research{name = "Research Division"}) @@ -7954,16 +7954,16 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDPbwhbDQbwhbDRaaaaaeaaaaaebsnbsnbAebDSbDSbDSbDSbAfbDTaaaaaaaaaboMbDUbDVbDWbDXbDYbDZbEabEbbEbbEcbEdbEebEfbEbbEgbEgbEhbEibEjbEkbALbElbCVbEmbCWbEnbEobCVbCVbEobCVbDdbDebEpbEqbErbEsbEtbEubEvbEwbCVbExaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaabsAbEybEzbEAbEBbEBbEBbEBbEBbECbkXbEDbEEbEFbEGbEHbEIbEJbzBbEKbEKbELbEMbENbEObEPbEQbERbESbETbEUbEVbEWbEXbEYbETbEZbFabFbbFabCqbhebllaYdaYdbtlbtlbtlbtlbtlaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabtqbFcbyHbyHbyHbyHbyHbFdbuLbyGbyHbFebuLbuLbuLbuLbtqaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaaaaeaaeaaaaaeaaaaaaaaaboMboMbDVbFfbFgbCNboMboMboMboMbFhbFibCPbFibFjbFkbFlbFmbFnbplbFobsAbFpbCVbCVbFqbCVbCVbCVbCVbFrbFsbFtbFubCVbEqbFvbFwbFxbCVbFybFzbFAbExaaebFBbFBbFBbFBbFBaaeaaeaaeaaeaaebsAbsAbFCbFDbEBbFEbFFbFGbFHbFIbFJbxdbxdbxdbFKbFLbFMbxdbxdbxdbzBbFNbFObFPbFQbFRbEQboCbFSbCqbFTbFbbFUbFbbFVbCqbFWbFXbFYbFZbCqbGabllbGbaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebtqbuLbuLbuLbuLbuLbuLbBsbuLbFebuLbuLbuLbuLbuLbtqbtqaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaeboMbDVbGcbGdbGebGdbGdbGfboMbGgbGhbGibGhbGjbFkbGkbGlbswbGmbGnbsAbGobCVbGpbCWbGqbCVbCVbCVbDebGrbGsbGtbFAbEqbGubGvbGwbGxbGybGzbGAbGBbGCbGDbGEbGFbGGbFBaaeaaaaaaaaaaaaaaebGHbFCbFDbEBbGIbGJbGKbGLbGMbGNbxdbGObGPbGQbGRbAUbGSbGTbGUbzBbGVbEQbGWbEQbGVbEQboCbGXbGYbGZbHabHbbHbbHbbHcbHbbDEbHdbHebCqbCqbllbHfaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabtqbtqbzZbuLbuLbuLbuLbHgbuLbuLbuLbuLbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeboMbHhbHiboMbCNboMboMbHjbHkbGdbGdbHlbqfbqfbFkbHmbGlbpcbplbpcbHnbCVbCVbCVbHobHpbHqbHrbHsbHtbGrbHubHvbHwbHxbHybHzbHAbHBbHCbHDbHEbExaaebHFbHGbGGbHHbFBaaeaaaaaaaaaaaaaaebHIbHJbHKbHLbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbHXbHYbHZbIabzBbIbbIcbFPbIdbIebEQbIfbIgbETbIhbIibFbbIjbFbbIibFbbFbbIkbIkbIlbCqbllaYdaYdaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebtqbtqbCxbCvbCvbuLbuLbuLbuLbuLbuLbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaabImbDVbInbIobIpbIqboMboMboMboMboMboMbIrboMbFkbIsbItbpcbplbIubIvbIwbIxbIybHobIzbIAbIBbICbHtbBLbIDbIEbCVbIFbIGbIHbIIbIJbIKbILbIMbINbIObGDbIPbGGbGGbFBaaeaaeaaeaaeaaeaaebHIbFCbIQbEBbIRbISbGKbITbsVaZtbIUbIVbIWbIXbIYbAUbAUbAUbIZbzBbJabFPbJbbFPbJcbEQbJdbJebCqbJfbJgbJhbJibJjbJkbJlbJmbJnbJobJpbJqbJrbJsbJtaYdaYdaaaaaaaaeaaaaaaaaebJubJubJuaaaaaaaaeaaaaaaaaeaaaaaaaaeaaaaaabtqbtqbwcbtqbtqbuLbuLbuLbuLbuLbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaeaaaaaaaaabJvbDVbFfbIobJwbJxbJybJxbJzbJxbJybJxbJAbIobFkbFkbJBbJCbJDbJEbJFbsAbJGbJGbCWbJGbJGbJGbJGbJHbJIbDkbDkbDkbJJbJKbJLbJKbJMbJNbJObJLbJPaaebFBbFBbFBbFBbFBaaeaaaaaaaaaaaaaaebHIbFCbJQbJRbJSbJTbJUbJVbJWbqDbJXbJYbJZbKabKbbKcbKcbKdbKebzBbKfbKgbKhbKgbKibEQbKjbKkbCqbKlbKmbKnbKobKpbKqbKrbKobKsbKpbKlbCqbKtbKubKvbKubKvbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKxbKybKzbKAbtqbtqbuLbuLbKBbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeboMbHhbHiboMbCNboMboMbHjbHkbGdbGdbHlbqfbqfbFkbHmbGlbpcbplbpcbHnbCVbCVbCVbHobHpbHqbHrbHsbHtbGrbHubHvbHwbHxbHybHzbHAbHBbHCbHDbHEbExaaebHFbHGbGGbHHbFBaaeaaaaaaaaaaaaaaebHIbHJbHKbHLbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbHXbHXbHYbHZbzBbIabIbbFPbIcbIdbEQbIebIfbETbIgbIhbFbbIibFbbIhbFbbFbbIjbIjbIkbCqbllaYdaYdaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebtqbtqbCxbCvbCvbuLbuLbuLbuLbuLbuLbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaabIlbDVbImbInbIobIpboMboMboMboMboMboMbIqboMbFkbIrbIsbpcbplbItbIubIvbIwbIxbHobIybIzbIAbIBbHtbBLbICbIDbCVbIEbIFbIGbIHbIIbIJbIKbILbIMbINbGDbIObGGbGGbFBaaeaaeaaeaaeaaeaaebHIbFCbIPbEBbIQbIRbGKbISbsVaZtbITbIUbIVbIWbIXbAUbIYbAUbIZbzBbJabFPbJbbFPbJcbEQbJdbJebCqbJfbJgbJhbJibJjbJkbJlbJmbJnbJobJpbJqbJrbJsbJtaYdaYdaaaaaaaaeaaaaaaaaebJubJubJuaaaaaaaaeaaaaaaaaeaaaaaaaaeaaaaaabtqbtqbwcbtqbtqbuLbuLbuLbuLbuLbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaeaaaaaaaaabJvbDVbFfbInbJwbJxbJybJxbJzbJxbJybJxbJAbInbFkbFkbJBbJCbJDbJEbJFbsAbJGbJGbCWbJGbJGbJGbJGbJHbJIbDkbDkbDkbJJbJKbJLbJKbJMbJNbJObJLbJPaaebFBbFBbFBbFBbFBaaeaaaaaaaaaaaaaaebHIbFCbJQbJRbJSbJTbJUbJVbJWbqDbJXbJYbJZbKabKbbKcbKcbKdbKebzBbKfbKgbKhbKgbKibEQbKjbKkbCqbKlbKmbKnbKobKpbKqbKrbKobKsbKpbKlbCqbKtbKubKvbKubKvbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKxbKybKzbKAbtqbtqbuLbuLbKBbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaboMboMboMboMboMbKCbKDbKEbKFbKGbKHbKIbJAbKGbKHbKIbJAbKJbKKbKLbKMbpcbplbKNbKObKPbKQbKRbKSbKTbKUbKVbKWbKXbCVbCVbKYbCVbKZbLabLbbLcbLdbHybLebLfbLgbGCbGDbLhbLibLibFBaaeaaaaaaaaaaaaaaebHIbFCbFDbEBbLjbLkbLlbLmbsVbLnbxdbLobLpbLqbLrbAUbLsbLtbLubzBbLvbLvbLvbLvbEQbEQbKjbLwbCqbCqbCqbLxbLybLybLybLzbLybLybCqbCqbCqbLAaZMaYdaYdaYdaaaaaaabVaaaaaaaaebJubJubJuaaaaaaaaeaaaaaaaaeaaaaaaaaeaaeaaebLBbLCbLDbLEbtqbtqbtqbuLbuMbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaabImbLFbqfbLGbLHbLIbLJbLKbLLbJAbJAbJAbJAbJAbJAbJAbJAbKJbKKbpcbKMbpcbplbLMbLNbLObLPbLQbLRbLSbFrbLTbLUbLVbCVbLWbLXbCVbLYbLZbMabCVbMbbLabMcbMdbExaaebHFbMebMfbMgbFBaaeaaeaaeaaeaaeaaebMhbFCbFDbEBbEBbEBbEBbEBbsVaZtbxdbxdbxdbxdbxdbFMbLvbLvbLvbLvbMibMjbMkbLvbMlbMmbMnbMobMpbMqbCqbLybLybLybLybMrbLybLybCqbMsbMtbMubMvaYdaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebMwbtobtobtpbtqbtqbtqbtqbtqbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaeaaabJvbqebqfbMxbqfbDVboMbIobMybJxbJxbJxbJAbJxbJxbJxbMzbIobIobIobMAbMBbplbMCbMDbMEbMFbMGbMHbMIbMJbMKbMFbMLbMMbLPbLPbLPbMNbMObMObMPbMbbIGbMQbMRbMSbMTbGDbMUbLibLibFBaaeaaaaaaaaaaaaaaebsAbFCbFDbMVbMWaZtbMXaZtbsVaZtbMYbMZbNabNbbNcbAUbNdbNebNfbNgbNhbNibNjbNkbNlbNmbNnbNobNpbNqbCqbNrbNsbLybLybLybNsbNtbCqbLAbNubNvbNwbJuaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaisaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaabNxbNxbNxboMbqfbNyboMbHhboMbIqbJAbKGbKHbNzbJAbKGbKHbKIbJAbJAbNAbJAbNBbpcbplbNCbsxbNDbLPbNEbNFbNGbNHbNIbJGbNJbMbbNKbLPbNLbNMbMPbNMbNNbMbbHybMcbNObExaaebFBbFBbFBbFBbFBaaeaaaaaaaaaaaaaaebsAbFCbFDbsAaZrbNPbNQbNRbNSaZtbNTbAUbAUbCebAUbAUbNUbNVbNWbNXbNYbNVbNZbLvbOabOabObbOcbOabOabCqbLybLybLybOdbLybLybLybCqbLAbOeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaabNxbOfbOgboMbqfbMxboMbOhbOibIqbJAbJAbOjbJAbOkbJAbOlbJAbJAbJAbOlbJAbNBbpcbplbpcbOmbOnbOobOpbJGbGqbLRbOqbJGbHtbMbbNKbLPbNLbNMbNNbNMbNNbOrbHybOsbOtbLgbGCbGDbOubOvbOwbFBaaeaaeaaeaaeaaeaaebsAbOxbOybOzbfvbfvbfvbOAbsVbOBbMYbOCbODbOEbOFbODbNdbOGbOHbLvbOIbNVbOJbLvbLvbLvbLvbLvbLvbLvbLvbCqbCqbCqbCqbCqbCqbCqbCqbOKaYdaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaisaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaabIlbLFbqfbLGbLHbLIbLJbLKbLLbJAbJAbJAbJAbJAbJAbJAbJAbKJbKKbpcbKMbpcbplbLMbLNbLObLPbLQbLRbLSbFrbLTbLUbLVbCVbLWbLXbCVbLYbLZbMabCVbMbbLabMcbMdbExaaebHFbMebMfbMgbFBaaeaaeaaeaaeaaeaaebMhbFCbFDbEBbEBbEBbEBbEBbsVaZtbxdbxdbxdbxdbxdbFMbLvbLvbLvbLvbMibMjbMkbLvbMlbMmbMnbMobMpbMqbCqbLybLybLybLybMrbLybLybCqbMsbMtbMubMvaYdaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebMwbtobtobtpbtqbtqbtqbtqbtqbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaeaaabJvbqebqfbMxbqfbDVboMbInbMybJxbJxbJxbJAbJxbJxbJxbMzbInbInbInbMAbMBbplbMCbMDbMEbMFbMGbMHbMIbMJbMKbMFbMLbMMbLPbLPbLPbMNbMObMObMPbMbbIFbMQbMRbMSbMTbGDbMUbLibLibFBaaeaaaaaaaaaaaaaaebsAbFCbFDbMVbMWaZtbMXaZtbsVaZtbMYbMZbNabNbbNcbAUbNdbNebNfbNgbNhbNibNjbNkbNlbNmbNnbNobNpbNqbCqbNrbNsbLybLybLybNsbNtbCqbLAbNubNvbNwbJuaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaisaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaabNxbNxbNxboMbqfbNyboMbHhboMbIpbJAbKGbKHbNzbJAbKGbKHbKIbJAbJAbNAbJAbNBbpcbplbNCbsxbNDbLPbNEbNFbNGbNHbNIbJGbNJbMbbNKbLPbNLbNMbMPbNMbNNbMbbHybMcbNObExaaebFBbFBbFBbFBbFBaaeaaaaaaaaaaaaaaebsAbFCbFDbsAaZrbNPbNQbNRbNSaZtbNTbAUbAUbCebAUbAUbNUbNVbNWbNXbNYbNVbNZbLvbOabOabObbOcbOabOabCqbLybLybLybOdbLybLybLybCqbLAbOeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaabNxbOfbOgboMbqfbMxboMbOhbOibIpbJAbJAbOjbJAbOkbJAbOlbJAbJAbJAbOlbJAbNBbpcbplbpcbOmbOnbOobOpbJGbGqbLRbOqbJGbHtbMbbNKbLPbNLbNMbNNbNMbNNbOrbHybOsbOtbLgbGCbGDbOubOvbOwbFBaaeaaeaaeaaeaaeaaebsAbOxbOybOzbfvbfvbfvbOAbsVbOBbMYbOCbODbOEbOFbODbNdbOGbOHbLvbOIbNVbOJbLvbLvbLvbLvbLvbLvbLvbLvbCqbCqbCqbCqbCqbCqbCqbCqbOKaYdaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaisaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaabNxbOfbOLbOMbGdbONboMbOObOObOPbOPbOPbOPbOPbOPbOPbOPbOQbOQbOPbOPbOPbORbOSbOTbpcbswbpcbpcbOUbOVbOWbOXbOYbOVbHtbOZbLPbLPbLPbPabNNbNMbNNbMbbHybMcbPbbExaaebHFbPcbPdbPebFBaaeaaaaaaaaaaaaaaebsAbPfbAJbPgbPhbPibcEbcEbPjbPkbxdbxdbxdbxdbxdbxdbLvbLvbPlbPmbPnbPobPpbPqbPrbPsbPtbPubPtbPvbPwbPxbPybPzbMtbMtbMtbMtbMtbMuaYdaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaadaadaagaadaadaadahOaadaadaadaagaagaaaaaaaaeaaeaaaaaaaaaaaaaaaaaabNxbOfbPAbOPbOPbPBbOPbPCbPDbOPbPEbPFbPGbOPbPHbPIbPJbPKbPKbPLbPMbEkbPNbpcbplbPObsxbPPbPQbPRbPSbJGbNFbBRbJGbNJbMbbLWbPTbPUbPVbMObPWbPXbMbbIGbPYbPZbMSbMTbGDbQabOvbOvbFBaaeaaaaaaaaaaaaaaeaaebsAbsAbsAbsAbxWbxXbxXbQbbvwbvwbvwbvwbvwbQcbvwbvwbvwbQdbQebQfbNVbQgbQhbQibNVbQjbQibQkbQlbQmbllbQnbNubQoaYdaYdaYdaYdaYdaYdaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaadaadaagaadaadaadahOaadaadaadaagaagaaaaaaaaeaaeaaaaaaaaaaaaaaaaaabNxbOfbPAbOPbOPbPBbOPbPCbPDbOPbPEbPFbPGbOPbPHbPIbPJbPKbPKbPLbPMbEkbPNbpcbplbPObsxbPPbPQbPRbPSbJGbNFbBRbJGbNJbMbbLWbPTbPUbPVbMObPWbPXbMbbIFbPYbPZbMSbMTbGDbQabOvbOvbFBaaeaaaaaaaaaaaaaaeaaebsAbsAbsAbsAbxWbxXbxXbQbbvwbvwbvwbvwbvwbQcbvwbvwbvwbQdbQebQfbNVbQgbQhbQibNVbQjbQibQkbQlbQmbllbQnbNubQoaYdaYdaYdaYdaYdaYdaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaeaaeaaaaaeaaeaaaaaaaaeaaeaaeaaaaagaaaaaeaaeaaaaaaaaaaaaaaaaaaaaabNxbOfbPAbQpbQqbPKbQrbQsbPKbQtbQubQvbPKbQwbPKbQvbPKbPKbPKbQxbQybpcbQzbQAbplbQBbQCbnXbnXbnXbnXbQDbQEbQFbJGbQGbQHbCVbHwbQIbCVbHAbQJbQKbQLbHCbMcbCVbExaaebFBbFBbFBbFBbFBaaeaaaaaaaaaaaaaaaaaeaaeaaaaaebJubsAbsAbsJbsJbsJbQMbQNbQNbQNbQObQNbQNbQNbllbQebQPbNVbQQbQRbQibQSbQTbQUbQVbQWbQmbllbQnbnFaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaabQXbQYbQZaaabQXbQYbQZaaabQXbQYbQZaaebRaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaabNxbOfbPAbRbbRcbPKbQubQsbPKbRdbRebRebRebRebRebRebRfbRebRgbQxbRhbpcbKMbpcbplbRibnYbRjbRkbRlbRmbRnbRobRpbBObRqbGvbPVbPVbPXbRrbRsbRtbGwbRubHybRvbRwbLgbGCbGDbRxbRybRybFBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebsAbRzbRAbABbAAbQNbRBbRCbRDbREbRFbQNbllbQebRGbRHbRIbRJbRKbRLbRMbRNbRObRPbQmbllbRQbnFaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaabQXbRRbQZaaabQXbRRbQZaaabQXbRRbQZaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaabNxbOfbPAbOPbOPbRSbPKbQsbRTbRUbRUbRVbRWbPKbPKbRXbPKbPKbRYbRZbSabpcbSbbpcbplbScbnYbSdbRnbSebSfbSgbShbSibJGbCVbMbbDjbDmbDkbSjbSkbEubSlbSmbHybMcbSnbExaaebHFbSobSpbSqbFBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaebQNbQNbQNbQNbQNbQNbSrbSrbRDbSrbSsbQNbllbStbSubNVbRIbNVbSvbNVbNVbNVbNVbSwbQmbllbQnbnFaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 58c3d6ebe38bde90758d4b78d8f4c4ef1c866922 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Mon, 9 Jan 2012 01:24:42 -0500 Subject: [PATCH 07/16] cleaned up brain transfer --- code/game/objects/items/weapons/surgery_tools.dm | 6 ++++++ code/modules/mob/organ/organ_external.dm | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 2a2c0fc618a..4fa9c44cdf8 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -517,6 +517,12 @@ CIRCULAR SAW if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid)) var/mob/living/carbon/human/H = M + + if(istype(H) && H.organs["head"]) + var/datum/organ/external/affecting = H.organs["head"] + if(affecting.destroyed) + return ..() + if(istype(H) && ( \ (H.head && H.head.flags & HEADCOVERSEYES) || \ (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ diff --git a/code/modules/mob/organ/organ_external.dm b/code/modules/mob/organ/organ_external.dm index e70528e08f8..974ed3b3955 100644 --- a/code/modules/mob/organ/organ_external.dm +++ b/code/modules/mob/organ/organ_external.dm @@ -114,7 +114,8 @@ obj/item/weapon/organ/head/proc/transfer_identity(var/mob/living/carbon/human/H) brainmob.name = H.real_name brainmob.real_name = H.real_name brainmob.dna = H.dna - brainmob.container = src + if(H.mind) + H.mind.transfer_to(brainmob) obj/item/weapon/organ/head/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/scalpel)) From 249bbd32d9b5f6fb9732385243342bfd5cb08f9b Mon Sep 17 00:00:00 2001 From: cib Date: Mon, 9 Jan 2012 01:34:28 -0800 Subject: [PATCH 08/16] EXPERIMENTAL: Set the crit setting in the soft-configuration to -50, so people go into crit later. Hopefully it's not borked. --- config/game_options.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/game_options.txt b/config/game_options.txt index 6521afe1867..64b4abbc031 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -1,7 +1,7 @@ ### HEALTH ### ## level of health at which a mob becomes unconscious (crit) -HEALTH_THRESHOLD_CRIT 0 +HEALTH_THRESHOLD_CRIT -50 ## level of health at which a mob becomes dead HEALTH_THRESHOLD_DEAD -100 From f827d9f56e9075b0a4bee0b66e01f73c87fc907c Mon Sep 17 00:00:00 2001 From: cib Date: Mon, 9 Jan 2012 04:09:57 -0800 Subject: [PATCH 09/16] Small addition so that traumatic shock will increase when a limb is missing or broken. --- code/modules/mob/living/carbon/shock.dm | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index c3539233692..7f2c734fa06 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -7,9 +7,19 @@ if(reagents.has_reagent("alkysine")) src.traumatic_shock -= 10 if(reagents.has_reagent("inaprovaline")) - src.traumatic_shock -= 15 + src.traumatic_shock -= 25 if(reagents.has_reagent("synaptizine")) - src.traumatic_shock -= 50 + src.traumatic_shock -= 100 // make synaptizine function as good painkiller + + // broken or ripped off organs will add quite a bit of pain + if(istype(src,/mob/living/carbon/human)) + var/mob/living/carbon/human/M = src + for(var/name in M.organs) + var/datum/organ/external/organ = M.organs[name] + if(organ.destroyed) + src.traumatic_shock += 60 + else if(organ.broken) + src.traumatic_shock += 40 return src.traumatic_shock From 82033108bb74ddfe1cab948f33553324f5a287f0 Mon Sep 17 00:00:00 2001 From: cib Date: Mon, 9 Jan 2012 04:30:15 -0800 Subject: [PATCH 10/16] The config's HEALTH_TRESHOLD_CRIT option was being ignored in a few places, fixed this. --- code/modules/mob/living/carbon/human/life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1df70ac599f..a963d0c88a2 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -229,7 +229,7 @@ var/datum/gas_mixture/environment = loc.return_air() var/datum/air_group/breath // HACK NEED CHANGING LATER - if(health < 0) + if(health < config.health_threshold_dead) losebreath++ if(losebreath>0) //Suffocating so do not take a breath From a36aebb512cbf91fe8e30f6f26e3a9de0cab1a05 Mon Sep 17 00:00:00 2001 From: cib Date: Mon, 9 Jan 2012 06:00:33 -0800 Subject: [PATCH 11/16] A few medical-related fixes. - Fixed another problem related to the crit config - Recovering from shock won't take forever anymore - Reduced the max speed at which you suffocate, mainly to make crit slower. If this is found to affect normal suffocation too much, increase HUMAN_MAX_OXYLOSS again. - Open organs now add a lot of shock, as well. - Hitting 0 health or below will make you collapse immediately. --- code/WorkInProgress/virus2/base.dm | 6 ------ code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 7 ++++++- code/modules/mob/living/carbon/shock.dm | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/code/WorkInProgress/virus2/base.dm b/code/WorkInProgress/virus2/base.dm index 00897198d49..039aa7934a5 100644 --- a/code/WorkInProgress/virus2/base.dm +++ b/code/WorkInProgress/virus2/base.dm @@ -336,12 +336,6 @@ proc/airborne_can_reach(turf/source, turf/target) activate(var/mob/living/carbon/mob,var/multiplier) mob.toxloss += (2*multiplier) -/datum/disease2/effect/greater/scream - name = "Random screaming syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*scream") - /datum/disease2/effect/greater/drowsness name = "Automated sleeping syndrome" stage = 3 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0e629c7f274..30545cd6513 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -2045,7 +2045,7 @@ It can still be worn/put on as normal. //SN src = null del(src) return - if ((target.health >= -99.0 && target.health < 0)) + if ((target.health >= -99.0 && target.health < config.health_threshold_dead)) target.cpr_time = world.time var/suff = min(target.getOxyLoss(), 7) target.oxyloss -= suff diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a963d0c88a2..72f3f0ebec1 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1,4 +1,4 @@ -#define HUMAN_MAX_OXYLOSS 12 //Defines how much oxyloss humans can get per tick. No air applies this value. +#define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. No air applies this value. /mob/living/carbon/human var @@ -1106,9 +1106,14 @@ handle_shock() ..() + if(health < 0) + // health 0 makes you immediately collapse + shock_stage = max(shock_stage, 61) + if(traumatic_shock >= 80) shock_stage += 1 else + if(shock_stage > 100) shock_stage = 100 shock_stage-- shock_stage = max(shock_stage, 0) return diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index 7f2c734fa06..c3833700b9f 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -16,7 +16,7 @@ var/mob/living/carbon/human/M = src for(var/name in M.organs) var/datum/organ/external/organ = M.organs[name] - if(organ.destroyed) + if(organ.destroyed || organ.open) src.traumatic_shock += 60 else if(organ.broken) src.traumatic_shock += 40 From 80f8c70e09656eba0f6facecf48ec557d889b527 Mon Sep 17 00:00:00 2001 From: cib Date: Mon, 9 Jan 2012 07:45:00 -0800 Subject: [PATCH 12/16] Band-aids and ointment work until 0 health, rather than 50 now. --- code/game/objects/items/weapons/medical.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/medical.dm b/code/game/objects/items/weapons/medical.dm index 0fcd35411e3..6c114d72e32 100644 --- a/code/game/objects/items/weapons/medical.dm +++ b/code/game/objects/items/weapons/medical.dm @@ -15,7 +15,7 @@ MEDICAL t_him = "her" user << "\red \The [M] is dead, you cannot help [t_him]!" return - if (M.health < 50) + if (M.health < 0) var/t_him = "it" if (M.gender == MALE) t_him = "him" From 12675d12d28fa5aa57ff0b1cbd2dfec8ff0ce553 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Mon, 9 Jan 2012 06:54:19 -0500 Subject: [PATCH 13/16] fixed bad html on pain text --- code/modules/mob/organ/pain.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/organ/pain.dm b/code/modules/mob/organ/pain.dm index 0791211abc5..5fcefd73c67 100644 --- a/code/modules/mob/organ/pain.dm +++ b/code/modules/mob/organ/pain.dm @@ -19,13 +19,13 @@ mob/proc/pain(var/partname, var/amount, var/force) var/msg switch(amount) if(1 to 10) - msg = "Your [partname] hurts a bit." + msg = "Your [partname] hurts a bit." if(11 to 90) flash_weak_pain() - msg = "Ouch! Your [partname] hurts." + msg = "Ouch! Your [partname] hurts." if(91 to 10000) flash_pain() - msg = "OH GOD! Your [partname] is hurting terribly!" + msg = "OH GOD! Your [partname] is hurting terribly!" if(msg && (msg != last_pain_message || prob(10))) last_pain_message = msg src << msg From 5e5d72d36d64354b8c6a9550af709d70c528c6be Mon Sep 17 00:00:00 2001 From: Albert Iordache Date: Mon, 9 Jan 2012 21:59:25 +0200 Subject: [PATCH 14/16] Reverted changes that would stop the bible from healing occasionally, and from burning the hands of people picking it up, who aren't chaplains --- code/game/objects/storage/bible.dm | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/code/game/objects/storage/bible.dm b/code/game/objects/storage/bible.dm index b2900ac6847..71232179582 100644 --- a/code/game/objects/storage/bible.dm +++ b/code/game/objects/storage/bible.dm @@ -6,7 +6,7 @@ new /obj/item/weapon/spacecash(src) new /obj/item/weapon/spacecash(src) -/*/obj/item/weapon/storage/bible/proc/bless(mob/living/carbon/M as mob) +/obj/item/weapon/storage/bible/proc/bless(mob/living/carbon/M as mob) if(ishuman(M)) var/mob/living/carbon/human/H = M var/heal_amt = 10 @@ -14,13 +14,13 @@ var/datum/organ/external/affecting = H.organs[name] if(affecting.heal_damage(heal_amt, heal_amt)) H.UpdateDamageIcon() - return */ + return /obj/item/weapon/storage/bible/attack(mob/M as mob, mob/living/user as mob) -// var/chaplain = 0 -// if(user.mind && (user.mind.assigned_role == "Chaplain")) -// chaplain = 1 + var/chaplain = 0 + if(user.mind && (user.mind.assigned_role == "Chaplain")) + chaplain = 1 M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") @@ -29,10 +29,10 @@ if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") user << "\red You don't have the dexterity to do this!" return -// if(!chaplain) -// user << "\red The book sizzles in your hands." -// user.take_organ_damage(0,10) -// return + if(!chaplain) + user << "\red The book sizzles in your hands." + user.take_organ_damage(0,10) + return if ((user.mutations & CLUMSY) && prob(50)) user << "\red The [src] slips out of your hand and hits your head." @@ -48,7 +48,7 @@ M << "\red The power of [src.deity_name] clears your mind of heresy!" user << "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!" ticker.mode.remove_cultist(M.mind) -/* if ((istype(M, /mob/living/carbon/human) && prob(60))) + if ((istype(M, /mob/living/carbon/human) && prob(60))) bless(M) for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] heals [] with the power of [src.deity_name]!", user, M), 1) @@ -60,7 +60,7 @@ M << "\red You feel dumber." for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] beats [] over the head with []!", user, M, src), 1) - playsound(src.loc, "punch", 25, 1, -1) */ + playsound(src.loc, "punch", 25, 1, -1) else if(M.stat == 2) for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] smacks []'s lifeless corpse with [].", user, M, src), 1) From 225b2ad03e3ae8171d79be6ec4849e5583b9301e Mon Sep 17 00:00:00 2001 From: Miniature Date: Tue, 10 Jan 2012 10:56:58 +1030 Subject: [PATCH 15/16] fix runtimes in disposals pipes and seed making for a plant whoever coded those parts should be shot --- code/defines/obj/hydro.dm | 2 +- code/modules/recycling/disposal.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm index 9a85cb59cb9..dbb26d4de1f 100644 --- a/code/defines/obj/hydro.dm +++ b/code/defines/obj/hydro.dm @@ -1139,7 +1139,7 @@ bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris - seed = "/obj/item/seeds/ambrosiavulgaris" + seed = "/obj/item/seeds/ambrosiavulgarisseed" name = "Ambrosia Vulgaris" desc = "A plant containing various healing chemicals." icon_state = "ambrosiavulgaris" diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index d416122e9cf..0535a5f6aed 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -688,7 +688,7 @@ M.weakened += 4 M << "\red You're gonna remember that one in the morning!" M:UpdateDamageIcon() - M:UpdateDamage() + //M:UpdateDamage() //doesnt fucking exist if you arent a blob else M.bruteloss += 4 if(prob(2)) @@ -742,7 +742,7 @@ H.active = 0 H.loc = src return - if(T.intact && istype(T,/turf/simulated/floor)) //intact floor, pop the tile + if(istype(T,/turf/simulated/floor) && T.intact) //intact floor, pop the tile var/turf/simulated/floor/F = T //F.health = 100 F.burnt = 1 From 0340e5f58ef98981eb1c43edb5539faad05492b3 Mon Sep 17 00:00:00 2001 From: cib Date: Tue, 10 Jan 2012 09:16:11 -0800 Subject: [PATCH 16/16] More medical changes. - Added tramadol and oxycodone, both effective painkillers. - Shock now takes drunkness into account. - Added some firstaid stuff to the table in the medbay lobby, so people can do treatment when there's no doctors. --- code/game/objects/storage/firstaid.dm | 14 ++++++++++++++ code/modules/chemical/Chemistry-Reagents.dm | 13 +++++++++++++ code/modules/chemical/Chemistry-Recipes.dm | 7 +++++++ code/modules/chemical/Chemistry-Tools.dm | 8 ++++++++ code/modules/mob/living/carbon/shock.dm | 13 ++++++++++--- maps/tgstation.2.0.8.dmm | 4 ++-- 6 files changed, 54 insertions(+), 5 deletions(-) diff --git a/code/game/objects/storage/firstaid.dm b/code/game/objects/storage/firstaid.dm index f8b777bf3ff..4930f569d22 100644 --- a/code/game/objects/storage/firstaid.dm +++ b/code/game/objects/storage/firstaid.dm @@ -81,6 +81,20 @@ new /obj/item/weapon/reagent_containers/pill/kelotane( src ) new /obj/item/weapon/reagent_containers/pill/kelotane( src ) +/obj/item/weapon/storage/pill_bottle/tramadol + name = "Pill bottle (tramadol)" + desc = "Contains painkiller pills." + +/obj/item/weapon/storage/pill_bottle/kelotane/New() + ..() + new /obj/item/weapon/reagent_containers/pill/tramadol( src ) + new /obj/item/weapon/reagent_containers/pill/tramadol( src ) + new /obj/item/weapon/reagent_containers/pill/tramadol( src ) + new /obj/item/weapon/reagent_containers/pill/tramadol( src ) + new /obj/item/weapon/reagent_containers/pill/tramadol( src ) + new /obj/item/weapon/reagent_containers/pill/tramadol( src ) + new /obj/item/weapon/reagent_containers/pill/tramadol( src ) + /obj/item/weapon/storage/pill_bottle/antitox name = "Pill bottle (Anti-toxin)" desc = "Contains pills used to counter toxins." diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm index ec511e28f00..358423a88ce 100644 --- a/code/modules/chemical/Chemistry-Reagents.dm +++ b/code/modules/chemical/Chemistry-Reagents.dm @@ -1311,6 +1311,19 @@ datum ..() return + tramadol + name = "Tramadol" + id = "tramadol" + description = "A simple, yet effective painkiller." + reagent_state = LIQUID + color = "#C8A5DC" + + oxycodone + name = "Oxycodone" + id = "oxycodone" + description = "An effective and very addictive painkiller." + reagent_state = LIQUID + color = "#C805DC" impedrezene name = "Impedrezene" diff --git a/code/modules/chemical/Chemistry-Recipes.dm b/code/modules/chemical/Chemistry-Recipes.dm index cba158e9b0e..250c3222221 100644 --- a/code/modules/chemical/Chemistry-Recipes.dm +++ b/code/modules/chemical/Chemistry-Recipes.dm @@ -70,6 +70,13 @@ datum required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1) result_amount = 3 + tramadol + name = "Tramadol" + id = "tramadol" + result = "tramadol" + required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "oxygen" = 1) + result_amount = 3 + //cyanide // name = "Cyanide" // id = "cyanide" diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index 05ff3cba25f..e9d9fbc68ff 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -2711,6 +2711,14 @@ ..() reagents.add_reagent("kelotane", 30) +/obj/item/weapon/reagent_containers/pill/tramadol + name = "Tramadol pill" + desc = "A simple painkiller." + icon_state = "pill8" + New() + ..() + reagents.add_reagent("tramadol", 30) + /obj/item/weapon/reagent_containers/pill/inaprovaline name = "Inaprovaline pill" desc = "Used to stabilize patients." diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index c3833700b9f..07a49bb12be 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -8,8 +8,12 @@ src.traumatic_shock -= 10 if(reagents.has_reagent("inaprovaline")) src.traumatic_shock -= 25 - if(reagents.has_reagent("synaptizine")) - src.traumatic_shock -= 100 // make synaptizine function as good painkiller + if(reagents.has_reagent("tramadol")) + src.traumatic_shock -= 80 // make synaptizine function as good painkiller + if(reagents.has_reagent("oxycodone")) + src.traumatic_shock -= 200 // make synaptizine function as good painkiller + if(src.slurring) + src.traumatic_shock -= 20 // broken or ripped off organs will add quite a bit of pain if(istype(src,/mob/living/carbon/human)) @@ -19,7 +23,10 @@ if(organ.destroyed || organ.open) src.traumatic_shock += 60 else if(organ.broken) - src.traumatic_shock += 40 + src.traumatic_shock += 30 + + if(src.traumatic_shock < 0) + src.traumatic_shock = 0 return src.traumatic_shock diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm index a6f135b9e54..073d253ad79 100644 --- a/maps/tgstation.2.0.8.dmm +++ b/maps/tgstation.2.0.8.dmm @@ -2748,7 +2748,7 @@ "baR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/maintcentral) "baS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor/plating,/area/maintenance/maintcentral) "baT" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/extinguisher,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/maintcentral) -"baU" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"baU" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table,/obj/item/weapon/storage/pill_bottle/tramadol{pixel_x = 8},/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "baV" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "baW" = (/obj/structure/morgue,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) "baX" = (/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) @@ -3621,7 +3621,7 @@ "brG" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/crew_quarters/bar) "brH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/sortjunction{sortType = list("Bar")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor/plating,/area/maintenance/maintcentral) "brI" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/maintcentral) -"brJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table,/obj/item/weapon/storage/backpack/medic{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/backpack/medic{pixel_x = 3; pixel_y = 6},/obj/item/weapon/cleaner,/obj/machinery/light{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"brJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table,/obj/item/weapon/storage/backpack/medic{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/backpack/medic{pixel_x = 3; pixel_y = 6},/obj/item/weapon/cleaner,/obj/machinery/light{dir = 8},/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/tramadol,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "brK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "brL" = (/obj/structure/closet/secure_closet/medical1{pixel_x = 5},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/medical/medbay) "brM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)