Merge remote-tracking branch 'remotes/upstream/master' into remove_thrall

This commit is contained in:
Xhuis
2015-08-04 14:48:35 -04:00
92 changed files with 1987 additions and 1652 deletions
+4 -6
View File
@@ -2,15 +2,15 @@
name = "appendectomy"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_appendix, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "groin"
requires_organic_chest = 1
possible_locs = list("groin")
//extract appendix
/datum/surgery_step/extract_appendix
name = "extract appendix"
accept_hand = 1
time = 64
var/obj/item/organ/appendix/A = null
var/obj/item/organ/internal/appendix/A = null
/datum/surgery_step/extract_appendix/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
A = locate() in target.internal_organs
@@ -23,9 +23,7 @@
if(A)
user.visible_message("[user] successfully removes [target]'s appendix!", "<span class='notice'>You successfully removes [target]'s appendix.</span>")
A.loc = get_turf(target)
target.internal_organs -= A
for(var/datum/disease/appendicitis in target.viruses)
appendicitis.cure()
A.Remove(target)
else
user << "<span class='warning'>You can't find an appendix in [target]!</span>"
return 1
+3 -1
View File
@@ -2,11 +2,13 @@
name = "brain removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/extract_brain)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "head"
possible_locs = list("head")
requires_organic_bodypart = 0
//extract brain
/datum/surgery_step/extract_brain
name = "extract brain"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 55)
time = 64
var/obj/item/organ/brain/B = null
+3 -3
View File
@@ -2,12 +2,12 @@
name = "cavity implant"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/handle_cavity, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "chest"
requires_organic_chest = 1
possible_locs = list("chest")
//handle cavity
/datum/surgery_step/handle_cavity
name = "implant item"
accept_hand = 1
accept_any_item = 1
time = 32
@@ -25,7 +25,7 @@
/datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(tool)
if(IC || tool.w_class > 3 || (tool.flags & NODROP) || tool.GetTypeInAllContents(/obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/organ))
if(IC || tool.w_class > 3 || NODROP in tool.flags || tool.GetTypeInAllContents(/obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/organ))
user << "<span class='warning'>You can't seem to fit [tool] in [target]'s [target_zone]!</span>"
return 0
else
+1
View File
@@ -7,6 +7,7 @@
//extract brain
/datum/surgery_step/extract_core
name = "extract core"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 100)
time = 16
+24 -23
View File
@@ -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)
+3 -2
View File
@@ -2,11 +2,12 @@
name = "eye surgery"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "eyes"
possible_locs = list("eyes")
requires_organic_bodypart = 0
//fix eyes
/datum/surgery_step/fix_eyes
name = "fix eyes"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/pen = 25)
time = 64
+2 -2
View File
@@ -2,12 +2,12 @@
name = "gender reassignment"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/reshape_genitals, /datum/surgery_step/close)
species = list(/mob/living/carbon/human)
location = "groin"
requires_organic_chest = 1
possible_locs = list("groin")
//reshape_genitals
/datum/surgery_step/reshape_genitals
name = "reshape genitals"
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/hatchet = 50, /obj/item/weapon/wirecutters = 35)
time = 64
+22 -1
View File
@@ -1,6 +1,7 @@
//make incision
/datum/surgery_step/incise
name = "make incision"
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 65, /obj/item/weapon/shard = 45)
time = 24
@@ -11,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
+46 -47
View File
@@ -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
+24 -12
View File
@@ -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 -32
View File
@@ -5,6 +5,7 @@
//SURGERY STEPS
/datum/surgery_step/replace
name = "sever muscules"
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/wirecutters = 55)
time = 32
@@ -14,15 +15,15 @@
/datum/surgery_step/add_limb
name = "replace limb"
implements = list(/obj/item/robot_parts = 100)
time = 32
var/obj/item/organ/limb/L = null // L because "limb"
allowed_organs = list("r_arm","l_arm","r_leg","l_leg","chest","head")
/datum/surgery_step/add_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
L = new_organ
L = surgery.organ
if(L)
user.visible_message("[user] begins to augment [target]'s [parse_zone(user.zone_sel.selecting)].", "<span class ='notice'>You begin to augment [target]'s [parse_zone(user.zone_sel.selecting)]...</span>")
else
@@ -36,8 +37,7 @@
name = "augmentation"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/saw, /datum/surgery_step/add_limb)
species = list(/mob/living/carbon/human)
location = "anywhere" //Check attempt_initate_surgery() (in code/modules/surgery/helpers) to see what this does if you can't tell
has_multi_loc = 1 //Multi location stuff, See multiple_location_example.dm
possible_locs = list("r_arm","l_arm","r_leg","l_leg","chest","head")
//SURGERY STEP SUCCESSES
@@ -45,34 +45,6 @@
/datum/surgery_step/add_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(L)
if(ishuman(target))
switch(L.body_part)
if(CHEST)
if(!istype(tool,/obj/item/robot_parts/chest))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(HEAD)
if(!istype(tool,/obj/item/robot_parts/head))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(ARM_LEFT)
if(!istype(tool,/obj/item/robot_parts/l_arm))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(ARM_RIGHT)
if(!istype(tool,/obj/item/robot_parts/r_arm))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(LEG_LEFT)
if(!istype(tool,/obj/item/robot_parts/l_leg))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(LEG_RIGHT)
if(!istype(tool,/obj/item/robot_parts/r_leg))
user << "<span class='warning'>That is the wrong robotic limb for this body part.</span>"
return 0
if(!user.drop_item())
return 0
var/mob/living/carbon/human/H = target
user.visible_message("[user] successfully augments [target]'s [parse_zone(target_zone)]!", "<span class='notice'>You successfully augment [target]'s [parse_zone(target_zone)].</span>")
L.loc = get_turf(target)
@@ -94,6 +66,7 @@
H.organs += new /obj/item/organ/limb/robot/chest(src)
for(var/datum/disease/appendicitis/A in H.viruses) //If they already have Appendicitis, Remove it
A.cure(1)
user.drop_item()
qdel(tool)
H.update_damage_overlays(0)
H.update_augments() //Gives them the Cyber limb overlay
+8 -4
View File
@@ -1,14 +1,17 @@
/datum/surgery/lipoplasty
name = "lipoplasty"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/cut_fat, /datum/surgery_step/remove_fat, /datum/surgery_step/close)
species = list(/mob/living/carbon/human)
target_must_be_fat = 1
location = "chest"
requires_organic_chest = 1
possible_locs = list("chest")
/datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target)
if(target.disabilities & FAT)
return 1
return 0
//cut fat
/datum/surgery_step/cut_fat
name = "cut excess fat"
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
time = 64
@@ -21,6 +24,7 @@
//remove fat
/datum/surgery_step/remove_fat
name = "remove loose fat"
implements = list(/obj/item/weapon/retractor = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/wirecutters = 35)
time = 32
@@ -1,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
@@ -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)
+26 -6
View File
@@ -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)
@@ -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)
+2 -2
View File
@@ -1,11 +1,11 @@
/datum/surgery/plastic_surgery
name = "plastic surgery"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/reshape_face, /datum/surgery_step/close)
species = list(/mob/living/carbon/human)
location = "head"
possible_locs = list("head")
//reshape_face
/datum/surgery_step/reshape_face
name = "reshape face"
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 50, /obj/item/weapon/wirecutters = 35)
time = 64
+3 -10
View File
@@ -1,22 +1,18 @@
/datum/surgery/embedded_removal
name = "removal of embedded objects"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/remove_object)
species = list(/mob/living/carbon/human)
location = "anywhere"
has_multi_loc = 1
possible_locs = list("r_arm","l_arm","r_leg","l_leg","chest","head")
/datum/surgery_step/remove_object
name = "remove embedded objects"
time = 32
allowed_organs = list("r_arm","l_arm","r_leg","l_leg","chest","head")
accept_hand = 1
var/obj/item/organ/limb/L = null
/datum/surgery_step/remove_object/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
L = new_organ
L = surgery.organ
if(L)
user.visible_message("[user] looks for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)].", "<span class='notice'>You look for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)]...</span>")
else
@@ -33,9 +29,6 @@
I.loc = get_turf(H)
L.embedded_objects -= I
if(!H.has_embedded_objects())
H.clear_alert("embeddedobject")
if(objects > 0)
user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.getDisplayName()]!", "<span class='notice'>You sucessfully remove [objects] objects from [H]'s [L.getDisplayName()].</span>")
else
+12 -11
View File
@@ -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
+2 -56
View File
@@ -4,8 +4,7 @@
var/accept_hand = 0 //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item.
var/accept_any_item = 0 //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand.
var/time = 10 //how long does the step take?
var/new_organ = null //Used for multilocation operations
var/list/allowed_organs = list()//Allowed organs, see Handle_Multi_Loc below - RR
var/name
/datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -39,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
+5 -4
View File
@@ -2,13 +2,13 @@
name = "xenomorph removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/xenomorph_removal, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
location = "chest"
requires_organic_chest = 1
possible_locs = list("chest")
//remove xeno from premises
/datum/surgery_step/xenomorph_removal
name = "remove foregin body"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/shovel/spade = 65, /obj/item/weapon/cultivator = 50, /obj/item/weapon/crowbar = 35)
time = 64
@@ -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)