Surgery, Implants and Organs rework: Phase 1

This commit is contained in:
c0
2015-07-31 22:18:31 +03:00
parent 7b94435e9c
commit 04f7b3f2de
48 changed files with 934 additions and 831 deletions
+4 -6
View File
@@ -2,15 +2,15 @@
name = "appendectomy"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_appendix, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "groin"
requires_organic_chest = 1
possible_locs = list("groin")
//extract appendix
/datum/surgery_step/extract_appendix
name = "extract appendix"
accept_hand = 1
time = 64
var/obj/item/organ/appendix/A = null
var/obj/item/organ/internal/appendix/A = null
/datum/surgery_step/extract_appendix/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
A = locate() in target.internal_organs
@@ -23,9 +23,7 @@
if(A)
user.visible_message("[user] successfully removes [target]'s appendix!", "<span class='notice'>You successfully removes [target]'s appendix.</span>")
A.loc = get_turf(target)
target.internal_organs -= A
for(var/datum/disease/appendicitis in target.viruses)
appendicitis.cure()
A.Remove(target)
else
user << "<span class='warning'>You can't find an appendix in [target]!</span>"
return 1
+3 -1
View File
@@ -2,11 +2,13 @@
name = "brain removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/extract_brain)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "head"
possible_locs = list("head")
requires_organic_bodypart = 0
//extract brain
/datum/surgery_step/extract_brain
name = "extract brain"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 55)
time = 64
var/obj/item/organ/brain/B = null
+3 -3
View File
@@ -2,12 +2,12 @@
name = "cavity implant"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/handle_cavity, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "chest"
requires_organic_chest = 1
possible_locs = list("chest")
//handle cavity
/datum/surgery_step/handle_cavity
name = "implant item"
accept_hand = 1
accept_any_item = 1
time = 32
@@ -25,7 +25,7 @@
/datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(tool)
if(IC || tool.w_class > 3 || (tool.flags & NODROP) || tool.GetTypeInAllContents(/obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/organ))
if(IC || tool.w_class > 3 || NODROP in tool.flags || tool.GetTypeInAllContents(/obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/organ))
user << "<span class='warning'>You can't seem to fit [tool] in [target]'s [target_zone]!</span>"
return 0
else
+1
View File
@@ -7,6 +7,7 @@
//extract brain
/datum/surgery_step/extract_core
name = "extract core"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 100)
time = 16
+12 -8
View File
@@ -5,12 +5,13 @@
user.visible_message("[user] begins to implant [target] with [implant].", "<span class='notice'>You begin to implant [target] with [implant]...</span>")
//[[[[EYES]]]]
/datum/surgery/eye_cybernetic_implant/eyes
/datum/surgery/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"
possible_locs = list("eyes")
/datum/surgery_step/cybernetic_implant/eyes
name = "insert eye cybernetic implant"
implements = list(/obj/item/cybernetic_implant/eyes = 100)
time = 32
@@ -23,12 +24,14 @@
return 1
//[[[[BRAIN]]]]
/datum/surgery/eye_cybernetic_implant/brain
/datum/surgery/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"
possible_locs = list("head")
requires_organic_bodypart = 0
/datum/surgery_step/cybernetic_implant/brain
name = "insert brain cybernetic implant"
implements = list(/obj/item/cybernetic_implant/brain = 100)
time = 32
@@ -45,12 +48,14 @@
return 1
//[[[[CHEST]]]]
/datum/surgery/eye_cybernetic_implant/chest
/datum/surgery/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"
possible_locs = list("chest")
requires_organic_bodypart = 0
/datum/surgery_step/cybernetic_implant/chest
name = "insert torso cybernetic implant"
implements = list(/obj/item/cybernetic_implant/chest = 100)
time = 32
@@ -70,10 +75,9 @@
if(full)
user << "<span class='warning'>You can't seem to implant anything else into the [target]'s [target_zone]!</span>"
else
if(!user.drop_item())
return
user.visible_message("[user] inserts [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]!", "<span class='notice'>You insert [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone].</span>")
implant.owner = target
implant.function()
user.drop_item()
target.internal_organs |= implant
implant.loc = target
+3 -2
View File
@@ -2,11 +2,12 @@
name = "eye surgery"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "eyes"
possible_locs = list("eyes")
requires_organic_bodypart = 0
//fix eyes
/datum/surgery_step/fix_eyes
name = "fix eyes"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/pen = 25)
time = 64
+2 -2
View File
@@ -2,12 +2,12 @@
name = "gender reassignment"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/reshape_genitals, /datum/surgery_step/close)
species = list(/mob/living/carbon/human)
location = "groin"
requires_organic_chest = 1
possible_locs = list("groin")
//reshape_genitals
/datum/surgery_step/reshape_genitals
name = "reshape genitals"
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/hatchet = 50, /obj/item/weapon/wirecutters = 35)
time = 64
+17 -2
View File
@@ -1,6 +1,7 @@
//make incision
/datum/surgery_step/incise
name = "make incision"
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 65, /obj/item/weapon/shard = 45)
time = 24
@@ -11,6 +12,7 @@
//clamp bleeders
/datum/surgery_step/clamp_bleeders
name = "clamp bleeders"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/wirecutters = 60, /obj/item/stack/cable_coil = 15)
time = 48
@@ -20,6 +22,7 @@
//retract skin
/datum/surgery_step/retract_skin
name = "retract skin"
implements = list(/obj/item/weapon/retractor = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/wirecutters = 35)
time = 32
@@ -30,6 +33,7 @@
//close incision
/datum/surgery_step/close
name = "mend incision"
implements = list(/obj/item/weapon/cautery = 100, /obj/item/weapon/weldingtool = 70, /obj/item/weapon/lighter = 45, /obj/item/weapon/match = 20)
time = 32
@@ -55,14 +59,25 @@
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)
target.heal_organ_damage(45,0)
return ..()
//saw bone
/datum/surgery_step/saw
name = "saw bone"
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
time = 64
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].", "<span class='notice'>You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...</span>")
/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.apply_damage(50,"brute","[target_zone]")
user.visible_message("[user] saws [target]'s [parse_zone(target_zone)] open!", "<span class='notice'>You saw [target]'s [parse_zone(target_zone)] open.</span>")
return 1
+28 -29
View File
@@ -1,54 +1,53 @@
/proc/attempt_initiate_surgery(obj/item/I, mob/living/M, mob/user)
if(istype(M))
var/mob/living/carbon/human/H
var/obj/item/organ/limb/affecting
if(istype(M, /mob/living/carbon/human))
H = M
affecting = H.get_organ(check_zone(user.zone_sel.selecting))
if(M.lying || isslime(M)) //if they're prone or a slime
var/list/all_surgeries = surgeries_list.Copy()
var/list/available_surgeries = list()
for(var/i in all_surgeries)
var/datum/surgery/S = all_surgeries[i]
if(!S.possible_locs.Find(user.zone_sel.selecting))
continue
if(locate(S.type) in M.surgeries)
continue
if(S.user_species_restricted)
if(!istype(user, /mob/living/carbon/human))
continue
var/mob/living/carbon/human/doc = user
if(!(doc.dna.species.id in S.user_species_ids))
continue
if(S.target_must_be_dead && M.stat != DEAD)
if(affecting && S.requires_organic_bodypart && affecting.status == ORGAN_ROBOTIC)
continue
if(S.target_must_be_fat && !(M.disabilities & FAT))
if(!S.can_start(user, M))
continue
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M //So we can use get_organ and not some terriblly long Switch or something worse - RR
if(S.requires_organic_chest && H.getlimb(/obj/item/organ/limb/robot/chest)) //This a seperate case to below, see "***" in surgery.dm - RR
continue
var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
if(affecting.status == ORGAN_ROBOTIC && affecting.body_part != HEAD) //Cannot operate on Robotic organs except for the head. - RR
continue
for(var/path in S.species)
if(istype(M, path))
available_surgeries[S.name] = S
break
for(var/datum/surgery/S in M.surgeries)
if(S.status == 1 && !S.step_in_progress)
available_surgeries["cancel " + S.name] = S
var/P = input("Begin which procedure?", "Surgery", null, null) as null|anything in available_surgeries
if(P)
var/datum/surgery/S = available_surgeries[P]
if(S in M.surgeries)
M.surgeries -= S
qdel(S)
return 1
var/datum/surgery/procedure = new S.type
if(procedure)
if(get_location_accessible(M, procedure.location) || procedure.ignore_clothes)
if(procedure.location == "anywhere") // if location == "anywhere" change location to the surgeon's target, otherwise leave location as is.
procedure.location = user.zone_sel.selecting
procedure.location = user.zone_sel.selecting
if(procedure.ignore_clothes || get_location_accessible(M, procedure.location))
M.surgeries += procedure
user.visible_message("[user] drapes [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].", "<span class='notice'>You drape [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].</span>")
if(affecting)
procedure.organ = affecting
user.visible_message("[user] drapes [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].", \
"<span class='notice'>You drape [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].</span>")
add_logs(user, M, "operated", addition="Operation type: [procedure.name]")
feedback_add_details("surgery_initiated","[procedure.name]")
return 1
else
user << "<span class='warning'>You need to expose [M]'s [procedure.location] first!</span>"
@@ -59,7 +58,7 @@
/proc/get_location_modifier(mob/M)
proc/get_location_modifier(mob/M)
var/turf/T = get_turf(M)
if(locate(/obj/structure/optable, T))
return 1
@@ -80,13 +79,13 @@
for(var/obj/item/clothing/I in list(C.back, C.wear_mask, C.head))
covered_locations |= I.body_parts_covered
face_covered |= I.flags_inv
eyesmouth_covered |= I.flags_cover
eyesmouth_covered |= I.flags
if(ishuman(C))
var/mob/living/carbon/human/H = C
for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.ears))
covered_locations |= I.body_parts_covered
face_covered |= I.flags_inv
eyesmouth_covered |= I.flags_cover
eyesmouth_covered |= I.flags
switch(location)
if("head")
+23 -12
View File
@@ -2,22 +2,18 @@
name = "implant removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/extract_implant, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "chest"
requires_organic_chest = 1
possible_locs = list("chest")
//extract implant
/datum/surgery_step/extract_implant
name = "extract implant"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 65)
time = 64
var/obj/item/weapon/implant/I = null
/datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
for(var/obj/item/weapon/implant/W in target)
if(W.imp_in == target) //Checking that it's actually implanted, not just in his pocket
I = W
break
I = locate(/obj/item/weapon/implant) in target
if(I)
user.visible_message("[user] begins to extract [I] from [target]'s [target_zone].", "<span class='notice'>You begin to extract [I] from [target]'s [target_zone]...</span>")
else
@@ -26,10 +22,25 @@
/datum/surgery_step/extract_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(I)
user.visible_message("[user] successfully removes [I] from [target]'s [target_zone]!", "<span class='notice'>You successfully remove [I] from [target]'s [target_zone].</span>")
qdel(I)
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/H = target
H.sec_hud_set_implants()
I.removed(target)
var/obj/item/weapon/implantcase/case
if(istype(user.get_item_by_slot(slot_l_hand), /obj/item/weapon/implantcase))
case = user.get_item_by_slot(slot_l_hand)
else if(istype(user.get_item_by_slot(slot_r_hand), /obj/item/weapon/implantcase))
case = user.get_item_by_slot(slot_r_hand)
else
case = locate(/obj/item/weapon/implantcase) in get_turf(target)
if(case && !case.imp)
case.imp = I
I.loc = case
case.update_icon()
user.visible_message("[user] places [I] into [case]!", "<span class='notice'>You place [I] into [case].</span>")
else
qdel(I)
else
user << "<span class='warning'>You can't find anything in [target]'s [target_zone]!</span>"
return 1
return 1
+5 -32
View File
@@ -5,6 +5,7 @@
//SURGERY STEPS
/datum/surgery_step/replace
name = "sever muscules"
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/wirecutters = 55)
time = 32
@@ -14,15 +15,15 @@
/datum/surgery_step/add_limb
name = "replace limb"
implements = list(/obj/item/robot_parts = 100)
time = 32
var/obj/item/organ/limb/L = null // L because "limb"
allowed_organs = list("r_arm","l_arm","r_leg","l_leg","chest","head")
/datum/surgery_step/add_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
L = new_organ
L = surgery.organ
if(L)
user.visible_message("[user] begins to augment [target]'s [parse_zone(user.zone_sel.selecting)].", "<span class ='notice'>You begin to augment [target]'s [parse_zone(user.zone_sel.selecting)]...</span>")
else
@@ -36,8 +37,7 @@
name = "augmentation"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/saw, /datum/surgery_step/add_limb)
species = list(/mob/living/carbon/human)
location = "anywhere" //Check attempt_initate_surgery() (in code/modules/surgery/helpers) to see what this does if you can't tell
has_multi_loc = 1 //Multi location stuff, See multiple_location_example.dm
possible_locs = list("r_arm","l_arm","r_leg","l_leg","chest","head")
//SURGERY STEP SUCCESSES
@@ -45,34 +45,6 @@
/datum/surgery_step/add_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(L)
if(ishuman(target))
switch(L.body_part)
if(CHEST)
if(!istype(tool,/obj/item/robot_parts/chest))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(HEAD)
if(!istype(tool,/obj/item/robot_parts/head))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(ARM_LEFT)
if(!istype(tool,/obj/item/robot_parts/l_arm))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(ARM_RIGHT)
if(!istype(tool,/obj/item/robot_parts/r_arm))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(LEG_LEFT)
if(!istype(tool,/obj/item/robot_parts/l_leg))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(LEG_RIGHT)
if(!istype(tool,/obj/item/robot_parts/r_leg))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(!user.drop_item())
return 0
var/mob/living/carbon/human/H = target
user.visible_message("[user] successfully augments [target]'s [parse_zone(target_zone)]!", "<span class='notice'>You successfully augment [target]'s [parse_zone(target_zone)].</span>")
L.loc = get_turf(target)
@@ -94,6 +66,7 @@
H.organs += new /obj/item/organ/limb/robot/chest(src)
for(var/datum/disease/appendicitis/A in H.viruses) //If they already have Appendicitis, Remove it
A.cure(1)
user.drop_item()
qdel(tool)
H.update_damage_overlays(0)
H.update_augments() //Gives them the Cyber limb overlay
+8 -4
View File
@@ -1,14 +1,17 @@
/datum/surgery/lipoplasty
name = "lipoplasty"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/cut_fat, /datum/surgery_step/remove_fat, /datum/surgery_step/close)
species = list(/mob/living/carbon/human)
target_must_be_fat = 1
location = "chest"
requires_organic_chest = 1
possible_locs = list("chest")
/datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target)
if(target.disabilities & FAT)
return 1
return 0
//cut fat
/datum/surgery_step/cut_fat
name = "cut excess fat"
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
time = 64
@@ -21,6 +24,7 @@
//remove fat
/datum/surgery_step/remove_fat
name = "remove loose fat"
implements = list(/obj/item/weapon/retractor = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/wirecutters = 35)
time = 32
@@ -1,51 +1,51 @@
/////AUGMENTATION\\\\\
//See code/modules/surgery/organs/organ.dm for the parent "limb"
/obj/item/organ/limb/robot
name = "cyberlimb"
desc = "You should never be seeing this!"
status = ORGAN_ROBOTIC
/obj/item/organ/limb/robot/chest
name = "chest"
desc = "A Robotic chest"
icon_state = "chest"
max_damage = 200
body_part = CHEST
/obj/item/organ/limb/robot/head
name = "head"
desc = "A Robotic head"
icon_state = "head"
max_damage = 200
body_part = HEAD
/obj/item/organ/limb/robot/l_arm
name = "l_arm"
desc = "A Robotic arm"
icon_state = "l_arm"
max_damage = 75
body_part = ARM_LEFT
/obj/item/organ/limb/robot/l_leg
name = "l_leg"
desc = "A Robotic leg"
icon_state = "l_leg"
max_damage = 75
body_part = LEG_LEFT
/obj/item/organ/limb/robot/r_arm
name = "r_arm"
desc = "A Robotic arm"
icon_state = "r_arm"
max_damage = 75
body_part = ARM_RIGHT
/obj/item/organ/limb/robot/r_leg
name = "r_leg"
desc = "A Robotic leg"
icon_state = "r_leg"
max_damage = 75
body_part = LEG_RIGHT
/////AUGMENTATION\\\\\
//See code/modules/surgery/organs/organ.dm for the parent "limb"
/obj/item/organ/limb/robot
name = "cyberlimb"
desc = "You should never be seeing this!"
status = ORGAN_ROBOTIC
/obj/item/organ/limb/robot/chest
name = "chest"
desc = "A Robotic chest"
icon_state = "chest"
max_damage = 200
body_part = CHEST
/obj/item/organ/limb/robot/head
name = "head"
desc = "A Robotic head"
icon_state = "head"
max_damage = 200
body_part = HEAD
/obj/item/organ/limb/robot/l_arm
name = "l_arm"
desc = "A Robotic arm"
icon_state = "l_arm"
max_damage = 75
body_part = ARM_LEFT
/obj/item/organ/limb/robot/l_leg
name = "l_leg"
desc = "A Robotic leg"
icon_state = "l_leg"
max_damage = 75
body_part = LEG_LEFT
/obj/item/organ/limb/robot/r_arm
name = "r_arm"
desc = "A Robotic arm"
icon_state = "r_arm"
max_damage = 75
body_part = ARM_RIGHT
/obj/item/organ/limb/robot/r_leg
name = "r_leg"
desc = "A Robotic leg"
icon_state = "r_leg"
max_damage = 75
body_part = LEG_RIGHT
+17 -8
View File
@@ -1,13 +1,22 @@
/mob/proc/getorgan()
mob/proc/getorgan()
return
/mob/living/carbon/getorgan(typepath)
mob/proc/getorgansloc()
return
mob/living/carbon/getorgan(typepath)
return (locate(typepath) in internal_organs)
/mob/proc/getlimb()
mob/living/carbon/getorgansloc(zone)
var/list/returnorg = list()
for(var/obj/item/organ/internal/O in internal_organs)
if(zone == O.zone)
returnorg += O
return returnorg
mob/proc/getlimb()
return
/mob/living/carbon/human/getlimb(typepath)
return (locate(typepath) in organs)
mob/living/carbon/human/getlimb(typepath)
return (locate(typepath) in organs)
@@ -1,199 +1,171 @@
/obj/item/organ
name = "organ"
icon = 'icons/obj/surgery.dmi'
/obj/item/organ/heart
name = "heart"
icon_state = "heart-on"
var/beating = 1
/obj/item/organ/heart/update_icon()
if(beating)
icon_state = "heart-on"
else
icon_state = "heart-off"
/obj/item/organ/appendix
name = "appendix"
icon_state = "appendix"
var/inflamed = 1
/obj/item/organ/appendix/update_icon()
if(inflamed)
icon_state = "appendixinflamed"
else
icon_state = "appendix"
//Looking for brains?
//Try code/modules/mob/living/carbon/brain/brain_item.dm
//Old Datum Limbs:
// code/modules/unused/limbs.dm
/obj/item/organ/limb
name = "limb"
var/mob/owner = null
var/body_part = null
var/brutestate = 0
var/burnstate = 0
var/brute_dam = 0
var/burn_dam = 0
var/max_damage = 0
var/status = ORGAN_ORGANIC
var/list/embedded_objects = list()
/obj/item/organ/limb/chest
name = "chest"
desc = "why is it detached..."
icon_state = "chest"
max_damage = 200
body_part = CHEST
/obj/item/organ/limb/head
name = "head"
desc = "what a way to get a head in life..."
icon_state = "head"
max_damage = 200
body_part = HEAD
/obj/item/organ/limb/l_arm
name = "l_arm"
desc = "why is it detached..."
icon_state = "l_arm"
max_damage = 75
body_part = ARM_LEFT
/obj/item/organ/limb/l_leg
name = "l_leg"
desc = "why is it detached..."
icon_state = "l_leg"
max_damage = 75
body_part = LEG_LEFT
/obj/item/organ/limb/r_arm
name = "r_arm"
desc = "why is it detached..."
icon_state = "r_arm"
max_damage = 75
body_part = ARM_RIGHT
/obj/item/organ/limb/r_leg
name = "r_leg"
desc = "why is it detached..."
icon_state = "r_leg"
max_damage = 75
body_part = LEG_RIGHT
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
//Cannot apply negative damage
/obj/item/organ/limb/proc/take_damage(brute, burn)
if(owner && (owner.status_flags & GODMODE)) return 0 //godmode
brute = max(brute,0)
burn = max(burn,0)
if(status == ORGAN_ROBOTIC) //This makes robolimbs not damageable by chems and makes it stronger
brute = max(0, brute - 5)
burn = max(0, burn - 4)
var/can_inflict = max_damage - (brute_dam + burn_dam)
if(!can_inflict) return 0
if((brute + burn) < can_inflict)
brute_dam += brute
burn_dam += burn
else
if(brute > 0)
if(burn > 0)
brute = round( (brute/(brute+burn)) * can_inflict, 1 )
burn = can_inflict - brute //gets whatever damage is left over
brute_dam += brute
burn_dam += burn
else
brute_dam += can_inflict
else
if(burn > 0)
burn_dam += can_inflict
else
return 0
return update_organ_icon()
//Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all.
//Damage cannot go below zero.
//Cannot remove negative damage (i.e. apply damage)
/obj/item/organ/limb/proc/heal_damage(brute, burn, robotic)
if(robotic && status != ORGAN_ROBOTIC) // This makes organic limbs not heal when the proc is in Robotic mode.
brute = max(0, brute - 3)
burn = max(0, burn - 3)
if(!robotic && status == ORGAN_ROBOTIC) // This makes robolimbs not healable by chems.
brute = max(0, brute - 3)
burn = max(0, burn - 3)
brute_dam = max(brute_dam - brute, 0)
burn_dam = max(burn_dam - burn, 0)
return update_organ_icon()
//Returns total damage...kinda pointless really
/obj/item/organ/limb/proc/get_damage()
return brute_dam + burn_dam
//Updates an organ's brute/burn states for use by update_damage_overlays()
//Returns 1 if we need to update overlays. 0 otherwise.
/obj/item/organ/limb/proc/update_organ_icon()
if(status == ORGAN_ORGANIC) //Robotic limbs show no damage - RR
var/tbrute = round( (brute_dam/max_damage)*3, 1 )
var/tburn = round( (burn_dam/max_damage)*3, 1 )
if((tbrute != brutestate) || (tburn != burnstate))
brutestate = tbrute
burnstate = tburn
return 1
return 0
//Returns a display name for the organ
/obj/item/organ/limb/proc/getDisplayName() //Added "Chest" and "Head" just in case, this may not be needed
switch(name)
if("l_leg") return "left leg"
if("r_leg") return "right leg"
if("l_arm") return "left arm"
if("r_arm") return "right arm"
if("chest") return "chest"
if("head") return "head"
else return name
//Remove all embedded objects from all limbs on the human mob
/mob/living/carbon/human/proc/remove_all_embedded_objects()
var/turf/T = get_turf(src)
for(var/obj/item/organ/limb/L in organs)
for(var/obj/item/I in L.embedded_objects)
L.embedded_objects -= I
I.loc = T
clear_alert("embeddedobject")
/mob/living/carbon/human/proc/has_embedded_objects()
. = 0
for(var/obj/item/organ/limb/L in organs)
for(var/obj/item/I in L.embedded_objects)
/obj/item/organ
name = "organ"
icon = 'icons/obj/surgery.dmi'
var/mob/living/carbon/owner = null
var/status = ORGAN_ORGANIC
//Old Datum Limbs:
// code/modules/unused/limbs.dm
/obj/item/organ/limb
name = "limb"
var/body_part = null
var/brutestate = 0
var/burnstate = 0
var/brute_dam = 0
var/burn_dam = 0
var/max_damage = 0
var/list/embedded_objects = list()
/obj/item/organ/limb/chest
name = "chest"
desc = "why is it detached..."
icon_state = "chest"
max_damage = 200
body_part = CHEST
/obj/item/organ/limb/head
name = "head"
desc = "what a way to get a head in life..."
icon_state = "head"
max_damage = 200
body_part = HEAD
/obj/item/organ/limb/l_arm
name = "l_arm"
desc = "why is it detached..."
icon_state = "l_arm"
max_damage = 75
body_part = ARM_LEFT
/obj/item/organ/limb/l_leg
name = "l_leg"
desc = "why is it detached..."
icon_state = "l_leg"
max_damage = 75
body_part = LEG_LEFT
/obj/item/organ/limb/r_arm
name = "r_arm"
desc = "why is it detached..."
icon_state = "r_arm"
max_damage = 75
body_part = ARM_RIGHT
/obj/item/organ/limb/r_leg
name = "r_leg"
desc = "why is it detached..."
icon_state = "r_leg"
max_damage = 75
body_part = LEG_RIGHT
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
//Cannot apply negative damage
/obj/item/organ/limb/proc/take_damage(brute, burn)
if(owner && (owner.status_flags & GODMODE)) return 0 //godmode
brute = max(brute,0)
burn = max(burn,0)
if(status == ORGAN_ROBOTIC) //This makes robolimbs not damageable by chems and makes it stronger
brute = max(0, brute - 5)
burn = max(0, burn - 4)
var/can_inflict = max_damage - (brute_dam + burn_dam)
if(!can_inflict) return 0
if((brute + burn) < can_inflict)
brute_dam += brute
burn_dam += burn
else
if(brute > 0)
if(burn > 0)
brute = round( (brute/(brute+burn)) * can_inflict, 1 )
burn = can_inflict - brute //gets whatever damage is left over
brute_dam += brute
burn_dam += burn
else
brute_dam += can_inflict
else
if(burn > 0)
burn_dam += can_inflict
else
return 0
return update_organ_icon()
//Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all.
//Damage cannot go below zero.
//Cannot remove negative damage (i.e. apply damage)
/obj/item/organ/limb/proc/heal_damage(brute, burn, robotic)
if(robotic && status != ORGAN_ROBOTIC) // This makes organic limbs not heal when the proc is in Robotic mode.
brute = max(0, brute - 3)
burn = max(0, burn - 3)
if(!robotic && status == ORGAN_ROBOTIC) // This makes robolimbs not healable by chems.
brute = max(0, brute - 3)
burn = max(0, burn - 3)
brute_dam = max(brute_dam - brute, 0)
burn_dam = max(burn_dam - burn, 0)
return update_organ_icon()
//Returns total damage...kinda pointless really
/obj/item/organ/limb/proc/get_damage()
return brute_dam + burn_dam
//Updates an organ's brute/burn states for use by update_damage_overlays()
//Returns 1 if we need to update overlays. 0 otherwise.
/obj/item/organ/limb/proc/update_organ_icon()
if(status == ORGAN_ORGANIC) //Robotic limbs show no damage - RR
var/tbrute = round( (brute_dam/max_damage)*3, 1 )
var/tburn = round( (burn_dam/max_damage)*3, 1 )
if((tbrute != brutestate) || (tburn != burnstate))
brutestate = tbrute
burnstate = tburn
return 1
return 0
//Returns a display name for the organ
/obj/item/organ/limb/proc/getDisplayName() //Added "Chest" and "Head" just in case, this may not be needed
switch(name)
if("l_leg") return "left leg"
if("r_leg") return "right leg"
if("l_arm") return "left arm"
if("r_arm") return "right arm"
if("chest") return "chest"
if("head") return "head"
else return name
//Remove all embedded objects from all limbs on the human mob
/mob/living/carbon/human/proc/remove_all_embedded_objects()
var/turf/T = get_turf(src)
for(var/obj/item/organ/limb/L in organs)
for(var/obj/item/I in L.embedded_objects)
L.embedded_objects -= I
I.loc = T
clear_alert("embeddedobject")
/mob/living/carbon/human/proc/has_embedded_objects()
. = 0
for(var/obj/item/organ/limb/L in organs)
for(var/obj/item/I in L.embedded_objects)
return 1
@@ -0,0 +1,59 @@
/obj/item/organ/internal
var/zone = "chest"
var/slot
var/vital = 0
/obj/item/organ/internal/proc/Insert(var/mob/living/carbon/M)
owner = M
M.internal_organs += src
loc = null
/obj/item/organ/internal/proc/Remove(var/mob/living/carbon/M, var/special = 0)
owner = null
M.internal_organs -= src
if(vital && !special)
M.death()
//Looking for brains?
//Try code/modules/mob/living/carbon/brain/brain_item.dm
/obj/item/organ/internal/heart
name = "heart"
icon_state = "heart-on"
zone = "chest"
slot = "heart"
vital = 1
var/beating = 1
/obj/item/organ/internal/heart/update_icon()
if(beating)
icon_state = "heart-on"
else
icon_state = "heart-off"
/obj/item/organ/internal/appendix
name = "appendix"
icon_state = "appendix"
zone = "groin"
slot = "appendix"
var/inflamed = 0
/obj/item/organ/internal/appendix/update_icon()
if(inflamed)
icon_state = "appendixinflamed"
else
icon_state = "appendix"
/obj/item/organ/internal/appendix/Remove(var/mob/living/carbon/M)
for(var/datum/disease/appendicitis in M.viruses)
appendicitis.cure()
..()
/obj/item/organ/internal/appendix/Insert(var/mob/living/carbon/M)
..()
if(inflamed)
M.AddDisease(new /datum/disease/appendicitis)
+2 -2
View File
@@ -1,11 +1,11 @@
/datum/surgery/plastic_surgery
name = "plastic surgery"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/reshape_face, /datum/surgery_step/close)
species = list(/mob/living/carbon/human)
location = "head"
possible_locs = list("head")
//reshape_face
/datum/surgery_step/reshape_face
name = "reshape face"
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 50, /obj/item/weapon/wirecutters = 35)
time = 64
+3 -10
View File
@@ -1,22 +1,18 @@
/datum/surgery/embedded_removal
name = "removal of embedded objects"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/remove_object)
species = list(/mob/living/carbon/human)
location = "anywhere"
has_multi_loc = 1
possible_locs = list("r_arm","l_arm","r_leg","l_leg","chest","head")
/datum/surgery_step/remove_object
name = "remove embedded objects"
time = 32
allowed_organs = list("r_arm","l_arm","r_leg","l_leg","chest","head")
accept_hand = 1
var/obj/item/organ/limb/L = null
/datum/surgery_step/remove_object/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
L = new_organ
L = surgery.organ
if(L)
user.visible_message("[user] looks for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)].", "<span class='notice'>You look for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)]...</span>")
else
@@ -33,9 +29,6 @@
I.loc = get_turf(H)
L.embedded_objects -= I
if(!H.has_embedded_objects())
H.clear_alert("embeddedobject")
if(objects > 0)
user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.getDisplayName()]!", "<span class='notice'>You sucessfully remove [objects] objects from [H]'s [L.getDisplayName()].</span>")
else
+12 -10
View File
@@ -1,5 +1,5 @@
/datum/surgery
var/name = null
var/name = "surgery"
var/status = 1
var/list/steps = list() //Steps in a surgery
var/step_in_progress = 0 //Actively performing a Surgery
@@ -7,11 +7,17 @@
var/location = "chest" //Surgery location
var/target_must_be_dead = 0 //Needs to be dead
var/target_must_be_fat = 0 //Needs to be fat
var/requires_organic_chest = 0 //Prevents you from performing an operation on Robotic chests***
var/has_multi_loc = 0 //Multiple locations - RR
var/user_species_restricted = 0 //Surgery only performable BY species
var/list/user_species_ids
var/requires_organic_bodypart = 1 //Prevents you from performing an operation on robotic limbs
var/list/possible_locs = list() //Multiple locations -- c0
var/ignore_clothes = 0 //This surgery ignores clothes
var/obj/item/organ/organ //Operable body part
/datum/surgery/proc/can_start(mob/user, mob/living/carbon/target)
// if 0 surgery wont show up in list
// put special restrictions here
return 1
/datum/surgery/proc/next_step(mob/user, mob/living/carbon/target)
if(step_in_progress) return
@@ -54,8 +60,4 @@
//RESOLVED ISSUES //"Todo" jobs that have been completed
//combine hands/feet into the arms - Hands/feet were removed - RR
//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) - Call this one done, see multiple_location_example.dm - RR
//*** This may seem entirely redundant because of Organic organs only having operations but you CAN circumvent that due to
//all surgeries (except augmentation) not checking where the surgeon aims so this is just a double check, it IS needed - RR
//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) - Call this one done, see multiple_location_example.dm - RR
+3 -57
View File
@@ -4,8 +4,7 @@
var/accept_hand = 0 //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item.
var/accept_any_item = 0 //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand.
var/time = 10 //how long does the step take?
var/new_organ = null //Used for multilocation operations
var/list/allowed_organs = list()//Allowed organs, see Handle_Multi_Loc below - RR
var/name
/datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -39,11 +38,8 @@
/datum/surgery_step/proc/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
surgery.step_in_progress = 1
if(surgery.has_multi_loc) //if it is multi-location, handle that
Handle_Multi_Loc(user, target)
preop(user, target, target_zone, tool)
if(do_after(user, time, target = target))
preop(user, target, target_zone, tool, surgery)
if(do_after(user, time))
var/advance = 0
var/prob_chance = 100
@@ -73,61 +69,11 @@
/datum/surgery_step/proc/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] succeeds!", "<span class='notice'>You succeed.</span>")
feedback_add_details("surgery_step_success","[src.type]")
return 1
/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(ishuman(target) || ismonkey(target) || isalienadult(target))
var/mob/living/carbon/M = target
M.apply_damage(75,"brute","[target_zone]")
user.visible_message("[user] saws [target]'s [parse_zone(target_zone)] open!", "<span class='notice'>You saw [target]'s [parse_zone(target_zone)] open.</span>")
feedback_add_details("surgery_step_success","[src.type]")
return 1
/datum/surgery_step/proc/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("<span class='warning'>[user] screws up!</span>", "<span class='warning'>You screw up!</span>")
feedback_add_details("surgery_step_failed","[src.type]")
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)
target.heal_organ_damage(45,0)
return ..()
/datum/surgery_step/proc/tool_check(mob/user, obj/item/tool)
return 1
/datum/surgery_step/proc/Handle_Multi_Loc(mob/user, mob/living/carbon/target) //this is here so MultiLoc Surgeries don't need to rewrite it each time - RR
if(user.zone_sel.selecting in allowed_organs)
switch(user.zone_sel.selecting) //Switch, for Aran - RR
if("r_arm")
new_organ = target.getlimb(/obj/item/organ/limb/r_arm)
if("l_arm")
new_organ = target.getlimb(/obj/item/organ/limb/l_arm)
if("r_leg")
new_organ = target.getlimb(/obj/item/organ/limb/r_leg)
if("l_leg")
new_organ = target.getlimb(/obj/item/organ/limb/l_leg)
if("chest")
new_organ = target.getlimb(/obj/item/organ/limb/chest)
if("groin")
new_organ = target.getlimb(/obj/item/organ/limb/chest)
if("head")
new_organ = target.getlimb(/obj/item/organ/limb/head)
if("eyes")
new_organ = target.getlimb(/obj/item/organ/limb/head)
if("mouth")
new_organ = target.getlimb(/obj/item/organ/limb/head)
else
user << "<span class='warning'>You cannot perform this operation on this body part!</span>" //Explain to the surgeon what went wrong - RR
return 0
return new_organ
else
return 0
+2 -2
View File
@@ -2,13 +2,13 @@
name = "xenomorph removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/xenomorph_removal, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "chest"
requires_organic_chest = 1
possible_locs = list("chest")
//remove xeno from premises
/datum/surgery_step/xenomorph_removal
name = "remove foregin body"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/shovel/spade = 65, /obj/item/weapon/cultivator = 50, /obj/item/weapon/crowbar = 35)
time = 64