From 6c9be9c82d531cbd9e898ab4d2f930b825dd6cfe Mon Sep 17 00:00:00 2001 From: c0 Date: Thu, 25 Feb 2016 12:50:45 +0300 Subject: [PATCH] Adds breathing tube implant, changes how heart works, reworks arm-mounted implants --- code/_onclick/hud/screen_objects.dm | 80 +++---- .../miniantags/slaughter/slaughter.dm | 3 + code/game/objects/items/devices/multitool.dm | 8 + code/game/objects/items/devices/scanners.dm | 2 +- code/game/objects/items/weapons/defib.dm | 2 +- code/game/objects/items/weapons/kitchen.dm | 8 +- .../game/objects/items/weapons/tanks/tanks.dm | 17 +- code/game/objects/items/weapons/tools.dm | 39 ++++ code/modules/mob/living/carbon/carbon.dm | 7 +- .../mob/living/carbon/carbon_defines.dm | 5 +- .../mob/living/carbon/human/inventory.dm | 2 +- code/modules/mob/living/carbon/life.dm | 3 + .../modules/mob/living/silicon/robot/robot.dm | 2 +- code/modules/mob/mob_grab.dm | 10 +- code/modules/projectiles/guns/mounted.dm | 18 +- .../research/designs/medical_designs.dm | 21 +- code/modules/surgery/organ_manipulation.dm | 4 +- code/modules/surgery/organs/augments_arms.dm | 182 ++++++++++++++++ code/modules/surgery/organs/augments_chest.dm | 106 ++++++++++ code/modules/surgery/organs/augments_eyes.dm | 2 +- .../surgery/organs/augments_internal.dm | 196 ++---------------- code/modules/surgery/organs/helpers.dm | 4 +- code/modules/surgery/organs/organ_internal.dm | 56 ++++- icons/obj/items_cyborg.dmi | Bin 0 -> 2327 bytes icons/obj/surgery.dmi | Bin 20026 -> 23113 bytes tgstation.dme | 2 + 26 files changed, 510 insertions(+), 269 deletions(-) create mode 100644 code/modules/surgery/organs/augments_arms.dm create mode 100644 code/modules/surgery/organs/augments_chest.dm create mode 100644 icons/obj/items_cyborg.dmi diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index fd3bc349f4c..54f015fdf44 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -117,47 +117,49 @@ C << "You are no longer running on internals." icon_state = "internal0" else - if(!istype(C.wear_mask, /obj/item/clothing/mask)) - C << "You are not wearing an internals mask!" - return 1 - else - var/obj/item/clothing/mask/M = C.wear_mask - if(M.mask_adjusted) // if mask on face but pushed down - M.adjustmask(C) // adjust it back - if( !(M.flags & MASKINTERNALS) ) + if(!C.getorganslot("breathing_tube")) + if(!istype(C.wear_mask, /obj/item/clothing/mask)) C << "You are not wearing an internals mask!" - return - if(istype(C.l_hand, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.l_hand] on your left hand." - C.internal = C.l_hand - else if(istype(C.r_hand, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.r_hand] on your right hand." - C.internal = C.r_hand - else if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(istype(H.s_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]." - H.internal = H.s_store - else if(istype(H.belt, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.belt] on your belt." - H.internal = H.belt - else if(istype(H.l_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.l_store] in your left pocket." - H.internal = H.l_store - else if(istype(H.r_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.r_store] in your right pocket." - H.internal = H.r_store - - //Seperate so CO2 jetpacks are a little less cumbersome. - if(!C.internal && istype(C.back, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.back] on your back." - C.internal = C.back - - if(C.internal) - icon_state = "internal1" + return 1 else - C << "You don't have an oxygen tank!" - return + var/obj/item/clothing/mask/M = C.wear_mask + if(M.mask_adjusted) // if mask on face but pushed down + M.adjustmask(C) // adjust it back + if( !(M.flags & MASKINTERNALS) ) + C << "You are not wearing an internals mask!" + return + + if(istype(C.l_hand, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.l_hand] on your left hand." + C.internal = C.l_hand + else if(istype(C.r_hand, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.r_hand] on your right hand." + C.internal = C.r_hand + else if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(istype(H.s_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]." + H.internal = H.s_store + else if(istype(H.belt, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.belt] on your belt." + H.internal = H.belt + else if(istype(H.l_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.l_store] in your left pocket." + H.internal = H.l_store + else if(istype(H.r_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.r_store] in your right pocket." + H.internal = H.r_store + + //Seperate so CO2 jetpacks are a little less cumbersome. + if(!C.internal && istype(C.back, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.back] on your back." + C.internal = C.back + + if(C.internal) + icon_state = "internal1" + else + C << "You don't have an oxygen tank!" + return C.update_action_buttons_icon() /obj/screen/mov_intent diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 684ee437c89..e17f41445d0 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -112,3 +112,6 @@ ..() if(M.mind) M.mind.remove_spell(/obj/effect/proc_holder/spell/bloodcrawl) + +/obj/item/organ/internal/heart/demon/Stop() + return 0 // Always beating. diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index d5d116a4392..7b935abfdb5 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -63,3 +63,11 @@ track_delay = world.time + 10 // 1 second return + + + +/obj/item/device/multitool/cyborg + name = "multitool" + desc = "Optimised and stripped-down version of a regular multitool." + icon = 'icons/obj/items_cyborg.dmi' + toolspeed = 2 \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index ae8d23b9ecb..68052b14958 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -129,7 +129,7 @@ MASS SPECTROMETER if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.heart_attack) + if(H.heart_attack && H.stat != DEAD) user << "Subject suffering from heart attack: Apply defibrillator immediately!" user << "Analyzing results for [M]:\n\tOverall status: [mob_status]" diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 0152f03c41d..88c1ab6393c 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -548,7 +548,7 @@ /obj/item/weapon/twohanded/shockpaddles/syndicate name = "syndicate defibrillator paddles" - desc = "A pair of paddles used to revive deceased operatives. It possesses both the ability to penetrate armor and todeliver powerful shocks offensively." + desc = "A pair of paddles used to revive deceased operatives. It possesses both the ability to penetrate armor and to deliver powerful shocks offensively." combat = 1 icon = 'icons/obj/weapons.dmi' icon_state = "defibpaddles0" diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index f92335d09d0..640a14dec73 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -98,6 +98,12 @@ origin_tech = "materials=2;combat=4" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") +/obj/item/weapon/kitchen/knife/combat/cyborg + name = "cyborg knife" + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "knife" + desc = "A cyborg-mounted plasteel knife. Extremely sharp and durable." + /obj/item/weapon/kitchen/knife/carrotshiv name = "carrot shiv" icon_state = "carrotshiv" @@ -118,4 +124,4 @@ w_class = 3 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") -/* Trays moved to /obj/item/weapon/storage/bag */ +/* Trays moved to /obj/item/weapon/storage/bag */ diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 58b230917d2..f62985f47f3 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -28,14 +28,15 @@ H.internal = null H.update_internals_hud_icon(0) else - if(!H.wear_mask) - H << "You need a mask!" - return - if(H.wear_mask.mask_adjusted) - H.wear_mask.adjustmask(H) - if(!(H.wear_mask.flags & MASKINTERNALS)) - H << "[H.wear_mask] can't use [src]!" - return + if(!H.getorganslot("breathing_tube")) + if(!H.wear_mask) + H << "You need a mask!" + return + if(H.wear_mask.mask_adjusted) + H.wear_mask.adjustmask(H) + if(!(H.wear_mask.flags & MASKINTERNALS)) + H << "[H.wear_mask] can't use [src]!" + return if(H.internal) H << "You switch your internals to [src]." diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 67696207645..3c546350790 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -34,6 +34,12 @@ playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1) return (BRUTELOSS) +/obj/item/weapon/wrench/cyborg + name = "automatic wrench" + desc = "An advanced robotic wrench. Can be found in construction cyborgs." + icon = 'icons/obj/items_cyborg.dmi' + toolspeed = 2 + /* * Screwdriver */ @@ -99,6 +105,17 @@ M = user return eyestab(M,user) +/obj/item/weapon/screwdriver/cyborg + name = "powered screwdriver" + desc = "An electrical screwdriver, designed to be both precise and quick." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "screwdriver" + item_state = "screwdriver_brown" + toolspeed = 2 + +/obj/item/weapon/screwdriver/cyborg/New(loc, var/param_color = null) + return ..(loc, "cyborg") + /* * Wirecutters */ @@ -142,6 +159,16 @@ playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1, -1) return (BRUTELOSS) + +/obj/item/weapon/wirecutters/cyborg + name = "wirecutters" + desc = "This cuts wires." + icon = 'icons/obj/items_cyborg.dmi' + toolspeed = 2 + +/obj/item/weapon/wirecutters/cyborg/New(loc, var/param_color = null) + return ..(loc, "cyborg") + /* * Welding Tool */ @@ -396,6 +423,11 @@ origin_tech = "engineering=2" /obj/item/weapon/weldingtool/largetank/cyborg + name = "integrated welding tool" + desc = "An advanced welder designed to be used in robotic systems." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "indwelder" + toolspeed = 2 /obj/item/weapon/weldingtool/largetank/flamethrower_screwdriver() return @@ -494,3 +526,10 @@ materials = list(MAT_METAL=70) icon_state = "crowbar_large" toolspeed = 2 + +/obj/item/weapon/crowbar/cyborg + name = "hydraulic crowbar" + desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs." + icon = 'icons/obj/items_cyborg.dmi' + force = 10 + toolspeed = 2 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b6b13b41669..458e37c3901 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -323,9 +323,10 @@ if(internal) internal = null update_internals_hud_icon(0) - else if(ITEM && istype(ITEM, /obj/item/weapon/tank) && wear_mask && (wear_mask.flags & MASKINTERNALS)) - internal = ITEM - update_internals_hud_icon(1) + else if(ITEM && istype(ITEM, /obj/item/weapon/tank)) + if((wear_mask && (wear_mask.flags & MASKINTERNALS)) || getorganslot("breathing_tube")) + internal = ITEM + update_internals_hud_icon(1) visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].", \ "[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].") diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 665ca0422be..544a023160b 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,8 +1,9 @@ /mob/living/carbon gender = MALE hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD) - var/list/stomach_contents = list() - var/list/internal_organs = list() //List of /obj/item/organ/internal in the mob. They don't go in the contents for some reason I don't want to know. + var/list/stomach_contents = list() + var/list/internal_organs = list() //List of /obj/item/organ/internal in the mob. They don't go in the contents for some reason I don't want to know. + var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU. diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index c7e5f8174fe..3e0ad9b5b3c 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -173,7 +173,7 @@ /mob/living/carbon/human/wear_mask_update(obj/item/clothing/C, toggle_off = 1) if((C.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(C.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR))) update_hair() - if(toggle_off && internal) + if(toggle_off && internal && !getorganslot("breathing_tube")) update_internals_hud_icon(0) internal = null if(C.flags_inv & HIDEEYES) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index ada5f67baf6..0c1bc7cf192 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -199,6 +199,9 @@ if(internal.loc != src) internal = null update_internals_hud_icon(0) + else if ((!wear_mask || !(wear_mask.flags & MASKINTERNALS)) && !getorganslot("breathing_tube")) + internal = null + update_internals_hud_icon(0) else update_internals_hud_icon(1) return internal.remove_air_volume(volume_needed) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index fb2e6646e18..de11726345d 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -453,7 +453,7 @@ if (WT.remove_fuel(0, user)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. if(src == user) user << "You start fixing youself..." - if(!do_after(user, 50/W.toolspeed, target = src)) + if(!do_after(user, 50, target = src)) return adjustBruteLoss(-30) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 4517dea695e..a29cc3b29fd 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -100,15 +100,18 @@ if(!affecting.buckled) affecting.loc = assailant.loc + var/breathing_tube = affecting.getorganslot("breathing_tube") + if(state >= GRAB_NECK) affecting.Stun(5) //It will hamper your voice, being choked and all. - if(isliving(affecting)) + if(isliving(affecting) && !breathing_tube) var/mob/living/L = affecting L.adjustOxyLoss(1) if(state >= GRAB_KILL) affecting.Weaken(5) //Should keep you down unless you get help. - affecting.losebreath = min(affecting.losebreath + 2, 3) + if(!breathing_tube) + affecting.losebreath = min(affecting.losebreath + 2, 3) /obj/item/weapon/grab/attack_self(mob/user) s_click(hud) @@ -165,7 +168,8 @@ add_logs(assailant, affecting, "strangled") assailant.changeNext_move(CLICK_CD_TKSTRANGLE) - affecting.losebreath += 1 + if(!affecting.getorganslot("breathing_tube")) + affecting.losebreath += 1 else if(assailant) assailant.visible_message("[assailant] is unable to tighten \his grip on [affecting]'s neck!") diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm index 84549c8e09f..177445f3b43 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/mounted.dm @@ -1,12 +1,11 @@ /obj/item/weapon/gun/energy/gun/advtaser/mounted name = "mounted taser" desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots." - icon_state = "armcannon" + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "taser" + item_state = "armcannonstun4" force = 5 selfcharge = 1 - flags = NODROP - slot_flags = null - w_class = 5 can_flashlight = 0 /obj/item/weapon/gun/energy/gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... @@ -15,16 +14,13 @@ /obj/item/weapon/gun/energy/laser/mounted name = "mounted laser" - desc = "An arm mounted cannon that fires lethal lasers. Doesn't come with a charge beam." - icon_state = "armcannon" + desc = "An arm mounted cannon that fires lethal lasers." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "laser" item_state = "armcannonlase" force = 5 selfcharge = 1 - flags = NODROP - slot_flags = null - w_class = 5 - materials = null /obj/item/weapon/gun/energy/laser/mounted/dropped() ..() - src.loc = null + src.loc = null \ No newline at end of file diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index aaa5d9df810..028bc09f8ae 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -121,6 +121,17 @@ build_path = /obj/item/organ/internal/cyberimp/eyes/shield category = list("Misc", "Medical Designs") +/datum/design/cyberimp_breather + name = "Breathing Tube implant" + desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked." + id = "ci-breather" + req_tech = list("materials" = 3, "biotech" = 3) + build_type = PROTOLATHE | MECHFAB + construction_time = 35 + materials = list(MAT_METAL = 200, MAT_GLASS = 250) + build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube + category = list("Misc", "Medical Designs") + /datum/design/cyberimp_medical_hud name = "Medical HUD implant" desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." @@ -174,7 +185,7 @@ construction_time = 60 materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 400, MAT_GOLD = 400) build_path = /obj/item/organ/internal/cyberimp/brain/anti_drop - category = list("Medical Designs") + category = list("Misc", "Medical Designs") /datum/design/cyberimp_antistun name = "CNS Rebooter implant" @@ -185,7 +196,7 @@ construction_time = 60 materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_SILVER = 500, MAT_GOLD = 1000) build_path = /obj/item/organ/internal/cyberimp/brain/anti_stun - category = list("Medical Designs") + category = list("Misc", "Medical Designs") /datum/design/cyberimp_nutriment name = "Nutriment pump implant" @@ -196,7 +207,7 @@ construction_time = 40 materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 500) build_path = /obj/item/organ/internal/cyberimp/chest/nutriment - category = list("Medical Designs") + category = list("Misc", "Medical Designs") /datum/design/cyberimp_nutriment_plus name = "Nutriment pump implant PLUS" @@ -207,7 +218,7 @@ construction_time = 50 materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 750) build_path = /obj/item/organ/internal/cyberimp/chest/nutriment/plus - category = list("Medical Designs") + category = list("Misc", "Medical Designs") /datum/design/cyberimp_reviver name = "Reviver implant" @@ -237,7 +248,7 @@ /datum/design/implantcase name = "Implant Case" - desc = "A glass case containing an implant." + desc = "A glass case for containing an implant." id = "implantcase" req_tech = list("materials" = 1, "biotech" = 2) build_type = PROTOLATHE diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 26de8b0b6a5..b0cc38c8dc8 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -7,13 +7,13 @@ requires_organic_bodypart = 0 /datum/surgery/organ_manipulation/soft - possible_locs = list("groin", "eyes", "mouth") + possible_locs = list("groin", "eyes", "mouth", "l_arm", "r_arm") steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/manipulate_organs) /datum/surgery/organ_manipulation/alien name = "alien organ manipulation" - possible_locs = list("chest", "head", "groin", "eyes", "mouth") + possible_locs = list("chest", "head", "groin", "eyes", "mouth", "l_arm", "r_arm") species = list(/mob/living/carbon/alien/humanoid) steps = list(/datum/surgery_step/saw, /datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/manipulate_organs) diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm new file mode 100644 index 00000000000..247bf322e02 --- /dev/null +++ b/code/modules/surgery/organs/augments_arms.dm @@ -0,0 +1,182 @@ +/obj/item/organ/internal/cyberimp/arm + name = "arm-mounted implant" + desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" + zone = "r_arm" + slot = "r_arm_device" + icon_state = "implant-toolkit" + w_class = 3 + actions_types = list(/datum/action/item_action/organ_action/toggle) + + var/list/items_list = list() + // Used to store a list of all items inside, for multi-item implants. + // I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies. + + var/obj/item/holder = null + // You can use this var for item path, it would be converted into an item on New() + +/obj/item/organ/internal/cyberimp/arm/New() + ..() + if(ispath(holder)) + holder = new holder(src) + + update_icon() + slot = zone + "_device" + items_list = contents.Copy() + +/obj/item/organ/internal/cyberimp/arm/update_icon() + if(zone == "r_arm") + transform = null + else // Mirroring the icon + transform = matrix(-1, 0, 0, 0, 1, 0) + +/obj/item/organ/internal/cyberimp/arm/examine(mob/user) + ..() + user << "[src] is assembled in the [zone == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it." + +/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/weapon/W, mob/user, params) + ..() + if(istype(W, /obj/item/weapon/screwdriver)) + if(zone == "r_arm") + zone = "l_arm" + else + zone = "r_arm" + slot = zone + "_device" + user << "You modify [src] to be installed on the [zone == "r_arm" ? "right" : "left"] arm." + update_icon() + else if(istype(W, /obj/item/weapon/card/emag)) + emag_act() + +/obj/item/organ/internal/cyberimp/arm/Remove(mob/living/carbon/M, special = 0) + Retract() + ..() + +/obj/item/organ/internal/cyberimp/arm/emag_act() + return 0 + +/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity) + if(prob(15/severity)) + owner << "[src] is hit by EMP!" + // give the owner an idea about why his implant is glitching + Retract() + ..() + +/obj/item/organ/internal/cyberimp/arm/proc/Retract() + if(!holder || (holder in src)) + return + + owner.visible_message("[owner] retracts [holder] back into \his [zone == "r_arm" ? "right" : "left"] arm.", + "[holder] snaps back into your [zone == "r_arm" ? "right" : "left"] arm.", + "You hear a short mechanical noise.") + + owner.unEquip(holder, 1) + holder.loc = src + holder = null + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) + +/obj/item/organ/internal/cyberimp/arm/proc/Extend(var/obj/item/item) + if(!(item in src)) + return + + holder = item + + holder.flags |= NODROP + holder.unacidable = 1 + holder.slot_flags = null + holder.w_class = 5 + holder.materials = null + + var/arm_slot = (zone == "r_arm" ? slot_r_hand : slot_l_hand) + var/obj/item/arm_item = owner.get_item_by_slot(arm_slot) + + if(arm_item) + if(!owner.unEquip(arm_item)) + owner << "Your [arm_item] interferes with [src]!" + return + else + owner << "You drop [arm_item] to activate [src]!" + + if(zone == "r_arm" ? !owner.put_in_r_hand(holder) : !owner.put_in_l_hand(holder)) + owner << "Your [src] fails to activate!" + return + + // Activate the hand that now holds our item. + if(zone == "r_arm" ? owner.hand : !owner.hand) + owner.swap_hand() + + owner.visible_message("[owner] extends [holder] from \his [zone == "r_arm" ? "right" : "left"] arm.", + "You extend [holder] from your [zone == "r_arm" ? "right" : "left"] arm.", + "You hear a short mechanical noise.") + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) + +/obj/item/organ/internal/cyberimp/arm/ui_action_click() + if(crit_fail || (!holder && !contents.len)) + owner << "The implant doesn't respond. It seems to be broken..." + return + + // You can emag the arm-mounted implant by activating it while holding emag in it's hand. + var/arm_slot = (zone == "r_arm" ? slot_r_hand : slot_l_hand) + if(istype(owner.get_item_by_slot(arm_slot), /obj/item/weapon/card/emag) && emag_act()) + return + + if(!holder || (holder in src)) + holder = null + if(contents.len == 1) + Extend(contents[1]) + else // TODO: make it similar to borg's storage-like module selection + var/obj/item/choise = input("Activate which item?", "Arm Implant", null, null) as null|anything in items_list + if(owner && owner == usr && owner.stat != DEAD && (src in owner.internal_organs) && !holder && istype(choise) && (choise in contents)) + // This monster sanity check is a nice example of how bad input() is. + Extend(choise) + else + Retract() + + +/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity) + if(prob(30/severity) && owner && !crit_fail) + Retract() + owner.visible_message("A loud bang comes from [owner]\'s [zone == "r_arm" ? "right" : "left"] arm!") + playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1) + owner << "You feel an explosion erupt inside your [zone == "r_arm" ? "right" : "left"] arm as your implant breaks!" + owner.adjust_fire_stacks(20) + owner.IgniteMob() + owner.adjustFireLoss(25) + crit_fail = 1 + else // The gun will still discharge anyway. + ..() + + +/obj/item/organ/internal/cyberimp/arm/gun/laser + name = "arm-mounted laser implant" + desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use." + icon_state = "arm_laser" + origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it + holder = /obj/item/weapon/gun/energy/laser/mounted + +/obj/item/organ/internal/cyberimp/arm/gun/laser/l/zone = "l_arm" + + +/obj/item/organ/internal/cyberimp/arm/gun/taser + name = "arm-mounted taser implant" + desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use." + icon_state = "arm_taser" + origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" + holder = /obj/item/weapon/gun/energy/gun/advtaser/mounted + +/obj/item/organ/internal/cyberimp/arm/gun/taser/l/zone = "l_arm" + + +/obj/item/organ/internal/cyberimp/arm/toolset + name = "integrated toolset implant" + desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm. Contains all neccessary tools." + origin_tech = "materials=5;engineering=5;biotech=4;powerstorage=3" + contents = newlist(/obj/item/weapon/screwdriver/cyborg, /obj/item/weapon/wrench/cyborg, /obj/item/weapon/weldingtool/largetank/cyborg, + /obj/item/weapon/crowbar/cyborg, /obj/item/weapon/wirecutters/cyborg, /obj/item/device/multitool/cyborg) + +/obj/item/organ/internal/cyberimp/arm/toolset/l/zone = "l_arm" + +/obj/item/organ/internal/cyberimp/arm/toolset/emag_act() + if(!(locate(/obj/item/weapon/kitchen/knife/combat/cyborg) in items_list)) + owner << "You unlock [src]'s integrated knife!" + items_list += new /obj/item/weapon/kitchen/knife/combat/cyborg(src) + return 1 + return 0 \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm new file mode 100644 index 00000000000..916051d133c --- /dev/null +++ b/code/modules/surgery/organs/augments_chest.dm @@ -0,0 +1,106 @@ +/obj/item/organ/internal/cyberimp/chest + name = "cybernetic torso implant" + desc = "implants for the organs in your torso" + icon_state = "chest_implant" + implant_overlay = "chest_implant_overlay" + zone = "chest" + +/obj/item/organ/internal/cyberimp/chest/nutriment + name = "Nutriment pump implant" + desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving." + icon_state = "chest_implant" + implant_color = "#00AA00" + var/hunger_threshold = NUTRITION_LEVEL_STARVING + var/synthesizing = 0 + var/poison_amount = 5 + slot = "stomach" + origin_tech = "materials=5;programming=3;biotech=4" + +/obj/item/organ/internal/cyberimp/chest/nutriment/on_life() + if(synthesizing) + return + + if(owner.nutrition <= hunger_threshold) + synthesizing = 1 + owner << "You feel less hungry..." + owner.nutrition += 50 + spawn(50) + synthesizing = 0 + +/obj/item/organ/internal/cyberimp/chest/nutriment/emp_act(severity) + if(!owner) + return + owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning + owner << "You feel like your insides are burning." + + +/obj/item/organ/internal/cyberimp/chest/nutriment/plus + name = "Nutriment pump implant PLUS" + desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry." + icon_state = "chest_implant" + implant_color = "#006607" + hunger_threshold = NUTRITION_LEVEL_HUNGRY + poison_amount = 10 + origin_tech = "materials=5;programming=3;biotech=5" + + + +/obj/item/organ/internal/cyberimp/chest/reviver + name = "Reviver implant" + desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!" + icon_state = "chest_implant" + implant_color = "#AD0000" + origin_tech = "materials=6;programming=3;biotech=6;syndicate=4" + slot = "heartdrive" + var/revive_cost = 0 + var/reviving = 0 + var/cooldown = 0 + +/obj/item/organ/internal/cyberimp/chest/reviver/on_life() + if(reviving) + if(owner.stat == UNCONSCIOUS) + spawn(30) + if(prob(90) && owner.getOxyLoss()) + owner.adjustOxyLoss(-3) + revive_cost += 5 + if(prob(75) && owner.getBruteLoss()) + owner.adjustBruteLoss(-1) + revive_cost += 20 + if(prob(75) && owner.getFireLoss()) + owner.adjustFireLoss(-1) + revive_cost += 20 + if(prob(40) && owner.getToxLoss()) + owner.adjustToxLoss(-1) + revive_cost += 50 + else + cooldown = revive_cost + world.time + reviving = 0 + return + + if(cooldown > world.time) + return + if(owner.stat != UNCONSCIOUS) + return + if(owner.suiciding) + return + + revive_cost = 0 + reviving = 1 + +/obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity) + if(!owner) + return + + if(reviving) + revive_cost += 200 + else + cooldown += 200 + + if(istype(owner, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = owner + if(H.stat != DEAD && prob(50 / severity)) + H.heart_attack = 1 + spawn(600 / severity) + H.heart_attack = 0 + if(H.stat == CONSCIOUS) + H << "You feel your heart beating again!" \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 279f912ef06..1693d217906 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -116,7 +116,7 @@ implant_color = "#101010" flash_protect = 2 aug_message = null - eye_color = "fff" + eye_color = null /obj/item/organ/internal/cyberimp/eyes/shield/emp_act(severity) return \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index b793fd05fc8..8a3776cce8e 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -26,6 +26,7 @@ icon_state = "brain_implant" implant_overlay = "brain_implant_overlay" zone = "head" + w_class = 1 /obj/item/organ/internal/cyberimp/brain/emp_act(severity) if(!owner) @@ -37,7 +38,7 @@ /obj/item/organ/internal/cyberimp/brain/anti_drop - name = "Anti-drop implant" + name = "anti-drop implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." var/active = 0 var/l_hand_ignore = 0 @@ -101,11 +102,11 @@ if(L_item) A = pick(oview(range)) L_item.throw_at(A, range, 2) - owner << "Your left arm spasms and throws the [L_item.name]!" + owner << "Your left arm spasms and throws the [L_item.name]!" if(R_item) A = pick(oview(range)) R_item.throw_at(A, range, 2) - owner << "Your right arm spasms and throws the [R_item.name]!" + owner << "Your right arm spasms and throws the [R_item.name]!" /obj/item/organ/internal/cyberimp/brain/anti_drop/proc/release_items() if(!l_hand_ignore && l_hand_obj in owner.contents) @@ -144,185 +145,24 @@ crit_fail = 0 -//[[[[CHEST]]]] +//[[[[MOUTH]]]] +/obj/item/organ/internal/cyberimp/mouth + zone = "mouth" -/obj/item/organ/internal/cyberimp/chest - name = "cybernetic torso implant" - desc = "implants for the organs in your torso" - icon_state = "chest_implant" - implant_overlay = "chest_implant_overlay" - zone = "chest" +/obj/item/organ/internal/cyberimp/mouth/breathing_tube + name = "breathing tube implant" + desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked." + icon_state = "breathing_tube" + slot = "breathing_tube" + w_class = 1 + origin_tech = "materials=2;biotech=3" -/obj/item/organ/internal/cyberimp/chest/nutriment - name = "Nutriment pump implant" - desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving." - icon_state = "chest_implant" - implant_color = "#00AA00" - var/hunger_threshold = NUTRITION_LEVEL_STARVING - var/synthesizing = 0 - var/poison_amount = 5 - slot = "stomach" - origin_tech = "materials=5;programming=3;biotech=4" - -/obj/item/organ/internal/cyberimp/chest/nutriment/on_life() - if(synthesizing) - return - - if(owner.nutrition <= hunger_threshold) - synthesizing = 1 - owner << "You feel less hungry..." - owner.nutrition += 50 - spawn(50) - synthesizing = 0 - -/obj/item/organ/internal/cyberimp/chest/nutriment/emp_act(severity) - if(!owner) - return - owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning - owner << "You feel like your insides are burning." +/obj/item/organ/internal/cyberimp/mouth/breathing_tube/emp_act(severity) + if(prob(60/severity)) + owner << "Your breathing tube suddenly closes!" + owner.losebreath += 2 -/obj/item/organ/internal/cyberimp/chest/nutriment/plus - name = "Nutriment pump implant PLUS" - desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry." - icon_state = "chest_implant" - implant_color = "#006607" - hunger_threshold = NUTRITION_LEVEL_HUNGRY - poison_amount = 10 - origin_tech = "materials=5;programming=3;biotech=5" - - - -/obj/item/organ/internal/cyberimp/chest/reviver - name = "Reviver implant" - desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!" - icon_state = "chest_implant" - implant_color = "#AD0000" - origin_tech = "materials=6;programming=3;biotech=6;syndicate=4" - slot = "heartdrive" - var/revive_cost = 0 - var/reviving = 0 - var/cooldown = 0 - -/obj/item/organ/internal/cyberimp/chest/reviver/on_life() - if(reviving) - if(owner.stat == UNCONSCIOUS) - spawn(30) - if(prob(90) && owner.getOxyLoss()) - owner.adjustOxyLoss(-3) - revive_cost += 5 - if(prob(75) && owner.getBruteLoss()) - owner.adjustBruteLoss(-1) - revive_cost += 20 - if(prob(75) && owner.getFireLoss()) - owner.adjustFireLoss(-1) - revive_cost += 20 - if(prob(40) && owner.getToxLoss()) - owner.adjustToxLoss(-1) - revive_cost += 50 - else - cooldown = revive_cost + world.time - reviving = 0 - return - - if(cooldown > world.time) - return - if(owner.stat != UNCONSCIOUS) - return - if(owner.suiciding) - return - - revive_cost = 0 - reviving = 1 - -/obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity) - if(!owner) - return - - if(reviving) - revive_cost += 200 - else - cooldown += 200 - - if(istype(owner, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = owner - if(H.stat != DEAD && prob(50 / severity)) - H.heart_attack = 1 - spawn(600 / severity) - H.heart_attack = 0 - if(H.stat == CONSCIOUS) - H << "You feel your heart beating again!" - -/obj/item/organ/internal/cyberimp/chest/arm_mod//dummy parent item for making arm-mod implants. works best with nodrop items that are sent to nullspace upon being dropped. - name = "Arm-mounted item implant" - desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" - icon_state = "chest_implant" - implant_color = "#007ACC" - slot = "shoulders" - origin_tech = "materials=5;biotech=4;powerstorage=4" - actions_types = list(/datum/action/item_action/organ_action/toggle) - var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere! - var/out = 0//determines if the item is in the owner's hand or not - var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work. - -/obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click() - if(overloaded)//ensure the implant isn't broken - owner << "The implant doesn't respond. It seems to be broken..." - return - if(holder == null) - owner << "You should not be attempting to use this implant, as it is a dummy item that should never appear. Please adminhelp and report this as an issue on github." - return - if(out)//check if the owner has the item out already - owner.unEquip(holder, 1)//if he does, take it away. then, - holder.loc = null//stash it in nullspace - out = 0//and set this to clarify the item isn't out. - owner << "You retract [holder]." - playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) - else//if he doesn't have the item out - if(owner.put_in_hands(holder))//put it in his hands. - out = 1 - owner << "You extend [holder]!" - playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) - else//if this fails to put the item in his hands, - holder.loc = null//keep it in nullspace - owner << "You can't extend [holder] if you can't use your hands!" - -/obj/item/organ/internal/cyberimp/chest/arm_mod/emp_act(severity)//if the implant gets EMPed... - if(!owner || overloaded)//ensure that it's in an owner and that it's not already EMPed, then... - return - if(out)//check if he has the item out... - owner.unEquip(holder, 1)//if he does, take it away. - holder.loc = null - out = 0 - owner << "[holder] forcibly retracts into your arm." - owner.visible_message("A loud bang comes from [owner]...") - playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1) - owner << "You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here?" - owner.adjust_fire_stacks(20) - owner.IgniteMob()//ignite the owner, as well as - owner.say("AUUUUUUUUUUUUUUUUUUGH!!") - owner.adjustFireLoss(25)//severely injure him! - overloaded = 1//then make sure this can't happen again by breaking the implant. - -/obj/item/organ/internal/cyberimp/chest/arm_mod/tase//mounted, self-charging taser! - name = "Arm-cannon taser implant" - desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use." - icon_state = "armcannon_tase_implant" - origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" - actions_types = list(/datum/action/item_action/organ_action/toggle) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created... - holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/lase//mounted, self-charging laser! - name = "Arm-cannon laser implant" - desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use." - icon_state = "armcannon_lase_implant" - origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it - actions_types = list(/datum/action/item_action/organ_action/toggle) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New() - holder = new /obj/item/weapon/gun/energy/laser/mounted(src) //BOX O' IMPLANTS diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm index 5fa8b0811be..b25f792f336 100644 --- a/code/modules/surgery/organs/helpers.dm +++ b/code/modules/surgery/organs/helpers.dm @@ -26,9 +26,7 @@ mob/living/carbon/getorganszone(zone, var/subzones = 0) return returnorg mob/living/carbon/getorganslot(slot) - for(var/obj/item/organ/internal/O in internal_organs) - if(slot == O.slot) - return O + return internal_organs_slot[slot] mob/proc/getlimb() return diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 4bfb4eb9c21..5ead35d2677 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -5,6 +5,7 @@ throwforce = 0 var/zone = "chest" var/slot + // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! var/vital = 0 @@ -18,6 +19,7 @@ owner = M M.internal_organs |= src + M.internal_organs_slot[slot] = src loc = null for(var/X in actions) var/datum/action/A = X @@ -28,6 +30,8 @@ owner = null if(M) M.internal_organs -= src + if(M.internal_organs_slot[slot] == src) + M.internal_organs_slot.Remove(slot) if(vital && !special) M.death() for(var/X in actions) @@ -41,6 +45,12 @@ /obj/item/organ/internal/proc/on_life() return +/obj/item/organ/internal/examine(mob/user) + ..() + if(status == ORGAN_ROBOTIC && crit_fail) + user << "[src] seems to be broken!" + + /obj/item/organ/internal/proc/prepare_eat() var/obj/item/weapon/reagent_containers/food/snacks/organ/S = new S.name = name @@ -56,7 +66,6 @@ name = "appendix" icon_state = "appendix" icon = 'icons/obj/surgery.dmi' - list_reagents = list("nutriment" = 5) @@ -92,7 +101,6 @@ zone = "chest" slot = "heart" origin_tech = "biotech=3" - vital = 1 var/beating = 1 var/icon_base = "heart" @@ -102,16 +110,46 @@ else icon_state = "[icon_base]-off" -/obj/item/organ/internal/heart/Insert(mob/living/carbon/M, special = 0) - ..() - beating = 1 - update_icon() - /obj/item/organ/internal/heart/Remove(mob/living/carbon/M, special = 0) ..() + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.stat == DEAD || H.heart_attack) + Stop() + return + if(!special) + H.heart_attack = 1 + spawn(120) - beating = 0 - update_icon() + if(!owner) + Stop() + +/obj/item/organ/internal/heart/attack_self(mob/user) + ..() + if(!beating) + Restart() + spawn(80) + if(!owner) + Stop() + + +/obj/item/organ/internal/heart/Insert(mob/living/carbon/M, special = 0) + ..() + if(ishuman(M) && beating) + var/mob/living/carbon/human/H = M + if(H.heart_attack) + H.heart_attack = 0 + return + +/obj/item/organ/internal/heart/proc/Stop() + beating = 0 + update_icon() + return 1 + +/obj/item/organ/internal/heart/proc/Restart() + beating = 1 + update_icon() + return 1 /obj/item/organ/internal/heart/prepare_eat() var/obj/S = ..() diff --git a/icons/obj/items_cyborg.dmi b/icons/obj/items_cyborg.dmi new file mode 100644 index 0000000000000000000000000000000000000000..dfdd311419489517d418278540b55468087106e2 GIT binary patch literal 2327 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 literal 0 HcmV?d00001 diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 0d2b1166c192976ed56b6d8c1d9e2957277c624b..9252dbf89f610624b4e5d4268b74ca5292947ef5 100644 GIT binary patch literal 23113 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 diff --git a/tgstation.dme b/tgstation.dme index fcee4ede946..53979542c99 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1598,6 +1598,8 @@ #include "code\modules\surgery\surgery_step.dm" #include "code\modules\surgery\tail_modification.dm" #include "code\modules\surgery\tools.dm" +#include "code\modules\surgery\organs\augments_arms.dm" +#include "code\modules\surgery\organs\augments_chest.dm" #include "code\modules\surgery\organs\augments_external.dm" #include "code\modules\surgery\organs\augments_eyes.dm" #include "code\modules\surgery\organs\augments_internal.dm"