mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-26 22:50:26 +01:00
Surgery & Organs Rework: Phase 2
This commit is contained in:
@@ -1,32 +0,0 @@
|
||||
/datum/surgery/appendectomy
|
||||
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)
|
||||
possible_locs = list("groin")
|
||||
|
||||
|
||||
//extract appendix
|
||||
/datum/surgery_step/extract_appendix
|
||||
name = "extract appendix"
|
||||
accept_hand = 1
|
||||
time = 64
|
||||
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
|
||||
if(A)
|
||||
user.visible_message("[user] begins to extract [target]'s appendix.", "<span class='notice'>You begin to extract [target]'s appendix...</span>")
|
||||
else
|
||||
user.visible_message("[user] looks for an appendix in [target].", "<span class='notice'>You look for an appendix in [target]...</span>")
|
||||
|
||||
/datum/surgery_step/extract_appendix/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
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)
|
||||
A.Remove(target)
|
||||
for(var/datum/disease/appendicitis in target.viruses)
|
||||
appendicitis.cure()
|
||||
target.resistances += /datum/disease/appendicitis
|
||||
else
|
||||
user << "<span class='warning'>You can't find an appendix in [target]!</span>"
|
||||
return 1
|
||||
@@ -1,43 +0,0 @@
|
||||
/datum/surgery/brain_removal
|
||||
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)
|
||||
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
|
||||
|
||||
/datum/surgery_step/extract_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
B = target.getorgan(/obj/item/organ/brain)
|
||||
if(B)
|
||||
user.visible_message("[user] begins to extract [target]'s brain.", "<span class='notice'>You begin to extract [target]'s brain...</span>")
|
||||
else
|
||||
user.visible_message("[user] looks for a brain in [target].", "<span class='notice'>You look for a brain in [target]...</span>")
|
||||
|
||||
/datum/surgery_step/extract_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(B)
|
||||
user.visible_message("[user] successfully removes [target]'s brain!", "<span class='notice'>You successfully remove [target]'s brain.</span>")
|
||||
B.loc = get_turf(target)
|
||||
B.transfer_identity(target)
|
||||
target.internal_organs -= B
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.update_hair(0)
|
||||
H.apply_damage(25,"brute","head")
|
||||
add_logs(user, target, "debrained", addition="INTENT: [uppertext(user.a_intent)]")
|
||||
else
|
||||
user << "<span class='warning'>You can't find a brain in [target]!</span>"
|
||||
return 1
|
||||
|
||||
|
||||
//brain removal for aliens
|
||||
/datum/surgery/brain_removal/alien
|
||||
name = "alien brain removal"
|
||||
steps = list(/datum/surgery_step/saw, /datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/extract_brain)
|
||||
species = list(/mob/living/carbon/alien/humanoid)
|
||||
@@ -2,8 +2,11 @@
|
||||
name = "core removal"
|
||||
steps = list(/datum/surgery_step/incise, /datum/surgery_step/incise, /datum/surgery_step/extract_core)
|
||||
species = list(/mob/living/simple_animal/slime)
|
||||
target_must_be_dead = 1
|
||||
|
||||
/datum/surgery/core_removal/can_start(mob/user, mob/living/carbon/target)
|
||||
if(target.stat == DEAD)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
//extract brain
|
||||
/datum/surgery_step/extract_core
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
#define MAX_BRAIN_IMPLANT 2
|
||||
#define MAX_CHEST_IMPLANT 3
|
||||
|
||||
/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/organ/internal/cyberimp/implant, datum/surgery/surgery)
|
||||
user.visible_message("[user] begins to implant [target] with [implant].", "<span class='notice'>You begin to implant [target] with [implant]...</span>")
|
||||
|
||||
//[[[[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)
|
||||
possible_locs = list("eyes")
|
||||
|
||||
/datum/surgery_step/cybernetic_implant/eyes
|
||||
name = "insert eye cybernetic implant"
|
||||
implements = list(/obj/item/organ/internal/cyberimp/eyes = 100)
|
||||
time = 32
|
||||
|
||||
/datum/surgery_step/cybernetic_implant/eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/organ/internal/cyberimp/eyes/implant, datum/surgery/surgery)
|
||||
if(implant)
|
||||
var/full = 0
|
||||
if(locate(/obj/item/organ/internal/cyberimp/eyes, target.internal_organs))
|
||||
full = 1
|
||||
insert(user,target,implant,target_zone,full)
|
||||
return 1
|
||||
|
||||
//[[[[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)
|
||||
possible_locs = list("head")
|
||||
requires_organic_bodypart = 0
|
||||
|
||||
/datum/surgery_step/cybernetic_implant/brain
|
||||
name = "insert brain cybernetic implant"
|
||||
implements = list(/obj/item/organ/internal/cyberimp/brain = 100)
|
||||
time = 32
|
||||
|
||||
/datum/surgery_step/cybernetic_implant/brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/organ/internal/cyberimp/brain/implant, datum/surgery/surgery)
|
||||
if(implant)
|
||||
var/full = 0
|
||||
for(var/obj/item/I in target.internal_organs)
|
||||
if(istype(I,/obj/item/organ/internal/cyberimp/brain))
|
||||
full++
|
||||
|
||||
if(full < MAX_BRAIN_IMPLANT)
|
||||
full = 0
|
||||
insert(user,target,implant,target_zone,full)
|
||||
return 1
|
||||
|
||||
//[[[[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)
|
||||
possible_locs = list("chest")
|
||||
requires_organic_bodypart = 0
|
||||
|
||||
/datum/surgery_step/cybernetic_implant/chest
|
||||
name = "insert torso cybernetic implant"
|
||||
implements = list(/obj/item/organ/internal/cyberimp/chest = 100)
|
||||
time = 32
|
||||
|
||||
/datum/surgery_step/cybernetic_implant/chest/success(mob/user, mob/living/carbon/target, target_zone, obj/item/organ/internal/cyberimp/chest/implant, datum/surgery/surgery)
|
||||
if(implant)
|
||||
var/full = 0
|
||||
for(var/obj/item/I in target.internal_organs)
|
||||
if(istype(I,/obj/item/organ/internal/cyberimp/chest))
|
||||
full++
|
||||
if(full < MAX_CHEST_IMPLANT)
|
||||
full = 0
|
||||
|
||||
insert(user,target,implant,target_zone,full)
|
||||
return 1
|
||||
|
||||
/datum/surgery_step/cybernetic_implant/proc/insert(mob/user, mob/living/carbon/target, obj/item/organ/internal/cyberimp/implant,target_zone,full)
|
||||
if(full)
|
||||
user << "<span class='warning'>You can't seem to implant anything else into the [target]'s [target_zone]!</span>"
|
||||
else
|
||||
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>")
|
||||
user.drop_item()
|
||||
implant.Insert(target)
|
||||
@@ -3,14 +3,17 @@
|
||||
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/dethrall)
|
||||
possible_locs = list("head")
|
||||
|
||||
/datum/surgery/dethrall/can_start(mob/user, mob/living/carbon/target)
|
||||
return is_thrall(target)
|
||||
|
||||
/datum/surgery_step/dethrall
|
||||
name = "search head"
|
||||
accept_hand = 1
|
||||
time = 70
|
||||
var/obj/item/organ/brain/B = null
|
||||
var/obj/item/organ/internal/brain/B = null
|
||||
|
||||
/datum/surgery_step/dethrall/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
B = target.getorgan(/obj/item/organ/brain)
|
||||
B = target.getorgan(/obj/item/organ/internal/brain)
|
||||
if(B)
|
||||
user.visible_message("[user] begins looking around in [target]'s head.", "<span class='notice'>You begin looking for foreign influences on [target]'s brain...")
|
||||
|
||||
@@ -19,8 +22,6 @@
|
||||
if(!is_thrall(target))
|
||||
user << "<span class='warning'>You are unable to locate anything on [target]'s brain.</span>"
|
||||
return 1
|
||||
user << "<span class='warning'>You locate a small, pulsing black tumor on the side of [target]'s brain and begin to remove it.</span>"
|
||||
target << "<span class='boldannounce'>A small part of your head pulses with agony as the light impacts it.</span>"
|
||||
sleep(30)
|
||||
user.visible_message("[user] begins removing something from [target]'s head.</span>", \
|
||||
"<span class='notice'>You begin carefully extracting the tumor...</span>")
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
return 1
|
||||
|
||||
/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(target.getorgan(/obj/item/organ/brain))
|
||||
if(target.getorgan(/obj/item/organ/internal/brain))
|
||||
user.visible_message("<span class='warning'>[user] accidentally stabs [target] right in the brain!</span>", "<span class='warning'>You accidentally stab [target] right in the brain!</span>")
|
||||
target.adjustBrainLoss(100)
|
||||
else
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/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
|
||||
time = 16
|
||||
|
||||
/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].", "<span class='notice'>You begin to make an incision in [target]'s [parse_zone(target_zone)]...</span>")
|
||||
@@ -14,7 +14,7 @@
|
||||
/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
|
||||
time = 24
|
||||
|
||||
/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].", "<span class='notice'>You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]...</span>")
|
||||
@@ -29,7 +29,7 @@
|
||||
/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
|
||||
time = 24
|
||||
|
||||
/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].", "<span class='notice'>You begin to retract the skin in [target]'s [parse_zone(target_zone)]...</span>")
|
||||
@@ -40,7 +40,7 @@
|
||||
/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
|
||||
time = 24
|
||||
|
||||
/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 the incision in [target]'s [parse_zone(target_zone)].", "<span class='notice'>You begin to mend the incision in [target]'s [parse_zone(target_zone)]...</span>")
|
||||
@@ -75,7 +75,7 @@
|
||||
/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
|
||||
time = 54
|
||||
|
||||
/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>")
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
break
|
||||
|
||||
var/P = input("Begin which procedure?", "Surgery", null, null) as null|anything in available_surgeries
|
||||
if(P && user.Adjacent(M) && (I in user))
|
||||
if(P && user && user.Adjacent(M) && (I in user))
|
||||
var/datum/surgery/S = available_surgeries[P]
|
||||
var/datum/surgery/procedure = new S.type
|
||||
if(procedure)
|
||||
|
||||
@@ -61,11 +61,10 @@
|
||||
if("head")
|
||||
H.organs += new /obj/item/organ/limb/robot/head(src)
|
||||
if("chest")
|
||||
var/datum/surgery_step/xenomorph_removal/xeno_removal = new
|
||||
xeno_removal.remove_xeno(user, target) // remove an alien if there is one
|
||||
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)
|
||||
for(var/obj/item/organ/internal/I in target.getorganszone(target_zone, 1))
|
||||
if(I.status == ORGAN_ORGANIC) // FLESH IS WEAK
|
||||
I.Remove(target, special = 1)
|
||||
qdel(I)
|
||||
user.drop_item()
|
||||
qdel(tool)
|
||||
H.update_damage_overlays(0)
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
/datum/surgery/organ_manipulation
|
||||
name = "organ manipulation"
|
||||
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/saw,
|
||||
/datum/surgery_step/manipulate_organs, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/close)
|
||||
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
|
||||
possible_locs = list("chest", "head")
|
||||
requires_organic_bodypart = 0
|
||||
|
||||
/datum/surgery/organ_manipulation/soft
|
||||
possible_locs = list("groin", "eyes", "mouth")
|
||||
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/incise,
|
||||
/datum/surgery_step/manipulate_organs, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/close)
|
||||
|
||||
/datum/surgery/organ_manipulation/alien
|
||||
name = "alien organ manipulation"
|
||||
possible_locs = list("chest", "head", "groin", "eyes", "mouth")
|
||||
species = list(/mob/living/carbon/alien/humanoid)
|
||||
steps = list(/datum/surgery_step/saw, /datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/manipulate_organs)
|
||||
|
||||
|
||||
|
||||
|
||||
/datum/surgery_step/manipulate_organs
|
||||
time = 64
|
||||
name = "manipulate organs"
|
||||
implements = list(/obj/item/organ/internal = 100)
|
||||
var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 55)
|
||||
var/implements_mend = list(/obj/item/weapon/cautery = 100, /obj/item/weapon/weldingtool = 70, /obj/item/weapon/lighter = 45, /obj/item/weapon/match = 20)
|
||||
var/current_type
|
||||
var/obj/item/organ/internal/I = null
|
||||
|
||||
/datum/surgery_step/manipulate_organs/New()
|
||||
..()
|
||||
implements = implements + implements_extract + implements_mend
|
||||
|
||||
/datum/surgery_step/manipulate_organs/tool_check(mob/user, obj/item/tool)
|
||||
if(istype(tool, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/WT = tool
|
||||
if(!WT.isOn()) return 0
|
||||
|
||||
else if(istype(tool, /obj/item/weapon/lighter))
|
||||
var/obj/item/weapon/lighter/L = tool
|
||||
if(!L.lit) return 0
|
||||
|
||||
else if(istype(tool, /obj/item/weapon/match))
|
||||
var/obj/item/weapon/match/M = tool
|
||||
if(!M.lit) return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
I = null
|
||||
if(isorgan(tool))
|
||||
current_type = "insert"
|
||||
I = tool
|
||||
if(target_zone != I.zone || target.getorganslot(I.slot))
|
||||
user << "<span class='notice'>There is no room for [I] in [target]'s [parse_zone(target_zone)]!</span>"
|
||||
return -1
|
||||
|
||||
user.visible_message("[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].",
|
||||
"<span class='notice'>You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...</span>")
|
||||
|
||||
else if(implement_type in implements_extract)
|
||||
current_type = "extract"
|
||||
var/list/organs = target.getorganszone(target_zone)
|
||||
if(!organs.len)
|
||||
user << "<span class='notice'>There is no removeable organs in [target]'s [parse_zone(target_zone)]!</span>"
|
||||
return -1
|
||||
else
|
||||
for(var/obj/item/organ/internal/O in organs)
|
||||
O.on_find(user)
|
||||
organs -= O
|
||||
organs[O.name] = O
|
||||
|
||||
I = input("Remove which organ?", "Surgery", null, null) as null|anything in organs
|
||||
if(I && user && target && user.Adjacent(target) && user.get_active_hand() == tool)
|
||||
I = organs[I]
|
||||
if(!I) return -1
|
||||
user.visible_message("[user] begins to extract [I] from [target]'s [parse_zone(target_zone)].",
|
||||
"<span class='notice'>You begin to extract [I] from [target]'s [parse_zone(target_zone)]...</span>")
|
||||
else
|
||||
return -1
|
||||
|
||||
else if(implement_type in implements_mend)
|
||||
current_type = "mend"
|
||||
|
||||
|
||||
/datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(current_type == "mend")
|
||||
user.visible_message("[user] mend the incision in [target]'s [parse_zone(target_zone)].",
|
||||
"<span class='notice'>You mend the incision in [target]'s [parse_zone(target_zone)].</span>")
|
||||
return 1
|
||||
else if(current_type == "insert")
|
||||
I = tool
|
||||
user.drop_item()
|
||||
I.Insert(target)
|
||||
user.visible_message("[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!",
|
||||
"<span class='notice'>You insert [tool] into [target]'s [parse_zone(target_zone)].</span>")
|
||||
|
||||
else if(current_type == "extract")
|
||||
if(I && I.owner == target)
|
||||
user.visible_message("[user] successfully extracts [I] from [target]'s [parse_zone(target_zone)]!",
|
||||
"<span class='notice'>You successfully extract [I] from [target]'s [parse_zone(target_zone)].</span>")
|
||||
add_logs(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
|
||||
I.Remove(target)
|
||||
I.loc = get_turf(target)
|
||||
else
|
||||
user.visible_message("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!",
|
||||
"<span class='notice'>You can't extract anything from [target]'s [parse_zone(target_zone)]!</span>")
|
||||
return 0
|
||||
@@ -11,8 +11,16 @@ mob/proc/getorganslot(slot)
|
||||
mob/living/carbon/getorgan(typepath)
|
||||
return (locate(typepath) in internal_organs)
|
||||
|
||||
mob/living/carbon/getorganszone(zone)
|
||||
mob/living/carbon/getorganszone(zone, var/subzones = 0)
|
||||
var/list/returnorg = list()
|
||||
if(subzones)
|
||||
if(zone == "head")
|
||||
returnorg = getorganszone("eyes") + getorganszone("mouth")
|
||||
// We don't have mouth organs now, but who knows?
|
||||
if(zone == "chest")
|
||||
returnorg = getorganszone("groin")
|
||||
|
||||
|
||||
for(var/obj/item/organ/internal/O in internal_organs)
|
||||
if(zone == O.zone)
|
||||
returnorg += O
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
/obj/item/organ/internal
|
||||
origin_tech = "biotech=2"
|
||||
force = 1
|
||||
w_class = 2
|
||||
throwforce = 0
|
||||
var/zone = "chest"
|
||||
var/slot
|
||||
var/vital = 0
|
||||
var/organ_action_name = null
|
||||
|
||||
/obj/item/organ/internal/proc/Insert(var/mob/living/carbon/M, special = 0)
|
||||
if(!iscarbon(M) || owner)
|
||||
/obj/item/organ/internal/proc/Insert(mob/living/carbon/M, special = 0)
|
||||
if(!iscarbon(M) || owner == M)
|
||||
return
|
||||
|
||||
var/obj/item/organ/internal/replaced = M.getorganslot(slot)
|
||||
@@ -19,7 +22,8 @@
|
||||
if(organ_action_name)
|
||||
action_button_name = organ_action_name
|
||||
|
||||
/obj/item/organ/internal/proc/Remove(var/mob/living/carbon/M, special = 0)
|
||||
|
||||
/obj/item/organ/internal/proc/Remove(mob/living/carbon/M, special = 0)
|
||||
owner = null
|
||||
if(M)
|
||||
M.internal_organs -= src
|
||||
@@ -29,14 +33,42 @@
|
||||
if(organ_action_name)
|
||||
action_button_name = null
|
||||
|
||||
/obj/item/organ/internal/proc/on_find(mob/living/finder)
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/proc/on_life()
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/proc/prepare_eat()
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/S = new
|
||||
S.name = name
|
||||
S.desc = desc
|
||||
S.icon = icon
|
||||
S.icon_state = icon_state
|
||||
S.origin_tech = origin_tech
|
||||
S.w_class = w_class
|
||||
S.reagents.add_reagent("nutriment", 5)
|
||||
|
||||
return S
|
||||
|
||||
/obj/item/organ/internal/Destroy()
|
||||
if(owner)
|
||||
Remove(owner, 1)
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/attack(mob/living/carbon/M, mob/user)
|
||||
if(M == user && ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(status == ORGAN_ORGANIC)
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/S = prepare_eat()
|
||||
if(S)
|
||||
H.drop_item()
|
||||
H.put_in_active_hand(S)
|
||||
S.attack(H, H)
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
|
||||
//Looking for brains?
|
||||
//Try code/modules/mob/living/carbon/brain/brain_item.dm
|
||||
|
||||
@@ -57,17 +89,23 @@
|
||||
else
|
||||
icon_state = "heart-off"
|
||||
|
||||
/obj/item/organ/internal/heart/Insert(var/mob/living/carbon/M, special = 0)
|
||||
/obj/item/organ/internal/heart/Insert(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
beating = 1
|
||||
update_icon()
|
||||
|
||||
/obj/item/organ/internal/heart/Remove(var/mob/living/carbon/M, special = 0)
|
||||
/obj/item/organ/internal/heart/Remove(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
spawn(120)
|
||||
beating = 0
|
||||
update_icon()
|
||||
|
||||
/obj/item/organ/internal/heart/prepare_eat()
|
||||
var/obj/S = ..()
|
||||
S.icon_state = "heart-off"
|
||||
return S
|
||||
|
||||
|
||||
|
||||
/obj/item/organ/internal/appendix
|
||||
name = "appendix"
|
||||
@@ -84,12 +122,20 @@
|
||||
icon_state = "appendix"
|
||||
name = "appendix"
|
||||
|
||||
/obj/item/organ/internal/appendix/Remove(var/mob/living/carbon/M, special = 0)
|
||||
for(var/datum/disease/appendicitis in M.viruses)
|
||||
appendicitis.cure()
|
||||
/obj/item/organ/internal/appendix/Remove(mob/living/carbon/M, special = 0)
|
||||
for(var/datum/disease/appendicitis/A in M.viruses)
|
||||
A.cure()
|
||||
inflamed = 1
|
||||
update_icon()
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/appendix/Insert(var/mob/living/carbon/M, special = 0)
|
||||
/obj/item/organ/internal/appendix/Insert(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
if(inflamed)
|
||||
M.AddDisease(new /datum/disease/appendicitis)
|
||||
M.AddDisease(new /datum/disease/appendicitis)
|
||||
|
||||
/obj/item/organ/internal/appendix/prepare_eat()
|
||||
var/obj/S = ..()
|
||||
if(inflamed)
|
||||
S.reagents.add_reagent("????", 5)
|
||||
return S
|
||||
@@ -5,7 +5,6 @@
|
||||
var/step_in_progress = 0 //Actively performing a Surgery
|
||||
var/list/species = list(/mob/living/carbon/human) //Acceptable Species
|
||||
var/location = "chest" //Surgery location
|
||||
var/target_must_be_dead = 0 //Needs to be dead
|
||||
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
|
||||
|
||||
@@ -38,9 +38,11 @@
|
||||
/datum/surgery_step/proc/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
surgery.step_in_progress = 1
|
||||
|
||||
preop(user, target, target_zone, tool, surgery)
|
||||
if(do_after(user, time, target = target))
|
||||
if(preop(user, target, target_zone, tool, surgery) == -1)
|
||||
surgery.step_in_progress = 0
|
||||
return
|
||||
|
||||
if(do_after(user, time, target = target))
|
||||
var/advance = 0
|
||||
var/prob_chance = 100
|
||||
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
/datum/surgery/xenomorph_removal
|
||||
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)
|
||||
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
|
||||
|
||||
/datum/surgery_step/xenomorph_removal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] begins to search in [target]'s chest for a xenomorph embryo.", "<span class='notice'>You begin to search in [target]'s chest for a xenomorph embryo...</span>")
|
||||
|
||||
/datum/surgery_step/xenomorph_removal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
if(remove_xeno(user, target))
|
||||
user.visible_message("[user] successfully extracts the xenomorph embryo from [target]!", "<span class='notice'>You successfully extract the xenomorph embryo from [target].</span>")
|
||||
else
|
||||
user.visible_message("[user] can't seem to find anything in [target]'s chest!", "<span class='notice'>You can't find anything in [target]'s chest!</span>")
|
||||
return 1
|
||||
|
||||
/datum/surgery_step/xenomorph_removal/proc/remove_xeno(mob/user, mob/living/carbon/target)
|
||||
var/obj/item/organ/internal/body_egg/alien_embryo/A = target.getorgan(/obj/item/organ/internal/body_egg/alien_embryo)
|
||||
if(A)
|
||||
user << "<span class='notice'>You found an unknown alien organism in [target]'s chest!</span>"
|
||||
if(A.stage < 4)
|
||||
user << "It's small and weak, barely the size of a foetus."
|
||||
else
|
||||
user << "It's grown quite large, and writhes slightly as you look at it."
|
||||
if(prob(10))
|
||||
A.AttemptGrow()
|
||||
|
||||
A.Remove(target)
|
||||
A.loc = get_turf(target)
|
||||
return 1
|
||||
|
||||
|
||||
/datum/surgery_step/xenomorph_removal/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/internal/body_egg/alien_embryo/A = target.getorgan(/obj/item/organ/internal/body_egg/alien_embryo)
|
||||
if(A)
|
||||
if(prob(50))
|
||||
A.AttemptGrow(0)
|
||||
user.visible_message("<span class='warning'>[user] accidentally pokes the xenomorph in [target]!</span>", "<span class='warning'>You accidentally poke the xenomorph in [target]!</span>")
|
||||
else
|
||||
target.adjustOxyLoss(30)
|
||||
user.visible_message("<span class='warning'>[user] accidentally pokes [target] in the lungs!</span>", "<span class='warning'>You accidentally poke [target] in the lungs!</span>")
|
||||
return 0
|
||||
Reference in New Issue
Block a user