mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 08:37:43 +01:00
Merge remote-tracking branch 'remotes/upstream/master' into remove_thrall
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
|
||||
|
||||
|
||||
@@ -1,42 +1,45 @@
|
||||
#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/cybernetic_implant/implant, datum/surgery/surgery)
|
||||
/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/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
|
||||
implements = list(/obj/item/cybernetic_implant/eyes = 100)
|
||||
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/cybernetic_implant/eyes/implant, datum/surgery/surgery)
|
||||
/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/cybernetic_implant/eyes,target.internal_organs))
|
||||
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/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
|
||||
implements = list(/obj/item/cybernetic_implant/brain = 100)
|
||||
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/cybernetic_implant/brain/implant, datum/surgery/surgery)
|
||||
/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/cybernetic_implant/brain))
|
||||
if(istype(I,/obj/item/organ/internal/cyberimp/brain))
|
||||
full++
|
||||
|
||||
if(full < MAX_BRAIN_IMPLANT)
|
||||
@@ -45,20 +48,22 @@
|
||||
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
|
||||
implements = list(/obj/item/cybernetic_implant/chest = 100)
|
||||
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/cybernetic_implant/chest/implant, datum/surgery/surgery)
|
||||
/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/cybernetic_implant/chest))
|
||||
if(istype(I,/obj/item/organ/internal/cyberimp/chest))
|
||||
full++
|
||||
if(full < MAX_CHEST_IMPLANT)
|
||||
full = 0
|
||||
@@ -66,14 +71,10 @@
|
||||
insert(user,target,implant,target_zone,full)
|
||||
return 1
|
||||
|
||||
/datum/surgery_step/cybernetic_implant/proc/insert(mob/user, mob/living/carbon/target, obj/item/cybernetic_implant/implant,target_zone,full)
|
||||
/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
|
||||
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()
|
||||
target.internal_organs |= implant
|
||||
implant.loc = target
|
||||
user.drop_item()
|
||||
implant.Insert(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,15 +12,22 @@
|
||||
|
||||
//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
|
||||
|
||||
/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>")
|
||||
|
||||
/datum/surgery_step/clamp_bleeders/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(20,0)
|
||||
return ..()
|
||||
|
||||
|
||||
//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 +38,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 +64,26 @@
|
||||
|
||||
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,65 +1,64 @@
|
||||
/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
|
||||
var/selected_zone = user.zone_sel.selecting
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
H = M
|
||||
affecting = H.get_organ(check_zone(selected_zone))
|
||||
|
||||
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]
|
||||
var/datum/surgery/current_surgery
|
||||
|
||||
if(locate(S.type) in M.surgeries)
|
||||
continue
|
||||
if(S.user_species_restricted)
|
||||
if(!istype(user, /mob/living/carbon/human))
|
||||
for(var/datum/surgery/S in M.surgeries)
|
||||
if(S.location == selected_zone)
|
||||
current_surgery = S
|
||||
|
||||
if(!current_surgery)
|
||||
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(selected_zone))
|
||||
continue
|
||||
var/mob/living/carbon/human/doc = user
|
||||
if(!(doc.dna.species.id in S.user_species_ids))
|
||||
if(affecting && S.requires_organic_bodypart && affecting.status == ORGAN_ROBOTIC)
|
||||
continue
|
||||
if(S.target_must_be_dead && M.stat != DEAD)
|
||||
continue
|
||||
if(S.target_must_be_fat && !(M.disabilities & FAT))
|
||||
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
|
||||
if(!S.can_start(user, M))
|
||||
continue
|
||||
|
||||
for(var/path in S.species)
|
||||
if(istype(M, path))
|
||||
available_surgeries[S.name] = S
|
||||
break
|
||||
|
||||
var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
|
||||
var/P = input("Begin which procedure?", "Surgery", null, null) as null|anything in available_surgeries
|
||||
if(P && user.Adjacent(M) && (I in user))
|
||||
var/datum/surgery/S = available_surgeries[P]
|
||||
var/datum/surgery/procedure = new S.type
|
||||
if(procedure)
|
||||
procedure.location = selected_zone
|
||||
if(procedure.ignore_clothes || get_location_accessible(M, selected_zone))
|
||||
M.surgeries += procedure
|
||||
procedure.organ = affecting
|
||||
user.visible_message("[user] drapes [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name].", \
|
||||
"<span class='notice'>You drape [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name].</span>")
|
||||
|
||||
if(affecting.status == ORGAN_ROBOTIC && affecting.body_part != HEAD) //Cannot operate on Robotic organs except for the head. - RR
|
||||
continue
|
||||
add_logs(user, M, "operated", addition="Operation type: [procedure.name], location: [selected_zone]")
|
||||
else
|
||||
user << "<span class='warning'>You need to expose [M]'s [parse_zone(selected_zone)] first!</span>"
|
||||
|
||||
for(var/path in S.species)
|
||||
if(istype(M, path))
|
||||
available_surgeries[S.name] = S
|
||||
break
|
||||
|
||||
var/P = input("Begin which procedure?", "Surgery", null, null) as null|anything in available_surgeries
|
||||
if(P)
|
||||
var/datum/surgery/S = available_surgeries[P]
|
||||
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
|
||||
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>")
|
||||
|
||||
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>"
|
||||
return 1 //return 1 so we don't slap the guy in the dick with the drapes.
|
||||
else
|
||||
return 1 //once the input menu comes up, cancelling it shouldn't hit the guy with the drapes either.
|
||||
else if(current_surgery.status == 1 && !current_surgery.step_in_progress)
|
||||
M.surgeries -= current_surgery
|
||||
user.visible_message("[user] removes the drapes from [M]'s [parse_zone(selected_zone)].", \
|
||||
"<span class='notice'>You remove the drapes from [M]'s [parse_zone(selected_zone)].</span>")
|
||||
qdel(current_surgery)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
/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
|
||||
|
||||
@@ -2,22 +2,19 @@
|
||||
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")
|
||||
requires_organic_bodypart = 0
|
||||
|
||||
|
||||
//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 +23,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
|
||||
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
//CONTENTS//
|
||||
Multiple location example surgery
|
||||
|
||||
|
||||
|
||||
//THE SURGERY//
|
||||
it is very similar to a normal surgery.
|
||||
Location = "anywhere" is the unique difference.
|
||||
|
||||
/datum/surgery/multiLocExample
|
||||
name = "Multiple Location Surgery Example"
|
||||
steps = list(/datum/surgery_step/multiLocExampleStep)
|
||||
species = list(/mob/living/carbon)
|
||||
location = "anywhere" //A Location "Anywhere" is handled in /code/modules/surgery/helpers attempt_initiate_surgery(), it is converted into a User.zone_sel.selecting.
|
||||
has_multi_loc = 1 //Needed to handle Multilocation
|
||||
|
||||
//THE STEPS//
|
||||
The block of "If's" is necessary, add or remove so you have just the areas you want, and set them to convert L(or your subsitute) to what you want it to be
|
||||
EG: a zone on a mob (where user is targetting) to the limb thats actually there.
|
||||
|
||||
|
||||
/datum/surgery_step/multiLocExampleStep
|
||||
implements = list()
|
||||
time = 9001
|
||||
allowed_organs = list("r_arm","l_arm","r_leg","l_leg","chest","head", "etc")
|
||||
// allowed_organs is a list of organs this operation works with, it is defined in the earliest instance of the surgery_step (Eg, datum/surgery_step/multiLocExampleStep)
|
||||
// allowed_organs is handled in Handle_Multi_Loc() in surgery_step.dm
|
||||
|
||||
|
||||
/datum/surgery_step/multiLocExampleStep/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
L = new_organ //new_organ is a variable in /datum/surgery_step, it is null by default, and is given a value in Handle_Multi_Loc()
|
||||
//Although Handle_Multi_Loc() is /datum/surgery_step/SURGERYNAME/Handle_Multi_Loc() you do not need to rewrite it in the surgery
|
||||
if(L)
|
||||
user.visible_message("<span class ='notice'>Generic Statement.</span>")
|
||||
else
|
||||
user.visible_message("<span class ='notice'>Generic Statement 2.</span>")
|
||||
|
||||
|
||||
/datum/surgery_step/multiLocExampleStep/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
You can use whatever you substituted "L" for here for useful things, swapping limbs for other limbs, etc.
|
||||
if the surgery is intended to be MultiLoc but should only be performable once per limb, add this
|
||||
"surgery.invalid_locations += user.zone_sel.selecting"
|
||||
Just after you have swapped limbs around, see limb augmentation for an example of this
|
||||
|
||||
*/
|
||||
|
||||
//This file is commented out as to avoid:
|
||||
// a snowflakey removal of it 100% of the time
|
||||
// it's an example, it doesn't work perfectly due to just being the multiple locations section.
|
||||
// It is also not set to compile, due to being Empty (according to the compiler)
|
||||
|
||||
//Enjoy making Multi-location operations! (if you understood my Rambling)
|
||||
//If you didn't understand this, Ask for RobRichards in Coderbus
|
||||
+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
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
/obj/item/organ/internal/cyberimp/eyes
|
||||
name = "cybernetic eyes"
|
||||
desc = "artificial photoreceptors with specialized functionality"
|
||||
icon_state = "eye_implant"
|
||||
implant_overlay = "eye_implant_overlay"
|
||||
slot = "eye_sight"
|
||||
zone = "eyes"
|
||||
w_class = 1
|
||||
|
||||
var/sight_flags = 0
|
||||
var/eye_color = "fff"
|
||||
var/old_eye_color = "fff"
|
||||
var/flash_protect = 0
|
||||
var/aug_message = "Your vision is augmented!"
|
||||
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/Insert(var/mob/living/carbon/M, var/special = 0)
|
||||
..()
|
||||
if(istype(owner, /mob/living/carbon/human) && eye_color)
|
||||
var/mob/living/carbon/human/HMN = owner
|
||||
old_eye_color = HMN.eye_color
|
||||
HMN.eye_color = eye_color
|
||||
HMN.regenerate_icons()
|
||||
if(aug_message && !special)
|
||||
owner << "<span class='notice'>[aug_message]</span>"
|
||||
M.sight |= sight_flags
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/Remove(var/mob/living/carbon/M, var/special = 0)
|
||||
M.sight ^= sight_flags
|
||||
if(istype(M,/mob/living/carbon/human) && eye_color)
|
||||
var/mob/living/carbon/human/HMN = owner
|
||||
HMN.eye_color = old_eye_color
|
||||
HMN.regenerate_icons()
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/on_life()
|
||||
..()
|
||||
owner.sight |= sight_flags
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/emp_act(severity)
|
||||
if(!owner)
|
||||
return
|
||||
if(severity > 1)
|
||||
if(prob(10 * severity))
|
||||
return
|
||||
var/save_sight = owner.sight
|
||||
owner.sight &= 0
|
||||
owner.disabilities |= BLIND
|
||||
owner << "<span class='warning'>Static obfuscates your vision!</span>"
|
||||
spawn(60 / severity)
|
||||
if(owner)
|
||||
owner.sight |= save_sight
|
||||
owner.disabilities ^= BLIND
|
||||
|
||||
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/xray
|
||||
name = "X-ray implant"
|
||||
desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile."
|
||||
eye_color = "000"
|
||||
implant_color = "#000000"
|
||||
origin_tech = "materials=6;programming=4;biotech=6;magnets=5"
|
||||
sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/thermals
|
||||
name = "Thermals implant"
|
||||
desc = "These cybernetic eye implants will give you Thermal vision. Vertical slit pupil included."
|
||||
eye_color = "FC0"
|
||||
implant_color = "#FFCC00"
|
||||
sight_flags = SEE_MOBS
|
||||
flash_protect = -1
|
||||
origin_tech = "materials=6;programming=4;biotech=5;magnets=5;syndicate=4"
|
||||
aug_message = "You see prey everywhere you look..."
|
||||
|
||||
|
||||
// HUD implants
|
||||
/obj/item/organ/internal/cyberimp/eyes/hud
|
||||
name = "HUD implant"
|
||||
desc = "These cybernetic eyes will display a HUD over everything you see. Maybe."
|
||||
slot = "eye_hud"
|
||||
var/HUD_type = 0
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/hud/Insert(var/mob/living/carbon/M, var/special = 0)
|
||||
..()
|
||||
if(HUD_type)
|
||||
var/datum/atom_hud/H = huds[HUD_type]
|
||||
H.add_hud_to(M)
|
||||
M.permanent_huds |= H
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/hud/Remove(var/mob/living/carbon/M, var/special = 0)
|
||||
if(HUD_type)
|
||||
var/datum/atom_hud/H = huds[HUD_type]
|
||||
M.permanent_huds ^= H
|
||||
H.remove_hud_from(M)
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/hud/medical
|
||||
name = "Medical HUD implant"
|
||||
desc = "These cybernetic eye implants will display a medical HUD over everything you see."
|
||||
eye_color = "0ff"
|
||||
implant_color = "#00FFFF"
|
||||
origin_tech = "materials=4;programming=3;biotech=4"
|
||||
aug_message = "You suddenly see health bars floating above people's heads..."
|
||||
HUD_type = DATA_HUD_MEDICAL_ADVANCED
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/hud/security
|
||||
name = "Security HUD implant"
|
||||
desc = "These cybernetic eye implants will display a security HUD over everything you see."
|
||||
eye_color = "d00"
|
||||
implant_color = "#CC0000"
|
||||
origin_tech = "materials=4;programming=4;biotech=3;combat=1"
|
||||
aug_message = "Job indicator icons pop up in your vision. That is not a certified surgeon..."
|
||||
HUD_type = DATA_HUD_SECURITY_ADVANCED
|
||||
|
||||
|
||||
// Welding shield implant
|
||||
/obj/item/organ/internal/cyberimp/eyes/shield
|
||||
name = "welding shield implant"
|
||||
desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision."
|
||||
slot = "eye_shield"
|
||||
origin_tech = "materials=4;biotech=3"
|
||||
implant_color = "#101010"
|
||||
flash_protect = 2
|
||||
// Welding with thermals will still hurt your eyes a bit.
|
||||
|
||||
/obj/item/organ/internal/cyberimp/eyes/shield/emp_act(severity)
|
||||
return
|
||||
@@ -0,0 +1,273 @@
|
||||
#define STUN_SET_AMOUNT 2
|
||||
|
||||
/obj/item/organ/internal/cyberimp
|
||||
name = "cybernetic implant"
|
||||
desc = "a state-of-the-art implant that improves a baseline's functionality"
|
||||
status = ORGAN_ROBOTIC
|
||||
var/implant_color = "#FFFFFF"
|
||||
var/implant_overlay
|
||||
|
||||
/obj/item/organ/internal/cyberimp/New(var/mob/M = null)
|
||||
if(iscarbon(M))
|
||||
src.Insert(M)
|
||||
if(implant_overlay)
|
||||
var/image/overlay = new /image(icon, implant_overlay)
|
||||
overlay.color = implant_color
|
||||
overlays |= overlay
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
//[[[[BRAIN]]]]
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain
|
||||
name = "cybernetic brain implant"
|
||||
desc = "injectors of extra sub-routines for the brain"
|
||||
icon_state = "brain_implant"
|
||||
implant_overlay = "brain_implant_overlay"
|
||||
zone = "head"
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/emp_act(severity)
|
||||
if(!owner)
|
||||
return
|
||||
var/stun_amount = 5 + (severity-1 ? 0 : 5)
|
||||
owner.Stun(stun_amount)
|
||||
owner << "<span class='warning'>Your body seizes up!</span>"
|
||||
return stun_amount
|
||||
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/anti_drop
|
||||
name = "Anti-drop implant"
|
||||
desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle."
|
||||
var/active = 0
|
||||
var/l_hand_ignore = 0
|
||||
var/r_hand_ignore = 0
|
||||
var/obj/item/l_hand_obj = null
|
||||
var/obj/item/r_hand_obj = null
|
||||
implant_color = "#DE7E00"
|
||||
slot = "brain_antidrop"
|
||||
origin_tech = "materials=5;programming=4;biotech=4"
|
||||
organ_action_name = "Toggle Anti-Drop"
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click()
|
||||
active = !active
|
||||
if(active)
|
||||
l_hand_obj = owner.l_hand
|
||||
r_hand_obj = owner.r_hand
|
||||
if(l_hand_obj)
|
||||
if(owner.l_hand.flags & NODROP)
|
||||
l_hand_ignore = 1
|
||||
else
|
||||
owner.l_hand.flags |= NODROP
|
||||
l_hand_ignore = 0
|
||||
|
||||
if(r_hand_obj)
|
||||
if(owner.r_hand.flags & NODROP)
|
||||
r_hand_ignore = 1
|
||||
else
|
||||
owner.r_hand.flags |= NODROP
|
||||
r_hand_ignore = 0
|
||||
|
||||
if(!l_hand_obj && !r_hand_obj)
|
||||
owner << "<span class='notice'>You are not holding any items, your hands relax...</span>"
|
||||
active = 0
|
||||
else
|
||||
var/msg = 0
|
||||
msg += !l_hand_ignore && l_hand_obj ? 1 : 0
|
||||
msg += !r_hand_ignore && r_hand_obj ? 2 : 0
|
||||
switch(msg)
|
||||
if(1)
|
||||
owner << "<span class='notice'>Your left hand's grip tightens.</span>"
|
||||
if(2)
|
||||
owner << "<span class='notice'>Your right hand's grip tightens.</span>"
|
||||
if(3)
|
||||
owner << "<span class='notice'>Both of your hand's grips tighten.</span>"
|
||||
else
|
||||
release_items()
|
||||
owner << "<span class='notice'>Your hands relax...</span>"
|
||||
l_hand_obj = null
|
||||
r_hand_obj = null
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/anti_drop/emp_act(severity)
|
||||
if(!owner)
|
||||
return
|
||||
var/range = severity ? 10 : 5
|
||||
var/atom/A
|
||||
var/obj/item/L_item = owner.l_hand
|
||||
var/obj/item/R_item = owner.r_hand
|
||||
|
||||
release_items()
|
||||
..()
|
||||
if(L_item)
|
||||
A = pick(oview(range))
|
||||
L_item.throw_at(A, range, 2)
|
||||
owner << "<span class='notice'>Your left arm spasms and throws the [L_item.name]!</span>"
|
||||
if(R_item)
|
||||
A = pick(oview(range))
|
||||
R_item.throw_at(A, range, 2)
|
||||
owner << "<span class='notice'>Your right arm spasms and throws the [R_item.name]!</span>"
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/anti_drop/proc/release_items()
|
||||
if(!l_hand_ignore && l_hand_obj in owner.contents)
|
||||
l_hand_obj.flags ^= NODROP
|
||||
if(!r_hand_ignore && r_hand_obj in owner.contents)
|
||||
r_hand_obj.flags ^= NODROP
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/anti_drop/Remove(var/mob/living/carbon/M, special = 0)
|
||||
if(active)
|
||||
ui_action_click()
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/anti_stun
|
||||
name = "CNS Rebooter implant"
|
||||
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
|
||||
implant_color = "#FFFF00"
|
||||
slot = "brain_antistun"
|
||||
origin_tech = "materials=6;programming=4;biotech=5"
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/anti_stun/on_life()
|
||||
..()
|
||||
if(crit_fail)
|
||||
return
|
||||
|
||||
if(owner.stunned > STUN_SET_AMOUNT)
|
||||
owner.stunned = STUN_SET_AMOUNT
|
||||
if(owner.weakened > STUN_SET_AMOUNT)
|
||||
owner.weakened = STUN_SET_AMOUNT
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/anti_stun/emp_act(severity)
|
||||
if(crit_fail)
|
||||
return
|
||||
crit_fail = 1
|
||||
spawn(90 / severity)
|
||||
crit_fail = 0
|
||||
|
||||
|
||||
//[[[[CHEST]]]]
|
||||
|
||||
/obj/item/organ/internal/cyberimp/chest
|
||||
name = "cybernetic torso implant"
|
||||
desc = "implants for the organs in your torso"
|
||||
icon_state = "chest_implant"
|
||||
implant_overlay = "chest_implant_overlay"
|
||||
zone = "chest"
|
||||
|
||||
/obj/item/organ/internal/cyberimp/chest/nutriment
|
||||
name = "Nutriment pump implant"
|
||||
desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#00AA00"
|
||||
var/hunger_threshold = NUTRITION_LEVEL_STARVING
|
||||
var/synthesizing = 0
|
||||
var/poison_amount = 5
|
||||
slot = "stomach"
|
||||
origin_tech = "materials=5;programming=3;biotech=4"
|
||||
|
||||
/obj/item/organ/internal/cyberimp/chest/nutriment/on_life()
|
||||
if(synthesizing)
|
||||
return
|
||||
|
||||
if(owner.nutrition <= hunger_threshold)
|
||||
synthesizing = 1
|
||||
owner << "<span class='notice'>You feel less hungry...</span>"
|
||||
owner.nutrition += 50
|
||||
spawn(50)
|
||||
synthesizing = 0
|
||||
|
||||
/obj/item/organ/internal/cyberimp/chest/nutriment/emp_act(severity)
|
||||
if(!owner)
|
||||
return
|
||||
owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning
|
||||
owner << "<span class='warning'>You feel like your insides are burning.</span>"
|
||||
|
||||
|
||||
/obj/item/organ/internal/cyberimp/chest/nutriment/plus
|
||||
name = "Nutriment pump implant PLUS"
|
||||
desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#006607"
|
||||
hunger_threshold = NUTRITION_LEVEL_HUNGRY
|
||||
poison_amount = 10
|
||||
origin_tech = "materials=5;programming=3;biotech=5"
|
||||
|
||||
|
||||
|
||||
/obj/item/organ/internal/cyberimp/chest/reviver
|
||||
name = "Reviver implant"
|
||||
desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!"
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#AD0000"
|
||||
origin_tech = "materials=6;programming=3;biotech=6;syndicate=4"
|
||||
slot = "heartdrive"
|
||||
var/revive_cost = 0
|
||||
var/reviving = 0
|
||||
var/cooldown = 0
|
||||
|
||||
/obj/item/organ/internal/cyberimp/chest/reviver/on_life()
|
||||
if(reviving)
|
||||
if(owner.stat == UNCONSCIOUS)
|
||||
spawn(30)
|
||||
if(prob(90) && owner.getOxyLoss())
|
||||
owner.adjustOxyLoss(-3)
|
||||
revive_cost += 5
|
||||
if(prob(75) && owner.getBruteLoss())
|
||||
owner.adjustBruteLoss(-1)
|
||||
revive_cost += 20
|
||||
if(prob(75) && owner.getFireLoss())
|
||||
owner.adjustFireLoss(-1)
|
||||
revive_cost += 20
|
||||
if(prob(40) && owner.getToxLoss())
|
||||
owner.adjustToxLoss(-1)
|
||||
revive_cost += 50
|
||||
else
|
||||
cooldown = revive_cost + world.time
|
||||
reviving = 0
|
||||
return
|
||||
|
||||
if(cooldown > world.time)
|
||||
return
|
||||
if(owner.stat != UNCONSCIOUS)
|
||||
return
|
||||
if(owner.suiciding)
|
||||
return
|
||||
|
||||
revive_cost = 0
|
||||
reviving = 1
|
||||
|
||||
/obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity)
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(reviving)
|
||||
revive_cost += 200
|
||||
else
|
||||
cooldown += 200
|
||||
|
||||
if(istype(owner, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(H.stat != DEAD && prob(50 / severity))
|
||||
H.heart_attack = 1
|
||||
spawn(600 / severity)
|
||||
H.heart_attack = 0
|
||||
if(H.stat == CONSCIOUS)
|
||||
H << "<span class='notice'>You feel your heart beating again!</span>"
|
||||
|
||||
|
||||
//BOX O' IMPLANTS
|
||||
|
||||
/obj/item/weapon/storage/box/cyber_implants
|
||||
name = "boxed cybernetic implants"
|
||||
desc = "A sleek, sturdy box."
|
||||
icon_state = "cyber_implants"
|
||||
var/list/boxed = list(/obj/item/organ/internal/cyberimp/eyes/xray,/obj/item/organ/internal/cyberimp/eyes/thermals,
|
||||
/obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver)
|
||||
var/amount = 5
|
||||
|
||||
/obj/item/weapon/storage/box/cyber_implants/New()
|
||||
..()
|
||||
var/i
|
||||
var/implant
|
||||
for(i = 0, i < amount, i++)
|
||||
implant = pick(boxed)
|
||||
new implant(src)
|
||||
@@ -1,395 +0,0 @@
|
||||
#define STUN_SET_AMOUNT 2
|
||||
|
||||
/obj/item/cybernetic_implant
|
||||
name = "cybernetic implant"
|
||||
desc = "a state-of-the-art implant that improves a baseline's functionality"
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
var/mob/living/carbon/owner = null
|
||||
var/implant_color = "#FFFFFF"
|
||||
|
||||
/obj/item/cybernetic_implant/New(var/mob/M = null)
|
||||
owner = M
|
||||
return ..()
|
||||
|
||||
/obj/item/cybernetic_implant/proc/function()
|
||||
return
|
||||
|
||||
|
||||
//[[[[EYES]]]]
|
||||
|
||||
/obj/item/cybernetic_implant/eyes
|
||||
name = "cybernetic eyes"
|
||||
desc = "artificial photoreceptors with specialized functionality"
|
||||
icon_state = "eye_implant"
|
||||
var/eye_color = "fff"
|
||||
var/flash_protect = 0
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/New()
|
||||
var/icon/overlay = new /icon('icons/obj/surgery.dmi',"eye_implant_overlay")
|
||||
overlay.ColorTone(implant_color)
|
||||
overlays |= overlay
|
||||
..()
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/proc/update_eye_color(fluff_message)
|
||||
if(istype(owner,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/HMN = owner
|
||||
HMN.eye_color = eye_color
|
||||
HMN.regenerate_icons()
|
||||
if(fluff_message)
|
||||
owner << "<span class='notice'>[fluff_message]</span>"
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/hud/medical
|
||||
name = "Medical HUD implant"
|
||||
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."
|
||||
eye_color = "0ff"
|
||||
implant_color = "#00FFFF"
|
||||
origin_tech = "materials=4;programming=3;biotech=4"
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/hud/medical/function()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
var/datum/atom_hud/H = huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
H.add_hud_to(owner)
|
||||
owner.permanent_huds |= H
|
||||
update_eye_color("You suddenly see health bars floating above people's heads...")
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/hud/security
|
||||
name = "Security HUD implant"
|
||||
desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control."
|
||||
eye_color = "d00"
|
||||
implant_color = "#CC0000"
|
||||
origin_tech = "materials=4;programming=4;biotech=3;combat=1"
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/hud/security/function()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
var/datum/atom_hud/H = huds[DATA_HUD_SECURITY_ADVANCED]
|
||||
H.add_hud_to(owner)
|
||||
owner.permanent_huds |= H
|
||||
update_eye_color("Job indicator icons pop up in your vision. That is not a certified surgeon...")
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/xray
|
||||
name = "X-ray implant"
|
||||
desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile."
|
||||
eye_color = "000"
|
||||
implant_color = "#000000"
|
||||
origin_tech = "materials=6;programming=4;biotech=6;magnets=5"
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/xray/function()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
owner.sight |= SEE_MOBS
|
||||
owner.sight |= SEE_OBJS
|
||||
owner.sight |= SEE_TURFS
|
||||
owner.permanent_sight_flags |= SEE_MOBS
|
||||
owner.permanent_sight_flags |= SEE_OBJS
|
||||
owner.permanent_sight_flags |= SEE_TURFS
|
||||
update_eye_color("Your vision is augmented!")
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/thermals
|
||||
name = "Thermals implant"
|
||||
desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included."
|
||||
eye_color = "FC0"
|
||||
implant_color = "#FFCC00"
|
||||
flash_protect = -1
|
||||
origin_tech = "materials=6;programming=4;biotech=5;magnets=5;syndicate=4"
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/thermals/function()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
owner.sight |= SEE_MOBS
|
||||
owner.permanent_sight_flags |= SEE_MOBS
|
||||
update_eye_color("You see prey everywhere you look...")
|
||||
|
||||
/obj/item/cybernetic_implant/eyes/emp_act(severity)
|
||||
if(!owner)
|
||||
return
|
||||
if(severity > 1)
|
||||
if(prob(5))
|
||||
return
|
||||
var/save_sight = owner.sight
|
||||
owner.sight &= 0
|
||||
owner.disabilities |= BLIND
|
||||
owner << "<span class='warning'>Static obfuscates your vision!</span>"
|
||||
spawn(50)
|
||||
owner.sight |= save_sight
|
||||
owner.disabilities ^= BLIND
|
||||
|
||||
|
||||
//[[[[BRAIN]]]]
|
||||
|
||||
/obj/item/cybernetic_implant/brain
|
||||
name = "cybernetic brain implant"
|
||||
desc = "injectors of extra sub-routines for the brain"
|
||||
icon_state = "brain_implant"
|
||||
|
||||
/obj/item/cybernetic_implant/brain/New()
|
||||
var/icon/overlay = new /icon('icons/obj/surgery.dmi',"brain_implant_overlay")
|
||||
overlay.ColorTone(implant_color)
|
||||
overlays |= overlay
|
||||
..()
|
||||
|
||||
/obj/item/cybernetic_implant/brain/emp_act(severity)
|
||||
if(!owner)
|
||||
return
|
||||
var/stun_amount = 5 + (severity-1 ? 0 : 5)
|
||||
owner.Stun(stun_amount)
|
||||
owner << "<span class='warning'>Your body seizes up!</span>"
|
||||
return stun_amount
|
||||
|
||||
/obj/item/cybernetic_implant/brain/anti_drop
|
||||
name = "Anti-drop implant"
|
||||
desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle."
|
||||
var/active = 0
|
||||
var/l_hand_ignore = 0
|
||||
var/r_hand_ignore = 0
|
||||
var/obj/item/l_hand_obj = null
|
||||
var/obj/item/r_hand_obj = null
|
||||
implant_color = "#DE7E00"
|
||||
origin_tech = "materials=5;programming=4;biotech=4"
|
||||
|
||||
/obj/item/cybernetic_implant/brain/anti_drop/function()
|
||||
action_button_name = "Toggle Anti-Drop"
|
||||
|
||||
/obj/item/cybernetic_implant/brain/anti_drop/ui_action_click()
|
||||
active = !active
|
||||
if(active)
|
||||
l_hand_obj = owner.l_hand
|
||||
r_hand_obj = owner.r_hand
|
||||
if(l_hand_obj)
|
||||
if(owner.l_hand.flags & NODROP)
|
||||
l_hand_ignore = 1
|
||||
else
|
||||
owner.l_hand.flags |= NODROP
|
||||
l_hand_ignore = 0
|
||||
|
||||
if(r_hand_obj)
|
||||
if(owner.r_hand.flags & NODROP)
|
||||
r_hand_ignore = 1
|
||||
else
|
||||
owner.r_hand.flags |= NODROP
|
||||
r_hand_ignore = 0
|
||||
|
||||
if(!l_hand_obj && !r_hand_obj)
|
||||
owner << "<span class='notice'>You are not holding any items, your hands relax...</span>"
|
||||
active = 0
|
||||
else
|
||||
var/msg = 0
|
||||
msg += !l_hand_ignore && l_hand_obj ? 1 : 0
|
||||
msg += !r_hand_ignore && r_hand_obj ? 2 : 0
|
||||
switch(msg)
|
||||
if(1)
|
||||
owner << "<span class='notice'>Your left hand's grip tightens.</span>"
|
||||
if(2)
|
||||
owner << "<span class='notice'>Your right hand's grip tightens.</span>"
|
||||
if(3)
|
||||
owner << "<span class='notice'>Both of your hand's grips tighten.</span>"
|
||||
else
|
||||
release_items()
|
||||
owner << "<span class='notice'>Your hands relax...</span>"
|
||||
l_hand_obj = null
|
||||
r_hand_obj = null
|
||||
|
||||
/obj/item/cybernetic_implant/brain/anti_drop/emp_act(severity)
|
||||
if(!owner)
|
||||
return
|
||||
var/range = severity ? 10 : 5
|
||||
var/atom/A
|
||||
var/obj/item/L_item = owner.l_hand
|
||||
var/obj/item/R_item = owner.r_hand
|
||||
|
||||
release_items()
|
||||
..()
|
||||
if(L_item)
|
||||
A = pick(oview(range))
|
||||
L_item.throw_at(A, range, 2)
|
||||
owner << "<span class='notice'>Your left arm spasms and throws the [L_item.name]!</span>"
|
||||
if(R_item)
|
||||
A = pick(oview(range))
|
||||
R_item.throw_at(A, range, 2)
|
||||
owner << "<span class='notice'>Your right arm spasms and throws the [R_item.name]!</span>"
|
||||
|
||||
/obj/item/cybernetic_implant/brain/anti_drop/proc/release_items()
|
||||
if(!l_hand_ignore && l_hand_obj in owner.contents)
|
||||
l_hand_obj.flags ^= NODROP
|
||||
if(!r_hand_ignore && r_hand_obj in owner.contents)
|
||||
r_hand_obj.flags ^= NODROP
|
||||
|
||||
/obj/item/cybernetic_implant/brain/anti_stun
|
||||
name = "CNS Rebooter implant"
|
||||
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
|
||||
implant_color = "#FFFF00"
|
||||
origin_tech = "materials=6;programming=4;biotech=5"
|
||||
|
||||
/obj/item/cybernetic_implant/brain/anti_stun/function()
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/item/cybernetic_implant/brain/anti_stun/process()
|
||||
if(!owner)
|
||||
SSobj.processing.Remove(src)
|
||||
qdel(src)
|
||||
return
|
||||
if(owner.stat == DEAD)
|
||||
return
|
||||
|
||||
if(owner.stunned > STUN_SET_AMOUNT)
|
||||
owner.stunned = STUN_SET_AMOUNT
|
||||
if(owner.weakened > STUN_SET_AMOUNT)
|
||||
owner.weakened = STUN_SET_AMOUNT
|
||||
|
||||
/obj/item/cybernetic_implant/brain/anti_stun/emp_act(severity)
|
||||
if(!owner)
|
||||
return
|
||||
SSobj.processing.Remove(src)
|
||||
spawn(..() * 10)
|
||||
SSobj.processing |= src
|
||||
|
||||
|
||||
//[[[[CHEST]]]]
|
||||
|
||||
/obj/item/cybernetic_implant/chest
|
||||
name = "cybernetic torso implant"
|
||||
desc = "implants for the organs in your torso"
|
||||
icon_state = "chest_implant"
|
||||
|
||||
/obj/item/cybernetic_implant/chest/New()
|
||||
var/icon/overlay = new /icon('icons/obj/surgery.dmi',"chest_implant_overlay")
|
||||
overlay.ColorTone(implant_color)
|
||||
overlays |= overlay
|
||||
..()
|
||||
|
||||
/obj/item/cybernetic_implant/chest/nutriment
|
||||
name = "Nutriment pump implant"
|
||||
desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#00AA00"
|
||||
var/hunger_threshold = NUTRITION_LEVEL_STARVING
|
||||
var/synthesizing = 0
|
||||
var/nutriment_amount = 30
|
||||
var/poison_amount = 5
|
||||
origin_tech = "materials=5;programming=3;biotech=4"
|
||||
|
||||
/obj/item/cybernetic_implant/chest/nutriment/function()
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/item/cybernetic_implant/chest/nutriment/process()
|
||||
if(synthesizing)
|
||||
return
|
||||
if(!owner)
|
||||
SSobj.processing.Remove(src)
|
||||
qdel(src)
|
||||
return
|
||||
if(owner.stat == DEAD)
|
||||
return
|
||||
|
||||
if(owner.nutrition <= hunger_threshold)
|
||||
synthesizing = 1
|
||||
spawn(50)
|
||||
owner << "<span class='notice'>You feel less hungry...</span>"
|
||||
owner.nutrition += nutriment_amount
|
||||
synthesizing = 0
|
||||
|
||||
/obj/item/cybernetic_implant/chest/nutriment/plus
|
||||
name = "Nutriment pump implant PLUS"
|
||||
desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#006607"
|
||||
hunger_threshold = NUTRITION_LEVEL_HUNGRY
|
||||
nutriment_amount = 50
|
||||
poison_amount = 10
|
||||
origin_tech = "materials=5;programming=3;biotech=5"
|
||||
|
||||
/obj/item/cybernetic_implant/chest/nutriment/emp_act(severity)
|
||||
if(!owner)
|
||||
return
|
||||
owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning
|
||||
owner << "<span class='warning'>You feel like your insides are burning.</span>"
|
||||
|
||||
|
||||
/obj/item/cybernetic_implant/chest/reviver
|
||||
name = "Reviver implant"
|
||||
desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!"
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#AD0000"
|
||||
origin_tech = "materials=6;programming=3;biotech=6;syndicate=4"
|
||||
var/revive_cost = 0
|
||||
var/reviving = 0
|
||||
var/cooldown = 0
|
||||
|
||||
/obj/item/cybernetic_implant/chest/reviver/function()
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/item/cybernetic_implant/chest/reviver/process()
|
||||
if(!owner)
|
||||
SSobj.processing.Remove(src)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(reviving)
|
||||
if(owner.stat == UNCONSCIOUS)
|
||||
spawn(30)
|
||||
if(prob(90) && owner.getOxyLoss())
|
||||
owner.adjustOxyLoss(-3)
|
||||
revive_cost += 5
|
||||
if(prob(75) && owner.getBruteLoss())
|
||||
owner.adjustBruteLoss(-1)
|
||||
revive_cost += 20
|
||||
if(prob(75) && owner.getFireLoss())
|
||||
owner.adjustFireLoss(-1)
|
||||
revive_cost += 20
|
||||
if(prob(40) && owner.getToxLoss())
|
||||
owner.adjustToxLoss(-1)
|
||||
revive_cost += 50
|
||||
else
|
||||
cooldown = revive_cost + world.time
|
||||
reviving = 0
|
||||
return
|
||||
|
||||
if(cooldown > world.time)
|
||||
return
|
||||
if(owner.stat != UNCONSCIOUS)
|
||||
return
|
||||
if(owner.suiciding)
|
||||
SSobj.processing.Remove(src)
|
||||
return
|
||||
|
||||
revive_cost = 0
|
||||
reviving = 1
|
||||
|
||||
/obj/item/cybernetic_implant/chest/reviver/emp_act(severity)
|
||||
if(reviving)
|
||||
revive_cost += 200
|
||||
else
|
||||
cooldown += 200
|
||||
|
||||
if(istype(owner, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(H.stat != DEAD && prob(50 / severity))
|
||||
H.heart_attack = 1
|
||||
spawn(600 / severity)
|
||||
H.heart_attack = 0
|
||||
if(H.stat == CONSCIOUS)
|
||||
H << "<span class='notice'>You feel your heart beating again!</span>"
|
||||
|
||||
|
||||
//BOX O' IMPLANTS
|
||||
|
||||
/obj/item/weapon/storage/box/cyber_implants
|
||||
name = "boxed cybernetic implants"
|
||||
desc = "A sleek, sturdy box."
|
||||
icon_state = "cyber_implants"
|
||||
var/list/boxed = list(/obj/item/cybernetic_implant/eyes/xray,/obj/item/cybernetic_implant/eyes/thermals,
|
||||
/obj/item/cybernetic_implant/brain/anti_stun, /obj/item/cybernetic_implant/chest/reviver)
|
||||
var/amount = 5
|
||||
|
||||
/obj/item/weapon/storage/box/cyber_implants/New()
|
||||
..()
|
||||
var/i
|
||||
var/implant
|
||||
for(i = 0, i < amount, i++)
|
||||
implant = pick(boxed)
|
||||
new implant(src)
|
||||
@@ -1,13 +1,33 @@
|
||||
/mob/proc/getorgan()
|
||||
mob/proc/getorgan(typepath)
|
||||
return
|
||||
/mob/living/carbon/getorgan(typepath)
|
||||
|
||||
mob/proc/getorganszone(zone)
|
||||
return
|
||||
|
||||
mob/proc/getorganslot(slot)
|
||||
return
|
||||
|
||||
|
||||
mob/living/carbon/getorgan(typepath)
|
||||
return (locate(typepath) in internal_organs)
|
||||
|
||||
/mob/proc/getlimb()
|
||||
mob/living/carbon/getorganszone(zone)
|
||||
var/list/returnorg = list()
|
||||
for(var/obj/item/organ/internal/O in internal_organs)
|
||||
if(zone == O.zone)
|
||||
returnorg += O
|
||||
return returnorg
|
||||
|
||||
mob/living/carbon/getorganslot(slot)
|
||||
for(var/obj/item/organ/internal/O in internal_organs)
|
||||
if(slot == O.slot)
|
||||
return O
|
||||
|
||||
mob/proc/getlimb()
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/getlimb(typepath)
|
||||
mob/living/carbon/human/getlimb(typepath)
|
||||
return (locate(typepath) in organs)
|
||||
|
||||
|
||||
|
||||
proc/isorgan(atom/A)
|
||||
return istype(A, /obj/item/organ/internal)
|
||||
+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,95 @@
|
||||
/obj/item/organ/internal
|
||||
origin_tech = "biotech=2"
|
||||
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)
|
||||
return
|
||||
|
||||
var/obj/item/organ/internal/replaced = M.getorganslot(slot)
|
||||
if(replaced)
|
||||
replaced.Remove(M, special = 1)
|
||||
|
||||
owner = M
|
||||
M.internal_organs |= src
|
||||
loc = null
|
||||
if(organ_action_name)
|
||||
action_button_name = organ_action_name
|
||||
|
||||
/obj/item/organ/internal/proc/Remove(var/mob/living/carbon/M, special = 0)
|
||||
owner = null
|
||||
if(M)
|
||||
M.internal_organs -= src
|
||||
if(vital && !special)
|
||||
M.death()
|
||||
|
||||
if(organ_action_name)
|
||||
action_button_name = null
|
||||
|
||||
/obj/item/organ/internal/proc/on_life()
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/Destroy()
|
||||
if(owner)
|
||||
Remove(owner, 1)
|
||||
..()
|
||||
|
||||
//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"
|
||||
origin_tech = "biotech=3"
|
||||
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/heart/Insert(var/mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
beating = 1
|
||||
update_icon()
|
||||
|
||||
/obj/item/organ/internal/heart/Remove(var/mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
spawn(120)
|
||||
beating = 0
|
||||
update_icon()
|
||||
|
||||
|
||||
/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"
|
||||
name = "inflamed appendix"
|
||||
else
|
||||
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/Insert(var/mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
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,17 +1,22 @@
|
||||
/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
|
||||
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/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 +59,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,10 +38,7 @@
|
||||
/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)
|
||||
preop(user, target, target_zone, tool, surgery)
|
||||
if(do_after(user, time, target = target))
|
||||
|
||||
var/advance = 0
|
||||
@@ -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
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
return 1
|
||||
|
||||
/datum/surgery_step/xenomorph_removal/proc/remove_xeno(mob/user, mob/living/carbon/target)
|
||||
var/obj/item/body_egg/alien_embryo/A = locate() in target.contents
|
||||
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)
|
||||
@@ -33,12 +33,13 @@
|
||||
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/body_egg/alien_embryo/A = locate() in target.contents
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user