diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index d16c466f9dc..aa84927af03 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -347,6 +347,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/book/granter/crafting_recipe/dusting/laser_musket_prime = 1, /obj/item/book/granter/sign_language = 1, /obj/item/disk/nuclear/fake = 1, + /obj/item/disk/surgery/advanced_plastic_surgery = 1, /obj/item/skillchip/brainwashing = 1, /obj/item/tattoo_kit = 1, /obj/item/folder/ancient_paperwork = 1, diff --git a/code/modules/photography/_pictures.dm b/code/modules/photography/_pictures.dm index 8c949892dbf..45fa5654ad9 100644 --- a/code/modules/photography/_pictures.dm +++ b/code/modules/photography/_pictures.dm @@ -5,6 +5,8 @@ var/list/mobs_seen = list() /// List of weakrefs pointing at dead mobs that appear in this photo var/list/dead_seen = list() + /// List of strings of face-visible humans in this photo + var/list/names_seen = list() var/caption var/icon/picture_image var/icon/picture_icon @@ -16,7 +18,7 @@ ///Was this image capable of seeing ghosts? var/see_ghosts = CAMERA_NO_GHOSTS -/datum/picture/New(name, desc, mobs_spotted, dead_spotted, image, icon, size_x, size_y, bp, caption_, autogenerate_icon, can_see_ghosts) +/datum/picture/New(name, desc, mobs_spotted, dead_spotted, names, image, icon, size_x, size_y, bp, caption_, autogenerate_icon, can_see_ghosts) if(!isnull(name)) picture_name = name if(!isnull(desc)) @@ -27,6 +29,9 @@ if(!isnull(dead_spotted)) for(var/mob/seen as anything in dead_spotted) dead_seen += WEAKREF(seen) + if(!isnull(names)) + for(var/seen in names) + names_seen += seen if(!isnull(image)) picture_image = image if(!isnull(icon)) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 1c0e360ed75..b168aaf54da 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -188,6 +188,8 @@ var/list/mobs = list() var/blueprints = FALSE var/clone_area = SSmapping.request_turf_block_reservation(size_x * 2 + 1, size_y * 2 + 1, 1) + ///list of human names taken on picture + var/list/names = list() var/width = size_x * 2 + 1 var/height = size_y * 2 + 1 @@ -218,8 +220,11 @@ var/icon/get_icon = camera_get_icon(turfs, target_turf, psize_x, psize_y, clone_area, size_x, size_y, (size_x * 2 + 1), (size_y * 2 + 1)) qdel(clone_area) get_icon.Blend("#000", ICON_UNDERLAY) + for(var/mob/living/carbon/human/person in mobs) + if(person.is_face_visible()) + names += "[person.name]" - var/datum/picture/picture = new("picture", desc.Join(" "), mobs_spotted, dead_spotted, get_icon, null, psize_x, psize_y, blueprints, can_see_ghosts = see_ghosts) + var/datum/picture/picture = new("picture", desc.Join(" "), mobs_spotted, dead_spotted, names, get_icon, null, psize_x, psize_y, blueprints, can_see_ghosts = see_ghosts) after_picture(user, picture) SEND_SIGNAL(src, COMSIG_CAMERA_IMAGE_CAPTURED, target, user) blending = FALSE diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 2bb779e318b..285878e7f26 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -1114,6 +1114,13 @@ surgery = /datum/surgery/advanced/wing_reconstruction research_icon_state = "surgery_chest" +/datum/design/surgery/advanced_plastic_surgery + name = "Advanced Plastic Surgery" + desc = "An advanced form of the plastic surgery, allowing oneself to remodel someone's face and voice based off a picture of someones face" + surgery = /datum/surgery/plastic_surgery/advanced + id = "surgery_advanced_plastic_surgery" + research_icon_state = "surgery_head" + /datum/design/surgery/experimental_dissection name = "Experimental Dissection" desc = "An experimental surgical procedure that dissects bodies in exchange for research points at ancient R&D consoles." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index bbd404c31c2..d12ebfaca1e 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -2367,3 +2367,15 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) hidden = TRUE experimental = TRUE + +/datum/techweb_node/advanced_plastic_surgery + id = "plastic_surgery" + display_name = "Advanced Plastic Surgery" + description = "A Procedure long lost due to licensing problems now once again available." + prereq_ids = list("base") + design_ids = list( + "surgery_advanced_plastic_surgery" + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index 440d48d1c5e..424251143c3 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -1,3 +1,9 @@ +/// Disk containing info for doing advanced plastic surgery. Spawns in maint and available as a role-restricted item in traitor uplinks. +/obj/item/disk/surgery/advanced_plastic_surgery + name = "Advanced Plastic Surgery Disk" + desc = "The disk provides instructions on how to do an Advanced Plastic Surgery, this surgery allows one-self to completely remake someone's face with that of another. Provided they have a picture of them in their offhand when reshaping the face. With the surgery long becoming obsolete with the rise of genetics technology. This item became an antique to many collectors, With only the cheaper and easier basic form of plastic surgery remaining in use in most places." + surgeries = list(/datum/surgery/plastic_surgery/advanced) + /datum/surgery/plastic_surgery name = "Plastic surgery" surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY @@ -9,6 +15,41 @@ /datum/surgery_step/close, ) +/datum/surgery/plastic_surgery/advanced + name = "advanced plastic surgery" + steps = list( + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/insert_plastic, + /datum/surgery_step/reshape_face, + /datum/surgery_step/close, + ) + +//Insert plastic step, It ain't called plastic surgery for nothing! :) +/datum/surgery_step/insert_plastic + name = "insert plastic (plastic)" + implements = list( + /obj/item/stack/sheet/plastic = 100, + /obj/item/stack/sheet/meat = 100) + time = 3.2 SECONDS + preop_sound = 'sound/effects/blobattack.ogg' + success_sound = 'sound/effects/attackblob.ogg' + failure_sound = 'sound/effects/blobattack.ogg' + +/datum/surgery_step/insert_plastic/preop(mob/user, mob/living/target, target_zone, obj/item/stack/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to insert [tool] into the incision in [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins to insert [tool] into the incision in [target]'s [parse_zone(target_zone)]."), + span_notice("[user] begins to insert [tool] into the incision in [target]'s [parse_zone(target_zone)]."), + ) + display_pain(target, "You feel something inserting just below the skin in your [parse_zone(target_zone)].") + +/datum/surgery_step/insert_plastic/success(mob/user, mob/living/target, target_zone, obj/item/stack/tool, datum/surgery/surgery, default_display_results) + . = ..() + tool.use(1) + //reshape_face /datum/surgery_step/reshape_face name = "reshape face (scalpel)" @@ -43,8 +84,15 @@ else var/list/names = list() if(!isabductor(user)) - for(var/i in 1 to 10) - names += target.dna.species.random_name(target.gender, TRUE) + var/obj/item/offhand = user.get_inactive_held_item() + if(istype(offhand, /obj/item/photo) && istype(surgery, /datum/surgery/plastic_surgery/advanced)) + var/obj/item/photo/disguises = offhand + for(var/namelist as anything in disguises.picture?.names_seen) + names += namelist + else + user.visible_message(span_warning("You have no picture to base the appearance on, reverting to random appearances.")) + for(var/i in 1 to 10) + names += target.dna.species.random_name(target.gender, TRUE) else for(var/_i in 1 to 9) names += "Subject [target.gender == MALE ? "i" : "o"]-[pick("a", "b", "c", "d", "e")]-[rand(10000, 99999)]" diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index 7eecbbf78bf..6dcd48dee83 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -173,6 +173,16 @@ cost = 5 surplus = 50 +/datum/uplink_item/role_restricted/advanced_plastic_surgery + name = "Advanced Plastic Surgery Program" + desc = "A bootleg copy of an collector item, this disk contains the procedure to perform advanced plastic surgery, allowing you to model someone's face and voice based on a picture taken by a camera on your offhand. \ + All changes are superficial and does not change ones genetic makeup. \ + Insert into an Operating Console to enable the procedure." + item = /obj/item/disk/surgery/brainwashing + restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_ROBOTICIST) + cost = 1 + surplus = 50 + /datum/uplink_item/role_restricted/springlock_module name = "Heavily Modified Springlock MODsuit Module" desc = "A module that spans the entire size of the MOD unit, sitting under the outer shell. \