From d03228bc6e67b79f4ffb657aab680fc8927b3f85 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Wed, 11 Apr 2012 15:42:54 -0700 Subject: [PATCH] Adds in limb replacement surgery, robolimbs, and all the crap for them. They can take more damage, require wires and welder to repair, but malfunction when they get more damaged, and explode when destroyed. --- baystation12.dme | 1 - .../Cael_Aislinn/Tajara/examine.dm | 75 +++++++++++++------ .../Cael_Aislinn/Tajara/tajaran.dm | 8 +- code/game/jobs/job/captian.dm | 2 +- code/game/jobs/job/security.dm | 8 +- code/game/machinery/cloning.dm | 2 +- code/game/magic/cultist/runes.dm | 1 + .../game/objects/items/weapons/hydroponics.dm | 8 +- code/game/objects/items/weapons/medical.dm | 7 ++ .../items/weapons/surgery_limbattachment.dm | 4 + .../objects/items/weapons/surgery_tools.dm | 27 +++++++ .../game/objects/items/weapons/tiles_wires.dm | 20 +++++ code/game/objects/items/weapons/tools.dm | 20 +++++ code/game/objects/stacks/glass.dm | 2 + code/game/objects/weapons.dm | 6 +- .../mob/living/carbon/human/examine.dm | 58 ++++++++++---- code/modules/mob/living/carbon/human/human.dm | 12 ++- .../mob/living/carbon/human/human_defense.dm | 4 + code/modules/mob/living/carbon/human/life.dm | 25 +++++++ .../mob/living/carbon/monkey/monkey.dm | 8 +- code/modules/mob/living/carbon/shock.dm | 4 +- code/modules/mob/organ/organ.dm | 52 ++++++++++--- html/create_object.html | 18 ++++- 23 files changed, 301 insertions(+), 71 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index 3edb656645d..5af30942210 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1089,7 +1089,6 @@ #include "code\WorkInProgress\AI_Visibility.dm" #include "code\WorkInProgress\buildmode.dm" #include "code\WorkInProgress\explosion_particles.dm" -#include "code\WorkInProgress\Cael_Aislinn\Tajara\examine.dm" #include "code\WorkInProgress\Cael_Aislinn\Tajara\say.dm" #include "code\WorkInProgress\Cael_Aislinn\Tajara\tajara_transformation.dm" #include "code\WorkInProgress\Cael_Aislinn\Tajara\tajaran.dm" diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm index eac51250c1c..9a023031fbb 100644 --- a/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm +++ b/code/WorkInProgress/Cael_Aislinn/Tajara/examine.dm @@ -243,7 +243,29 @@ if(temp.destroyed) wound_flavor_text["[temp.display_name]"] = "[t_He] is missing [t_his] [temp.display_name].\n" continue - if(temp.wounds) + if(temp.robot) + if(!(temp.brute_dam + temp.burn_dam)) + wound_flavor_text["[temp.display_name]"] = "[t_He] has a robot arm!\n" + else + wound_flavor_text["[temp.display_name]"] = "[t_He] has a robot arm, it has" + switch(temp.brute_dam) + if(0) + wound_flavor_text["[temp.display_name]"] += "" + else if(0 to 20) + wound_flavor_text["[temp.display_name]"] += " some dents" + else if(20 to INFINITY) + wound_flavor_text["[temp.display_name]"] += pick(" a lot of dents"," severe denting") + if(temp.brute_dam && temp.brute_dam) + wound_flavor_text["[temp.display_name]"] += " and" + switch(temp.burn_dam) + if(0) + wound_flavor_text["[temp.display_name]"] += "" + else if(0 to 20) + wound_flavor_text["[temp.display_name]"] += " some burns" + else if(20 to INFINITY) + wound_flavor_text["[temp.display_name]"] += pick(" a lot of burns"," severe melting") + wound_flavor_text["[temp.display_name]"] += "!\n" + else if(temp.wounds) var/list/wounds = list(list(),list(),list(),list(),list(),list()) for(var/datum/organ/wound/w in temp.wounds) switch(w.healing_state) @@ -429,50 +451,59 @@ flavor_text_string += flavor_text[text] flavor_text_string += " on [t_his] [named].
" wound_flavor_text["[named]"] = flavor_text_string - if(wound_flavor_text["head"] && !skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas))) + var/display_chest = 0 + var/display_shoes = 0 + var/display_gloves = 0 + if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas))))) msg += wound_flavor_text["head"] else if(is_bleeding["head"]) msg += "[src] has blood running down [t_his] face!\n" - if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) + if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you. msg += wound_flavor_text["chest"] else if(is_bleeding["chest"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" - if(wound_flavor_text["left arm"] && !w_uniform && !skipjumpsuit) + display_chest = 1 + if(wound_flavor_text["left arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["left arm"] else if(is_bleeding["left arm"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" - if(wound_flavor_text["left hand"] && !gloves && !skipgloves) + display_chest = 1 + if(wound_flavor_text["left hand"] && (is_destroyed["left hand"] || (!gloves && !skipgloves))) msg += wound_flavor_text["left hand"] else if(is_bleeding["left hand"]) - msg += "[src] has blood running from under [t_his] gloves!\n" - if(wound_flavor_text["right arm"] && !w_uniform && !skipjumpsuit) + display_gloves = 1 + if(wound_flavor_text["right arm"] && (is_destroyed["right arm"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["right arm"] else if(is_bleeding["right arm"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" - if(wound_flavor_text["right hand"] && !gloves && !skipgloves) + display_chest = 1 + if(wound_flavor_text["right hand"] && (is_destroyed["right hand"] || (!gloves && !skipgloves))) msg += wound_flavor_text["right hand"] else if(is_bleeding["right hand"]) - msg += "[src] has blood running from under [t_his] gloves!\n" - if(wound_flavor_text["groin"] && !w_uniform && !skipjumpsuit) + display_gloves = 1 + if(wound_flavor_text["groin"] && (is_destroyed["groin"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["groin"] else if(is_bleeding["groin"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" - if(wound_flavor_text["left leg"] && !w_uniform && !skipjumpsuit) + display_chest = 1 + if(wound_flavor_text["left leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["left leg"] else if(is_bleeding["left leg"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" - if(wound_flavor_text["left foot"]&& !shoes && !skipshoes) + display_chest = 1 + if(wound_flavor_text["left foot"]&& (is_destroyed["left foot"] || (!shoes && !skipshoes))) msg += wound_flavor_text["left foot"] else if(is_bleeding["left foot"]) - msg += "[src] has blood running from [t_his] shoes!\n" - if(wound_flavor_text["right leg"] && !w_uniform && !skipjumpsuit) + display_shoes = 1 + if(wound_flavor_text["right leg"] && (is_destroyed["right leg"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["right leg"] else if(is_bleeding["right leg"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" - if(wound_flavor_text["right foot"]&& !shoes && !skipshoes) + display_chest = 1 + if(wound_flavor_text["right foot"]&& (is_destroyed["right foot"] || (!shoes && !skipshoes))) msg += wound_flavor_text["right foot"] else if(is_bleeding["right foot"]) - msg += "[src] has blood running from [t_his] shoes!\n" + display_shoes = 1 + if(display_chest) + msg += "[src] has blood soaking through from under [t_his] clothing!\n" + if(display_shoes) + msg += "[src] has blood running from [t_his] shoes!\n" + if(display_gloves) + msg += "[src] has blood running from under [t_his] gloves!\n" // if(w.bleeding) diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm index 2f6f5696cf5..d84a34e89f0 100644 --- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm +++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm @@ -496,8 +496,12 @@ && !istype(part, /datum/organ/external/chest) \ && !istype(part, /datum/organ/external/head) \ && !part.destroyed) - stand_icon.Blend(new /icon('tajaran.dmi', "[part.icon_name]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('tajaran.dmi', "[part.icon_name]_l"), ICON_OVERLAY) + var/icon/temp = new /icon('tajaran.dmi', "[part.icon_name]_s") + if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + stand_icon.Blend(temp, ICON_OVERLAY) + temp = new /icon('tajaran.dmi', "[part.icon_name]_l") + if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + lying_icon.Blend(temp , ICON_OVERLAY) stand_icon.Blend(new /icon('tajaran.dmi', "groin_[g]_s"), ICON_OVERLAY) lying_icon.Blend(new /icon('tajaran.dmi', "groin_[g]_l"), ICON_OVERLAY) diff --git a/code/game/jobs/job/captian.dm b/code/game/jobs/job/captian.dm index 6e9bd017ab5..60e68e43d17 100644 --- a/code/game/jobs/job/captian.dm +++ b/code/game/jobs/job/captian.dm @@ -18,7 +18,7 @@ H.equip_if_possible(new /obj/item/clothing/head/caphat(H), H.slot_head) H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(H), H.slot_glasses) H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_in_backpack) - var/datum/organ/external/O = pick(H.organs) + var/datum/organ/external/O = H.organs[pick(H.organs)] var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) O.implant += L L.imp_in = H diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 57587b46372..769ee4ec8db 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -23,7 +23,7 @@ H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses/sechud(H), H.slot_glasses) H.equip_if_possible(new /obj/item/weapon/handcuffs(H), H.slot_in_backpack) H.equip_if_possible(new /obj/item/weapon/gun/energy/gun(H), H.slot_s_store) - var/datum/organ/external/O = pick(H.organs) + var/datum/organ/external/O = H.organs[pick(H.organs)] var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) O.implant += L L.imp_in = H @@ -55,7 +55,7 @@ H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses/sechud(H), H.slot_glasses) H.equip_if_possible(new /obj/item/weapon/handcuffs(H), H.slot_in_backpack) H.equip_if_possible(new /obj/item/device/flash(H), H.slot_l_store) - var/datum/organ/external/O = pick(H.organs) + var/datum/organ/external/O = H.organs[pick(H.organs)] var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) O.implant += L L.imp_in = H @@ -96,7 +96,7 @@ H.equip_if_possible(new /obj/item/weapon/zippo(H), H.slot_l_store) // H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/snacks/candy_corn(H), H.slot_h_store) // No... just no. --SkyMarshal - var/datum/organ/external/O = pick(H.organs) + var/datum/organ/external/O = H.organs[pick(H.organs)] var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) O.implant += L L.imp_in = H @@ -128,7 +128,7 @@ H.equip_if_possible(new /obj/item/clothing/gloves/red(H), H.slot_gloves) H.equip_if_possible(new /obj/item/weapon/handcuffs(H), H.slot_s_store) H.equip_if_possible(new /obj/item/device/flash(H), H.slot_l_store) - var/datum/organ/external/O = pick(H.organs) + var/datum/organ/external/O = H.organs[pick(H.organs)] var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) O.implant += L L.imp_in = H diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index a0460b9d67c..c5992128899 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -395,7 +395,7 @@ //Add an implant if needed var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) if (isnull(imp)) - var/datum/organ/external/O = pick(subject.organs) + var/datum/organ/external/O = subject.organs[pick(subject.organs)] imp = new /obj/item/weapon/implant/health(O) O.implant += imp imp.implanted = subject diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm index bb4a1bb858c..bdcc7480aba 100644 --- a/code/game/magic/cultist/runes.dm +++ b/code/game/magic/cultist/runes.dm @@ -283,6 +283,7 @@ var/list/sacrificed = list() del(ghost) for(var/name in corpse_to_raise.organs) var/datum/organ/external/affecting = corpse_to_raise.organs[name] + affecting.robot = 0 affecting.heal_damage(1000, 1000) corpse_to_raise.setToxLoss(0) corpse_to_raise.setOxyLoss(0) diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index 51235f58b54..045c7d43fbb 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -82,9 +82,9 @@ Deathnettle /obj/item/weapon/grown/nettle/pickup(mob/living/carbon/human/user as mob) if(!user.gloves) user << "\red The nettle burns your bare hand!" - if(istype(user, /mob/living/carbon/human)) + if(hasorgans(user)) var/organ = ((user.hand ? "l_":"r_") + "arm") - var/datum/organ/external/affecting = user.get_organ(organ) + var/datum/organ/external/affecting = user:get_organ(organ) affecting.take_damage(0,force) else user.take_organ_damage(0,force) @@ -101,9 +101,9 @@ Deathnettle /obj/item/weapon/grown/deathnettle/pickup(mob/living/carbon/human/user as mob) if(!user.gloves) - if(istype(user, /mob/living/carbon/human)) + if(hasorgans(user)) var/organ = ((user.hand ? "l_":"r_") + "arm") - var/datum/organ/external/affecting = user.get_organ(organ) + var/datum/organ/external/affecting = user:get_organ(organ) affecting.take_damage(0,force) else user.take_organ_damage(0,force) diff --git a/code/game/objects/items/weapons/medical.dm b/code/game/objects/items/weapons/medical.dm index 2d66e9bc242..8755deddf0f 100644 --- a/code/game/objects/items/weapons/medical.dm +++ b/code/game/objects/items/weapons/medical.dm @@ -43,6 +43,10 @@ MEDICAL use(1) return + if(affecting.robot) + user << "Medical equipment for a robot arm? Better get a welder..." + return + for(var/datum/organ/wound/W in affecting.wounds) if(W.bleeding || !W.is_healing) if(heal_brute && W.wound_type == 2) @@ -157,6 +161,9 @@ MEDICAL affecting.gauzed = 1 use(1) return + if(affecting.robot) + user << "Medical equipment for a robot arm? Better get a welder..." + return for(var/datum/organ/wound/W in affecting.wounds) if(W.bleeding || !W.healing_state) diff --git a/code/game/objects/items/weapons/surgery_limbattachment.dm b/code/game/objects/items/weapons/surgery_limbattachment.dm index 7e85d321553..b84ae2cf0b7 100644 --- a/code/game/objects/items/weapons/surgery_limbattachment.dm +++ b/code/game/objects/items/weapons/surgery_limbattachment.dm @@ -45,6 +45,7 @@ var/datum/organ/external/T = H.organs["l_hand"] T.attachable = 0 T.destroyed = 0 + T.broken = 0 T.robot = 1 user.drop_item() M.update_body() @@ -104,6 +105,7 @@ var/datum/organ/external/T = H.organs["r_hand"] T.attachable = 0 T.destroyed = 0 + T.broken = 0 T.robot = 1 user.drop_item() M.update_body() @@ -162,6 +164,7 @@ var/datum/organ/external/T = H.organs["l_foot"] T.attachable = 0 T.destroyed = 0 + T.broken = 0 T.robot = 1 user.drop_item() M.update_body() @@ -221,6 +224,7 @@ var/datum/organ/external/T = H.organs["r_foot"] T.attachable = 0 T.destroyed = 0 + T.broken = 0 T.robot = 1 user.drop_item() M.update_body() diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 352edbf8820..becabfb18d9 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -246,6 +246,10 @@ CIRCULAR SAW if(S.destroyed) return ..() + if(S.robot) + user << "Medical equipment for a robot arm? How would that do any good..." + return + if(!S.open) user << "\red There is skin in the way!" return 0 @@ -556,6 +560,10 @@ CIRCULAR SAW if(S.destroyed) return ..() + if(S.robot) + user << "Medical equipment for a robot arm? How would that do any good..." + return + if(!S.open) user << "\red There is skin in the way!" return 0 @@ -764,6 +772,9 @@ CIRCULAR SAW if(!S.open) usr << "You have to cut the limb open first!" return + if(S.robot) + user << "Medical equipment for a robot arm? How would that do any good..." + return for(var/mob/O in viewers(M)) O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.display_name] with \the [src.name]", 1) @@ -977,6 +988,10 @@ CIRCULAR SAW if(S.destroyed) user << "What [S.display_name]?" + + if(S.robot) + user << "Medical equipment for a robot arm? How would that do any good..." + return if(!S.open) user << "\red There is no wound to close up!" return 0 @@ -1366,6 +1381,10 @@ CIRCULAR SAW if(S.destroyed) return ..() + if(S.robot) + user << "Medical equipment for a robot arm? How would that do any good..." + return + if(S.open) user << "\red The wound is already open!" return 0 @@ -1559,6 +1578,14 @@ CIRCULAR SAW var/datum/organ/external/S = H:organs[user.zone_sel.selecting] if(S.destroyed) return + + if(S.robot) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, M) + spark_system.attach(M) + spark_system.start() + spawn(10) + del(spark_system) for(var/mob/O in viewers(H, null)) O.show_message(text("\red [H] gets \his [S.display_name] sawed at with [src] by [user]... It looks like [user] is trying to cut it off!"), 1) if(!do_after(user, rand(20,80))) diff --git a/code/game/objects/items/weapons/tiles_wires.dm b/code/game/objects/items/weapons/tiles_wires.dm index 59e96b89ef2..3395f37d0c4 100644 --- a/code/game/objects/items/weapons/tiles_wires.dm +++ b/code/game/objects/items/weapons/tiles_wires.dm @@ -25,4 +25,24 @@ TILES user << "\blue You are not using this to lay wire..." return +/obj/item/weapon/wire/attack(mob/M as mob, mob/user as mob) + if(hasorgans(M)) + var/datum/organ/external/S = M:organs[user.zone_sel.selecting] + if(!S.robot || user.a_intent != "help") + return ..() + if(S.brute_dam) + S.heal_damage(0,15,0,1) + if(user != M) + user.visible_message("\red You repair some burn damage on \the [M]'s [S.display_name]",\ + "\red \The [user] repairs some burn damage on \the [M]'s [S.display_name] with \the [src]",\ + "You wires being cut.") + else + user.visible_message("\red You repair some burn damage on your [S.display_name]",\ + "\red \The [user] repairs some burn damage on their [S.display_name] with \the [src]",\ + "You wires being cut.") + else + user << "Nothing to fix!" + else + return ..() + diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 6bfb785c571..d1e095b8f06 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -260,6 +260,26 @@ WELDINGTOOOL user.disabilities &= ~1 return + attack(mob/M as mob, mob/user as mob) + if(hasorgans(M)) + var/datum/organ/external/S = M:organs[user.zone_sel.selecting] + if(!S.robot || user.a_intent != "help") + return ..() + if(S.brute_dam) + S.heal_damage(15,0,0,1) + if(user != M) + user.visible_message("\red You patch some dents on \the [M]'s [S.display_name]",\ + "\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src]",\ + "You hear a welder.") + else + user.visible_message("\red You patch some dents on your [S.display_name]",\ + "\red \The [user] patches some dents on their [S.display_name] with \the [src]",\ + "You hear a welder.") + else + user << "Nothing to fix!" + else + return ..() + /obj/item/weapon/weldingtool/largetank name = "Industrial Welding Tool" diff --git a/code/game/objects/stacks/glass.dm b/code/game/objects/stacks/glass.dm index 39881da11e2..90733aec8aa 100644 --- a/code/game/objects/stacks/glass.dm +++ b/code/game/objects/stacks/glass.dm @@ -214,6 +214,8 @@ SHARDS var/mob/living/carbon/human/H = M if(!((H.shoes) || (H.wear_suit && H.wear_suit.body_parts_covered & FEET))) var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot")) + if(affecting.robot) + return H.Weaken(3) affecting.take_damage(5, 0) H.UpdateDamageIcon() diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm index a118b09f2e3..c84aa9aa2fb 100644 --- a/code/game/objects/weapons.dm +++ b/code/game/objects/weapons.dm @@ -132,12 +132,12 @@ if("feet") if(!H.shoes) affecting = H.get_organ(pick("l_leg", "r_leg")) - H.Weaken(3) + if(!affecting.robot) H.Weaken(3) if("l_hand", "r_hand") if(!H.gloves) affecting = H.get_organ(type) - H.Stun(3) - if(affecting) + if(!affecting.robot) H.Stun(3) + if(affecting && !affecting.robot) affecting.take_damage(1, 0) H.UpdateDamageIcon() H.updatehealth() diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index ea7b4b09b8c..b108669b3b9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -245,7 +245,26 @@ is_destroyed["[temp.display_name]"] = 1 wound_flavor_text["[temp.display_name]"] = "[t_He] is missing [t_his] [temp.display_name].\n" continue - if(temp.wounds) + if(temp.robot) + if(!(temp.brute_dam + temp.burn_dam)) + wound_flavor_text["[temp.display_name]"] = "[t_He] has a robot [temp.display_name]!\n" + continue + else + wound_flavor_text["[temp.display_name]"] = "[t_He] has a robot [temp.display_name], it has" + if(temp.brute_dam) switch(temp.brute_dam) + if(0 to 20) + wound_flavor_text["[temp.display_name]"] += " some dents" + if(21 to INFINITY) + wound_flavor_text["[temp.display_name]"] += pick(" a lot of dents"," severe denting") + if(temp.brute_dam && temp.burn_dam) + wound_flavor_text["[temp.display_name]"] += " and" + if(temp.burn_dam) switch(temp.burn_dam) + if(0 to 20) + wound_flavor_text["[temp.display_name]"] += " some burns" + if(21 to INFINITY) + wound_flavor_text["[temp.display_name]"] += pick(" a lot of burns"," severe melting") + wound_flavor_text["[temp.display_name]"] += "!\n" + else if(temp.wounds) var/list/wounds = list(list(),list(),list(),list(),list(),list()) for(var/datum/organ/wound/w in temp.wounds) switch(w.healing_state) @@ -403,22 +422,22 @@ switch(tally[tallied]) if(1) if(!flavor_text.len) - flavor_text += "\The [src] has[prob(10) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]" + flavor_text += "[t_He] has[prob(10) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]" else flavor_text += "[prob(10) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]" if(2) if(!flavor_text.len) - flavor_text += "\The [src] has[prob(10) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s" + flavor_text += "[t_He] has[prob(10) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s" else flavor_text += "[prob(10) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s" if(3 to 5) if(!flavor_text.len) - flavor_text += "\The [src] has several [tallied_rename[tallied]]s" + flavor_text += "[t_He] has several [tallied_rename[tallied]]s" else flavor_text += " several [tallied_rename[tallied]]s" if(6 to INFINITY) if(!flavor_text.len) - flavor_text += "\The [src] has a bunch of [tallied_rename[tallied]]s" + flavor_text += "[t_He] has a bunch of [tallied_rename[tallied]]s" else flavor_text += " a ton of [tallied_rename[tallied]]s" if(flavor_text.len) @@ -434,6 +453,9 @@ //Handles the text strings being added to the actual description. //If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext. + var/display_chest = 0 + var/display_shoes = 0 + var/display_gloves = 0 if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas))))) msg += wound_flavor_text["head"] else if(is_bleeding["head"]) @@ -441,43 +463,49 @@ if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you. msg += wound_flavor_text["chest"] else if(is_bleeding["chest"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" + display_chest = 1 if(wound_flavor_text["left arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["left arm"] else if(is_bleeding["left arm"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" + display_chest = 1 if(wound_flavor_text["left hand"] && (is_destroyed["left hand"] || (!gloves && !skipgloves))) msg += wound_flavor_text["left hand"] else if(is_bleeding["left hand"]) - msg += "[src] has blood running from under [t_his] gloves!\n" + display_gloves = 1 if(wound_flavor_text["right arm"] && (is_destroyed["right arm"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["right arm"] else if(is_bleeding["right arm"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" + display_chest = 1 if(wound_flavor_text["right hand"] && (is_destroyed["right hand"] || (!gloves && !skipgloves))) msg += wound_flavor_text["right hand"] else if(is_bleeding["right hand"]) - msg += "[src] has blood running from under [t_his] gloves!\n" + display_gloves = 1 if(wound_flavor_text["groin"] && (is_destroyed["groin"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["groin"] else if(is_bleeding["groin"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" + display_chest = 1 if(wound_flavor_text["left leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["left leg"] else if(is_bleeding["left leg"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" + display_chest = 1 if(wound_flavor_text["left foot"]&& (is_destroyed["left foot"] || (!shoes && !skipshoes))) msg += wound_flavor_text["left foot"] else if(is_bleeding["left foot"]) - msg += "[src] has blood running from [t_his] shoes!\n" + display_shoes = 1 if(wound_flavor_text["right leg"] && (is_destroyed["right leg"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["right leg"] else if(is_bleeding["right leg"]) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" + display_chest = 1 if(wound_flavor_text["right foot"]&& (is_destroyed["right foot"] || (!shoes && !skipshoes))) msg += wound_flavor_text["right foot"] else if(is_bleeding["right foot"]) - msg += "[src] has blood running from [t_his] shoes!\n" + display_shoes = 1 + if(display_chest) + msg += "[src] has blood soaking through from under [t_his] clothing!\n" + if(display_shoes) + msg += "[src] has blood running from [t_his] shoes!\n" + if(display_gloves) + msg += "[src] has blood running from under [t_his] gloves!\n" // if(w.bleeding) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d4c962dfd9a..061d15d1223 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1419,8 +1419,12 @@ && !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) + var/icon/temp = new /icon('human.dmi', "[part.icon_name]_s") + if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + stand_icon.Blend(temp, ICON_OVERLAY) + temp = new /icon('human.dmi', "[part.icon_name]_l") + if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + lying_icon.Blend(temp , 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) @@ -2589,7 +2593,7 @@ It can still be worn/put on as normal. var/amount = 0.0 for(var/name in organs) var/datum/organ/external/O = organs[name] - amount+= O.brute_dam + if(!O.robot) amount+= O.brute_dam return amount /mob/living/carbon/human/adjustBruteLoss(var/amount, var/used_weapon = null) @@ -2602,7 +2606,7 @@ It can still be worn/put on as normal. var/amount = 0.0 for(var/name in organs) var/datum/organ/external/O = organs[name] - amount+= O.burn_dam + if(!O.robot) amount+= O.burn_dam return amount /mob/living/carbon/human/adjustFireLoss(var/amount,var/used_weapon = null) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index d5806a36423..26b1d586016 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -83,6 +83,10 @@ emp_act for(var/obj/O in src) if(!O) continue O.emp_act(severity) + for(var/named in organs) + var/datum/organ/external/O = organs[named] + if(O.destroyed) continue + O.emp_act(severity) ..() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a4588ef4296..9e4b9314eb9 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -211,6 +211,7 @@ adjustFireLoss(-2) for(var/datum/organ/external/org in organs) + if(org.robot) continue org.brute_dam = max(org.brute_dam - 2, 0) org.burn_dam = max(org.burn_dam - 2, 0) updatehealth() @@ -843,6 +844,30 @@ for(var/name in organs) var/datum/organ/external/E = organs[name] E.process() + if(E.robot && prob(E.brute_dam + E.burn_dam)) + if(E.name == "l_hand" || E.name == "l_arm") + if(hand && equipped()) + drop_item() + emote("custom v drops what they were holding, their limb malfunctioning!") + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, src) + spark_system.attach(src) + spark_system.start() + spawn(10) + del(spark_system) + else if(E.name == "r_hand" || E.name == "r_arm") + if(!hand && equipped()) + drop_item() + emote("custom v drops what they were holding, their limb malfunctioning!") + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, src) + spark_system.attach(src) + spark_system.start() + spawn(10) + del(spark_system) + 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.broken || E.destroyed) if(E.name == "l_hand" || E.name == "l_arm") if(hand && equipped()) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 85b02146d84..09d9b7cd6b5 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -590,8 +590,12 @@ && !istype(part, /datum/organ/external/chest) \ && !istype(part, /datum/organ/external/head) \ && !part.destroyed) - stand_icon.Blend(new /icon('monkey.dmi', "[part.icon_name]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('monkey.dmi', "[part.icon_name]_l"), ICON_OVERLAY) + var/icon/temp = new /icon('monkey.dmi', "[part.icon_name]_s") + if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + stand_icon.Blend(temp, ICON_OVERLAY) + temp = new /icon('monkey.dmi', "[part.icon_name]_l") + if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + lying_icon.Blend(temp , ICON_OVERLAY) stand_icon.Blend(new /icon('monkey.dmi', "groin_s"), ICON_OVERLAY) lying_icon.Blend(new /icon('monkey.dmi', "groin_l"), ICON_OVERLAY) diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index a4427703dcc..d7bca333688 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -20,9 +20,9 @@ var/mob/living/carbon/human/M = src for(var/name in M.organs) var/datum/organ/external/organ = M.organs[name] - if(organ.destroyed || organ.open) + if(organ.destroyed) src.traumatic_shock += 60 - else if(organ.broken) + else if(organ.broken || organ.open) src.traumatic_shock += 30 if(src.traumatic_shock < 0) diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 9ff680d7cad..164ded1d36f 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -87,8 +87,11 @@ return 0 if(destroyed) return 0 + if(robot) + brute *= 0.66 //~2/3 damage for ROBOLIMBS + burn *= 0.66 //~2/3 damage for ROBOLIMBS - if(owner) owner.pain(display_name, (brute+burn)*3, 1) + if(owner && !robot) owner.pain(display_name, (brute+burn)*3, 1) if(sharp) var/nux = brute * rand(10,15) if(brute_dam >= max_damage) @@ -100,7 +103,7 @@ return else if(prob(nux)) createwound(max(1,min(6,round(brute/10) + rand(0,1))),0,brute) - owner << "You feel something wet on your [display_name]" + if(!robot) owner << "You feel something wet on your [display_name]" if((brute_dam + burn_dam + brute + burn) < max_damage) if(brute) @@ -131,7 +134,7 @@ burn = can_inflict burn_dam += burn createwound(max(1,min(6,round(burn/10) + rand(0,1))),2,burn) - else + else if(!robot) var/passed_dam = (brute + burn) - can_inflict //Getting how much overdamage we have. var/list/datum/organ/external/possible_points = list() if(parent) @@ -146,6 +149,8 @@ target.take_damage(passed_dam, 0, sharp, used_weapon) else target.take_damage(0, passed_dam, sharp, used_weapon) + else + droplimb(1) //Robot limbs just kinda fail at full damage. if(broken) @@ -157,7 +162,9 @@ return result - proc/heal_damage(brute, burn, internal = 0) + proc/heal_damage(brute, burn, internal = 0, robo_repair = 0) + if(robot && !robo_repair) + return var/brute_to_heal = 0 var/brute_wounds = list() var/burn_to_heal = 0 @@ -250,7 +257,7 @@ destroyed = 1 owner:update_body() return - if(brute_dam > min_broken_damage) + if(brute_dam > min_broken_damage && !robot) if(broken == 0) //owner.unlock_medal("Broke Yarrr Bones!", 0, "Break a bone.", "easy") owner.visible_message("\red You hear a loud cracking sound coming from [owner.name].","\red Something feels like it shattered in your [display_name]!","You hear a sickening crack.") @@ -296,7 +303,7 @@ return 1 return 0 - proc/droplimb(var/override = 0) + proc/droplimb(var/override = 0,var/no_explode = 0) if(override) destroyed = 1 if(destroyed) @@ -307,7 +314,7 @@ for(var/datum/organ/external/I in children) if(I && !I.destroyed) - I.droplimb(1) + I.droplimb(1,1) var/obj/item/weapon/organ/H switch(body_part) if(UPPER_TORSO) @@ -372,11 +379,25 @@ var/lol = pick(cardinal) step(H,lol) destspawn = 1 - owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.","\red Your [display_name] goes flying off!","You hear a terrible sound of ripping tendons and flesh.") + if(!robot) + owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.",\ + "\red Your [display_name] goes flying off!",\ + "You hear a terrible sound of ripping tendons and flesh.") + else + owner.visible_message("\red [owner.name]'s [display_name] explodes violently!",\ + "\red Your [display_name] explodes!",\ + "You hear an explosion followed by a scream!") + if(!no_explode) + explosion(get_turf(owner),-1,-1,2,3) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, src) + spark_system.attach(src) + spark_system.start() + spawn(10) + del(spark_system) for(var/datum/organ/wound/W in wounds) W.update_health() del(W) - del(wounds) owner.update_body() owner.update_clothing() @@ -411,6 +432,13 @@ W.initial_dmg += damage W.wound_size = max(1,min(6,round(W.damage/10) + rand(0,1))) + proc/emp_act(severity) + if(!robot) return + if(prob(30*severity)) + take_damage(4(4-severity), 0, 1, used_weapon = "EMP") + else + droplimb(1) + /datum/organ/wound name = "wound" var/wound_type = 0 //0 = cut, 1 = bruise, 2 = burn @@ -424,6 +452,8 @@ var/slowheal = 3 proc/start_close() + if(parent.robot) + return sleep(rand(1800,3000)) //3-5 minutes if(prob(50) && wound_size == 1) parent.wounds.Remove(src) @@ -465,6 +495,8 @@ return 1 proc/become_scar() + if(parent.robot) + return healing_state = 1 //Patched spawn(200*slowheal) //~20-60 seconds update_health(5) //Heals some. @@ -520,6 +552,8 @@ return proc/update_health(var/percent = 1) + if(!owner || owner.stat == 2) + return damage = max(damage - damage/percent,0) //Remove that amount of the damage if(wound_type > 1) parent.burn_dam = max(parent.burn_dam - (initial_dmg - damage),0) diff --git a/html/create_object.html b/html/create_object.html index aa36cad8163..e652260f67e 100644 --- a/html/create_object.html +++ b/html/create_object.html @@ -27,7 +27,7 @@
- Type
+ Type
Offset: A @@ -52,6 +52,7 @@ var object_list = document.spawner.object_list; var object_paths = null /* object types */; var objects = object_paths == null ? new Array() : object_paths.split(";"); + var iterator = 0 document.spawner.filter.focus(); populateList(objects); @@ -107,6 +108,21 @@ object_list.options[0].selected = 'true'; } } + + function submitUpdate() + { + iterator += 1; + setTimeout(testUpdate(), 750); + } + + function testUpdate() + { + iterator -= 1; + if (iterator == 0) + { + updateSearch(); + } + }