diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index e3617463aa4..b36ba8d8ac5 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -103,6 +103,7 @@ "strange crystal" = /obj/item/organ/internal/nucleation/strange_crystal, "resonant crystal" = /obj/item/organ/internal/nucleation/resonant_crystal ) + vision_organ = /obj/item/organ/internal/eyes/luminescent_crystal /datum/species/nucleation/handle_post_spawn(var/mob/living/carbon/human/H) H.light_color = "#1C1C00" diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 39a93731acb..e532d0acc1d 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -125,7 +125,7 @@ /datum/species/New() //If the species has eyes, they are the default vision organ if(!vision_organ && has_organ["eyes"]) - vision_organ = "eyes" + vision_organ = /obj/item/organ/internal/eyes unarmed = new unarmed_type() diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 453d0f0c4f3..631e78f3234 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -512,7 +512,7 @@ "optics" = /obj/item/organ/internal/optical_sensor ) - vision_organ = "optics" + vision_organ = /obj/item/organ/internal/optical_sensor has_limbs = list( "chest" = list("path" = /obj/item/organ/external/chest/ipc), "groin" = list("path" = /obj/item/organ/external/groin/ipc), diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index c26689a9675..fff50be4376 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -7,12 +7,25 @@ name = "bone repair" steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders,/datum/surgery_step/generic/retract_skin, /datum/surgery_step/glue_bone, /datum/surgery_step/set_bone,/datum/surgery_step/finish_bone,/datum/surgery_step/generic/cauterize) possible_locs = list("chest","l_arm", "l_hand","r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","groin") + disallowed_mob = list(/mob/living/carbon/human/machine,/mob/living/carbon/human/diona,/mob/living/carbon/human/slime) /datum/surgery/bone_repair/skull name = "bone repair" steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/glue_bone, /datum/surgery_step/mend_skull,/datum/surgery_step/finish_bone,/datum/surgery_step/generic/cauterize) possible_locs = list("head") + disallowed_mob = list(/mob/living/carbon/human/machine,/mob/living/carbon/human/diona,/mob/living/carbon/human/slime) + +/datum/surgery/bonerepair/can_start(mob/user, mob/living/carbon/target) + if(istype(target,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = target + var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) + if(affected.status & ORGAN_ROBOT) + return 0 + if(!(affected.encased)) + return 0 + return 1 + //surgery steps /datum/surgery_step/glue_bone @@ -82,10 +95,9 @@ affected.stage = 2 return 1 else - user.visible_message("\blue [user] sets the bone in [target]'s [affected.name]\red in the WRONG place with \the [tool].", \ - "\blue You set the bone in [target]'s [affected.name]\red in the WRONG place with \the [tool].") - affected.fracture()//can i remove this please? - return 0 + user.visible_message("\blue [user] sets the bone in [target]'s [affected.name] in place with \the [tool].", \ + "\blue You set the bone in [target]'s [affected.name] in place with \the [tool].") + return 1 /datum/surgery_step/set_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index fd49360815f..a8c24c4e843 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -251,7 +251,7 @@ user.visible_message("\blue [user] amputates [target]'s [affected.name] at the [affected.amputation_point] with \the [tool].", \ "\blue You amputate [target]'s [affected.name] with \the [tool].") - add_logs(user,target, "surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]") + add_logs(target,user ,"surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]") affected.droplimb(1,DROPLIMB_EDGE) return 1 diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 0871c8327ea..33bc4bda768 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -6,10 +6,12 @@ if(istype(M, /mob/living/carbon/human)) H = M affecting = H.get_organ(check_zone(selected_zone)) + else if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime)) + H = M + affecting = selected_zone if(can_operate(H)) //if they're prone or a slime var/datum/surgery/current_surgery - world << "line 15" for(var/datum/surgery/S in M.surgeries) if(S.location == selected_zone) @@ -33,9 +35,8 @@ break if(override) - if(I == /obj/item/robot_parts) + if(istype(I,/obj/item/robot_parts)) var/datum/surgery/S = available_surgeries["robotic limb attachment"] - world << "[S]" if(S) var/datum/surgery/procedure = new S.type if(procedure) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 4cd06a68402..ec40af5b60a 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -143,7 +143,7 @@ if(tool) user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) - else + else if(IC) user.visible_message("[user] checks for items in [target]'s [target_zone].", "You check for items in [target]'s [target_zone]...") target.custom_pain("The pain in your chest is living hell!",1) ..() @@ -155,6 +155,10 @@ user << "Central command would kill you if you implanted the disk into someone." return 0//fail + if(istype(tool,/obj/item/organ)) + user << "This isn't the type of surgery for that!" + return 0//fail + if(tool) user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ "\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index bd11f11db1e..29cc6a28f2c 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -170,9 +170,13 @@ var/new_limb_type = organ_data["path"] var/obj/item/organ/external/new_limb = new new_limb_type(target) new_limb.robotize(L.model_info) + new_limb.replaced(target) + new_limb.status &= ~ORGAN_DESTROYED + if(new_limb.children) + for(var/obj/item/organ/external/C in new_limb.children) + C.status &= ~ORGAN_DESTROYED if(L.sabotaged) new_limb.sabotaged = 1 - target.update_body() target.updatehealth() target.UpdateDamageIcon() diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 35e5560e4d3..b6450f8257a 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -166,6 +166,8 @@ datumvars//note i am putting External in robolimbs. origin_tech = "materials=5;programming=3;biotech=4" /obj/item/organ/internal/cyberimp/chest/nutriment/on_life() + if(!owner) + return if(synthesizing) return if(owner.stat == DEAD) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 0d6942d3b73..f1a5497a93c 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -5,7 +5,7 @@ var/list/organ_cache = list() icon = 'icons/obj/surgery.dmi' var/dead_icon var/mob/living/carbon/human/owner = null - var/status = 0 + var/status = ORGAN_ORGANIC var/vital //Lose a vital limb, die immediately. var/damage = 0 // amount of damage to the organ diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 59b1f98b74a..c2a750cb905 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -5,6 +5,7 @@ max_damage = 50 //made same as arm, since it is not vital min_broken_damage = 30 encased = null + status = ORGAN_ROBOT /obj/item/organ/external/head/ipc/New() robotize("Morpheus Cyberkinetics") @@ -12,43 +13,82 @@ /obj/item/organ/external/chest/ipc encased = null + status = ORGAN_ROBOT /obj/item/organ/external/chest/ipc/New() robotize("Morpheus Cyberkinetics") ..() +/obj/item/organ/external/groin/ipc + encased = null + status = ORGAN_ROBOT + /obj/item/organ/external/groin/ipc/New() robotize("Morpheus Cyberkinetics") ..() +/obj/item/organ/external/arm/ipc + encased = null + status = ORGAN_ROBOT + /obj/item/organ/external/arm/ipc/New() robotize("Morpheus Cyberkinetics") ..() +/obj/item/organ/external/arm/right/ipc + encased = null + status = ORGAN_ROBOT + /obj/item/organ/external/arm/right/ipc/New() robotize("Morpheus Cyberkinetics") ..() +/obj/item/organ/external/leg/ipc + encased = null + status = ORGAN_ROBOT /obj/item/organ/external/leg/ipc/New() robotize("Morpheus Cyberkinetics") ..() +/obj/item/organ/external/leg/right/ipc + encased = null + status = ORGAN_ROBOT + + /obj/item/organ/external/leg/right/ipc/New() robotize("Morpheus Cyberkinetics") ..() +/obj/item/organ/external/foot/ipc + encased = null + status = ORGAN_ROBOT + + /obj/item/organ/external/foot/ipc/New() robotize("Morpheus Cyberkinetics") ..() +/obj/item/organ/external/foot/right/ipc + encased = null + status = ORGAN_ROBOT + + /obj/item/organ/external/foot/right/ipc/New() robotize("Morpheus Cyberkinetics") ..() +/obj/item/organ/external/hand/ipc + encased = null + status = ORGAN_ROBOT + /obj/item/organ/external/hand/ipc/New() robotize("Morpheus Cyberkinetics") ..() +/obj/item/organ/external/hand/right/ipc + encased = null + status = ORGAN_ROBOT + /obj/item/organ/external/hand/right/ipc/New() robotize("Morpheus Cyberkinetics") ..() @@ -62,6 +102,7 @@ parent_organ = "chest" slot = "heart" vital = 1 + status = ORGAN_ROBOT /obj/item/organ/internal/cell/New() robotize() @@ -81,6 +122,7 @@ icon = 'icons/obj/robot_component.dmi' icon_state = "camera" slot = "eyes" + status = ORGAN_ROBOT // dead_icon = "camera_broken" /obj/item/organ/internal/optical_sensor/New() @@ -95,6 +137,7 @@ vital = 1 max_damage = 200 slot = "brain" + status = ORGAN_ROBOT var/obj/item/device/mmi/stored_mmi /obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi() diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 8074bf047b9..389f47dd65e 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -4,7 +4,7 @@ /datum/surgery_step/open_encased/retract, /datum/surgery_step/internal/manipulate_organs, /datum/surgery_step/glue_bone, /datum/surgery_step/set_bone,/datum/surgery_step/finish_bone,/datum/surgery_step/generic/cauterize) possible_locs = list("chest","head") requires_organic_bodypart = 0 - disallowed_mob = (/mob/living/carbon/human/machine) + disallowed_mob = list(/mob/living/carbon/human/machine,/mob/living/carbon/human/diona,/mob/living/carbon/human/slime) /datum/surgery/organ_manipulation/soft possible_locs = list("groin", "eyes", "mouth") @@ -24,6 +24,13 @@ steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw, /datum/surgery_step/internal/manipulate_organs,/datum/surgery_step/generic/cauterize) +/datum/surgery/organ_manipulation/can_start(mob/user, mob/living/carbon/target) + if(istype(target,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = target + var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) + if(affected.status & ORGAN_ROBOT) + return 0 + return 1 // Internal surgeries. /datum/surgery_step/internal @@ -204,7 +211,7 @@ for(var/obj/item/organ/internal/I in affected.internal_organs) if(I && I.damage > 0) if(I.robotic < 2 && !istype (tool, /obj/item/stack/nanopaste)) - if(!I.sterile) + if(!(I.sterile)) spread_germs_to_organ(I, user) user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \ "You start treating damage to [target]'s [I.name] with [tool_name]." ) @@ -228,6 +235,8 @@ tool_name = "regenerative membrane" if (istype(tool, /obj/item/stack/medical/bruise_pack)) tool_name = "the bandaid" + if (istype(tool, /obj/item/stack/nanopaste)) + tool_name = "\the [tool]" //what else do you call nanopaste medically? if (!hasorgans(target)) return @@ -285,7 +294,64 @@ return 0 -//todo set up fail steps +/datum/surgery_step/internal/manipulate_organs/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + if(current_type == "mend") + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + user.visible_message("\red [user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!", \ + "\red Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!") + var/dam_amt = 2 + + if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) + target.adjustToxLoss(5) + + else if (istype(tool, /obj/item/stack/medical/bruise_pack) || istype(tool, /obj/item/stack/nanopaste)) + dam_amt = 5 + target.adjustToxLoss(10) + affected.createwound(CUT, 5) + + for(var/obj/item/organ/internal/I in affected.internal_organs) + if(I && I.damage > 0 && !(I.tough)) + I.take_damage(dam_amt,0) + + return 0 + else if(current_type == "insert") + + user.visible_message("\red [user]'s hand slips, damaging \the [tool]!", \ + "\red Your hand slips, damaging \the [tool]!") + var/obj/item/organ/internal/I = tool + if(istype(I) &&!(I.tough)) + I.take_damage(rand(3,5),0) + return 0 + + + else if(current_type == "extract") + if(I && I.owner == target) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("\red [user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \ + "\red Your hand slips, damaging [target]'s [affected.name] with \the [tool]!") + affected.createwound(BRUISE, 20) + else + user.visible_message("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!", + "You can't extract anything from [target]'s [parse_zone(target_zone)]!") + return 0 + else if(current_type == "finish") + if(affected.encased) + var/msg = "\red [user]'s hand slips, bending [target]'s [affected.encased] the wrong way!" + var/self_msg = "\red Your hand slips, bending [target]'s [affected.encased] the wrong way!" + user.visible_message(msg, self_msg) + affected.fracture() + else + var/msg = "\red [user]'s hand slips, tearing the skin!" + var/self_msg = "\red Your hand slips, tearing skin!" + user.visible_message(msg, self_msg) + affected.createwound(BRUISE, 20) + return 0 + + + return 0 ////////////////////////////////////////////////////////////////// // HEART SURGERY // diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index cc3a6abeafb..0d10998e706 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -19,6 +19,14 @@ allowed_mob = list(/mob/living/carbon/human/machine) disallowed_mob = list(/mob/living/carbon/human) +/datum/surgery/cybernetic_repair/can_start(mob/user, mob/living/carbon/target) + + if(istype(target,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = target + var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) + if(affected.status & ORGAN_ORGANIC) + return 0 + return 1 //to do, moar surgerys or condense down ala mainpulate organs. /datum/surgery_step/robotics @@ -49,6 +57,7 @@ return 1 /datum/surgery_step/robotics/external/unscrew_hatch + name = "unscrew hatch" allowed_tools = list( /obj/item/weapon/screwdriver = 100, /obj/item/weapon/coin = 50, @@ -82,6 +91,7 @@ return 0 /datum/surgery_step/robotics/external/open_hatch + name = "open hatch" allowed_tools = list( /obj/item/weapon/retractor = 100, /obj/item/weapon/crowbar = 100, @@ -115,6 +125,7 @@ return 0 /datum/surgery_step/robotics/external/close_hatch + name = "close hatch" allowed_tools = list( /obj/item/weapon/retractor = 100, /obj/item/weapon/crowbar = 100, diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 075c9199534..ba22b72ae18 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -1,6 +1,6 @@ ///Datum Surgery Helpers// /datum/surgery - var/name = "surgery" + var/name var/status = 1 var/list/steps = list() /* @@ -20,7 +20,7 @@ var/obj/item/organ/organ_ref //Operable body part var/current_organ = "organ" var/list/allowed_mob = list(/mob/living/carbon/human) - var/list/disallowed_mob = null + var/list/disallowed_mob = list(/mob/living/carbon/human/machine) /datum/surgery/proc/can_start(mob/user, mob/living/carbon/target) // if 0 surgery wont show up in list @@ -110,7 +110,7 @@ prob_chance *= get_location_modifier(target) if(prob_chance > 100)//if we are using a super tool - max_duration = max_duration - 50 //PLACEHOLDER VALUES + max_duration = max_duration/prob_chance //PLACEHOLDER VALUES if(do_after(user, max_duration, target = target))