diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 3e3f140a711..06992926f90 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -172,6 +172,7 @@ #define ORGAN_SLOT_EARS "ears" #define ORGAN_SLOT_EYES "eye_sight" #define ORGAN_SLOT_HEART "heart" +#define ORGAN_SLOT_STACK "stack" //SKYRAT EDIT, STACKS #define ORGAN_SLOT_HEART_AID "heartdrive" #define ORGAN_SLOT_HUD "eye_hud" #define ORGAN_SLOT_LIVER "liver" @@ -226,6 +227,7 @@ GLOBAL_LIST_INIT(organ_process_order, list( ORGAN_SLOT_LUNGS, ORGAN_SLOT_HEART, ORGAN_SLOT_ZOMBIE, + ORGAN_SLOT_STACK, //SKYRAT EDIT ORGAN_SLOT_THRUSTERS, ORGAN_SLOT_HUD, ORGAN_SLOT_LIVER, diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 22368fb4921..44484a12694 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -219,6 +219,10 @@ GENE SCANNER if(ishuman(M)) var/mob/living/carbon/human/the_dude = M var/datum/species/the_dudes_species = the_dude.dna.species +//SKYRAT EDIT BEGIN - Neural Laces + if (the_dude.getorganslot(ORGAN_SLOT_STACK)) + render_list += "Subject possesses a cortical stack.\n" +//SKYRAT EDIT END - Neural Laces if (!(NOBLOOD in the_dudes_species.species_traits) && !the_dude.getorganslot(ORGAN_SLOT_HEART)) render_list += "Subject lacks a heart.\n" if (!(TRAIT_NOBREATH in the_dudes_species.species_traits) && !the_dude.getorganslot(ORGAN_SLOT_LUNGS)) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 96ebe0c5b02..7dd4a01de12 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -172,7 +172,7 @@ return ..() /obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer) - var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit") + var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit", "Neural Lace Kit") //SKYRAT EDIT - Neural Laces var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in sortList(items) if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) @@ -184,6 +184,8 @@ if("Resonator Kit") new /obj/item/extinguisher/mini(drop_location) new /obj/item/resonator(drop_location) + if("Neural Lace Kit") // Skyrat edit + new /obj/item/autosurgeon/organ/corticalstack(drop_location) if("Minebot Kit") new /mob/living/simple_animal/hostile/mining_drone(drop_location) new /obj/item/weldingtool/hugetank(drop_location) diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 95dff282839..53a2a510bf1 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -57,7 +57,7 @@ if(no_brain && istype(I, /obj/item/organ/brain)) qdel(I) continue - if(no_organs && !istype(I, /obj/item/organ/brain)) + if(no_organs && !istype(I, (/obj/item/organ/brain || /obj/item/organ/corticalstack))) //Skyrat edit - Neural Laces - babyproofed qdel(I) continue I.Remove(src) diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index d502f7c0dd8..fab718785cd 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -25,7 +25,12 @@ /obj/item/pinpointer/crew = 2, /obj/item/storage/firstaid/advanced = 2, /obj/item/shears = 1, - /obj/item/storage/organbox = 1) + /obj/item/storage/organbox = 1, + //SKYRAT EDIT BEGIN - ADDS CORTICAL STACKS AND REMOVERS TO NANOMEDS + /obj/item/autosurgeon/organ/corticalstack = 3, + /obj/item/stackremover = 5 + //SKYRAT EDIT END + ) refill_canister = /obj/item/vending_refill/medical default_price = PAYCHECK_EASY extra_price = PAYCHECK_COMMAND @@ -39,6 +44,11 @@ /obj/machinery/vending/medical/syndicate_access name = "\improper SyndiMed Plus" req_access = list(ACCESS_SYNDICATE) +//SKYRAT EDIT - ADDS DELACERS AND AUTOSURGEONS TO SYNDIES + premium = list(/obj/item/autosurgeon/organ/syndicate/corticalstack = 20, + /obj/item/stackremover/syndicate = 20, + /obj/item/organ/corticalstack/syndicate = 40) +//SKYRAT EDIT END //Created out of a necessity to get these dumb chems out of the medical tools vendor. /obj/machinery/vending/drugs diff --git a/modular_skyrat/modules/neural-lacing/code/delacer.dm b/modular_skyrat/modules/neural-lacing/code/delacer.dm new file mode 100644 index 00000000000..692b14872ce --- /dev/null +++ b/modular_skyrat/modules/neural-lacing/code/delacer.dm @@ -0,0 +1,53 @@ +/obj/item/stackremover + name = "cortical stack remover" + desc = "A pair of tweezer-like knives, used to quickly extract a stack after death." + icon = 'icons/obj/surgery.dmi' + icon_state = "shears" + flags_1 = CONDUCT_1 + item_flags = SURGICAL_TOOL + toolspeed = 1 + force = 12 + w_class = WEIGHT_CLASS_NORMAL + throwforce = 6 + throw_speed = 2 + throw_range = 5 + custom_materials = list(/datum/material/iron=8000, /datum/material/titanium=6000) + attack_verb_continuous = list("shears", "snips") + attack_verb_simple = list("shear", "snip") + sharpness = SHARP_EDGED + custom_premium_price = PAYCHECK_MEDIUM * 14 + +/obj/item/stackremover/syndicate + name = "blood-red cortical stack remover" + desc = "A pair of tweezer-like knives, used to quickly extract a stack after death. This one is shaped like a double-helix with blood-red blades. Are you a believer?" + toolspeed = 0.5 + force = 27 + armour_penetration = 40 + +/datum/uplink_item/device_tools/corticalstackremover + name = "Blood-Red Cortical Stack Remover" + desc = "For those who wont be quiet... Are you a believer?" + item = /obj/item/stackremover/syndicate + cost = 15 //Support item. Dangerous + + +/obj/item/stackremover/attack(mob/living/M, mob/living/user) + var/mob/living/carbon/patient = M + if(!iscarbon(M) || user.combat_mode) + return ..() + if(!patient.getorganslot("stack")) + return ..() + var/amputation_speed_mod = 1 + var/obj/item/organ/corticalstack/CSTACK = patient.getorganslot("stack") + patient.visible_message(span_danger("[user] begins to secure [src] around [patient]'s neck."), span_userdanger("[user] begins to secure [src] around your neck")) + playsound(get_turf(patient), 'sound/items/ratchet.ogg', 20, TRUE) + if(patient.stat >= UNCONSCIOUS || HAS_TRAIT(patient, TRAIT_INCAPACITATED)) //if you're incapacitated (due to paralysis, a stun, being in staminacrit, etc.), critted, unconscious, or dead, it's much easier to properly line up a snip + amputation_speed_mod *= 0.5 + if(patient.stat != DEAD && patient.jitteriness) //jittering will make it harder to secure the shears, even if you can't otherwise move + amputation_speed_mod *= 1.5 //15*0.5*1.5=11.25, so staminacritting someone who's jittering (from, say, a stun baton) won't give you enough time to snip their head off, but staminacritting someone who isn't jittering will + + if(do_after(user, toolspeed * 5 SECONDS * amputation_speed_mod, target = patient)) + playsound(get_turf(patient), 'sound/weapons/bladeslice.ogg', 250, TRUE) + CSTACK.Remove(patient) + CSTACK.forceMove(get_turf(patient)) + user.visible_message(span_danger("[src] violently spears in, ripping out [patient]'s [CSTACK]."), span_notice("You rip out [patient]'s [CSTACK] with [src].")) diff --git a/modular_skyrat/modules/neural-lacing/code/implanter.dm b/modular_skyrat/modules/neural-lacing/code/implanter.dm new file mode 100644 index 00000000000..63c194d9fc3 --- /dev/null +++ b/modular_skyrat/modules/neural-lacing/code/implanter.dm @@ -0,0 +1,46 @@ +/obj/item/autosurgeon/organ/corticalstack + desc = "A single-use autosurgeon that contains a cortical stack. A screwdriver can be used to remove it, but implants can't be placed back in." + uses = 1 + starting_organ = /obj/item/organ/corticalstack + +/obj/item/organ/corticalstack/syndicate + name = "Blood-Red Cortical Stack" + desc = "A strange, crystalline storage device containing 'DHF', digitised conciousness. This one has after-market modifications." + invasive = 0 + +/obj/item/autosurgeon/organ/syndicate/corticalstack + desc = "A dual-use autosurgeon that contains a blood-red cortical stack. This implanter is modified to be usable twice." + uses = 2 + starting_organ = /obj/item/organ/corticalstack/syndicate + +/datum/uplink_item/device_tools/corticalstack + name = "Blood-Red Cortical Stack" + desc = " A marvel of modern technology; the cortical stack, For when you really want to avoid that death. This one can be removed without killing the user; allowing 'double-sleeving'." + item = /obj/item/autosurgeon/organ/syndicate/corticalstack + cost = 5 //Support item + +/datum/supply_pack/goody/corticalstack + name = "Cortical Stack Crate" + desc = "Important employee's? Unable to afford losing them without the chance of revival? Back them up to these chips that go in the base of the neck. Warranty not included." + cost = CARGO_CRATE_VALUE * 6 //Expensive. + contains = list(/obj/item/autosurgeon/organ/corticalstack,/obj/item/autosurgeon/organ/corticalstack,/obj/item/autosurgeon/organ/corticalstack) + crate_name = "Cortical Stack Crate" + +/obj/item/storage/backpack/duffelbag/syndie/loadout/believer/PopulateContents() + new /obj/item/clothing/gloves/combat(src) + new /obj/item/clothing/shoes/combat(src) + new /obj/item/autosurgeon/organ/syndicate/corticalstack(src) + new /obj/item/stackremover/syndicate(src) + new /obj/item/book/granter/martial/cqc(src) + new /obj/item/clothing/under/syndicate/sniper(src) + new /obj/item/implanter/storage(src) + new /obj/item/autosurgeon/organ/syndicate/anti_stun(src) + +//Badass section down here +/datum/uplink_item/loadout_skyrat/believer + name = "Believer Bundle" + desc = "Named after the infamous collector of souls - the believer bundle, a collection of items to ensure you get that payment on time..." + item = /obj/item/storage/backpack/duffelbag/syndie/loadout/believer + cost = 25 + + diff --git a/modular_skyrat/modules/neural-lacing/code/mobhandlers.dm b/modular_skyrat/modules/neural-lacing/code/mobhandlers.dm new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/modular_skyrat/modules/neural-lacing/code/mobhandlers.dm @@ -0,0 +1 @@ + diff --git a/modular_skyrat/modules/neural-lacing/code/resleever.dm b/modular_skyrat/modules/neural-lacing/code/resleever.dm new file mode 100644 index 00000000000..9dd99ac2d64 --- /dev/null +++ b/modular_skyrat/modules/neural-lacing/code/resleever.dm @@ -0,0 +1,2 @@ +//TBA - THIS CODE FILE IS GOING TO BE USED ONCE I FINISH AN AUTOMATED RESLEEVER UI(NEVER)// + diff --git a/modular_skyrat/modules/neural-lacing/code/stack.dm b/modular_skyrat/modules/neural-lacing/code/stack.dm new file mode 100644 index 00000000000..10658d1969f --- /dev/null +++ b/modular_skyrat/modules/neural-lacing/code/stack.dm @@ -0,0 +1,65 @@ +/obj/item/organ/corticalstack + name = "Cortical Stack" + desc = "A strange, crystalline storage device containing 'DHF', digitised conciousness." + icon = 'modular_skyrat/modules/neural-lacing/icons/Neuralstack.dmi' + icon_state = "cortical-stack" + base_icon_state = "cortical-stack" + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_STACK + status = ORGAN_ROBOTIC + organ_flags = ORGAN_SYNTHETIC + + var/active = FALSE + var/invasive = 1 //WILL THIS KILL THE HOST IF REMOVED? + var/ownerckey + var/datum/mind/backup + var/prompting = FALSE // Are we waiting for a user prompt before backing them up to DHF? + +/obj/item/organ/corticalstack/examine() + . = ..() + if(!backup && !ownerckey && active) //SHOULD NOT HAPPEN + . += span_info("The integrity light upon the lace is dull, and black. The DHF is corrupted beyond repair.") + return + if((ownerckey && (backup || backup.get_ghost()))) //Incase something incredibly bad happens + if(organ_flags & ORGAN_FAILING) + . += span_info("The integrity light upon the neural lace is flashing a dull red, damaged. You may be able to restore it with some cable coils.") + else + . += span_info("The integrity light is showing a pale blue.") + else + . += span_info("This one is dark and dull, empty.") + + +/obj/item/organ/corticalstack/Insert(mob/living/carbon/MSTACK) + . = ..() + MSTACK.visible_message(span_notice("[MSTACK] jerks violently as the cortical stack is inserted...")) + if(!active) + ownerckey = MSTACK.ckey + backup = MSTACK.mind + active = TRUE + to_chat(MSTACK, span_danger("You feel a sharp sting, and then a cool, almost numbing sensation spread over your form; your cortical stack coming online...")) + MSTACK.visible_message(span_notice("..Before ceasing, the stack letting out a ping; it has succeeded in integrating with their neural systems.")) + else + if(MSTACK.mind && (backup || ownerckey) && !(MSTACK.mind == backup || MSTACK.ckey != ownerckey)) + MSTACK.visible_message(span_warning("..Before ceasing, the stack letting out an alarm; unable to override the conciousness within.")) + else + MSTACK.visible_message(span_notice("..Before ceasing, the stack letting out a ping; it has succeeded in integrating with their neural systems.")) + to_chat(owner, span_notice("You feel a strange, ephermeal sensation come over you, as you re-awaken from your slumber...")) + REMOVE_TRAIT(MSTACK, TRAIT_DNR, src) //PREVENTS PEOPLE FROM GETTING DNR'D AFTER HAVING THEIR STACK REMOVED AND RELACED + MSTACK.ckey = ownerckey + MSTACK.mind = backup + MSTACK.SetSleeping(100) + +/obj/item/organ/corticalstack/Remove(mob/living/carbon/MSTACK) + . = ..() + if(invasive) + MSTACK.death() + MSTACK.visible_message(span_danger("[MSTACK] violently siezes as their stack is removed!")) + ADD_TRAIT(MSTACK, TRAIT_DNR, src) + + else + MSTACK.visible_message(span_danger("[MSTACK] twinges in discomfort; although remains concious.")) + +/obj/item/organ/corticalstack/Destroy() + . = ..() + ownerckey = null + backup = null diff --git a/modular_skyrat/modules/neural-lacing/code/traits.dm b/modular_skyrat/modules/neural-lacing/code/traits.dm new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/modular_skyrat/modules/neural-lacing/code/traits.dm @@ -0,0 +1 @@ + diff --git a/modular_skyrat/modules/neural-lacing/defines/stackdefines.dm b/modular_skyrat/modules/neural-lacing/defines/stackdefines.dm new file mode 100644 index 00000000000..b28b04f6431 --- /dev/null +++ b/modular_skyrat/modules/neural-lacing/defines/stackdefines.dm @@ -0,0 +1,3 @@ + + + diff --git a/modular_skyrat/modules/neural-lacing/icons/Neuralstack.dmi b/modular_skyrat/modules/neural-lacing/icons/Neuralstack.dmi new file mode 100644 index 00000000000..82f58ca5851 Binary files /dev/null and b/modular_skyrat/modules/neural-lacing/icons/Neuralstack.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 5b2d2c33c95..2bc22d4e4bc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4380,6 +4380,13 @@ #include "modular_skyrat\modules\nsfw\aphros\code\chemistry\aphro_keg.dm" #include "modular_skyrat\modules\nsfw\aphros\code\chemistry\reagents\aphrodisiac_reagent.dm" #include "modular_skyrat\modules\nsfw\aphros\code\chemistry\recipes\aphrodisiac.dm" +#include "modular_skyrat\modules\neural-lacing\code\delacer.dm" +#include "modular_skyrat\modules\neural-lacing\code\implanter.dm" +#include "modular_skyrat\modules\neural-lacing\code\mobhandlers.dm" +#include "modular_skyrat\modules\neural-lacing\code\resleever.dm" +#include "modular_skyrat\modules\neural-lacing\code\stack.dm" +#include "modular_skyrat\modules\neural-lacing\code\traits.dm" +#include "modular_skyrat\modules\neural-lacing\defines\stackdefines.dm" #include "modular_skyrat\modules\nsfw\misc\dancerpole.dm" #include "modular_skyrat\modules\nsfw\shockcollar\code\shock_collar.dm" #include "modular_skyrat\modules\nsfw\vendors\code\item_overrides.dm"