mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 21:18:37 +01:00
Surgery, Implants and Organs rework: Phase 1
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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,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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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")
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
+51
-51
@@ -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
|
||||
|
||||
@@ -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)
|
||||
+170
-198
@@ -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)
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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,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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user