From 585db8ba2820fef37a8bf11e309eba6270043537 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 27 Jun 2017 23:02:48 -0400 Subject: [PATCH 1/6] Breathing Tube Augment --- code/_onclick/hud/screen_objects.dm | 11 ++++++----- .../game/objects/items/weapons/tanks/tanks.dm | 4 +++- code/modules/clothing/clothing.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 14 ++++++++------ .../mob/living/carbon/carbon_defines.dm | 1 + code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/inventory.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 7 ++++--- code/modules/mob/living/carbon/life.dm | 7 ++++--- code/modules/mob/mob_grab.dm | 10 +++++++--- .../research/designs/medical_designs.dm | 11 +++++++++++ .../surgery/organs/augments_internal.dm | 18 ++++++++++++++++++ code/modules/surgery/organs/helpers.dm | 4 +--- code/modules/surgery/organs/organ_internal.dm | 4 ++++ icons/obj/surgery.dmi | Bin 35399 -> 35543 bytes 15 files changed, 70 insertions(+), 27 deletions(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 260df783bf9..d184f765eac 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -108,11 +108,12 @@ icon_state = "internal0" else var/no_mask = FALSE - if(!C.wear_mask || !(C.wear_mask.flags & AIRTIGHT)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!H.head || !(H.head.flags & AIRTIGHT)) - no_mask = TRUE + if(!C.get_organ_slot("breathing_tube")) + if(!C.wear_mask || !(C.wear_mask.flags & AIRTIGHT)) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(!H.head || !(H.head.flags & AIRTIGHT)) + no_mask = TRUE if(no_mask) to_chat(C, "You are not wearing a suitable mask or helmet.") diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 3b99936b0a8..27cbff53547 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -54,7 +54,9 @@ C.update_internals_hud_icon(0) else var/can_open_valve = 0 - if(C.wear_mask && C.wear_mask.flags & AIRTIGHT) + if(C.get_organ_slot("breathing_tube")) + can_open_valve = 1 + else if(C.wear_mask && C.wear_mask.flags & AIRTIGHT) can_open_valve = 1 else if(ishuman(C)) var/mob/living/carbon/human/H = C diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 3d11f40b1c9..596259b47da 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -332,7 +332,7 @@ BLIND // can't see anything mask_adjusted = 1 if(adjusted_flags) slot_flags = adjusted_flags - if(ishuman(user) && H.internal && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals. + if(ishuman(user) && H.internal && !H.get_organ_slot("breathing_tube") && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals. Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/ H.update_internals_hud_icon(0) H.internal = null diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 1407fba6998..8caecdb42d7 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -650,9 +650,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, "[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM].") var/no_mask - if(!(wear_mask && wear_mask.flags & AIRTIGHT)) - if(!(head && head.flags & AIRTIGHT)) - no_mask = 1 + if(!get_organ_slot("breathing_tube")) + if(!(wear_mask && wear_mask.flags & AIRTIGHT)) + if(!(head && head.flags & AIRTIGHT)) + no_mask = 1 if(no_mask) to_chat(usr, "[src] is not wearing a suitable mask or helmet!") return @@ -663,9 +664,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, update_internals_hud_icon(0) else var/no_mask2 - if(!(wear_mask && wear_mask.flags & AIRTIGHT)) - if(!(head && head.flags & AIRTIGHT)) - no_mask2 = 1 + if(!get_organ_slot("breathing_tube")) + if(!(wear_mask && wear_mask.flags & AIRTIGHT)) + if(!(head && head.flags & AIRTIGHT)) + no_mask2 = 1 if(no_mask2) to_chat(usr, "[src] is not wearing a suitable mask or helmet!") return diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 6e34291caae..ab7a5f1d5a9 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -3,6 +3,7 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD) var/list/stomach_contents = list() var/list/internal_organs = list() + var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. var/antibodies = 0 var/life_tick = 0 // The amount of life ticks that have processed on this mob. diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ba55801c522..2fec182504a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -428,7 +428,7 @@ /mob/living/carbon/human/show_inv(mob/user) user.set_machine(src) - var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask) + var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask) || get_organ_slot("breathing_tube") var/list/obscured = check_obscured_slots() var/dat = {" diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 8e1c32f931a..6edc2f0ae75 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -151,7 +151,7 @@ update_hair() //rebuild hair update_fhair() update_head_accessory() - if(internal) + if(internal && !get_organ_slot("breathing_tube")) internal = null update_internals_hud_icon(0) wear_mask_update(I, toggle_off = FALSE) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index f51ba71bff8..5a67b1c09a2 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -301,9 +301,10 @@ var/null_internals = 0 //internals are invalid, therefore turn them off var/skip_contents_check = 0 //rigsuit snowflake, oxygen tanks aren't stored inside the mob, so the 'contents.Find' check has to be skipped. - if(!(wear_mask && wear_mask.flags & AIRTIGHT)) //if NOT (wear_mask AND wear_mask.flags CONTAIN AIRTIGHT) - if(!(head && head.flags & AIRTIGHT)) //if NOT (head AND head.flags CONTAIN AIRTIGHT) - null_internals = 1 //not wearing a mask or suitable helmet + if(!get_organ_slot("breathing_tube")) + if(!(wear_mask && wear_mask.flags & AIRTIGHT)) //if NOT (wear_mask AND wear_mask.flags CONTAIN AIRTIGHT) + if(!(head && head.flags & AIRTIGHT)) //if NOT (head AND head.flags CONTAIN AIRTIGHT) + null_internals = 1 //not wearing a mask or suitable helmet if(istype(back, /obj/item/weapon/rig)) //wearing a rigsuit var/obj/item/weapon/rig/rig = back //needs to be typecasted because this doesn't use get_rig() for some reason diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index da764cafda3..cbfc9ddbfdf 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -183,9 +183,10 @@ if(internal) if(internal.loc != src) internal = null - if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask - if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet - internal = null //turn off internals + if(!get_organ_slot("breathing_tube")) + if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask + if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet + internal = null //turn off internals if(internal) update_internals_hud_icon(1) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index ecc987530ab..4b41b5084c6 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -167,9 +167,11 @@ */ + var/breathing_tube = affecting.get_organ_slot("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) @@ -177,7 +179,8 @@ //affecting.apply_effect(STUTTER, 5) //would do this, but affecting isn't declared as mob/living for some stupid reason. affecting.Stuttering(5) //It will hamper your voice, being choked and all. affecting.Weaken(5) //Should keep you down unless you get help. - affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) + if(!breathing_tube) + affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) adjust_position() @@ -290,7 +293,8 @@ msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]") assailant.next_move = world.time + 10 - affecting.AdjustLoseBreath(1) + if(!affecting.get_organ_slot("breathing_tube")) + affecting.AdjustLoseBreath(1) affecting.setDir(WEST) adjust_position() diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 66c150f636d..601ad98346a 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -260,6 +260,17 @@ build_path = /obj/item/organ/internal/cyberimp/eyes/shield category = list("Misc", "Medical") +/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" = 2, "biotech" = 3) + build_type = PROTOLATHE | MECHFAB + construction_time = 35 + materials = list(MAT_METAL = 600, 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." diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 4a7aa2554fc..13061db2c4d 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -144,6 +144,24 @@ spawn(90 / severity) crit_fail = 0 + +//[[[[MOUTH]]]] +/obj/item/organ/internal/cyberimp/mouth + parent_organ = "mouth" + +/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 = "implant_mask" + slot = "breathing_tube" + w_class = WEIGHT_CLASS_TINY + origin_tech = "materials=2;biotech=3" + +/obj/item/organ/internal/cyberimp/mouth/breathing_tube/emp_act(severity) + if(prob(60/severity) && owner) + to_chat(owner, "Your breathing tube suddenly closes!") + owner.AdjustLoseBreath(2) + /obj/item/organ/internal/cyberimp/brain/clown_voice name = "Comical implant" desc = "Uh oh." diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm index 94b0de5e066..61ed78d0e3b 100644 --- a/code/modules/surgery/organs/helpers.dm +++ b/code/modules/surgery/organs/helpers.dm @@ -30,9 +30,7 @@ return returnorg /mob/living/carbon/get_organ_slot(slot) - for(var/obj/item/organ/internal/O in internal_organs) - if(slot == O.slot) - return O + return internal_organs_slot[slot] /mob/living/carbon/get_int_organ_tag(tag) for(var/obj/item/organ/internal/O in internal_organs) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 071d579b0c0..47535c044eb 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -7,6 +7,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! vital = 0 var/non_primary = 0 @@ -29,6 +30,7 @@ owner = M M.internal_organs |= src + M.internal_organs_slot[slot] = src var/obj/item/organ/external/parent if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M @@ -52,6 +54,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) if(M.stat != DEAD)//safety check! M.death() diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index ac42a7d538c198000160e91d582f3d0dd7660e94..2d1bb9ac74953be0dda557c0c6b107ee7ffe87dc 100644 GIT binary patch delta 16649 zcmaL8by!tV_b$3N-Ko+gA>Aomg0!F@(%s#;kXBLz=>`$$?v#>lq`ReS(`WhpzH^`R zJonziAI!yCi#f+0bIdWu`;M`D;}K>O5Mt>-Ht)CZU1iK%Oq{J8U9BAK0l+gYKd~b^ zl@l*?T$%9c%ayLSiKe#kZf=#j>@yzX(E2R`z1^s{QXI-3M}4qF13o?F{h zH<$Ol0~{B3XJ&p|O>6$H>-N$4)x!FH}joGAg-C*%-w6w$nMvL0B7=AN|59 zUj3v(wVf$KVT-gba8BRXUAE{mlM2Bbunwj9J?$9TXOgncB~z~5Euo^c9!`TUpv2$u zJLj#SaUV4j#v3&wL1TH!`QT;g1W5`ju#|3~z(ej1Y}48Od=H!OX$xb{?HMkvNMd!W zYDhf3^?NDaazlvmc?H+9SvgZSto=K<=#^?kS~w5+RraaLW%~PF{(W~KB#MQYMz53{YF!>=c%vs|LPNd%N`3W;W>?>t z@C_>w)3b>90oi`~=c0m^Ux*6tqVW4@OgeHx@cM}WkkgL(~DvXdCp~oA*c_xL+5Jy;*jr!4~wS7G8S-r9Wei$fsIff~A zWliveHGTA&fi1$0Ov0F6*T%7H6dyyRfPNk5;u{UtVC%B#d z32#GSlWmY4y~#b&wS!8?kk(^K;Lcdpx`O^l>9{v}sP)#H*|oF|_m}dJ8kITOjbBF8 zuv=;7c~hA0nV_gpS}G93nk=FKe#sP>vbYmbhyO)p;o1i_)-CMdw4XMh^SW9QRHCBCwI4MaCggQ zp5ZssL)QHAtJ~yDh#QFJ`fi#TnFFI#;){2{vzZHtlB{BCOCWulKEofyx)_)B)E zGv<4w*6t>Z9L2bXzD~(|os#@|{Oasvhj!PLyKF=$?#gB7_j{Y| zEH}^&!c*-Dly-)NkAm}Up13$W1G+;2{PqjsLM~hH?SkG@0iOph81v;(z^)-)T(-c-A;Kh-V>nadFX-K|;gFmvB4N_R#Hr ztJ53C)wM38&UyQ=xDZ`3@r0%BVE;yerk76)EMfBo@OnHOJBR}V0}VNe0U*==hUw?e zpT{S?RJpCKlxAjTqr0w*%*=uMWpa9Y6qJv(gjyfmh$#_P{kE#Bs|_cy1y+`?k^4qQ z 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 delta 16504 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 Date: Wed, 28 Jun 2017 17:01:34 -0400 Subject: [PATCH 2/6] 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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