From 47db4eded3c5a45045e333f7b59ee13fdb22374d Mon Sep 17 00:00:00 2001 From: Chinsky Date: Wed, 7 Nov 2012 20:01:55 +0400 Subject: [PATCH 1/3] Can attach limbs now. No preparations needed yet. --- code/WorkInProgress/surgery.dm | 50 +++++++++++++++++++- code/datums/organs/organ_external.dm | 15 +++++- code/game/objects/items.dm | 2 +- code/game/objects/items/robot/robot_parts.dm | 5 ++ 4 files changed, 68 insertions(+), 4 deletions(-) diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm index 31c97c7821..31a073a13a 100644 --- a/code/WorkInProgress/surgery.dm +++ b/code/WorkInProgress/surgery.dm @@ -834,4 +834,52 @@ proc/build_surgery_steps_list() // LIMB SURGERY // ////////////////////////////////////////////////////////////////// -//uh, sometime later, okay? \ No newline at end of file +/datum/surgery_step/limb/ + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return 0 + var/datum/organ/external/affected = target.get_organ(target_zone) + if (!affected) + return 0 + if (!(affected.status & ORGAN_DESTROYED)) + return 0 + if (affected.parent) + if (affected.parent.status & ORGAN_DESTROYED) + return 0 + return 1 + +/datum/surgery_step/limb/attach + required_tool = /obj/item/robot_parts + + min_duration = 80 + max_duration = 100 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/robot_parts/p = tool + if (p.part) + if (!(target_zone in p.part)) + return 0 + var/datum/organ/external/affected = target.get_organ(target_zone) + return ..()// && affected.status & ORGAN_ATTACHABLE + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts attaching [tool] where [target]'s [affected.display_name] used to be.", \ + "You start attaching [tool] where [target]'s [affected.display_name] used to be.") + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("\blue [user] has attached [tool] where [target]'s [affected.display_name] used to be.", \ + "\blue You have attached [tool] where [target]'s [affected.display_name] used to be.") + affected.robotize() + target.update_body() + target.updatehealth() + target.UpdateDamageIcon() + del(tool) + + fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \ + "\red Your hand slips, damaging connectors on [target]'s [affected.display_name]!") + target.apply_damage(10, BRUTE, affected) + diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 3303fda93a..0c953e6843 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -378,8 +378,8 @@ if(!no_explode) explosion(get_turf(owner),-1,-1,2,3) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() - spark_system.set_up(5, 0, src) - spark_system.attach(src) + spark_system.set_up(5, 0, owner) + spark_system.attach(owner) spark_system.start() spawn(10) del(spark_system) @@ -477,6 +477,17 @@ else return name + proc/robotize() + src.status &= ~ORGAN_BROKEN + src.status &= ~ORGAN_BLEEDING + src.status &= ~ORGAN_SPLINTED + src.status &= ~ORGAN_ATTACHABLE + src.status &= ~ORGAN_DESTROYED + src.status |= ORGAN_ROBOT + for (var/datum/organ/external/T in children) + if(T) + T.robotize() + /datum/organ/external/chest name = "chest" icon_name = "chest" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2196f10b60..86bc955da0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -188,7 +188,7 @@ return if (can_operate(M)) //Checks if mob is lying down on table for surgery if(istype(M,/mob/living/carbon)) - if (user.a_intent == "help" || (user.a_intent != "harm" && is_surgery_tool(src))) + if (user.a_intent != "harm") if(surgery_steps == null) build_surgery_steps_list() for(var/datum/surgery_step/S in surgery_steps) //check if tool is right or close enough diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 340af7c605..8554fd4b6b 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -7,6 +7,7 @@ slot_flags = SLOT_BELT var/construction_time = 100 var/list/construction_cost = list("metal"=20000,"glass"=5000) + var/list/part = null /obj/item/robot_parts/l_arm name = "Cyborg Left Arm" @@ -14,6 +15,7 @@ icon_state = "l_arm" construction_time = 200 construction_cost = list("metal"=18000) + part = list("l_arm","l_hand") /obj/item/robot_parts/r_arm name = "Cyborg Right Arm" @@ -21,6 +23,7 @@ icon_state = "r_arm" construction_time = 200 construction_cost = list("metal"=18000) + part = list("r_arm","r_hand") /obj/item/robot_parts/l_leg name = "Cyborg Left Leg" @@ -28,6 +31,7 @@ icon_state = "l_leg" construction_time = 200 construction_cost = list("metal"=15000) + part = list("l_leg","l_foot") /obj/item/robot_parts/r_leg name = "Cyborg Right Leg" @@ -35,6 +39,7 @@ icon_state = "r_leg" construction_time = 200 construction_cost = list("metal"=15000) + part = list("r_leg","r_foot") /obj/item/robot_parts/chest name = "Cyborg Torso" From 5043147cfc8448501bcabf2b5ddba3a7845f432c Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 9 Nov 2012 13:22:55 +0400 Subject: [PATCH 2/3] Added prothesis instll surgery. --- code/WorkInProgress/surgery.dm | 101 +++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 4 deletions(-) diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm index 31a073a13a..847b148a3f 100644 --- a/code/WorkInProgress/surgery.dm +++ b/code/WorkInProgress/surgery.dm @@ -64,12 +64,18 @@ proc/build_surgery_steps_list() /datum/surgery_step/generic/ var/datum/organ/external/affected //affected organ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (target_zone == "eyes") //there are specific steps for eye surgery + return 0 if (!hasorgans(target)) return 0 affected = target.get_organ(target_zone) if (affected == null) return 0 - return target_zone != "eyes" //there are specific steps for eye surgery + if (affected.status & ORGAN_DESTROYED) + return 0 + if (affected.status & ORGAN_ROBOT) + return 0 + return 1 /datum/surgery_step/generic/cut_open required_tool = /obj/item/weapon/scalpel @@ -848,6 +854,94 @@ proc/build_surgery_steps_list() return 0 return 1 + +/datum/surgery_step/limb/cut + required_tool = /obj/item/weapon/scalpel + + min_duration = 80 + max_duration = 100 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts cutting away flesh where [target]'s [affected.display_name] used to be with \the [tool].", \ + "You start cutting away flesh where [target]'s [affected.display_name] used to be with \the [tool].") + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("\blue [user] cuts away flesh where [target]'s [affected.display_name] used to be with \the [tool].", \ + "\blue You cut away flesh where [target]'s [affected.display_name] used to be with \the [tool].") + affected.status |= ORGAN_CUT_AWAY + + fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + if (affected.parent) + affected = affected.parent + user.visible_message("\red [user]'s hand slips, cutting [target]'s [affected.display_name] open!", \ + "\red Your hand slips, cutting [target]'s [affected.display_name] open!") + affected.createwound(CUT, 10) + + +/datum/surgery_step/limb/mend + required_tool = /obj/item/weapon/retractor + + min_duration = 80 + max_duration = 100 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + return ..() && affected.status & ORGAN_CUT_AWAY + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] is beginning reposition flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].", \ + "You start repositioning flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].") + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("\blue [user] has finished repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].", \ + "\blue You have finished repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].") + affected.open = 3 + + fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + if (affected.parent) + affected = affected.parent + user.visible_message("\red [user]'s hand slips, tearing flesh on [target]'s [affected.display_name]!", \ + "\red Your hand slips, tearing flesh on [target]'s [affected.display_name]!") + target.apply_damage(10, BRUTE, affected) + + +/datum/surgery_step/limb/prepeare + required_tool = /obj/item/weapon/cautery + + min_duration = 60 + max_duration = 70 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + return ..() && affected.open == 3 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts adjusting area around [target]'s [affected.display_name] with \the [tool].", \ + "You start adjusting area around [target]'s [affected.display_name] with \the [tool]..") + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("\blue [user] has finished adjusting the area around [target]'s [affected.display_name] with \the [tool].", \ + "\blue You have finished adjusting the area around [target]'s [affected.display_name] with \the [tool].") + affected.status |= ORGAN_ATTACHABLE + affected.open = 0 + + fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + if (affected.parent) + affected = affected.parent + user.visible_message("\red [user]'s hand slips, searing [target]'s [affected.display_name]!", \ + "\red Your hand slips, searing [target]'s [affected.display_name]!") + target.apply_damage(10, BURN, affected) + + /datum/surgery_step/limb/attach required_tool = /obj/item/robot_parts @@ -860,7 +954,7 @@ proc/build_surgery_steps_list() if (!(target_zone in p.part)) return 0 var/datum/organ/external/affected = target.get_organ(target_zone) - return ..()// && affected.status & ORGAN_ATTACHABLE + return ..() && affected.status & ORGAN_ATTACHABLE begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -881,5 +975,4 @@ proc/build_surgery_steps_list() var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \ "\red Your hand slips, damaging connectors on [target]'s [affected.display_name]!") - target.apply_damage(10, BRUTE, affected) - + target.apply_damage(10, BRUTE, affected) \ No newline at end of file From a2f4c91e4ac649d66f5ebfe70eba8fdddcff2b62 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 9 Nov 2012 18:07:02 +0400 Subject: [PATCH 3/3] Made limbs prepeared for replacement stop hurt. --- code/WorkInProgress/surgery.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm index 847b148a3f..a7210ee6e0 100644 --- a/code/WorkInProgress/surgery.dm +++ b/code/WorkInProgress/surgery.dm @@ -911,7 +911,7 @@ proc/build_surgery_steps_list() target.apply_damage(10, BRUTE, affected) -/datum/surgery_step/limb/prepeare +/datum/surgery_step/limb/prepare required_tool = /obj/item/weapon/cautery min_duration = 60 @@ -931,6 +931,7 @@ proc/build_surgery_steps_list() user.visible_message("\blue [user] has finished adjusting the area around [target]'s [affected.display_name] with \the [tool].", \ "\blue You have finished adjusting the area around [target]'s [affected.display_name] with \the [tool].") affected.status |= ORGAN_ATTACHABLE + affected.amputated = 1 affected.open = 0 fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)