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 3edb656645..5af3094221 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 eac51250c1..9a023031fb 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 2f6f5696cf..d84a34e89f 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 6e9bd017ab..60e68e43d1 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 57587b4637..769ee4ec8d 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 a0460b9d67..c599212889 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 bb4a1bb858..bdcc7480ab 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 51235f58b5..045c7d43fb 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 2d66e9bc24..8755deddf0 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 7e85d32155..b84ae2cf0b 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 352edbf882..becabfb18d 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 59e96b89ef..3395f37d0c 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 6bfb785c57..d1e095b8f0 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 39881da11e..90733aec8a 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 a118b09f2e..c84aa9aa2f 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 ea7b4b09b8..b108669b3b 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 d4c962dfd9..061d15d122 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 d5806a3642..26b1d58601 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 a4588ef429..9e4b9314eb 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 85b02146d8..09d9b7cd6b 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 a4427703dc..d7bca33368 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 9ff680d7ca..164ded1d36 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 aa36cad816..e652260f67 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(); + } + }