diff --git a/_maps/map_files/MetaStation/MetaStation.v41F.dmm b/_maps/map_files/MetaStation/MetaStation.v41F.dmm
index b05fc0caa49..dae47adebe4 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41F.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41F.dmm
@@ -7369,7 +7369,7 @@
"cMl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Departure Lounge"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cMm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Departure Lounge"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cMn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Departure Lounge"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
-"cMo" = (/obj/structure/table/wood,/obj/item/weapon/spellbook/oneuse/smoke{name = "mysterious old book of "},/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{name = "flask of holy water"; pixel_x = -2; pixel_y = 2},/obj/item/weapon/nullrod{pixel_x = 4},/obj/item/organ/heart,/obj/item/device/soulstone/anybody,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office)
+"cMo" = (/obj/structure/table/wood,/obj/item/weapon/spellbook/oneuse/smoke{name = "mysterious old book of "},/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{name = "flask of holy water"; pixel_x = -2; pixel_y = 2},/obj/item/weapon/nullrod{pixel_x = 4},/obj/item/organ/internal/heart,/obj/item/device/soulstone/anybody,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office)
"cMp" = (/obj/structure/optable{name = "Robotics Operating Table"},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/camera{c_tag = "Robotics - Aft"; dir = 1; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/assembly/robotics)
"cMq" = (/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/assembly/robotics)
"cMs" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera{c_tag = "Departure Lounge - Port Fore"; dir = 4; network = list("SS13")},/obj/structure/flora/kirbyplants{icon_state = "plant-24"; layer = 4.1; tag = "icon-plant-24"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm
index 11a68034d8b..ee249664ab5 100644
--- a/code/datums/diseases/appendicitis.dm
+++ b/code/datums/diseases/appendicitis.dm
@@ -23,7 +23,7 @@
if(prob(5))
affected_mob.emote("cough")
if(2)
- var/obj/item/organ/appendix/A = affected_mob.getorgan(/obj/item/organ/appendix)
+ var/obj/item/organ/internal/appendix/A = affected_mob.getorgan(/obj/item/organ/internal/appendix)
if(A)
A.inflamed = 1
A.update_icon()
diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index 938c48b5343..0f5ebca201e 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -61,7 +61,7 @@ var/global/max_secret_rooms = 6
walltypes = list(/turf/simulated/wall/r_wall=2,/turf/simulated/wall=2,/turf/simulated/mineral/random/high_chance=1)
floortypes = list(/turf/simulated/floor/plasteel,/turf/simulated/floor/engine)
treasureitems = list(/obj/machinery/bot/medbot/mysterious=1, /obj/item/weapon/circular_saw=1, /obj/structure/closet/critter/cat=2)
- fluffitems = list(/obj/effect/decal/cleanable/blood=5,/obj/item/organ/appendix=2,/obj/structure/closet/crate/freezer=2,
+ fluffitems = list(/obj/effect/decal/cleanable/blood=5,/obj/item/organ/internal/appendix=2,/obj/structure/closet/crate/freezer=2,
/obj/structure/optable=1,/obj/item/weapon/scalpel=1,/obj/item/weapon/storage/firstaid/regular=3,
/obj/item/weapon/tank/internals/anesthetic=1, /obj/item/weapon/surgical_drapes=2, /obj/item/device/mass_spectrometer/adv=1,/obj/item/clothing/glasses/hud/health=1)
@@ -72,7 +72,7 @@ var/global/max_secret_rooms = 6
treasureitems = list(/obj/item/device/soulstone=1, /obj/item/clothing/suit/space/cult=1, /obj/item/weapon/bedsheet/cult=2,
/obj/item/clothing/suit/cultrobes=2, /mob/living/simple_animal/hostile/creature=3)
fluffitems = list(/obj/effect/gateway=1,/obj/effect/gibspawner=1,/obj/structure/cult/talisman=1,/obj/item/toy/crayon/red=2,
- /obj/item/organ/heart=2, /obj/effect/decal/cleanable/blood=4,/obj/structure/table/wood=2,/obj/item/weapon/ectoplasm=3,
+ /obj/item/organ/internal/heart=2, /obj/effect/decal/cleanable/blood=4,/obj/structure/table/wood=2,/obj/item/weapon/ectoplasm=3,
/obj/item/clothing/head/helmet/space/cult=1, /obj/item/clothing/shoes/cult=1)
if("wizden")
diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm
index 35ce34e0792..8e6662109e3 100644
--- a/code/game/gamemodes/abduction/abduction.dm
+++ b/code/game/gamemodes/abduction/abduction.dm
@@ -257,10 +257,7 @@
scientist.equip_to_slot_or_del(G, slot_in_backpack)
var/obj/item/weapon/implant/abductor/beamplant = new /obj/item/weapon/implant/abductor(scientist)
- beamplant.imp_in = scientist
- beamplant.implanted = 1
- beamplant.implanted(scientist)
- beamplant.home = console.pad
+ beamplant.implant(scientist)
/datum/game_mode/abduction/check_finished()
diff --git a/code/game/gamemodes/abduction/abduction_gear.dm b/code/game/gamemodes/abduction/abduction_gear.dm
index 24fc829d65b..9595f0883b9 100644
--- a/code/game/gamemodes/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/abduction/abduction_gear.dm
@@ -264,6 +264,7 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "implant"
activated = 1
+ origin_tech = "materials=2;biotech=3;magnets=4;bluespace=5"
var/obj/machinery/abductor/pad/home
var/cooldown = 30
@@ -282,6 +283,29 @@
if(cooldown == initial(cooldown))
SSobj.processing.Remove(src)
+/obj/item/weapon/implant/abductor/implant(var/mob/source, var/mob/user)
+ if(..())
+ var/obj/machinery/abductor/console/console
+ if(ishuman(source))
+ var/mob/living/carbon/human/H = source
+ if(H.dna && istype(H.dna.species, /datum/species/abductor))
+ var/datum/species/abductor/S = H.dna.species
+ console = get_team_console(S.team)
+ home = console.pad
+
+ if(!home)
+ console = get_team_console(pick(1, 2, 3, 4))
+ home = console.pad
+ return 1
+
+/obj/item/weapon/implant/abductor/proc/get_team_console(var/team)
+ var/obj/machinery/abductor/console/console
+ for(var/obj/machinery/abductor/console/c in machines)
+ if(c.team == team)
+ console = c
+ break
+ return console
+
/obj/item/device/firing_pin/alien
name = "alien firing pin"
diff --git a/code/game/gamemodes/abduction/abduction_surgery.dm b/code/game/gamemodes/abduction/abduction_surgery.dm
index a618e1d2544..81c871b20d5 100644
--- a/code/game/gamemodes/abduction/abduction_surgery.dm
+++ b/code/game/gamemodes/abduction/abduction_surgery.dm
@@ -1,17 +1,26 @@
/datum/surgery/organ_extraction
name = "experimental dissection"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin,/datum/surgery_step/incise, /datum/surgery_step/extract_organ ,/datum/surgery_step/gland_insert)
- species = list(/mob/living/carbon/human)
- location = "chest"
- user_species_restricted = 1
- user_species_ids = list("abductor")
+ possible_locs = list("chest")
ignore_clothes = 1
+/datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target)
+ if(!ishuman(user))
+ return 0
+ var/mob/living/carbon/human/H = user
+ if(H.dna && istype(H.dna.species, /datum/species/abductor))
+ return 1
+ if((locate(/obj/item/weapon/implant/abductor) in H))
+ return 1
+ return 0
+
+
/datum/surgery_step/extract_organ
+ name = "remove heart"
accept_hand = 1
time = 32
- var/obj/item/IC = null
- var/list/organ_types = list(/obj/item/organ/heart)
+ var/obj/item/organ/internal/IC = null
+ var/list/organ_types = list(/obj/item/organ/internal/heart)
/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
for(var/obj/item/I in target.internal_organs)
@@ -24,13 +33,14 @@
if(IC)
user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].")
user.put_in_hands(IC)
- target.internal_organs -= IC
+ IC.Remove(target, special = 1)
return 1
else
user << "You don't find anything in [target]'s [target_zone]!"
return 0
/datum/surgery_step/gland_insert
+ name = "insert gland"
implements = list(/obj/item/gland = 100)
time = 32
@@ -42,6 +52,4 @@
user.drop_item()
var/obj/item/gland/gland = tool
gland.Inject(target)
- return 1
-
-
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm
index afc3776342f..349696c8fae 100644
--- a/code/game/gamemodes/gang/gang_pen.dm
+++ b/code/game/gamemodes/gang/gang_pen.dm
@@ -67,6 +67,7 @@
name = "gang implant"
desc = "Makes you a gangster or such."
activated = 0
+ origin_tech = "materials=2;biotech=4;programming=4;syndicate=4"
var/datum/gang/gang
/obj/item/weapon/implant/gang/New(loc,var/setgang)
@@ -85,39 +86,38 @@
Integrity: Implant's EMP function will destroy itself in the process."}
return dat
-/obj/item/weapon/implant/gang/implanted(mob/target)
- ..()
- for(var/obj/item/weapon/implant/I in target)
- if(I != src)
- qdel(I)
+/obj/item/weapon/implant/gang/implant(mob/target)
+ if(..())
+ for(var/obj/item/weapon/implant/I in target)
+ if(I != src)
+ qdel(I)
- var/success
- if(target.stat != DEAD)
- if(target.mind in ticker.mode.get_gangsters())
- if(ticker.mode.remove_gangster(target.mind,0,1))
- success = 1 //Was not a gang boss, convert as usual
- else
- success = 1 //Not a gangster, convert as usual
+ var/success
+ if(target.stat != DEAD)
+ if(target.mind in ticker.mode.get_gangsters())
+ if(ticker.mode.remove_gangster(target.mind,0,1))
+ success = 1 //Was not a gang boss, convert as usual
+ else
+ success = 1 //Not a gangster, convert as usual
- if(!target.mind)
- return
+ if(!target.mind)
+ return 0
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- H.sec_hud_set_implants()
- if(success && ticker.mode.add_gangster(target.mind,gang,0))
- target.Paralyse(5)
- else
- target.visible_message("[target] seems to resist the implant!", "You feel the influence of your enemies try to invade your mind!")
- qdel(src)
+ if(ishuman(target))
+ if(success && ticker.mode.add_gangster(target.mind,gang,0))
+ target.Paralyse(5)
+ else
+ target.visible_message("[target] seems to resist the implant!", "You feel the influence of your enemies try to invade your mind!")
-/obj/item/weapon/implanter/gang/
- name = "implanter-gang"
+ qdel(src)
+ return -1
-/obj/item/weapon/implanter/gang/New(loc,var/gang)
+/obj/item/weapon/implanter/gang
+ name = "implanter (gang)"
+
+/obj/item/weapon/implanter/gang/New(loc, var/gang)
if(!gang)
qdel(src)
return
imp = new /obj/item/weapon/implant/gang(src,gang)
- ..()
- update_icon()
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 1cb47606530..ceb70737d79 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -181,13 +181,9 @@
synd_mob.equip_to_slot_or_del(U, slot_in_backpack)
var/obj/item/weapon/implant/weapons_auth/W = new/obj/item/weapon/implant/weapons_auth(synd_mob)
- W.imp_in = synd_mob
- W.implanted = 1
- W.implanted(synd_mob)
+ W.implant(synd_mob)
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(synd_mob)
- E.imp_in = synd_mob
- E.implanted = 1
- E.implanted(synd_mob)
+ E.implant(synd_mob)
synd_mob.faction |= "syndicate"
synd_mob.update_icons()
return 1
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index e446fe82255..4ec583172e6 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -60,8 +60,10 @@
"}
if(patient.surgeries.len)
- dat += "
Initiated Procedures
"
+ dat += "
Initiated Procedures"
for(var/datum/surgery/procedure in patient.surgeries)
dat += "[capitalize(procedure.name)]
"
+ var/datum/surgery_step/surgery_step = procedure.get_surgery_step()
+ dat += "Next step: [capitalize(surgery_step.name)]
"
dat += "
"
return dat
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index cab57a23a05..a2157fbec72 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -3,17 +3,19 @@
icon = 'icons/obj/implants.dmi'
icon_state = "generic" //Shows up as the action button icon
action_button_is_hands_free = 1
+ origin_tech = "materials=2;biotech=3;programming=2"
+
var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like loyalty implants
var/implanted = null
var/mob/living/imp_in = null
item_color = "b"
- var/allow_reagents = 0
+ var/allow_multiple = 0
+ var/uses = -1
/obj/item/weapon/implant/proc/trigger(emote, mob/source)
return
-
/obj/item/weapon/implant/proc/activate()
return
@@ -22,16 +24,53 @@
//What does the implant do upon injection?
-//return 0 if the implant fails (ex. Revhead and loyalty implant.)
-//return 1 if the implant succeeds (ex. Nonrevhead and loyalty implant.)
-/obj/item/weapon/implant/proc/implanted(mob/source)
+//return 1 if the implant injects
+//return -1 if the implant fails to inject
+//return 0 if there is no room for implant
+/obj/item/weapon/implant/proc/implant(var/mob/source, var/mob/user)
+ var/obj/item/weapon/implant/imp_e = locate(src.type) in source
+ if(!allow_multiple && imp_e && imp_e != src)
+ if(imp_e.uses < initial(imp_e.uses)*2)
+ if(uses == -1)
+ imp_e.uses = -1
+ else
+ imp_e.uses = min(imp_e.uses + uses, initial(imp_e.uses)*2)
+ qdel(src)
+ return 1
+ else
+ return 0
+
+
if(activated)
action_button_name = "Activate [src.name]"
if(istype(source, /mob/living/carbon/human))
var/mob/living/carbon/human/H = source
H.sec_hud_set_implants()
+ src.loc = source
+ imp_in = source
+ implanted = 1
+
+ if(user)
+ add_logs(user, source, "implanted", object="[name]")
+
return 1
+/obj/item/weapon/implant/proc/removed(var/mob/source)
+ src.loc = null
+ imp_in = null
+ implanted = 0
+
+ if(istype(source, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = source
+ H.sec_hud_set_implants()
+
+ return 1
+
+/obj/item/weapon/implant/Destroy()
+ if(imp_in)
+ removed(imp_in)
+ ..()
+
/obj/item/weapon/implant/proc/get_data()
return "No information available"
@@ -45,6 +84,7 @@
name = "tracking implant"
desc = "Track with this."
activated = 0
+ origin_tech = "materials=2;magnets=2;programming=2;biotech=2"
var/id = 1.0
/obj/item/weapon/implant/tracking/get_data()
@@ -68,6 +108,7 @@
name = "firearms authentication implant"
desc = "Lets you shoot your guns"
icon_state = "auth"
+ origin_tech = "materials=2;magnets=2;programming=2;biotech=5;syndicate=5"
activated = 0
/obj/item/weapon/implant/weapons_auth/get_data()
@@ -78,181 +119,13 @@
Function: Allows operation of implant-locked weaponry, preventing equipment from falling into enemy hands."}
return dat
-/obj/item/weapon/implant/explosive
- name = "microbomb implant"
- desc = "And boom goes the weasel."
- icon_state = "explosive"
- var/weak = 1.6
- var/medium = 0.8
- var/heavy = 0.4
- var/delay = 7
-
-/obj/item/weapon/implant/explosive/get_data()
- var/dat = {"
Implant Specifications:
-
Name: Robust Corp RX-78 Employee Management Implant
-
Life: Activates upon death.
-
Important Notes: Explodes
-
-
Implant Details:
-
Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.
-
Special Features: Explodes
-
Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
- return dat
-
-/obj/item/weapon/implant/explosive/trigger(emote, mob/source)
- if(emote == "deathgasp")
- activate("death")
-
-/obj/item/weapon/implant/explosive/activate(cause)
- if(!cause || !imp_in) return 0
- if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your microbomb implant? This will cause you to explode!", "Microbomb Implant Confirmation", "Yes", "No") != "Yes")
- return 0
- for(var/obj/item/weapon/implant/explosive/E in imp_in)
- heavy += 0.4
- medium += 0.8
- weak += 1.6
- delay += 7
- if(E != src)
- qdel(E)
- heavy = round(heavy)
- medium = round(medium)
- weak = round(weak)
- imp_in << "
You activate your microbomb implant."
-//If the delay is short, just blow up already jeez
- if(delay <= 7)
- imp_in.gib()
- explosion(src,heavy,medium,weak,weak, flame_range = weak)
- qdel(src)
- return
- timed_explosion()
-
-/obj/item/weapon/implant/explosive/proc/timed_explosion()
- imp_in.visible_message("
[imp_in] starts beeping ominously!")
- playsound(loc, 'sound/items/timer.ogg', 30, 0)
- sleep(delay/4)
- if(imp_in.stat)
- imp_in.visible_message("
[imp_in] doubles over in pain!")
- imp_in.Weaken(7)
- playsound(loc, 'sound/items/timer.ogg', 30, 0)
- sleep(delay/4)
- playsound(loc, 'sound/items/timer.ogg', 30, 0)
- sleep(delay/4)
- playsound(loc, 'sound/items/timer.ogg', 30, 0)
- sleep(delay/4)
- imp_in.gib()
- explosion(src,heavy,medium,weak,weak, flame_range = weak)
- qdel(src)
-
-/obj/item/weapon/implant/explosive/macro
- name = "macrobomb implant"
- desc = "And boom goes the weasel. And everything else nearby."
- icon_state = "explosive"
- weak = 16
- medium = 8
- heavy = 4
- delay = 70
-
-/obj/item/weapon/implant/explosive/macro/activate(cause)
- if(!cause || !imp_in) return 0
- if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your macrobomb implant? This will cause you to explode and gib!", "Macrobomb Implant Confirmation", "Yes", "No") != "Yes")
- return 0
- for(var/obj/item/weapon/implant/explosive/macro/E in imp_in)
- if(E != src)
- qdel(E)
- imp_in << "
You activate your macrobomb implant."
- timed_explosion()
-
-/obj/item/weapon/implant/chem
- name = "chem implant"
- desc = "Injects things."
- icon_state = "reagents"
- allow_reagents = 1
-
-/obj/item/weapon/implant/chem/get_data()
- var/dat = {"
Implant Specifications:
-
Name: Robust Corp MJ-420 Prisoner Management Implant
-
Life: Deactivates upon death but remains within the body.
-
Important Notes: Due to the system functioning off of nutrients in the implanted subject's body, the subject
- will suffer from an increased appetite.
-
-
Implant Details:
-
Function: Contains a small capsule that can contain various chemicals. Upon receiving a specially encoded signal
- the implant releases the chemicals directly into the blood stream.
-
Special Features:
-
Micro-Capsule- Can be loaded with any sort of chemical agent via the common syringe and can hold 50 units.
- Can only be loaded while still in its original case.
-
Integrity: Implant will last so long as the subject is alive. However, if the subject suffers from malnutrition,
- the implant may become unstable and either pre-maturely inject the subject or simply break."}
- return dat
-
-/obj/item/weapon/implant/chem/New()
- ..()
- create_reagents(50)
-
-/obj/item/weapon/implant/chem/trigger(emote, mob/source)
- if(emote == "deathgasp")
- activate(reagents.total_volume)
-
-/obj/item/weapon/implant/chem/activate(cause)
- if(!cause || !imp_in) return 0
- var/mob/living/carbon/R = imp_in
- var/injectamount = null
- if (cause == "action_button")
- injectamount = reagents.total_volume
- else
- injectamount = cause
- reagents.trans_to(R, injectamount)
- R << "
You hear a faint beep."
- if(!reagents.total_volume)
- R << "
You hear a faint click from your chest."
- qdel(src)
-
-
-/obj/item/weapon/implant/loyalty
- name = "loyalty implant"
- desc = "Makes you loyal or such."
- activated = 0
-
-/obj/item/weapon/implant/loyalty/get_data()
- var/dat = {"
Implant Specifications:
-
Name: Nanotrasen Employee Management Implant
-
Life: Ten years.
-
Important Notes: Personnel injected with this device tend to be much more loyal to the company.
-
-
Implant Details:
-
Function: Contains a small pod of nanobots that manipulate the host's mental functions.
-
Special Features: Will prevent and cure most forms of brainwashing.
-
Integrity: Implant will last so long as the nanobots are inside the bloodstream."}
- return dat
-
-
-/obj/item/weapon/implant/loyalty/implanted(mob/target)
- ..()
- if((target.mind in (ticker.mode.head_revolutionaries | ticker.mode.get_gang_bosses())) || is_shadow_or_thrall(target))
- target.visible_message("
[target] seems to resist the implant!", "
You feel the corporate tendrils of Nanotrasen try to invade your mind!")
- return 0
- if(target.mind in ticker.mode.get_gangsters())
- ticker.mode.remove_gangster(target.mind)
- target.visible_message("
[src] was destroyed in the process!", "
You feel a surge of loyalty towards Nanotrasen.")
- return 0
- if(target.mind in ticker.mode.revolutionaries)
- ticker.mode.remove_revolutionary(target.mind)
- if(target.mind in ticker.mode.cult)
- target << "
You feel the corporate tendrils of Nanotrasen try to invade your mind!"
- else
- target << "
You feel a surge of loyalty towards Nanotrasen."
- return 1
-
-/obj/item/weapon/implant/loyalty/Destroy()
- if(imp_in.stat != DEAD)
- imp_in << "
You feel a sense of liberation as Nanotrasen's grip on your mind fades away."
- ..()
/obj/item/weapon/implant/adrenalin
name = "adrenal implant"
desc = "Removes all stuns and knockdowns."
icon_state = "adrenal"
- var/uses = 3
+ origin_tech = "materials=2;biotech=4;combat=3;syndicate=4"
+ uses = 3
/obj/item/weapon/implant/adrenalin/get_data()
var/dat = {"
Implant Specifications:
@@ -285,8 +158,8 @@
name = "emp implant"
desc = "Triggers an EMP."
icon_state = "emp"
-
- var/uses = 2
+ origin_tech = "materials=2;biotech=3;magnets=4;syndicate=4"
+ uses = 2
/obj/item/weapon/implant/emp/activate()
if (src.uses < 1) return 0
diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm
new file mode 100644
index 00000000000..8b847d4f1de
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implant_chem.dm
@@ -0,0 +1,54 @@
+/obj/item/weapon/implant/chem
+ name = "chem implant"
+ desc = "Injects things."
+ icon_state = "reagents"
+ origin_tech = "materials=3;biotech=4"
+ flags = OPENCONTAINER
+
+/obj/item/weapon/implant/chem/get_data()
+ var/dat = {"
Implant Specifications:
+
Name: Robust Corp MJ-420 Prisoner Management Implant
+
Life: Deactivates upon death but remains within the body.
+
Important Notes: Due to the system functioning off of nutrients in the implanted subject's body, the subject
+ will suffer from an increased appetite.
+
+
Implant Details:
+
Function: Contains a small capsule that can contain various chemicals. Upon receiving a specially encoded signal
+ the implant releases the chemicals directly into the blood stream.
+
Special Features:
+
Micro-Capsule- Can be loaded with any sort of chemical agent via the common syringe and can hold 50 units.
+ Can only be loaded while still in its original case.
+
Integrity: Implant will last so long as the subject is alive. However, if the subject suffers from malnutrition,
+ the implant may become unstable and either pre-maturely inject the subject or simply break."}
+ return dat
+
+/obj/item/weapon/implant/chem/New()
+ ..()
+ create_reagents(50)
+
+/obj/item/weapon/implant/chem/trigger(emote, mob/source)
+ if(emote == "deathgasp")
+ activate(reagents.total_volume)
+
+/obj/item/weapon/implant/chem/activate(cause)
+ if(!cause || !imp_in) return 0
+ var/mob/living/carbon/R = imp_in
+ var/injectamount = null
+ if (cause == "action_button")
+ injectamount = reagents.total_volume
+ else
+ injectamount = cause
+ reagents.trans_to(R, injectamount)
+ R << "
You hear a faint beep."
+ if(!reagents.total_volume)
+ R << "
You hear a faint click from your chest."
+ qdel(src)
+
+
+/obj/item/weapon/implantcase/chem
+ name = "glass case - 'Remote Chemical'"
+ desc = "A case containing a remote chemical implant."
+
+/obj/item/weapon/implantcase/chem/New()
+ imp = new /obj/item/weapon/implant/chem(src)
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm
new file mode 100644
index 00000000000..dad37115fe5
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implant_explosive.dm
@@ -0,0 +1,119 @@
+/obj/item/weapon/implant/explosive
+ name = "microbomb implant"
+ desc = "And boom goes the weasel."
+ icon_state = "explosive"
+ origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
+ var/weak = 1.6
+ var/medium = 0.8
+ var/heavy = 0.4
+ var/delay = 7
+
+/obj/item/weapon/implant/explosive/get_data()
+ var/dat = {"
Implant Specifications:
+
Name: Robust Corp RX-78 Employee Management Implant
+
Life: Activates upon death.
+
Important Notes: Explodes
+
+
Implant Details:
+
Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.
+
Special Features: Explodes
+
Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
+ return dat
+
+/obj/item/weapon/implant/explosive/trigger(emote, mob/source)
+ if(emote == "deathgasp")
+ activate("death")
+
+/obj/item/weapon/implant/explosive/activate(cause)
+ if(!cause || !imp_in) return 0
+ if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your microbomb implant? This will cause you to explode!", "Microbomb Implant Confirmation", "Yes", "No") != "Yes")
+ return 0
+ heavy = round(heavy)
+ medium = round(medium)
+ weak = round(weak)
+ imp_in << "
You activate your microbomb implant."
+//If the delay is short, just blow up already jeez
+ if(delay <= 7)
+ imp_in.gib()
+ explosion(src,heavy,medium,weak,weak, flame_range = weak)
+ qdel(src)
+ return
+ timed_explosion()
+
+/obj/item/weapon/implant/explosive/implant(mob/source)
+ var/obj/item/weapon/implant/explosive/imp_e = locate(src.type) in source
+ if(imp_e)
+ imp_e.heavy += heavy
+ imp_e.medium += medium
+ imp_e.weak += weak
+ imp_e.delay += delay
+ qdel(src)
+ return 1
+
+ return ..()
+
+/obj/item/weapon/implant/explosive/proc/timed_explosion()
+ imp_in.visible_message("
[imp_in] starts beeping ominously!")
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
+ if(imp_in && imp_in.stat)
+ imp_in.visible_message("
[imp_in] doubles over in pain!")
+ imp_in.Weaken(7)
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
+ if(imp_in)
+ imp_in.gib()
+ explosion(src,heavy,medium,weak,weak, flame_range = weak)
+ qdel(src)
+
+/obj/item/weapon/implant/explosive/macro
+ name = "macrobomb implant"
+ desc = "And boom goes the weasel. And everything else nearby."
+ icon_state = "explosive"
+ origin_tech = "materials=3;combat=5;biotech=4;syndicate=5"
+ weak = 16
+ medium = 8
+ heavy = 4
+ delay = 70
+
+/obj/item/weapon/implant/explosive/macro/activate(cause)
+ if(!cause || !imp_in) return 0
+ if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your macrobomb implant? This will cause you to explode and gib!", "Macrobomb Implant Confirmation", "Yes", "No") != "Yes")
+ return 0
+ imp_in << "
You activate your macrobomb implant."
+ timed_explosion()
+
+/obj/item/weapon/implant/explosive/macro/implant(mob/source)
+ var/obj/item/weapon/implant/explosive/imp_e = locate(src.type) in source
+ if(imp_e)
+ return 0
+ imp_e = locate(/obj/item/weapon/implant/explosive) in source
+ if(imp_e)
+ heavy += imp_e.heavy
+ medium += imp_e.medium
+ weak += imp_e.weak
+ delay += imp_e.delay
+ qdel(imp_e)
+
+ return ..()
+
+
+/obj/item/weapon/implanter/explosive
+ name = "implanter (explosive)"
+
+/obj/item/weapon/implanter/explosive/New()
+ imp = new /obj/item/weapon/implant/explosive(src)
+ ..()
+
+
+/obj/item/weapon/implantcase/explosive
+ name = "glass case - 'Explosive'"
+ desc = "A case containing an explosive implant."
+
+/obj/item/weapon/implantcase/explosive/New()
+ imp = new /obj/item/weapon/implant/explosive(src)
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm
similarity index 84%
rename from code/game/objects/items/weapons/implants/implantfreedom.dm
rename to code/game/objects/items/weapons/implants/implant_freedom.dm
index 821cec4c572..40505d82489 100644
--- a/code/game/objects/items/weapons/implants/implantfreedom.dm
+++ b/code/game/objects/items/weapons/implants/implant_freedom.dm
@@ -1,37 +1,36 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
-
-/obj/item/weapon/implant/freedom
- name = "freedom implant"
- desc = "Use this to escape from those evil Red Shirts."
- icon_state = "freedom"
- item_color = "r"
- var/uses = 4.0
-
-
-/obj/item/weapon/implant/freedom/activate()
- if (src.uses < 1) return 0
- src.uses--
- imp_in << "You feel a faint click."
- if(iscarbon(imp_in))
- var/mob/living/carbon/C_imp_in = imp_in
- C_imp_in.uncuff()
-
-
-/obj/item/weapon/implant/freedom/get_data()
- var/dat = {"
-
Implant Specifications:
-
Name: Freedom Beacon
-
Life: optimum 5 uses
-
Important Notes: Illegal
-
-
Implant Details:
-
Function: Transmits a specialized cluster of signals to override handcuff locking
-mechanisms
-
Special Features:
-
Neuro-Scan- Analyzes certain shadow signals in the nervous system
-
Integrity: The battery is extremely weak and commonly after injection its
-life can drive down to only 1 use.
-No Implant Specifics"}
- return dat
-
-
+/obj/item/weapon/implant/freedom
+ name = "freedom implant"
+ desc = "Use this to escape from those evil Red Shirts."
+ icon_state = "freedom"
+ item_color = "r"
+ origin_tech = "materials=2;magnets=3;biotech=3;syndicate=4"
+ uses = 4
+
+
+/obj/item/weapon/implant/freedom/activate()
+ if(uses == 0) return 0
+ if(uses != -1) uses--
+ imp_in << "You feel a faint click."
+ if(iscarbon(imp_in))
+ var/mob/living/carbon/C_imp_in = imp_in
+ C_imp_in.uncuff()
+
+
+/obj/item/weapon/implant/freedom/get_data()
+ var/dat = {"
+
Implant Specifications:
+
Name: Freedom Beacon
+
Life: optimum 5 uses
+
Important Notes: Illegal
+
+
Implant Details:
+
Function: Transmits a specialized cluster of signals to override handcuff locking
+mechanisms
+
Special Features:
+
Neuro-Scan- Analyzes certain shadow signals in the nervous system
+
Integrity: The battery is extremely weak and commonly after injection its
+life can drive down to only 1 use.
+No Implant Specifics"}
+ return dat
+
+
diff --git a/code/game/objects/items/weapons/implants/implant_loyality.dm b/code/game/objects/items/weapons/implants/implant_loyality.dm
new file mode 100644
index 00000000000..7c054c253df
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implant_loyality.dm
@@ -0,0 +1,65 @@
+/obj/item/weapon/implant/loyalty
+ name = "loyalty implant"
+ desc = "Makes you loyal or such."
+ origin_tech = "materials=2;biotech=4;programming=4"
+ activated = 0
+
+/obj/item/weapon/implant/loyalty/get_data()
+ var/dat = {"
Implant Specifications:
+
Name: Nanotrasen Employee Management Implant
+
Life: Ten years.
+
Important Notes: Personnel injected with this device tend to be much more loyal to the company.
+
+
Implant Details:
+
Function: Contains a small pod of nanobots that manipulate the host's mental functions.
+
Special Features: Will prevent and cure most forms of brainwashing.
+
Integrity: Implant will last so long as the nanobots are inside the bloodstream."}
+ return dat
+
+
+/obj/item/weapon/implant/loyalty/implant(mob/target)
+ if(..())
+ if((target.mind in (ticker.mode.head_revolutionaries | ticker.mode.get_gang_bosses())) || is_shadow_or_thrall(target))
+ target.visible_message("
[target] seems to resist the implant!", "
You feel the corporate tendrils of Nanotrasen try to invade your mind!")
+ imp_in = null
+ qdel(src)
+ return -1
+ if(target.mind in ticker.mode.get_gangsters())
+ ticker.mode.remove_gangster(target.mind)
+ target.visible_message("
[src] was destroyed in the process!", "
You feel a surge of loyalty towards Nanotrasen.")
+ imp_in = null
+ qdel(src)
+ return -1
+ if(target.mind in ticker.mode.revolutionaries)
+ ticker.mode.remove_revolutionary(target.mind)
+ if(target.mind in ticker.mode.cult)
+ target << "
You feel the corporate tendrils of Nanotrasen try to invade your mind!"
+ else
+ target << "
You feel a surge of loyalty towards Nanotrasen."
+ return 1
+ return 0
+
+/obj/item/weapon/implant/loyalty/removed(mob/target)
+ if(..())
+ if(target.stat != DEAD)
+ target << "
You feel a sense of liberation as Nanotrasen's grip on your mind fades away."
+ return 1
+ return 0
+
+
+/obj/item/weapon/implanter/loyalty
+ name = "implanter (loyalty)"
+
+/obj/item/weapon/implanter/loyalty/New()
+ imp = new /obj/item/weapon/implant/loyalty(src)
+ ..()
+ update_icon()
+
+
+/obj/item/weapon/implantcase/loyalty
+ name = "glass case - 'Loyalty'"
+ desc = "A case containing a loyalty implant."
+
+/obj/item/weapon/implantcase/loyalty/New()
+ imp = new /obj/item/weapon/implant/loyalty(src)
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index 5da2cd828bc..8cf41c2f730 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -1,19 +1,28 @@
/obj/item/weapon/implantcase
- name = "glass case"
- desc = "A case containing an implant."
+ name = "implant case"
+ desc = "A glass case containing an implant."
+ icon = 'icons/obj/items.dmi'
icon_state = "implantcase-0"
item_state = "implantcase"
throw_speed = 2
throw_range = 5
w_class = 1.0
+ origin_tech = "materials=1;biotech=2"
+ materials = list(MAT_GLASS=500)
var/obj/item/weapon/implant/imp = null
/obj/item/weapon/implantcase/update_icon()
if(imp)
icon_state = "implantcase-[imp.item_color]"
+ origin_tech = imp.origin_tech
+ flags = imp.flags
+ reagents = imp.reagents
else
icon_state = "implantcase-0"
+ origin_tech = initial(origin_tech)
+ flags = initial(flags)
+ reagents = null
/obj/item/weapon/implantcase/attackby(obj/item/weapon/W, mob/user, params)
@@ -25,21 +34,13 @@
if(!in_range(src, user) && loc != user)
return
if(t)
- name = "glass case- '[t]'"
+ name = "implant case - '[t]'"
else
- name = "glass case"
- else if(istype(W, /obj/item/weapon/reagent_containers/syringe))
- if(!imp) return
- if(!imp.allow_reagents) return
- if(imp.reagents.total_volume >= imp.reagents.maximum_volume)
- user << "
[src] is full."
- else
- W.reagents.trans_to(imp, 5)
- user << "
You inject 5 units of the solution. The syringe now contains [W.reagents.total_volume] units."
+ name = "implant case"
else if(istype(W, /obj/item/weapon/implanter))
var/obj/item/weapon/implanter/I = W
if(I.imp)
- if((imp || I.imp.implanted))
+ if(imp || I.imp.implanted)
return
I.imp.loc = src
imp = I.imp
@@ -56,55 +57,28 @@
update_icon()
I.update_icon()
+ /*else if(istype(W, /obj/item/ammo_casing/shotgun/implanter))
+ var/obj/item/ammo_casing/shotgun/implanter/I = W
+ if(I.implanter)
+ src.attackby(I.implanter, user, params) */ // COMING SOON -- c0
+
+/obj/item/weapon/implantcase/New()
+ ..()
+ update_icon()
+
/obj/item/weapon/implantcase/tracking
- name = "glass case- 'Tracking'"
+ name = "glass case - 'Tracking'"
desc = "A case containing a tracking implant."
- icon = 'icons/obj/items.dmi'
- icon_state = "implantcase-b"
/obj/item/weapon/implantcase/tracking/New()
imp = new /obj/item/weapon/implant/tracking(src)
..()
-/obj/item/weapon/implantcase/explosive
- name = "glass case- 'Explosive'"
- desc = "A case containing an explosive implant."
- icon = 'icons/obj/items.dmi'
- icon_state = "implantcase-r"
-
-/obj/item/weapon/implantcase/explosive/New()
- imp = new /obj/item/weapon/implant/explosive(src)
- ..()
-
-
-/obj/item/weapon/implantcase/chem
- name = "glass case- 'Chem'"
- desc = "A case containing a chemical implant."
- icon = 'icons/obj/items.dmi'
- icon_state = "implantcase-b"
-
-/obj/item/weapon/implantcase/chem/New()
- imp = new /obj/item/weapon/implant/chem(src)
- ..()
-
-
-/obj/item/weapon/implantcase/loyalty
- name = "glass case- 'Loyalty'"
- desc = "A case containing a loyalty implant."
- icon = 'icons/obj/items.dmi'
- icon_state = "implantcase-r"
-
-/obj/item/weapon/implantcase/loyalty/New()
- imp = new /obj/item/weapon/implant/loyalty(src)
- ..()
-
/obj/item/weapon/implantcase/weapons_auth
- name = "glass case- 'Firearms Authentication'"
+ name = "glass case - 'Firearms Authentication'"
desc = "A case containing a firearms authentication implant."
- icon = 'icons/obj/items.dmi'
- icon_state = "implantcase-r"
/obj/item/weapon/implantcase/weapons_auth/New()
imp = new /obj/item/weapon/implant/weapons_auth(src)
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index 72aca3d4a66..5b36e5337ae 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -132,11 +132,8 @@
if(istype(imp, /obj/item/weapon/implant/loyalty))
M.visible_message("
[M] has been implanted by the [src.name].")
- if(imp.implanted(M))
- imp.loc = M
- imp.imp_in = M
- imp.implanted = 1
- implant_list -= imp
+ if(imp.implant(M))
+ implant_list -= imp
break
return
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index cb54e6386b1..034e31ac510 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -1,82 +1,74 @@
/obj/item/weapon/implanter
name = "implanter"
+ desc = "A sterile automatic implant injector."
icon = 'icons/obj/items.dmi'
icon_state = "implanter0"
item_state = "syringe_0"
throw_speed = 3
throw_range = 5
w_class = 2.0
+ origin_tech = "materials=1;biotech=3;programming=2"
+ materials = list(MAT_METAL=600, MAT_GLASS=200)
var/obj/item/weapon/implant/imp = null
/obj/item/weapon/implanter/update_icon()
if(imp)
icon_state = "implanter1"
+ origin_tech = imp.origin_tech
else
icon_state = "implanter0"
+ origin_tech = initial(origin_tech)
/obj/item/weapon/implanter/attack(mob/living/carbon/M, mob/user)
if(!iscarbon(M))
return
if(user && imp)
- if(M.head && (M.head.flags & THICKMATERIAL))
- user << "
[M]'s [M.head.name] is in the way! Take it off first!"
- return
- M.visible_message("
[user] is attemping to implant [M].")
+ if(M != user)
+ M.visible_message("
[user] is attemping to implant [M].")
var/turf/T = get_turf(M)
- if(T && (M == user || do_after(user, 50, target = M)))
+ if(T && (M == user || do_after(user, 50)))
if(user && M && (get_turf(M) == T) && src && imp)
- if(M.head && (M.head.flags & THICKMATERIAL))
- return
- M.visible_message("[user] has implanted [M].", "
[user] implants you with the implant.")
- add_logs(user, M, "implanted", src)
- user << "
You implant the implant into [M]."
- if(imp.implanted(M))
- imp.loc = M
- imp.imp_in = M
- imp.implanted = 1
+ if(imp.implant(M, user))
+ user << "
You implant the implant into [M]."
+ M.visible_message("[user] has implanted [M].", "
[user] implants you with the implant.")
+ imp = null
+ update_icon()
- imp = null
- update_icon()
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- H.sec_hud_set_implants()
-
-
-
-/obj/item/weapon/implanter/loyalty
- name = "implanter-loyalty"
-
-/obj/item/weapon/implanter/loyalty/New()
- imp = new /obj/item/weapon/implant/loyalty(src)
+/obj/item/weapon/implanter/attackby(obj/item/weapon/W, mob/user, params)
..()
- update_icon()
+ if(istype(W, /obj/item/weapon/pen))
+ var/t = stripped_input(user, "What would you like the label to be?", name, null)
+ if(user.get_active_hand() != W)
+ return
+ if(!in_range(src, user) && loc != user)
+ return
+ if(t)
+ name = "implanter ([t])"
+ else
+ name = "implanter"
-
-/obj/item/weapon/implanter/explosive
- name = "implanter-explosive"
-
-/obj/item/weapon/implanter/explosive/New()
- imp = new /obj/item/weapon/implant/explosive(src)
+/obj/item/weapon/implanter/New()
..()
- update_icon()
+ spawn(1)
+ update_icon()
+
+
/obj/item/weapon/implanter/adrenalin
- name = "implanter-adrenalin"
+ name = "implanter (adrenalin)"
/obj/item/weapon/implanter/adrenalin/New()
imp = new /obj/item/weapon/implant/adrenalin(src)
..()
- update_icon()
/obj/item/weapon/implanter/emp
- name = "implanter-EMP"
+ name = "implanter (EMP)"
/obj/item/weapon/implanter/emp/New()
imp = new /obj/item/weapon/implant/emp(src)
..()
- update_icon()
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index 74a2b365aa9..b19bb66d995 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -3,18 +3,33 @@
desc = "Summon things."
icon = 'icons/obj/radio.dmi'
icon_state = "radio"
+ origin_tech = "materials=2;magnets=4;programming=4;biotech=4;syndicate=8;bluespace=5"
/obj/item/weapon/implant/uplink/New()
hidden_uplink = new(src)
hidden_uplink.uses = 10
..()
-/obj/item/weapon/implant/uplink/implanted(mob/source)
- ..()
- hidden_uplink.uplink_owner="[source.key]"
- return 1
+/obj/item/weapon/implant/uplink/implant(mob/source)
+ var/obj/item/weapon/implant/imp_e = locate(src.type) in source
+ if(imp_e)
+ imp_e.hidden_uplink.uses += hidden_uplink.uses
+ qdel(src)
+ return 1
+ if(..())
+ hidden_uplink.uplink_owner="[source.key]"
+ return 1
+ return 0
/obj/item/weapon/implant/uplink/activate()
if(hidden_uplink)
- hidden_uplink.check_trigger(imp_in)
\ No newline at end of file
+ hidden_uplink.check_trigger(imp_in)
+
+
+/obj/item/weapon/implanter/uplink
+ name = "implanter (uplink)"
+
+/obj/item/weapon/implanter/uplink/New()
+ imp = new /obj/item/weapon/implant/uplink(src)
+ ..()
\ No newline at end of file
diff --git a/code/modules/awaymissions/exile.dm b/code/modules/awaymissions/exile.dm
index 7e36cf7e04a..cf659e59b5c 100644
--- a/code/modules/awaymissions/exile.dm
+++ b/code/modules/awaymissions/exile.dm
@@ -1,18 +1,10 @@
//Exile implants will allow you to use the station gate, but not return home.
//This will allow security to exile badguys/for badguys to exile their kill targets
-/obj/item/weapon/implanter/exile
- name = "implanter-exile"
-
-/obj/item/weapon/implanter/exile/New()
- imp = new /obj/item/weapon/implant/exile( src )
- ..()
- update_icon()
-
-
/obj/item/weapon/implant/exile
name = "exile implant"
desc = "Prevents you from returning from away missions"
+ origin_tech = "materials=2;biotech=3;magnets=2;bluespace=3"
activated = 0
/obj/item/weapon/implant/exile/get_data()
@@ -22,11 +14,16 @@
return dat
+/obj/item/weapon/implanter/exile
+ name = "implanter (exile)"
+
+/obj/item/weapon/implanter/exile/New()
+ imp = new /obj/item/weapon/implant/exile( src )
+ ..()
+
/obj/item/weapon/implantcase/exile
- name = "glass case- 'Exile'"
+ name = "glass case - 'Exile'"
desc = "A case containing an exile implant."
- icon = 'icons/obj/items.dmi'
- icon_state = "implantcase-r"
/obj/item/weapon/implantcase/exile/New()
imp = new /obj/item/weapon/implant/exile(src)
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
index 54c0ed1c52e..ef5f43f7495 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
@@ -36,7 +36,7 @@
/datum/table_recipe/appendixburger
name = "Appendix burger"
reqs = list(
- /obj/item/organ/appendix = 1,
+ /obj/item/organ/internal/appendix = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/burger/appendix
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index b7552f60814..81a3f2a4cf5 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -114,7 +114,7 @@
if(89)
new /obj/item/organ/brain/alien(src)
if(90)
- new /obj/item/organ/heart(src)
+ new /obj/item/organ/internal/heart(src)
if(91)
new /obj/item/device/soulstone/anybody(src)
if(92)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 679fb191dc1..4cda20901dd 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -22,8 +22,8 @@
/obj/item/organ/limb/r_arm, /obj/item/organ/limb/r_leg, /obj/item/organ/limb/l_leg)
for(var/obj/item/organ/limb/O in organs)
O.owner = src
- internal_organs += new /obj/item/organ/appendix
- internal_organs += new /obj/item/organ/heart
+ internal_organs += new /obj/item/organ/internal/appendix
+ internal_organs += new /obj/item/organ/internal/heart
internal_organs += new /obj/item/organ/brain
// for spawned humans; overwritten by other code
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 1d1bbcc64d5..9cbc5ce8407 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -16,8 +16,8 @@
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
- internal_organs += new /obj/item/organ/appendix
- internal_organs += new /obj/item/organ/heart
+ internal_organs += new /obj/item/organ/internal/appendix
+ internal_organs += new /obj/item/organ/internal/heart
internal_organs += new /obj/item/organ/brain
if(name == "monkey")
diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm
index c9e36f27b46..37e5ff55bd2 100644
--- a/code/modules/ninja/ninja_event.dm
+++ b/code/modules/ninja/ninja_event.dm
@@ -213,7 +213,5 @@ Contents:
equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(src), slot_back)
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(src)
- E.imp_in = src
- E.implanted = 1
- E.implanted(src)
+ E.implant(src)
return 1
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index abf6b2663a7..51963c82627 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -199,4 +199,4 @@
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 500, MAT_URANIUM = 1000, MAT_DIAMOND = 2000)
build_path = /obj/item/cybernetic_implant/chest/reviver
- category = list("Medical Designs")
+ category = list("Medical Designs")
\ No newline at end of file
diff --git a/code/modules/surgery/appendectomy.dm b/code/modules/surgery/appendectomy.dm
index 0ba1db2da7c..c89d1776deb 100644
--- a/code/modules/surgery/appendectomy.dm
+++ b/code/modules/surgery/appendectomy.dm
@@ -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!", "
You successfully removes [target]'s appendix.")
A.loc = get_turf(target)
- target.internal_organs -= A
- for(var/datum/disease/appendicitis in target.viruses)
- appendicitis.cure()
+ A.Remove(target)
else
user << "
You can't find an appendix in [target]!"
return 1
\ No newline at end of file
diff --git a/code/modules/surgery/brain_removal.dm b/code/modules/surgery/brain_removal.dm
index 0d57fb6f9a2..0d2426775a6 100644
--- a/code/modules/surgery/brain_removal.dm
+++ b/code/modules/surgery/brain_removal.dm
@@ -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
diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm
index 6f556860bee..9ad5d579ae1 100644
--- a/code/modules/surgery/cavity_implant.dm
+++ b/code/modules/surgery/cavity_implant.dm
@@ -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 << "
You can't seem to fit [tool] in [target]'s [target_zone]!"
return 0
else
diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm
index 6a38e160560..fe976b25824 100644
--- a/code/modules/surgery/core_removal.dm
+++ b/code/modules/surgery/core_removal.dm
@@ -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
diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm
index ced4776f535..b725717945a 100644
--- a/code/modules/surgery/cybernetic_implants.dm
+++ b/code/modules/surgery/cybernetic_implants.dm
@@ -5,12 +5,13 @@
user.visible_message("[user] begins to implant [target] with [implant].", "
You begin to implant [target] with [implant]...")
//[[[[EYES]]]]
-/datum/surgery/eye_cybernetic_implant/eyes
+/datum/surgery/cybernetic_implant/eyes
name = "eye cybernetic implant"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant/eyes, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
- location = "eyes"
+ possible_locs = list("eyes")
/datum/surgery_step/cybernetic_implant/eyes
+ name = "insert eye cybernetic implant"
implements = list(/obj/item/cybernetic_implant/eyes = 100)
time = 32
@@ -23,12 +24,14 @@
return 1
//[[[[BRAIN]]]]
-/datum/surgery/eye_cybernetic_implant/brain
+/datum/surgery/cybernetic_implant/brain
name = "brain cybernetic implant"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/brain, /datum/surgery_step/close)
- location = "head"
+ possible_locs = list("head")
+ requires_organic_bodypart = 0
/datum/surgery_step/cybernetic_implant/brain
+ name = "insert brain cybernetic implant"
implements = list(/obj/item/cybernetic_implant/brain = 100)
time = 32
@@ -45,12 +48,14 @@
return 1
//[[[[CHEST]]]]
-/datum/surgery/eye_cybernetic_implant/chest
+/datum/surgery/cybernetic_implant/chest
name = "torso cybernetic implant"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/chest, /datum/surgery_step/close)
- location = "chest"
+ possible_locs = list("chest")
+ requires_organic_bodypart = 0
/datum/surgery_step/cybernetic_implant/chest
+ name = "insert torso cybernetic implant"
implements = list(/obj/item/cybernetic_implant/chest = 100)
time = 32
@@ -70,10 +75,9 @@
if(full)
user << "
You can't seem to implant anything else into the [target]'s [target_zone]!"
else
- if(!user.drop_item())
- return
user.visible_message("[user] inserts [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]!", "
You insert [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone].")
implant.owner = target
implant.function()
+ user.drop_item()
target.internal_organs |= implant
implant.loc = target
\ No newline at end of file
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index 71e136efa72..06117fb80d7 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -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
diff --git a/code/modules/surgery/gender_reassignment.dm b/code/modules/surgery/gender_reassignment.dm
index 4cc6be2d953..797450ae2f6 100644
--- a/code/modules/surgery/gender_reassignment.dm
+++ b/code/modules/surgery/gender_reassignment.dm
@@ -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
diff --git a/code/modules/surgery/generic_steps.dm b/code/modules/surgery/generic_steps.dm
index a4ea6e51ba2..81731314f49 100644
--- a/code/modules/surgery/generic_steps.dm
+++ b/code/modules/surgery/generic_steps.dm
@@ -1,6 +1,7 @@
//make incision
/datum/surgery_step/incise
+ name = "make incision"
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 65, /obj/item/weapon/shard = 45)
time = 24
@@ -11,6 +12,7 @@
//clamp bleeders
/datum/surgery_step/clamp_bleeders
+ name = "clamp bleeders"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/wirecutters = 60, /obj/item/stack/cable_coil = 15)
time = 48
@@ -20,6 +22,7 @@
//retract skin
/datum/surgery_step/retract_skin
+ name = "retract skin"
implements = list(/obj/item/weapon/retractor = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/wirecutters = 35)
time = 32
@@ -30,6 +33,7 @@
//close incision
/datum/surgery_step/close
+ name = "mend incision"
implements = list(/obj/item/weapon/cautery = 100, /obj/item/weapon/weldingtool = 70, /obj/item/weapon/lighter = 45, /obj/item/weapon/match = 20)
time = 32
@@ -55,14 +59,25 @@
return 0
+/datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(locate(/datum/surgery_step/saw) in surgery.steps)
+ target.heal_organ_damage(45,0)
+ return ..()
+
+
//saw bone
/datum/surgery_step/saw
+ name = "saw bone"
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
time = 64
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].", "
You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...")
-
-
+/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!", "
You saw [target]'s [parse_zone(target_zone)] open.")
+ return 1
\ No newline at end of file
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 4982c6bcc64..c4ba5c2680d 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -1,54 +1,53 @@
/proc/attempt_initiate_surgery(obj/item/I, mob/living/M, mob/user)
if(istype(M))
+ var/mob/living/carbon/human/H
+ var/obj/item/organ/limb/affecting
+ if(istype(M, /mob/living/carbon/human))
+ H = M
+ affecting = H.get_organ(check_zone(user.zone_sel.selecting))
+
if(M.lying || isslime(M)) //if they're prone or a slime
var/list/all_surgeries = surgeries_list.Copy()
var/list/available_surgeries = list()
for(var/i in all_surgeries)
var/datum/surgery/S = all_surgeries[i]
-
+ if(!S.possible_locs.Find(user.zone_sel.selecting))
+ continue
if(locate(S.type) in M.surgeries)
continue
- if(S.user_species_restricted)
- if(!istype(user, /mob/living/carbon/human))
- continue
- var/mob/living/carbon/human/doc = user
- if(!(doc.dna.species.id in S.user_species_ids))
- continue
- if(S.target_must_be_dead && M.stat != DEAD)
+ if(affecting && S.requires_organic_bodypart && affecting.status == ORGAN_ROBOTIC)
continue
- if(S.target_must_be_fat && !(M.disabilities & FAT))
+ if(!S.can_start(user, M))
continue
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M //So we can use get_organ and not some terriblly long Switch or something worse - RR
-
- if(S.requires_organic_chest && H.getlimb(/obj/item/organ/limb/robot/chest)) //This a seperate case to below, see "***" in surgery.dm - RR
- continue
-
-
- var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
-
- if(affecting.status == ORGAN_ROBOTIC && affecting.body_part != HEAD) //Cannot operate on Robotic organs except for the head. - RR
- continue
-
for(var/path in S.species)
if(istype(M, path))
available_surgeries[S.name] = S
break
+ for(var/datum/surgery/S in M.surgeries)
+ if(S.status == 1 && !S.step_in_progress)
+ available_surgeries["cancel " + S.name] = S
+
var/P = input("Begin which procedure?", "Surgery", null, null) as null|anything in available_surgeries
if(P)
var/datum/surgery/S = available_surgeries[P]
+ if(S in M.surgeries)
+ M.surgeries -= S
+ qdel(S)
+ return 1
+
var/datum/surgery/procedure = new S.type
if(procedure)
- if(get_location_accessible(M, procedure.location) || procedure.ignore_clothes)
- if(procedure.location == "anywhere") // if location == "anywhere" change location to the surgeon's target, otherwise leave location as is.
- procedure.location = user.zone_sel.selecting
+ procedure.location = user.zone_sel.selecting
+ if(procedure.ignore_clothes || get_location_accessible(M, procedure.location))
M.surgeries += procedure
- user.visible_message("[user] drapes [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].", "
You drape [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].")
+ if(affecting)
+ procedure.organ = affecting
+ user.visible_message("[user] drapes [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].", \
+ "
You drape [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].")
add_logs(user, M, "operated", addition="Operation type: [procedure.name]")
- feedback_add_details("surgery_initiated","[procedure.name]")
return 1
else
user << "
You need to expose [M]'s [procedure.location] first!"
@@ -59,7 +58,7 @@
-/proc/get_location_modifier(mob/M)
+proc/get_location_modifier(mob/M)
var/turf/T = get_turf(M)
if(locate(/obj/structure/optable, T))
return 1
@@ -80,13 +79,13 @@
for(var/obj/item/clothing/I in list(C.back, C.wear_mask, C.head))
covered_locations |= I.body_parts_covered
face_covered |= I.flags_inv
- eyesmouth_covered |= I.flags_cover
+ eyesmouth_covered |= I.flags
if(ishuman(C))
var/mob/living/carbon/human/H = C
for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.ears))
covered_locations |= I.body_parts_covered
face_covered |= I.flags_inv
- eyesmouth_covered |= I.flags_cover
+ eyesmouth_covered |= I.flags
switch(location)
if("head")
diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm
index 86851838afc..6b4feb8749e 100644
--- a/code/modules/surgery/implant_removal.dm
+++ b/code/modules/surgery/implant_removal.dm
@@ -2,22 +2,18 @@
name = "implant removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/extract_implant, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
- location = "chest"
- requires_organic_chest = 1
-
+ possible_locs = list("chest")
//extract implant
/datum/surgery_step/extract_implant
+ name = "extract implant"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 65)
time = 64
var/obj/item/weapon/implant/I = null
/datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- for(var/obj/item/weapon/implant/W in target)
- if(W.imp_in == target) //Checking that it's actually implanted, not just in his pocket
- I = W
- break
+ I = locate(/obj/item/weapon/implant) in target
if(I)
user.visible_message("[user] begins to extract [I] from [target]'s [target_zone].", "
You begin to extract [I] from [target]'s [target_zone]...")
else
@@ -26,10 +22,25 @@
/datum/surgery_step/extract_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(I)
user.visible_message("[user] successfully removes [I] from [target]'s [target_zone]!", "
You successfully remove [I] from [target]'s [target_zone].")
- 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]!", "
You place [I] into [case].")
+ else
+ qdel(I)
+
else
user << "
You can't find anything in [target]'s [target_zone]!"
- return 1
+ return 1
\ No newline at end of file
diff --git a/code/modules/surgery/limb augmentation.dm b/code/modules/surgery/limb augmentation.dm
index 22d168044c0..d7ff7340302 100644
--- a/code/modules/surgery/limb augmentation.dm
+++ b/code/modules/surgery/limb augmentation.dm
@@ -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)].", "
You begin to augment [target]'s [parse_zone(user.zone_sel.selecting)]...")
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 << "
That is the wrong robotic limb for this body part."
- return 0
- if(HEAD)
- if(!istype(tool,/obj/item/robot_parts/head))
- user << "
That is the wrong robotic limb for this body part."
- return 0
- if(ARM_LEFT)
- if(!istype(tool,/obj/item/robot_parts/l_arm))
- user << "
That is the wrong robotic limb for this body part."
- return 0
- if(ARM_RIGHT)
- if(!istype(tool,/obj/item/robot_parts/r_arm))
- user << "
That is the wrong robotic limb for this body part."
- return 0
- if(LEG_LEFT)
- if(!istype(tool,/obj/item/robot_parts/l_leg))
- user << "
That is the wrong robotic limb for this body part."
- return 0
- if(LEG_RIGHT)
- if(!istype(tool,/obj/item/robot_parts/r_leg))
- user << "
That is the wrong robotic limb for this body part."
- 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)]!", "
You successfully augment [target]'s [parse_zone(target_zone)].")
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
diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm
index 532e90e1e9e..7fcf8616e62 100644
--- a/code/modules/surgery/lipoplasty.dm
+++ b/code/modules/surgery/lipoplasty.dm
@@ -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
diff --git a/code/modules/surgery/organs/augments.dm b/code/modules/surgery/organs/augments_external.dm
similarity index 95%
rename from code/modules/surgery/organs/augments.dm
rename to code/modules/surgery/organs/augments_external.dm
index 263315aba1b..d3acb5135d9 100644
--- a/code/modules/surgery/organs/augments.dm
+++ b/code/modules/surgery/organs/augments_external.dm
@@ -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
+
diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/augments_internal.dm
similarity index 100%
rename from code/modules/surgery/organs/cybernetic_implants.dm
rename to code/modules/surgery/organs/augments_internal.dm
diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm
index dd0529d4344..a0bdf9e3369 100644
--- a/code/modules/surgery/organs/helpers.dm
+++ b/code/modules/surgery/organs/helpers.dm
@@ -1,13 +1,22 @@
-/mob/proc/getorgan()
+mob/proc/getorgan()
return
-/mob/living/carbon/getorgan(typepath)
+
+mob/proc/getorgansloc()
+ return
+
+mob/living/carbon/getorgan(typepath)
return (locate(typepath) in internal_organs)
-/mob/proc/getlimb()
+mob/living/carbon/getorgansloc(zone)
+ var/list/returnorg = list()
+ for(var/obj/item/organ/internal/O in internal_organs)
+ if(zone == O.zone)
+ returnorg += O
+
+ return returnorg
+
+mob/proc/getlimb()
return
-/mob/living/carbon/human/getlimb(typepath)
- return (locate(typepath) in organs)
-
-
-
+mob/living/carbon/human/getlimb(typepath)
+ return (locate(typepath) in organs)
\ No newline at end of file
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ_external.dm
similarity index 85%
rename from code/modules/surgery/organs/organ.dm
rename to code/modules/surgery/organs/organ_external.dm
index 05ae58ccc21..9e231fae5d1 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -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
\ No newline at end of file
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
new file mode 100644
index 00000000000..99cb764ccdd
--- /dev/null
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -0,0 +1,59 @@
+/obj/item/organ/internal
+ var/zone = "chest"
+ var/slot
+ var/vital = 0
+
+/obj/item/organ/internal/proc/Insert(var/mob/living/carbon/M)
+ owner = M
+ M.internal_organs += src
+ loc = null
+
+/obj/item/organ/internal/proc/Remove(var/mob/living/carbon/M, var/special = 0)
+ owner = null
+ M.internal_organs -= src
+ if(vital && !special)
+ M.death()
+
+//Looking for brains?
+//Try code/modules/mob/living/carbon/brain/brain_item.dm
+
+
+
+/obj/item/organ/internal/heart
+ name = "heart"
+ icon_state = "heart-on"
+ zone = "chest"
+ slot = "heart"
+ vital = 1
+ var/beating = 1
+
+/obj/item/organ/internal/heart/update_icon()
+ if(beating)
+ icon_state = "heart-on"
+ else
+ icon_state = "heart-off"
+
+
+
+/obj/item/organ/internal/appendix
+ name = "appendix"
+ icon_state = "appendix"
+ zone = "groin"
+ slot = "appendix"
+ var/inflamed = 0
+
+/obj/item/organ/internal/appendix/update_icon()
+ if(inflamed)
+ icon_state = "appendixinflamed"
+ else
+ icon_state = "appendix"
+
+/obj/item/organ/internal/appendix/Remove(var/mob/living/carbon/M)
+ for(var/datum/disease/appendicitis in M.viruses)
+ appendicitis.cure()
+ ..()
+
+/obj/item/organ/internal/appendix/Insert(var/mob/living/carbon/M)
+ ..()
+ if(inflamed)
+ M.AddDisease(new /datum/disease/appendicitis)
\ No newline at end of file
diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm
index 4dd1f600b2d..52a52d10a74 100644
--- a/code/modules/surgery/plastic_surgery.dm
+++ b/code/modules/surgery/plastic_surgery.dm
@@ -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
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index f8e7de333d9..5ca4083ab6c 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -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)].", "
You look for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)]...")
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()]!", "
You sucessfully remove [objects] objects from [H]'s [L.getDisplayName()].")
else
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index d7f7fdfebb5..5ae9a9b849f 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -1,5 +1,5 @@
/datum/surgery
- var/name = null
+ var/name = "surgery"
var/status = 1
var/list/steps = list() //Steps in a surgery
var/step_in_progress = 0 //Actively performing a Surgery
@@ -7,11 +7,17 @@
var/location = "chest" //Surgery location
var/target_must_be_dead = 0 //Needs to be dead
var/target_must_be_fat = 0 //Needs to be fat
- var/requires_organic_chest = 0 //Prevents you from performing an operation on Robotic chests***
- var/has_multi_loc = 0 //Multiple locations - RR
- var/user_species_restricted = 0 //Surgery only performable BY species
- var/list/user_species_ids
+ var/requires_organic_bodypart = 1 //Prevents you from performing an operation on robotic limbs
+ var/list/possible_locs = list() //Multiple locations -- c0
var/ignore_clothes = 0 //This surgery ignores clothes
+ var/obj/item/organ/organ //Operable body part
+
+
+/datum/surgery/proc/can_start(mob/user, mob/living/carbon/target)
+ // if 0 surgery wont show up in list
+ // put special restrictions here
+ return 1
+
/datum/surgery/proc/next_step(mob/user, mob/living/carbon/target)
if(step_in_progress) return
@@ -54,8 +60,4 @@
//RESOLVED ISSUES //"Todo" jobs that have been completed
//combine hands/feet into the arms - Hands/feet were removed - RR
-//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) - Call this one done, see multiple_location_example.dm - RR
-
-
-//*** This may seem entirely redundant because of Organic organs only having operations but you CAN circumvent that due to
-//all surgeries (except augmentation) not checking where the surgeon aims so this is just a double check, it IS needed - RR
\ No newline at end of file
+//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
\ No newline at end of file
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index e630e7da48e..686fc3c0e8e 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -4,8 +4,7 @@
var/accept_hand = 0 //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item.
var/accept_any_item = 0 //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand.
var/time = 10 //how long does the step take?
- var/new_organ = null //Used for multilocation operations
- var/list/allowed_organs = list()//Allowed organs, see Handle_Multi_Loc below - RR
+ var/name
/datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -39,11 +38,8 @@
/datum/surgery_step/proc/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
surgery.step_in_progress = 1
- if(surgery.has_multi_loc) //if it is multi-location, handle that
- Handle_Multi_Loc(user, target)
-
- preop(user, target, target_zone, tool)
- if(do_after(user, time, target = target))
+ preop(user, target, target_zone, tool, surgery)
+ if(do_after(user, time))
var/advance = 0
var/prob_chance = 100
@@ -73,61 +69,11 @@
/datum/surgery_step/proc/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] succeeds!", "
You succeed.")
- 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!", "
You saw [target]'s [parse_zone(target_zone)] open.")
- 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("
[user] screws up!", "
You screw up!")
- 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 << "
You cannot perform this operation on this body part!" //Explain to the surgeon what went wrong - RR
- return 0
-
- return new_organ
-
- else
- return 0
-
-
diff --git a/code/modules/surgery/xenomorph_removal.dm b/code/modules/surgery/xenomorph_removal.dm
index 9650e824122..8528c349179 100644
--- a/code/modules/surgery/xenomorph_removal.dm
+++ b/code/modules/surgery/xenomorph_removal.dm
@@ -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
diff --git a/tgstation.dme b/tgstation.dme
index b8939f6fa7d..2029e03a330 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -677,10 +677,13 @@
#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm"
#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm"
#include "code\game\objects\items\weapons\implants\implant.dm"
+#include "code\game\objects\items\weapons\implants\implant_chem.dm"
+#include "code\game\objects\items\weapons\implants\implant_explosive.dm"
+#include "code\game\objects\items\weapons\implants\implant_freedom.dm"
+#include "code\game\objects\items\weapons\implants\implant_loyality.dm"
#include "code\game\objects\items\weapons\implants\implantcase.dm"
#include "code\game\objects\items\weapons\implants\implantchair.dm"
#include "code\game\objects\items\weapons\implants\implanter.dm"
-#include "code\game\objects\items\weapons\implants\implantfreedom.dm"
#include "code\game\objects\items\weapons\implants\implantpad.dm"
#include "code\game\objects\items\weapons\implants\implantuplink.dm"
#include "code\game\objects\items\weapons\melee\energy.dm"
@@ -1502,10 +1505,11 @@
#include "code\modules\surgery\surgery_step.dm"
#include "code\modules\surgery\tools.dm"
#include "code\modules\surgery\xenomorph_removal.dm"
-#include "code\modules\surgery\organs\augments.dm"
-#include "code\modules\surgery\organs\cybernetic_implants.dm"
+#include "code\modules\surgery\organs\augments_external.dm"
+#include "code\modules\surgery\organs\augments_internal.dm"
#include "code\modules\surgery\organs\helpers.dm"
-#include "code\modules\surgery\organs\organ.dm"
+#include "code\modules\surgery\organs\organ_external.dm"
+#include "code\modules\surgery\organs\organ_internal.dm"
#include "code\modules\telesci\bscrystal.dm"
#include "code\modules\telesci\gps.dm"
#include "code\modules\telesci\telepad.dm"