From d402ce4ee21442f01e5fc5a877eb79e0ad85c315 Mon Sep 17 00:00:00 2001 From: Fikou <23585223+Fikou@users.noreply.github.com> Date: Tue, 15 Nov 2022 22:50:30 +0100 Subject: [PATCH] New Station Trait: Cybernetic Revolution + Body Purist Quirk (#71229) ## About The Pull Request Adds a new station trait, the Cybernetic Revolution It causes every crewmember to spawn with a cybernetic implant/organ (it depends on their job). For example. the bartender has an upgraded cybernetic liver, security officers have extendable flashes, prisoners have flash shielded eyes. For AIs, they get the surveillance upgrade. The trait also lowers research costs for the cybernetic designs, triples the price of EMP kits and EMP flashlights, doubles price of EMP bombs, and allows traitors to buy autosurgeons, so they can implant themselves with whatever they ripped out of the crew. If you do not wish to partake, you can also take the Body Purist quirk, which prevents you from getting a cybernetic, but everytime you have a mechanical limb/organ from some other source, you will take a severe mood penalty. ## Why It's Good For The Game This could be a cool modifier to rounds once in a while, slightly modifying the gameplay of all the crew. Also our implant system is very barely used, so why not? ![image](https://user-images.githubusercontent.com/23585223/201492290-2043bbe8-8270-4114-add2-a612eafa0ec7.png) ## Changelog :cl: add: New Station Trait: Cybernetic Revolution add: Body Purist Quirk /:cl: Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> --- code/__DEFINES/traits.dm | 1 + .../subsystem/processing/quirks.dm | 3 +- .../mood_events/generic_negative_events.dm | 6 ++ code/datums/quirks/negative.dm | 73 ++++++++++++++++++ code/datums/station_traits/positive_traits.dm | 63 +++++++++++++++ code/modules/awaymissions/pamphlet.dm | 33 ++++++++ code/modules/research/techweb/all_nodes.dm | 25 ++++++ code/modules/surgery/organs/augments_arms.dm | 3 +- code/modules/surgery/organs/heart.dm | 9 ++- code/modules/unit_tests/_unit_tests.dm | 1 + .../modules/unit_tests/station_trait_tests.dm | 10 +++ code/modules/uplink/uplink_items/explosive.dm | 10 +++ code/modules/uplink/uplink_items/special.dm | 20 +++++ .../uplink/uplink_items/stealthy_tools.dm | 5 ++ icons/obj/medical/organs/organs.dmi | Bin 33362 -> 33362 bytes tgstation.dme | 1 + 16 files changed, 258 insertions(+), 5 deletions(-) create mode 100644 code/modules/unit_tests/station_trait_tests.dm create mode 100644 code/modules/uplink/uplink_items/special.dm diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index fab114039f3..d3e3a9ccf46 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -900,6 +900,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint" #define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched" #define STATION_TRAIT_BOTS_GLITCHED "station_trait_bot_glitch" +#define STATION_TRAIT_CYBERNETIC_REVOLUTION "station_trait_cybernetic_revolution" ///From the market_crash event #define MARKET_CRASH_EVENT_TRAIT "crashed_market_event" diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 04f7e67e80d..c0746ab07f9 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -27,7 +27,8 @@ PROCESSING_SUBSYSTEM_DEF(quirks) list("Bad Touch", "Friendly"), list("Extrovert", "Introvert"), list("Prosthetic Limb", "Quadruple Amputee"), - list("Quadruple Amputee", "Paraplegic","Frail"), + list("Quadruple Amputee", "Paraplegic", "Frail"), + list("Prosthetic Limb", "Body Purist"), ) /datum/controller/subsystem/processing/quirks/Initialize() diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index a24a178d91d..6dfa6434d07 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -403,3 +403,9 @@ description = "Blast it! That stunt didn't go as planned!" mood_change = -2 timeout = 4 MINUTES + +/datum/mood_event/body_purist + description = "I feel cybernetics attached to me, and I HATE IT!" + +/datum/mood_event/body_purist/add_effects(power) + mood_change = power diff --git a/code/datums/quirks/negative.dm b/code/datums/quirks/negative.dm index f42f0bf7da6..28d4d03cbb8 100644 --- a/code/datums/quirks/negative.dm +++ b/code/datums/quirks/negative.dm @@ -990,3 +990,76 @@ medical_record_text = "Patient is not literate." hardcore_value = 8 mail_goodies = list(/obj/item/pai_card) // can read things for you + +/datum/quirk/body_purist + name = "Body Purist" + desc = "You believe your body is a temple and its natural form is an embodiment of perfection. Accordingly, you despise the idea of ever augmenting it with unnatural parts, cybernetic, prosthetic, or anything like it." + icon = "person-rays" + value = -2 + mood_quirk = TRUE + gain_text = "You now begin to hate the idea of having cybernetic implants." + lose_text = "Maybe cybernetics aren't so bad. You now feel okay with augmentations and prosthetics." + medical_record_text = "This patient has disclosed an extreme hatred for unnatural bodyparts and augmentations." + hardcore_value = 3 + mail_goodies = list(/obj/item/paper/pamphlet/cybernetics) + var/cybernetics_level = 0 + +/datum/quirk/body_purist/add() + check_cybernetics() + RegisterSignal(quirk_holder, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_organ_gain)) + RegisterSignal(quirk_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_organ_lose)) + RegisterSignal(quirk_holder, COMSIG_CARBON_ATTACH_LIMB, PROC_REF(on_limb_gain)) + RegisterSignal(quirk_holder, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(on_limb_lose)) + +/datum/quirk/body_purist/remove() + UnregisterSignal(quirk_holder, list( + COMSIG_CARBON_GAIN_ORGAN, + COMSIG_CARBON_LOSE_ORGAN, + COMSIG_CARBON_ATTACH_LIMB, + COMSIG_CARBON_REMOVE_LIMB, + )) + quirk_holder.clear_mood_event("body_purist") + +/datum/quirk/body_purist/proc/check_cybernetics() + var/mob/living/carbon/owner = quirk_holder + if(!istype(owner)) + return + for(var/obj/item/bodypart/limb as anything in owner.bodyparts) + if(!IS_ORGANIC_LIMB(limb)) + cybernetics_level++ + for(var/obj/item/organ/internal/organ as anything in owner.internal_organs) + if(organ.organ_flags & ORGAN_SYNTHETIC) + cybernetics_level++ + for(var/obj/item/organ/external/organ as anything in owner.external_organs) + if(organ.organ_flags & ORGAN_SYNTHETIC) + cybernetics_level++ + update_mood() + +/datum/quirk/body_purist/proc/update_mood() + quirk_holder.clear_mood_event("body_purist") + if(cybernetics_level) + quirk_holder.add_mood_event("body_purist", /datum/mood_event/body_purist, -cybernetics_level * 10) + +/datum/quirk/body_purist/proc/on_organ_gain(datum/source, obj/item/organ/new_organ, special) + SIGNAL_HANDLER + if(new_organ.organ_flags & ORGAN_SYNTHETIC || new_organ.status == ORGAN_ROBOTIC) //why the fuck are there 2 of them + cybernetics_level++ + update_mood() + +/datum/quirk/body_purist/proc/on_organ_lose(datum/source, obj/item/organ/old_organ, special) + SIGNAL_HANDLER + if(old_organ.organ_flags & ORGAN_SYNTHETIC || old_organ.status == ORGAN_ROBOTIC) + cybernetics_level-- + update_mood() + +/datum/quirk/body_purist/proc/on_limb_gain(datum/source, obj/item/bodypart/new_limb, special) + SIGNAL_HANDLER + if(!IS_ORGANIC_LIMB(new_limb)) + cybernetics_level++ + update_mood() + +/datum/quirk/body_purist/proc/on_limb_lose(datum/source, obj/item/bodypart/old_limb, special) + SIGNAL_HANDLER + if(!IS_ORGANIC_LIMB(old_limb)) + cybernetics_level-- + update_mood() diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 902ac8f2386..77d30291c3f 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -270,3 +270,66 @@ // Put our filthy fingerprints all over the contents for(var/obj/item/item in wallet) item.add_fingerprint(living_mob, ignoregloves = TRUE) + +/datum/station_trait/cybernetic_revolution + name = "Cybernetic Revolution" + trait_type = STATION_TRAIT_POSITIVE + show_in_report = TRUE + weight = 1 + report_message = "The new trends in cybernetics have come to the station! Everyone has some form of cybernetic implant." + trait_to_give = STATION_TRAIT_CYBERNETIC_REVOLUTION + /// List of all job types with the cybernetics they should receive. + var/static/list/job_to_cybernetic = list( + /datum/job/assistant = /obj/item/organ/internal/heart/cybernetic, //real cardiac + /datum/job/atmospheric_technician = /obj/item/organ/internal/cyberimp/mouth/breathing_tube, + /datum/job/bartender = /obj/item/organ/internal/liver/cybernetic/tier3, + /datum/job/botanist = /obj/item/organ/internal/cyberimp/chest/nutriment, + /datum/job/captain = /obj/item/organ/internal/heart/cybernetic/tier3, + /datum/job/cargo_technician = /obj/item/organ/internal/stomach/cybernetic/tier2, + /datum/job/chaplain = /obj/item/organ/internal/cyberimp/brain/anti_drop, + /datum/job/chemist = /obj/item/organ/internal/liver/cybernetic/tier2, + /datum/job/chief_engineer = /obj/item/organ/internal/cyberimp/chest/thrusters, + /datum/job/chief_medical_officer = /obj/item/organ/internal/cyberimp/chest/reviver, + /datum/job/clown = /obj/item/organ/internal/cyberimp/brain/anti_stun, //HONK! + /datum/job/cook = /obj/item/organ/internal/cyberimp/chest/nutriment/plus, + /datum/job/curator = /obj/item/organ/internal/eyes/robotic/glow, + /datum/job/detective = /obj/item/organ/internal/lungs/cybernetic/tier3, + /datum/job/doctor = /obj/item/organ/internal/cyberimp/arm/surgery, + /datum/job/geneticist = /obj/item/organ/internal/fly, //we don't care about implants, we have cancer. + /datum/job/head_of_personnel = /obj/item/organ/internal/eyes/robotic, + /datum/job/head_of_security = /obj/item/organ/internal/eyes/robotic/thermals, + /datum/job/janitor = /obj/item/organ/internal/eyes/robotic/xray, + /datum/job/lawyer = /obj/item/organ/internal/heart/cybernetic/tier2, + /datum/job/mime = /obj/item/organ/internal/tongue/robot, //... + /datum/job/paramedic = /obj/item/organ/internal/cyberimp/eyes/hud/medical, + /datum/job/prisoner = /obj/item/organ/internal/eyes/robotic/shield, + /datum/job/psychologist = /obj/item/organ/internal/ears/cybernetic/upgraded, + /datum/job/quartermaster = /obj/item/organ/internal/stomach/cybernetic/tier3, + /datum/job/research_director = /obj/item/organ/internal/cyberimp/bci, + /datum/job/roboticist = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic, + /datum/job/scientist = /obj/item/organ/internal/ears/cybernetic, + /datum/job/security_officer = /obj/item/organ/internal/cyberimp/arm/flash, + /datum/job/shaft_miner = /obj/item/organ/internal/monster_core/rush_gland, + /datum/job/station_engineer = /obj/item/organ/internal/cyberimp/arm/toolset, + /datum/job/virologist = /obj/item/organ/internal/lungs/cybernetic/tier2, + /datum/job/warden = /obj/item/organ/internal/cyberimp/eyes/hud/security, + ) + +/datum/station_trait/cybernetic_revolution/New() + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_SPAWN, PROC_REF(on_job_after_spawn)) + +/datum/station_trait/cybernetic_revolution/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/spawned, client/player_client) + SIGNAL_HANDLER + + var/datum/quirk/body_purist/body_purist = /datum/quirk/body_purist + if(initial(body_purist.name) in player_client.prefs.all_quirks) + return + var/cybernetic_type = job_to_cybernetic[job.type] + if(!cybernetic_type) + if(isAI(spawned)) + var/mob/living/silicon/ai/ai = spawned + ai.eyeobj.relay_speech = TRUE //surveillance upgrade. the ai gets cybernetics too. + return + var/obj/item/organ/internal/cybernetic = new cybernetic_type() + cybernetic.Insert(spawned, special = TRUE, drop_if_replaced = FALSE) diff --git a/code/modules/awaymissions/pamphlet.dm b/code/modules/awaymissions/pamphlet.dm index 5220da6bfa3..be8aa9de890 100644 --- a/code/modules/awaymissions/pamphlet.dm +++ b/code/modules/awaymissions/pamphlet.dm @@ -46,3 +46,36 @@ As a participant in the Nanotrasen Gateway Project, you will be on the frontiers of space. \ Though complete safety is assured, participants are advised to prepare for inhospitable \ environs." + +/obj/item/paper/pamphlet/cybernetics + name = "pamphlet - 'Synthman's Cybernetic Starter Gear!'" + default_raw_text = "Join the Body Modder Revolution today! We are offering FREE SAMPLES of the latest and greatest \ + cybernetic augments by Synthman Co. to you in this rare exclusive offer! With this letter, you are being gifted a \ + special limited edition choice NTSDA-certified grade-A cybernetic implant, FREE OF CHARGE! Build up your body to \ + GREATNESS with Synthman's new exclusive line of cybernetic products! Become greater, stronger, and BETTER today!" + var/obj/item/organ/internal/heart/cybernetic/sample + +/obj/item/paper/pamphlet/cybernetics/Initialize(mapload) + . = ..() + sample = new(src) + update_desc() + +/obj/item/paper/pamphlet/cybernetics/update_desc(updates) + . = ..() + desc = "A pamphlet encouraging the reader to implant themselves.[sample ? " Has an attached \"sample\"..." : ""]" + +/obj/item/paper/pamphlet/cybernetics/Destroy() + QDEL_NULL(sample) + return ..() + +/obj/item/paper/pamphlet/cybernetics/Exited(atom/movable/gone, direction) + . = ..() + if(gone == sample) + sample = null + update_desc() + +/obj/item/paper/pamphlet/cybernetics/attack_self(mob/user, modifiers) + . = ..() + to_chat(user, span_notice("As you read the pamphlet, a free sample falls out!")) + sample.forceMove(drop_location()) + playsound(sample, 'sound/misc/splort.ogg', 50, vary = TRUE) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 797af3a3f67..b1227738816 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1274,6 +1274,11 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) +/datum/techweb_node/cyber_organs/New() + ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION)) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500) + /datum/techweb_node/cyber_organs_upgraded id = "cyber_organs_upgraded" display_name = "Upgraded Cybernetic Organs" @@ -1288,6 +1293,11 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) +/datum/techweb_node/cyber_organs_upgraded/New() + ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION)) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + /datum/techweb_node/cyber_implants id = "cyber_implants" display_name = "Cybernetic Implants" @@ -1304,6 +1314,11 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) +/datum/techweb_node/cyber_implants/New() + ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION)) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + /datum/techweb_node/adv_cyber_implants id = "adv_cyber_implants" display_name = "Advanced Cybernetic Implants" @@ -1317,6 +1332,11 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) +/datum/techweb_node/adv_cyber_implants/New() + ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION)) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) + /datum/techweb_node/combat_cyber_implants id = "combat_cyber_implants" display_name = "Combat Cybernetic Implants" @@ -1331,6 +1351,11 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) +/datum/techweb_node/combat_cyber_implants/New() + ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION)) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) + ////////////////////////Tools//////////////////////// /datum/techweb_node/basic_mining diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 026b5b5ceb2..2119f0883c0 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -274,7 +274,8 @@ active_item.set_light_on(TRUE) /obj/item/organ/internal/cyberimp/arm/flash/Retract() - active_item.set_light_on(FALSE) + if(active_item) + active_item.set_light_on(FALSE) return ..() /obj/item/organ/internal/cyberimp/arm/baton diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index a78388cf57a..728f51493c5 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -182,7 +182,8 @@ /obj/item/organ/internal/heart/cybernetic name = "basic cybernetic heart" desc = "A basic electronic device designed to mimic the functions of an organic human heart." - icon_state = "heart-c" + icon_state = "heart-c-on" + base_icon_state = "heart-c" organ_flags = ORGAN_SYNTHETIC maxHealth = STANDARD_ORGAN_THRESHOLD*0.75 //This also hits defib timer, so a bit higher than its less important counterparts @@ -194,7 +195,8 @@ /obj/item/organ/internal/heart/cybernetic/tier2 name = "cybernetic heart" desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma." - icon_state = "heart-c-u" + icon_state = "heart-c-u-on" + base_icon_state = "heart-c-u" maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD dose_available = TRUE emp_vulnerability = 40 @@ -202,7 +204,8 @@ /obj/item/organ/internal/heart/cybernetic/tier3 name = "upgraded cybernetic heart" desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma. This upgraded model can regenerate its dose after use." - icon_state = "heart-c-u2" + icon_state = "heart-c-u2-on" + base_icon_state = "heart-c-u2" maxHealth = 2 * STANDARD_ORGAN_THRESHOLD dose_available = TRUE emp_vulnerability = 20 diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index c191f76f7bc..6a2d13ffe55 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -183,6 +183,7 @@ #include "spell_shapeshift.dm" #include "spritesheets.dm" #include "stack_singular_name.dm" +#include "station_trait_tests.dm" #include "stomach.dm" #include "strippable.dm" #include "subsystem_init.dm" diff --git a/code/modules/unit_tests/station_trait_tests.dm b/code/modules/unit_tests/station_trait_tests.dm new file mode 100644 index 00000000000..b74f6503a08 --- /dev/null +++ b/code/modules/unit_tests/station_trait_tests.dm @@ -0,0 +1,10 @@ +/// This test spawns various station traits and looks through them to see if there's any errors. +/datum/unit_test/station_traits + +/datum/unit_test/station_traits/Run() + var/datum/station_trait/cybernetic_revolution/cyber_trait = allocate(/datum/station_trait/cybernetic_revolution) + for(var/datum/job/job in subtypesof(/datum/job)) + if(!(initial(job.job_flags) & JOB_CREW_MEMBER)) + continue + if(!(job in cyber_trait.job_to_cybernetic)) + Fail("Job [job] does not have an assigned cybernetic for [cyber_trait.type] station trait.") diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm index d7a02acf33f..5a65aebadbc 100644 --- a/code/modules/uplink/uplink_items/explosive.dm +++ b/code/modules/uplink/uplink_items/explosive.dm @@ -62,6 +62,11 @@ item = /obj/item/storage/box/syndie_kit/emp cost = 2 +/datum/uplink_item/explosives/emp/New() + ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION)) + cost *= 3 + /datum/uplink_item/explosives/pizza_bomb name = "Pizza Bomb" desc = "A pizza box with a bomb cunningly attached to the lid. The timer needs to be set by opening the box; afterwards, \ @@ -88,6 +93,11 @@ item = /obj/item/sbeacondrop/emp cost = 7 +/datum/uplink_item/explosives/syndicate_bomb/emp/New() + ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION)) + cost *= 2 + // High progression cost /datum/uplink_item/explosives/syndicate_bomb diff --git a/code/modules/uplink/uplink_items/special.dm b/code/modules/uplink/uplink_items/special.dm new file mode 100644 index 00000000000..00425f2089a --- /dev/null +++ b/code/modules/uplink/uplink_items/special.dm @@ -0,0 +1,20 @@ +/datum/uplink_category/special + name = "Special" + weight = -3 + +/datum/uplink_item/special + category = /datum/uplink_category/special + cant_discount = TRUE + surplus = 0 + purchasable_from = NONE + +/datum/uplink_item/special/autosurgeon + name = "Syndicate Autosurgeon" + desc = "A multi-use autosurgeon for implanting whatever you want into yourself. Rip that station apart and make it part of you." + item = /obj/item/autosurgeon/syndicate + cost = 5 + +/datum/uplink_item/special/autosurgeon/New() + ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION)) + purchasable_from |= UPLINK_TRAITORS diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm index 32ece25bd96..f6de15506a5 100644 --- a/code/modules/uplink/uplink_items/stealthy_tools.dm +++ b/code/modules/uplink/uplink_items/stealthy_tools.dm @@ -58,6 +58,11 @@ cost = 4 surplus = 30 +/datum/uplink_item/stealthy_tools/emplight/New() + ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION)) + cost *= 3 + /datum/uplink_item/stealthy_tools/mulligan name = "Mulligan" desc = "Screwed up and have security on your tail? This handy syringe will give you a completely new identity \ diff --git a/icons/obj/medical/organs/organs.dmi b/icons/obj/medical/organs/organs.dmi index 85e372b4b08ca6c18bc741b059f7d389cdc3b3e6..8402814dcd05c2d9fd66cd1fedf55e8054e65ae1 100644 GIT binary patch delta 818 zcmV-21I_%>gaXop0+2|5p0u}I7E=^+XkS5KY}#fck%lB^>OTD*oXlpXbxHS@03S(_ zKSj~+i+?|VdHPm7etp_rFeVZ%j>X}h58KT%HMuX2#Y45-^hjNw=RYY!#^PAKJ4GOV zx7{=pQ*kWz+f5rG;QaeFwfkY^c8yB*2r=)ZZLQ?OAs@Dz20cuF#j*HQ?#ny727|CO zTkrp1Z9b)5p_!{!_^cOCfB66Ohq5XUW%aA=xGK`P80&X%wa$07=={?g8Ok?ec)DOz z19`e&G)ORWgORJP+-|g!m5QFJVVshcGo*bZ^@LtX%Ry6?0CjKW3dql?ks(E(FDAK@6aW z6u@QT$;zexUhhIjqtrrP0HGV%H_G%zW+~PMCT^gYcfX zbGgSDmhbeYmz)O4#j&XNWp%iJ025v?ViSbVIAtJRlB<%Mp&J|FApgpn~*?QV8@ zmokvItXASqE*L%N+9Z}yciu*_sL)Gf zgR}#&K_%df%%ERPh{1VChUM#pbafB0!~JRt!;bZT#^PbM#bJd7h9T=BLkupPDnw!M zz}W>zXAA7UV;-PhWH%9?iJL_`%bWPI+?UIqJaFD+5q~DVk8k`S&-P;MTJm`X9+9|} zSfgRe{KiIav1_*OYHS(Sf5Vz*$SDG`Il?R29HZ_rsTtp`h5LuHs>&q?=CBdCk>FZC wIel0p+`+ntcd$Mp?qGd7+`%80;P=JnZ;!>}*Qf1&V6r$96GQh)vt|SAeoxS)kN^Mx delta 818 zcmV-21I_%>gaXop0+2|5nY6cD7E=^+XkS5KY})2VA`MB-)P4FrILUfu>m|Ln1o%jb z{3(k5Sp50*+slvQ`TNWEiZPLJaVm~~eA;easm@(-DxMD8O^4KWdHRzwWGqg_hjRqt z58F*mF%_p`zuhzu0#3i*QoEm4Zda>hhY<5ln#M{l9P(+qsnNrKSe%M4<-VNR)fj}G z*?RvU*5*^{6`Hup$}OJ!_|M6Y<)J*5hkx4+<|xBroZrER73iYlFYiiUz7xRH6{8x+ z(-otk>=V};IbEI`XDIQ5)T?%(nsH24&XD$<)DwD;mV>4&0jkc*84j9yVm2vx_o=7! zAPp+bSabT8b{e>U)%ElPx5;7dFd}#xZt3}f+qCOFqyR=3Quhk}V!3z&x0b%Tah8j6 zCv^d!?~!ZLOK=B?8xH~XXNj00*1BZVLnmJMc=k|T@(@I?X*0BgYdx^;weK)WF9y&< z3g9yFXk}9XuXmxbuWmj)#1>VUafp(|pld~j6@#wGQtM%Vv27DrW5Gg025v@VjYApIA$PSlADEzt%jJew(mD@_|>~u7H$V! zhzaxb3!+}%ME;6#mFHg)&SZsQ9DM*W(m#={=vml$hA3yrdjEQ?a+Fo2FkasY&SV&! zP(uLD#ONY_CSk~ik#`lU&`IN3!z{xQ^~sDQp27RH3zGE>kkda(6qu zOBu-9aj2osSUX#)5N(j*ot`kmGd+{J63bJ0-)p9isg<~sD@G5xHi>1>oi~vzDs&Rr zAZ<@F