diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 2c7ae702d64..dbe03173e4e 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -102,7 +102,7 @@ datum/design/bluespacebodybag name = "Medical HUD implant" desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." id = "ci-medhud" - req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4) + req_tech = list("materials" = 6, "programming" = 4, "biotech" = 4) build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 100) build_path = /obj/item/cybernetic_implant/eyes/hud/medical @@ -112,7 +112,7 @@ datum/design/bluespacebodybag name = "Security HUD implant" desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." id = "ci-sechud" - req_tech = list("materials" = 5, "programming" = 5, "biotech" = 5, "combat" = 2) + req_tech = list("materials" = 6, "programming" = 5, "biotech" = 4, "combat" = 2) build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 200, "$glass" = 200, "$silver" = 300, "$gold" = 300) build_path = /obj/item/cybernetic_implant/eyes/hud/security @@ -122,38 +122,65 @@ datum/design/bluespacebodybag name = "X-Ray implant" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." id = "ci-xray" - req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3) + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 6, "magnets" = 5, "plasmatech" = 3) build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500) + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$uranium" = 500, "$diamond" = 1000) build_path = /obj/item/cybernetic_implant/eyes/xray category = list("Medical Designs") -/datum/design/cyberimb_thermals +/datum/design/cyberimp_thermals name = "Thermals implant" desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." id = "ci-thermals" - req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3) + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3, "syndicate" = 4) build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500) + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 1000) build_path = /obj/item/cybernetic_implant/eyes/thermals category = list("Medical Designs") -/datum/design/cyberimb_antidrop +/datum/design/cyberimp_antidrop name = "Anti-Drop implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." id = "ci-antidrop" - req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5) + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5) build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 400) build_path = /obj/item/cybernetic_implant/brain/anti_drop category = list("Medical Designs") -/datum/design/cyberimb_antistun +/datum/design/cyberimp_antistun name = "CNS Rebooter implant" desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." id = "ci-antistun" - req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5) + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 6) build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 600) + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 500, "$gold" = 1000) build_path = /obj/item/cybernetic_implant/brain/anti_stun + category = list("Medical Designs") + +/datum/design/cyberimp_nutriment + name = "Nutriment pump implant" + desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving." + id = "ci-nutriment" + req_tech = list("materials" = 6, "programming" = 4, "biotech" = 5) + build_type = PROTOLATHE | MECHFAB + materials = list("$metal" = 200, "$glass" = 200, "$gold" = 500, "$uranium" = 500) + category = list("Medical Designs") + +/datum/design/cyberimp_nutriment_plus + name = "Nutriment pump implant PLUS" + desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are hungry." + id = "ci-nutrimentplus" + req_tech = list("materials" = 6, "programming" = 4, "biotech" = 6) + build_type = PROTOLATHE | MECHFAB + materials = list("$metal" = 200, "$glass" = 200, "$gold" = 500, "$uranium" = 750) + category = list("Medical Designs") + +/datum/design/cyberimp_reviver + name = "Reviver implant" + desc = "This implant will automatically deliver a therapeutic dose of electrical energy to your heart if it ever stops beating, and inject you with nanites. A second chance!" + id = "ci-reviver" + req_tech = list("materials" = 6, "programming" = 4, "biotech" = 6) + build_type = PROTOLATHE | MECHFAB + materials = list("$metal" = 200, "$glass" = 200, "$gold" = 1000, "$uranium" = 500, "$diamond" = 2000) category = list("Medical Designs") \ No newline at end of file diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm index 6d289144127..3fd16cb8b62 100644 --- a/code/modules/surgery/cybernetic_implants.dm +++ b/code/modules/surgery/cybernetic_implants.dm @@ -1,35 +1,37 @@ #define MAX_BRAIN_IMPLANT 2 +#define MAX_CHEST_IMPLANT 3 +/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery) + user.visible_message("[user] begins to implant [target] with [implant].") + +//[[[[EYES]]]] /datum/surgery/eye_cybernetic_implant/eyes name = "eye cybernetic implant" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant/eyes, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) location = "eyes" -/datum/surgery/eye_cybernetic_implant/brain - name = "brain cybernetic implant" - steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/brain, /datum/surgery_step/close) - location = "head" - /datum/surgery_step/cybernetic_implant/eyes implements = list(/obj/item/cybernetic_implant/eyes = 100) time = 32 -/datum/surgery_step/cybernetic_implant/brain - implements = list(/obj/item/cybernetic_implant/brain = 100) - time = 32 - -/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery) - user.visible_message("[user] begins to implant [target] with [implant].") - /datum/surgery_step/cybernetic_implant/eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/eyes/implant, datum/surgery/surgery) if(implant) var/full = 0 if(locate(/obj/item/cybernetic_implant/eyes,target.internal_organs)) full = 1 - insert(user,target,implant,target_zone,full) return 1 +//[[[[BRAIN]]]] +/datum/surgery/eye_cybernetic_implant/brain + name = "brain cybernetic implant" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/brain, /datum/surgery_step/close) + location = "head" + +/datum/surgery_step/cybernetic_implant/brain + implements = list(/obj/item/cybernetic_implant/brain = 100) + time = 32 + /datum/surgery_step/cybernetic_implant/brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/brain/implant, datum/surgery/surgery) if(implant) var/full = 0 @@ -39,10 +41,30 @@ if(full < MAX_BRAIN_IMPLANT) full = 0 - insert(user,target,implant,target_zone,full) return 1 +//[[[[CHEST]]]] +/datum/surgery/eye_cybernetic_implant/chest + name = "torso cybernetic implant" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/chest, /datum/surgery_step/close) + location = "chest" + +/datum/surgery_step/cybernetic_implant/chest + implements = list(/obj/item/cybernetic_implant/chest = 100) + time = 32 + +/datum/surgery_step/cybernetic_implant/chest/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/chest/implant, datum/surgery/surgery) + if(implant) + var/full = 0 + for(var/obj/item/I in target.contents) + if(istype(I,/obj/item/cybernetic_implant/chest)) + full++ + + if(full < MAX_CHEST_IMPLANT) + full = 0 + insert(user,target,implant,target_zone,full) + return 1 /datum/surgery_step/cybernetic_implant/proc/insert(mob/user, mob/living/carbon/target, obj/item/cybernetic_implant/implant,target_zone,full) if(full) diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index 5b5a928148b..0d48eb69cce 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -44,6 +44,7 @@ desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." eye_color = "0ff" implant_color = "#00FFFF" + origin_tech = "materials=4;programming=3;biotech=4" /obj/item/cybernetic_implant/eyes/hud/medical/function() if(!owner) @@ -59,6 +60,7 @@ desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." eye_color = "d00" implant_color = "#CC0000" + origin_tech = "materials=4;programming=4;biotech=3;combat=1" /obj/item/cybernetic_implant/eyes/hud/security/function() if(!owner) @@ -74,6 +76,7 @@ desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." eye_color = "000" implant_color = "#000000" + origin_tech = "materials=6;programming=4;biotech=5;magnets=5;plasmatech=2" /obj/item/cybernetic_implant/eyes/xray/function() if(!owner) @@ -93,6 +96,7 @@ eye_color = "FC0" implant_color = "#FFCC00" flash_protect = -1 + origin_tech = "materials=6;programming=4;biotech=5;magnets=5;plasmatech=2;syndicate=4" /obj/item/cybernetic_implant/eyes/thermals/function() if(!owner) @@ -143,6 +147,7 @@ var/obj/item/l_hand_obj = null var/obj/item/r_hand_obj = null implant_color = "#DE7E00" + origin_tech = "materials=5;programming=4;biotech=4" /obj/item/cybernetic_implant/brain/anti_drop/function() action_button_name = "Toggle Anti-Drop" @@ -213,6 +218,7 @@ name = "CNS Rebooter implant" desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." implant_color = "#FFFF00" + origin_tech = "materials=6;programming=4;biotech=5" /obj/item/cybernetic_implant/brain/anti_stun/function() SSobj.processing |= src @@ -233,4 +239,94 @@ /obj/item/cybernetic_implant/brain/anti_stun/emp_act(severity) SSobj.processing.Remove(src) spawn(..() * 10) - SSobj.processing |= src \ No newline at end of file + SSobj.processing |= src + + +//[[[[CHEST]]]] + +/obj/item/cybernetic_implant/chest + name = "cybernetic torso implant" + desc = "implants for the organs in your torso" + icon_state = "chest_implant" + +/obj/item/cybernetic_implant/chest/nutriment + name = "Nutriment pump implant" + desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving." + icon_state = "chest_implant" + var/hunger_threshold = NUTRITION_LEVEL_STARVING + var/synthesizing = 0 + var/nutriment_amount = 30 + var/poison_amount = 5 + origin_tech = "materials=5;programming=3;biotech=4" + +/obj/item/cybernetic_implant/chest/nutriment/function() + SSobj.processing |= src + +/obj/item/cybernetic_implant/chest/nutriment/process() + if(synthesizing) + return + if(!owner) + SSobj.processing.Remove(src) + qdel(src) + return + if(owner.stat == DEAD) + return + + if(owner.nutrition <= hunger_threshold) + synthesizing = 1 + spawn(50) + owner << "You feel less hungry..." + owner.nutrition += nutriment_amount + synthesizing = 0 + +/obj/item/cybernetic_implant/chest/nutriment/plus + name = "Nutriment pump implant PLUS" + desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are hungry." + icon_state = "chest_implant" + hunger_threshold = NUTRITION_LEVEL_HUNGRY + nutriment_amount = 50 + poison_amount = 10 + origin_tech = "materials=5;programming=3;biotech=5" + +/obj/item/cybernetic_implant/chest/nutriment/emp_act(severity) + owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning + owner << "You feel like your insides are burning." + +/obj/item/cybernetic_implant/chest/reviver + name = "Reviver implant" + desc = "This implant will automatically deliver a therapeutic dose of electrical energy to your heart if it ever stops beating, and inject you with nanites. A second chance!" + icon_state = "chest_implant" + var/defibrillating = 0 + var/recharge_time + +/obj/item/cybernetic_implant/chest/reviver/function() + recharge_time = world.time + 2000 + SSobj.processing |= src + +/obj/item/cybernetic_implant/chest/reviver/process() + if(defibrillating) + return + if(!owner) + SSobj.processing.Remove(src) + qdel(src) + return + if(world.time < recharge_time) + return + if(owner.stat != DEAD) + return + + defibrillating = 1 + spawn(600) + if(owner.stat == DEAD) + owner.visible_message("[owner]'s body convulses by itself.") + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + owner.reagents.add_reagent("nanites",10) + owner.stat = UNCONSCIOUS + owner.heart_attack = 0 + dead_mob_list -= owner + living_mob_list |= list(owner) + owner.emote("gasp") + add_logs(owner, owner, "revived", object="defibrillator implant") + recharge_time = world.time + 20000 + defibrillating = 0 \ No newline at end of file diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index f4509701ac0..68d781e9065 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -86,6 +86,27 @@ user.visible_message("[user] screws up!") return 0 +/datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(locate(/datum/surgery_step/saw) in surgery.steps) + var/limb_type + switch(target_zone) + if("head") + limb_type = /obj/item/organ/limb/head + if("chest") + limb_type = /obj/item/organ/limb/chest + if("l_arm") + limb_type = /obj/item/organ/limb/l_arm + if("r_arm") + limb_type = /obj/item/organ/limb/r_arm + if("l_leg") + limb_type = /obj/item/organ/limb/l_leg + if("r_leg") + limb_type = /obj/item/organ/limb/r_leg + else + return + var/obj/item/organ/limb/limb = target.getlimb(limb_type) + if(limb) + limb.heal_damage(35,0,0) /datum/surgery_step/proc/tool_check(mob/user, obj/item/tool) return 1 diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 93ebade829d..c325add6f21 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ