From e8bbe783c6ea2fb7c2fa5c78d8a4f9aa861d3a23 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 28 Jun 2017 17:01:34 -0400 Subject: [PATCH] arm augments --- code/game/objects/items/devices/flash.dm | 33 ++ code/game/objects/items/weapons/kitchen.dm | 7 + .../objects/items/weapons/melee/energy.dm | 21 +- .../living/carbon/human/species/station.dm | 2 +- code/modules/projectiles/guns/mounted.dm | 26 +- .../research/designs/medical_designs.dm | 11 + code/modules/surgery/organs/augments_arms.dm | 315 ++++++++++++++++++ .../surgery/organs/augments_internal.dm | 169 ---------- code/modules/surgery/organs/organ_internal.dm | 1 - code/modules/surgery/organs/vocal_cords.dm | 1 - code/modules/surgery/organs_internal.dm | 2 +- code/modules/surgery/robotics.dm | 2 +- icons/mob/inhands/items_lefthand.dmi | Bin 189747 -> 190030 bytes icons/mob/inhands/items_righthand.dmi | Bin 186591 -> 186840 bytes icons/obj/guns/energy.dmi | Bin 35012 -> 35126 bytes icons/obj/items_cyborg.dmi | Bin 0 -> 2258 bytes icons/obj/surgery.dmi | Bin 35543 -> 36932 bytes icons/obj/weapons.dmi | Bin 62404 -> 62803 bytes paradise.dme | 1 + sound/weapons/flashbang.ogg | Bin 0 -> 11020 bytes 20 files changed, 390 insertions(+), 201 deletions(-) create mode 100644 code/modules/surgery/organs/augments_arms.dm create mode 100644 icons/obj/items_cyborg.dmi create mode 100644 sound/weapons/flashbang.ogg diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index de82f0b8c34..1a1ed2b4c5e 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -201,4 +201,37 @@ icon_state = "memorizer" item_state = "nullrod" +/obj/item/device/flash/armimplant + name = "photon projector" + desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocals fix the flashbulb if it ever burns out." + var/flashcd = 20 + var/overheat = 0 + var/obj/item/organ/internal/cyberimp/arm/flash/I = null + +/obj/item/device/flash/armimplant/Destroy() + I = null + return ..() + +/obj/item/device/flash/armimplant/burn_out() + if(I && I.owner) + to_chat(I.owner, "Your photon projector implant overheats and deactivates!") + I.Retract() + overheat = FALSE + addtimer(src, "cooldown", flashcd * 2) + +/obj/item/device/flash/armimplant/try_use_flash(mob/user = null) + if(overheat) + if(I && I.owner) + to_chat(I.owner, "Your photon projector is running too hot to be used again so quickly!") + return FALSE + overheat = TRUE + addtimer(src, "cooldown", flashcd) + playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) + update_icon(1) + return TRUE + +/obj/item/device/flash/armimplant/proc/cooldown() + overheat = FALSE + + /obj/item/device/flash/synthetic //just a regular flash now diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 13bc85999e0..c642226a8d6 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -151,6 +151,13 @@ origin_tech = "materials=3;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." + origin_tech = null + /obj/item/weapon/kitchen/knife/carrotshiv name = "carrot shiv" icon_state = "carrotshiv" diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 1c1dbbd8363..2bb2924837d 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -200,26 +200,29 @@ name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" - force = 30 - sharp = 1 - edge = 1 + force = 30 //Normal attacks deal esword damage + hitsound = 'sound/weapons/blade1.ogg' + active = 1 throwforce = 1//Throwing or dropping the item deletes it. throw_speed = 3 throw_range = 1 w_class = WEIGHT_CLASS_BULKY //So you can't hide it in your pocket or some such. - armour_penetration = 50 - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/datum/effect/system/spark_spread/spark_system + sharp = 1 + edge = 1 //Most of the other special functions are handled in their own files. aka special snowflake code so kewl /obj/item/weapon/melee/energy/blade/New() + ..() spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) -/obj/item/weapon/melee/energy/blade/dropped() - ..() - qdel(src) - /obj/item/weapon/melee/energy/blade/attack_self(mob/user) return + +/obj/item/weapon/melee/energy/blade/hardlight + name = "hardlight blade" + desc = "An extremely sharp blade made out of hard light. Packs quite a punch." + icon_state = "lightblade" + item_state = "lightblade" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 150f2d647bc..52c66369fe9 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -922,7 +922,7 @@ "brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain, "cell" = /obj/item/organ/internal/cell, "optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2. - "charger" = /obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord + "charger" = /obj/item/organ/internal/cyberimp/arm/power_cord ) vision_organ = /obj/item/organ/internal/eyes/optical_sensor diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm index 8fec6cd8b8e..a767c94cc9c 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/mounted.dm @@ -1,30 +1,20 @@ /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 - flags = NODROP - w_class = WEIGHT_CLASS_HUGE - can_flashlight = 0 selfcharge = 1 + can_flashlight = 0 trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead -/obj/item/weapon/gun/energy/gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... - ..() - loc = null//send it to nullspace to get retrieved by the implant later on. gotta cover those edge cases. - /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 - flags = NODROP - w_class = WEIGHT_CLASS_HUGE - materials = null selfcharge = 1 - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - -/obj/item/weapon/gun/energy/laser/mounted/dropped() - ..() - loc = null + trigger_guard = TRIGGER_GUARD_ALLOW_ALL \ 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 601ad98346a..52a5b9e027c 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -271,6 +271,17 @@ build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube category = list("Misc", "Medical Designs") +/datum/design/cyberimp_toolset + name = "Toolset Arm Implant" + desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm." + id = "ci-toolset" + req_tech = list("materials" = 3, "engineering" = 4, "biotech" = 4, "powerstorage" = 4) + build_type = PROTOLATHE | MECHFAB + materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500) + construction_time = 200 + build_path = /obj/item/organ/internal/cyberimp/arm/toolset + 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." diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm new file mode 100644 index 00000000000..a3c1b2bb474 --- /dev/null +++ b/code/modules/surgery/organs/augments_arms.dm @@ -0,0 +1,315 @@ +/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!" + parent_organ = "r_arm" + slot = "r_arm_device" + icon_state = "implant-toolkit" + w_class = WEIGHT_CLASS_NORMAL + 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 = parent_organ + "_device" + items_list = contents.Copy() + +/obj/item/organ/internal/cyberimp/arm/update_icon() + if(parent_organ == "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) + ..() + to_chat(user, "[src] is assembled in the [parent_organ == "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(isscrewdriver(W)) + if(parent_organ == "r_arm") + parent_organ = "l_arm" + else + parent_organ = "r_arm" + slot = parent_organ + "_device" + to_chat(user, "You modify [src] to be installed on the [parent_organ == "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) + to_chat(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 [parent_organ == "r_arm" ? "right" : "left"] arm.", + "[holder] snaps back into your [parent_organ == "r_arm" ? "right" : "left"] arm.", + "You hear a short mechanical noise.") + + if(istype(holder, /obj/item/device/flash/armimplant)) + var/obj/item/device/flash/F = holder + F.set_light(0) + + owner.unEquip(holder, 1) + holder.forceMove(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 = WEIGHT_CLASS_HUGE + holder.materials = null + + if(istype(holder, /obj/item/device/flash/armimplant)) + var/obj/item/device/flash/F = holder + F.set_light(7) + + var/arm_slot = (parent_organ == "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(parent_organ == "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(parent_organ == "r_arm" ? owner.hand : !owner.hand) + owner.swap_hand() + + owner.visible_message("[owner] extends [holder] from \his [parent_organ == "r_arm" ? "right" : "left"] arm.", + "You extend [holder] from your [parent_organ == "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)) + to_chat(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 = (parent_organ == "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 [parent_organ == "r_arm" ? "right" : "left"] arm!") + playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1) + to_chat(owner, "You feel an explosion erupt inside your [parent_organ == "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=4;combat=4;biotech=4;powerstorage=4;syndicate=3" + contents = newlist(/obj/item/weapon/gun/energy/laser/mounted) + +/obj/item/organ/internal/cyberimp/arm/gun/laser/l + parent_organ = "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" + contents = newlist(/obj/item/weapon/gun/energy/gun/advtaser/mounted) + +/obj/item/organ/internal/cyberimp/arm/gun/taser/l + parent_organ = "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=3;engineering=4;biotech=3;powerstorage=4" + 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 + parent_organ = "l_arm" + +/obj/item/organ/internal/cyberimp/arm/toolset/emag_act() + if(!(locate(/obj/item/weapon/kitchen/knife/combat/cyborg) in items_list)) + to_chat(usr, "You unlock [src]'s integrated knife!") + items_list += new /obj/item/weapon/kitchen/knife/combat/cyborg(src) + return 1 + return 0 + +/obj/item/organ/internal/cyberimp/arm/esword + name = "arm-mounted energy blade" + desc = "An illegal, and highly dangerous cybernetic implant that can project a deadly blade of concentrated enregy." + contents = newlist(/obj/item/weapon/melee/energy/blade/hardlight) + origin_tech = "materials=4;combat=5;biotech=3;powerstorage=2;syndicate=5" + +/obj/item/organ/internal/cyberimp/arm/medibeam + name = "integrated medical beamgun" + desc = "A cybernetic implant that allows the user to project a healing beam from their hand." + contents = newlist(/obj/item/weapon/gun/medbeam) + origin_tech = "materials=5;combat=2;biotech=5;powerstorage=4;syndicate=1" + +/obj/item/organ/internal/cyberimp/arm/flash + name = "integrated high-intensity photon projector" //Why not + desc = "An integrated projector mounted onto a user's arm, that is able to be used as a powerful flash." + contents = newlist(/obj/item/device/flash/armimplant) + origin_tech = "materials=4;combat=3;biotech=4;magnets=4;powerstorage=3" + +/obj/item/organ/internal/cyberimp/arm/flash/New() + ..() + if(locate(/obj/item/device/flash/armimplant) in items_list) + var/obj/item/device/flash/armimplant/F = locate(/obj/item/device/flash/armimplant) in items_list + F.I = src + +/obj/item/organ/internal/cyberimp/arm/baton + name = "arm electrification implant" + desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm." + contents = newlist(/obj/item/borg/stun) + origin_tech = "materials=3;combat=5;biotech=4;powerstorage=4;syndicate=3" + +/obj/item/organ/internal/cyberimp/arm/combat + name = "combat cybernetics implant" + desc = "A powerful cybernetic implant that contains combat modules built into the user's arm" + contents = newlist(/obj/item/weapon/melee/energy/blade/hardlight, /obj/item/weapon/gun/medbeam, /obj/item/borg/stun, /obj/item/device/flash/armimplant) + origin_tech = "materials=5;combat=7;biotech=5;powerstorage=5;syndicate=6;programming=5" + +/obj/item/organ/internal/cyberimp/arm/combat/New() + ..() + if(locate(/obj/item/device/flash/armimplant) in items_list) + var/obj/item/device/flash/armimplant/F = locate(/obj/item/device/flash/armimplant) in items_list + F.I = src + +/obj/item/organ/internal/cyberimp/arm/surgery + name = "surgical toolset implant" + desc = "A set of surgical tools hidden behind a concealed panel on the user's arm" + contents = newlist(/obj/item/weapon/retractor, /obj/item/weapon/hemostat, /obj/item/weapon/cautery, /obj/item/weapon/surgicaldrill, /obj/item/weapon/scalpel, /obj/item/weapon/circular_saw, /obj/item/weapon/bonegel, /obj/item/weapon/FixOVein, /obj/item/weapon/bonesetter) + origin_tech = "materials=3;engineering=3;biotech=3;programming=2;magnets=3" + +// lets make IPCs even *more* vulnerable to EMPs! +/obj/item/organ/internal/cyberimp/arm/power_cord + name = "APC-compatible power adapter implant" + desc = "An implant commonly installed inside IPCs in order to allow them to easily collect energy from their environment" + origin_tech = "materials=3;biotech=2;powerstorage=3" + contents = newlist(/obj/item/apc_powercord) + +/obj/item/organ/internal/cyberimp/arm/power_cord/emp_act(severity) + // To allow repair via nanopaste/screwdriver + // also so IPCs don't also catch on fire and fall even more apart upon EMP + damage = 1 + crit_fail = TRUE + +/obj/item/organ/internal/cyberimp/arm/power_cord/surgeryize() + if(crit_fail && owner) + to_chat(owner, "Your [src] feels functional again.") + crit_fail = FALSE + + +/obj/item/apc_powercord + name = "power cable" + desc = "Insert into a nearby APC to draw power from it." + icon = 'icons/obj/power.dmi' + icon_state = "wire1" + flags = NOBLUDGEON + +/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) + return ..() + user.changeNext_move(CLICK_CD_MELEE) + var/obj/machinery/power/apc/A = target + var/mob/living/carbon/human/H = user + if(H.get_int_organ(/obj/item/organ/internal/cell)) + if(A.emagged || A.stat & BROKEN) + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread + s.set_up(3, 1, A) + s.start() + to_chat(H, "The APC power currents surge erratically, damaging your chassis!") + H.adjustFireLoss(10,0) + else if(A.cell && A.cell.charge > 0) + if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) + to_chat(user, "You are already fully charged!") + else + addtimer(src, "powerdraw_loop", 0, TRUE, A, H) + else + to_chat(user, "There is no charge to draw from that APC.") + else + to_chat(user, "You lack a cell in which to store charge!") + +/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) + H.visible_message("[H] inserts a power connector into \the [A].", "You begin to draw power from \the [A].") + while(do_after(H, 10, target = A)) + if(loc != H) + to_chat(H, "You must keep your connector out while charging!") + break + if(A.cell.charge == 0) + to_chat(H, "\The [A] has no more charge.") + break + A.charging = 1 + if(A.cell.charge >= 500) + H.nutrition += 50 + A.cell.charge -= 500 + to_chat(H, "You siphon off some of the stored charge for your own use.") + else + H.nutrition += A.cell.charge/10 + A.cell.charge = 0 + to_chat(H, "You siphon off the last of \the [A]'s charge.") + break + if(H.nutrition > NUTRITION_LEVEL_WELL_FED) + to_chat(H, "You are now fully charged.") + break + H.visible_message("[H] unplugs from \the [A].", "You unplug from \the [A].") \ 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 13061db2c4d..0a99a9b9e5a 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -273,175 +273,6 @@ if(H.stat == CONSCIOUS) to_chat(H, "You feel your heart beating again!") -//ARM...THAT GO IN THE CHEST -/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. - var/lasthand = null - -/obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click() - toggle_item() - -/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/toggle_item() - if(overloaded)//ensure the implant isn't broken - to_chat(owner, "The implant doesn't respond. It seems to be broken...") - return - owner.changeNext_move(CLICK_CD_MELEE) - if(owner.next_move < world.time) - return // No spam - 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.visible_message("[owner] retracts [holder].","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. - lasthand = owner.get_active_hand() - out = 1 - owner.visible_message("[owner] extends [holder]!","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 - to_chat(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.visible_message("[holder] forcibly retracts into [owner]'s arm.") - overload() // Make sure this doesn't happen again - -/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/overload() - owner.visible_message("A loud bang comes from [owner]...") - playsound(get_turf(owner), 'sound/effects/bang.ogg', 100, 1) - to_chat(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!!") - if(prob(50)) - if(lasthand == "r_hand") - var/obj/item/organ/external/limb = owner.get_organ("r_arm") - limb.droplimb(0, DROPLIMB_EDGE) - else if(lasthand == "l_hand") - var/obj/item/organ/external/limb = owner.get_organ("l_arm") - limb.droplimb(0, DROPLIMB_EDGE) - owner.say("I HAVE BEEN DISARMED!!!") - owner.adjustFireLoss(25)//severely injure him! - overloaded = TRUE - -/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=4;combat=4;biotech=4;powerstorage=4;syndicate=3" - 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) - -// lets make IPCs even *more* vulnerable to EMPs! -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord - name = "APC-compatible power adapter implant" - desc = "An implant commonly installed inside IPCs in order to allow them to easily collect energy from their environment" - origin_tech = "materials=3;biotech=2;powerstorage=3" - slot = "shoulders2" - actions_types = list(/datum/action/item_action/organ_action/toggle) - - -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/New() - ..() - holder = new /obj/item/apc_powercord(src) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/overload() - // To allow repair via nanopaste/screwdriver - // also so IPCs don't also catch on fire and fall even more apart upon EMP - damage = 1 - overloaded = TRUE - -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/surgeryize() - if(overloaded && owner) - to_chat(owner, "Your [src] feels functional again.") - overloaded = FALSE - - -/obj/item/apc_powercord - name = "power cable" - desc = "Insert into a nearby APC to draw power from it." - icon = 'icons/obj/power.dmi' - icon_state = "wire1" - flags = NODROP | NOBLUDGEON - -/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) - return ..() - user.changeNext_move(CLICK_CD_MELEE) - var/obj/machinery/power/apc/A = target - var/mob/living/carbon/human/H = user - if(H.get_int_organ(/obj/item/organ/internal/cell)) - if(A.emagged || A.stat & BROKEN) - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(3, 1, A) - s.start() - to_chat(H, "The APC power currents surge erratically, damaging your chassis!") - H.adjustFireLoss(10,0) - else if(A.cell && A.cell.charge > 0) - if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) - to_chat(user, "You are already fully charged!") - else - addtimer(src, "powerdraw_loop", 0, TRUE, A, H) - else - to_chat(user, "There is no charge to draw from that APC.") - else - to_chat(user, "You lack a cell in which to store charge!") - -/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) - H.visible_message("[H] inserts a power connector into \the [A].", "You begin to draw power from \the [A].") - while(do_after(H, 10, target = A)) - if(loc != H) - to_chat(H, "You must keep your connector out while charging!") - break - if(A.cell.charge == 0) - to_chat(H, "\The [A] has no more charge.") - break - A.charging = 1 - if(A.cell.charge >= 500) - H.nutrition += 50 - A.cell.charge -= 500 - to_chat(H, "You siphon off some of the stored charge for your own use.") - else - H.nutrition += A.cell.charge/10 - A.cell.charge = 0 - to_chat(H, "You siphon off the last of \the [A]'s charge.") - break - if(H.nutrition > NUTRITION_LEVEL_WELL_FED) - to_chat(H, "You are now fully charged.") - break - H.visible_message("[H] unplugs from \the [A].", "You unplug from \the [A].") - //BOX O' IMPLANTS /obj/item/weapon/storage/box/cyber_implants diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 47535c044eb..602a6e295d5 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -5,7 +5,6 @@ force = 1 w_class = WEIGHT_CLASS_SMALL throwforce = 0 - var/zone = "chest" var/slot // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! vital = 0 diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index e44f20046db..d3f3c2c933b 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -38,7 +38,6 @@ var/static/regex/multispin_words = regex("like a record baby") /obj/item/organ/internal/vocal_cords //organs that are activated through speech with the :x channel name = "vocal cords" icon_state = "appendix" - zone = "mouth" slot = "vocal_cords" parent_organ = "mouth" var/spans = null diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 420d56de43d..5dcb5954da5 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -14,7 +14,7 @@ /datum/surgery/organ_manipulation_boneless name = "Organ Manipulation" - possible_locs = list("chest","head","groin", "eyes", "mouth") + possible_locs = list("chest","head","groin", "eyes", "mouth", "l_arm", "r_arm") steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/internal/manipulate_organs,/datum/surgery_step/generic/cauterize) requires_organic_bodypart = 1 diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index e1dc252412d..5d8a81f4bc6 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -12,7 +12,7 @@ /datum/surgery/cybernetic_repair/internal name = "Internal Component Manipulation" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/robotics/manipulate_robotic_organs) - possible_locs = list("eyes", "chest","head","groin") + possible_locs = list("eyes", "chest","head","groin","l_arm","r_arm") requires_organic_bodypart = 0 /datum/surgery/cybernetic_amputation diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 1461df9bbbec659a929025dd4476019753f49185..ae7ba3e5f1a519eefe331b19671c09db59ccc268 100644 GIT binary patch delta 21010 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