From c573f25fa69269cad96bdf0449b2efcdb2ee7afa Mon Sep 17 00:00:00 2001 From: "petethegoat@gmail.com" Date: Sun, 10 Feb 2013 22:30:53 +0000 Subject: [PATCH] Committing WIP datum based surgery. It is: -functional It's not: -finished -fun -perfect git-svn-id: http://tgstation13.googlecode.com/svn/trunk@5684 316c924e-a436-60f5-8080-3fe189b3f50e --- code/WorkInProgress/surgery/appendectomy.dm | 20 ++++++++++++ code/WorkInProgress/surgery/human.dm | 24 ++++++++++++++ code/WorkInProgress/surgery/surgery.dm | 19 +++++++++++ code/WorkInProgress/surgery/surgery_step.dm | 36 +++++++++++++++++++++ 4 files changed, 99 insertions(+) create mode 100644 code/WorkInProgress/surgery/appendectomy.dm create mode 100644 code/WorkInProgress/surgery/human.dm create mode 100644 code/WorkInProgress/surgery/surgery.dm create mode 100644 code/WorkInProgress/surgery/surgery_step.dm diff --git a/code/WorkInProgress/surgery/appendectomy.dm b/code/WorkInProgress/surgery/appendectomy.dm new file mode 100644 index 00000000000..8987b09b215 --- /dev/null +++ b/code/WorkInProgress/surgery/appendectomy.dm @@ -0,0 +1,20 @@ +/datum/surgery/appendectomy + name = "appendectomy" + steps = list(/datum/surgery_step/open, /datum/surgery_step/close) + location = "groin" + + +/datum/surgery_step/open + implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchenknife = 65, /obj/item/weapon/shard = 45) + time = 12 + +/datum/surgery_step/open/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to cut open [target].") + + +/datum/surgery_step/close + implements = list(/obj/item/weapon/cautery = 100, /obj/item/weapon/weldingtool = 70, /obj/item/weapon/lighter = 45, /obj/item/weapon/match = 20) + time = 8 + +/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to mend [target].") \ No newline at end of file diff --git a/code/WorkInProgress/surgery/human.dm b/code/WorkInProgress/surgery/human.dm new file mode 100644 index 00000000000..d781b064c5e --- /dev/null +++ b/code/WorkInProgress/surgery/human.dm @@ -0,0 +1,24 @@ +//WORK IN PROGRESS + +/mob/living/carbon/human + var/list/surgeries = list() +// var/list/organs = list() + +/mob/living/carbon/human/attackby(obj/item/I, mob/user) + if(lying) //if they're prone + if(istype(I, /obj/item/weapon/bedsheet)) + var/P = input("Begin which procedure?", "Surgery", null, null) as null|anything in (typesof(/datum/surgery) - /datum/surgery) + var/datum/surgery/procedure = new P + if(procedure) + surgeries += procedure + return + + else if(surgeries.len) + var/success = 0 + for(var/datum/surgery/S in surgeries) + if(S.next_step(user, src)) + success = 1 + if(success) + return + + ..() \ No newline at end of file diff --git a/code/WorkInProgress/surgery/surgery.dm b/code/WorkInProgress/surgery/surgery.dm new file mode 100644 index 00000000000..0998386f5ca --- /dev/null +++ b/code/WorkInProgress/surgery/surgery.dm @@ -0,0 +1,19 @@ +/datum/surgery + var/name = "surgery" + var/status = 1 + var/list/steps = list() + var/location = "chest" + + +/datum/surgery/proc/next_step(mob/user, mob/living/carbon/target) + var/procedure = steps[status] + var/datum/surgery_step/S = new procedure + if(S) + if(S.try_op(user, target, user.zone_sel.selecting, user.get_active_hand(), src)) + return 1 + return 0 + + +/datum/surgery/proc/complete(mob/living/carbon/human/target) + target.surgeries.Cut(src) + src = null \ No newline at end of file diff --git a/code/WorkInProgress/surgery/surgery_step.dm b/code/WorkInProgress/surgery/surgery_step.dm new file mode 100644 index 00000000000..321b017b8df --- /dev/null +++ b/code/WorkInProgress/surgery/surgery_step.dm @@ -0,0 +1,36 @@ +/datum/surgery_step + var/list/implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchenknife = 65, /obj/item/weapon/shard = 45) + var/time = 10 + + +/datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(tool.type in implements) + if(target_zone == surgery.location) + initiate(user, target, target_zone, tool, surgery) + return 1 + return 0 + + +/datum/surgery_step/proc/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + preop(user, target, target_zone, tool) + if(do_after(user, time)) + var/prob_chance = implements[tool.type] + if(prob(prob_chance)) + success(user, target, target_zone, tool, surgery) + surgery.status++ + if(surgery.status > surgery.steps.len) + surgery.complete(target) + else + failure(user, target, target_zone, tool, surgery) + + +/datum/surgery_step/proc/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to perform surgery on [target].") + + +/datum/surgery_step/proc/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] succeeds!") + + +/datum/surgery_step/proc/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] screws up!") \ No newline at end of file