diff --git a/code/WorkInProgress/surgery/human.dm b/code/WorkInProgress/surgery/human.dm deleted file mode 100644 index 8ea01991b86..00000000000 --- a/code/WorkInProgress/surgery/human.dm +++ /dev/null @@ -1,29 +0,0 @@ -//WORK IN PROGRESS - -/mob/living/carbon - var/list/surgeries = list() - var/list/internal_organs = list() - -/mob/living/carbon/New() - ..() - internal_organs += new /obj/item/organ/appendix - internal_organs += new /obj/item/organ/heart - -/mob/living/carbon/human/attackby(obj/item/I, mob/user) - if(lying) //if they're prone - if(istype(I, /obj/item/weapon/bedsheet)) - var/P = input("Begin which procedure?", "Surgery", null, null) as null|anything in (typesof(/datum/surgery) - /datum/surgery) - var/datum/surgery/procedure = new P - if(procedure) - surgeries += procedure - return - - else if(surgeries.len) - var/success = 0 - for(var/datum/surgery/S in surgeries) - if(S.next_step(user, src)) - success = 1 - if(success) - return - - ..() \ No newline at end of file diff --git a/code/WorkInProgress/surgery/surgery.dm b/code/WorkInProgress/surgery/surgery.dm deleted file mode 100644 index 2f2710d9576..00000000000 --- a/code/WorkInProgress/surgery/surgery.dm +++ /dev/null @@ -1,22 +0,0 @@ -/datum/surgery - var/name = "surgery" - var/status = 1 - var/list/steps = list() - var/location = "chest" - var/step_in_progress = 0 - - -/datum/surgery/proc/next_step(mob/user, mob/living/carbon/target) - if(step_in_progress) return - - var/procedure = steps[status] - var/datum/surgery_step/S = new procedure - if(S) - if(S.try_op(user, target, user.zone_sel.selecting, user.get_active_hand(), src)) - return 1 - return 0 - - -/datum/surgery/proc/complete(mob/living/carbon/human/target) - target.surgeries -= src - src = null \ No newline at end of file diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 222daffd883..9c9e2ac2b72 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -14,6 +14,7 @@ var/global/list/cable_list = list() //Index for all cables, so that powernet var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff var/global/list/landmarks_list = list() //list of all landmarks created +var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path. //Preferences stuff //Hairstyles @@ -46,6 +47,7 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel") else hair_styles_male_list += H.name hair_styles_female_list += H.name + //Facial Hair - Initialise all /datum/sprite_accessory/facial_hair into an list indexed by facialhair-style name paths = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair for(var/path in paths) @@ -58,6 +60,12 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel") facial_hair_styles_male_list += H.name facial_hair_styles_female_list += H.name + //Surgeries + paths = typesof(/datum/surgery) - /datum/surgery + for(var/path in paths) + var/datum/surgery/S = new path() + surgeries_list[S.name] = S + /* // Uncomment to debug chemical reaction list. /client/verb/debug_chemical_list() diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 68a0eeabf83..4abcf712004 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -19,23 +19,26 @@ if(1) if(prob(5)) affected_mob.emote("cough") if(2) + var/obj/item/organ/appendix/A = getappendix(affected_mob) + if(A) + A.inflamed = 1 + A.update_icon() if(prob(3)) - affected_mob << "\red You feel a stabbing pain in your abdomen!" + affected_mob << "You feel a stabbing pain in your abdomen!" affected_mob.Stun(rand(2,3)) affected_mob.adjustToxLoss(1) if(3) if(prob(1)) if (affected_mob.nutrition > 100) affected_mob.Stun(rand(4,6)) - for(var/mob/O in viewers(world.view, affected_mob)) - O.show_message(text("\red [] throws up!", affected_mob), 1) + affected_mob.visible_message("[affected_mob] throws up!") playsound(affected_mob.loc, 'sound/effects/splat.ogg', 50, 1) var/turf/location = affected_mob.loc - if (istype(location, /turf/simulated)) + if(istype(location, /turf/simulated)) location.add_vomit_floor(affected_mob) affected_mob.nutrition -= 95 affected_mob.adjustToxLoss(-1) else - affected_mob << "\red You gag as you want to throw up, but there's nothing in your stomach!" + affected_mob << "You gag as you want to throw up, but there's nothing in your stomach!" affected_mob.Weaken(10) affected_mob.adjustToxLoss(3) \ No newline at end of file diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm index ac85b18ae3b..1186432e243 100644 --- a/code/datums/spells/inflict_handler.dm +++ b/code/datums/spells/inflict_handler.dm @@ -25,10 +25,10 @@ target.gib() if("gib_brain") if(ishuman(target) || ismonkey(target)) - var/mob/living/carbon/C = target - if(C.brain_op_stage != 4) // Their brain is already taken out - var/obj/item/brain/B = new(C.loc) - B.transfer_identity(C) + var/obj/item/organ/brain/B = getbrain(target) + if(B) + B.loc = get_turf(target) + B.transfer_identity(target) target.gib() if("disintegrate") target.dust() diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 0a1a3377dbd..cbf7f4dfa36 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -543,8 +543,8 @@ var/list/sacrificed = list() if(!(iscultist(V))) victims += V//Checks for cult status and mob type for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards - if(istype(I,/obj/item/brain)) - var/obj/item/brain/B = I + if(istype(I,/obj/item/organ/brain)) + var/obj/item/organ/brain/B = I victims += B.brainmob else if(istype(I,/obj/item/device/mmi)) var/obj/item/device/mmi/B = I diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 7f10d0cc437..667e9b11538 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -57,7 +57,7 @@ if ((M.stat != 2) || (!M.client)) continue //They need a brain! - if ((istype(M, /mob/living/carbon/human)) && (M:brain_op_stage >= 4.0)) + if (!getbrain(M)) continue if (M.ckey == find_key) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 91f114a28ff..e0d213e8aa4 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -404,7 +404,7 @@ if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna)) scantemp = "Error: Unable to locate valid genetic data." return - if (subject.brain_op_stage == 4.0) + if (!getbrain(subject)) scantemp = "Error: No signs of intelligence detected." return if (subject.suiciding == 1) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 2c20189494d..45383de5a66 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -124,7 +124,7 @@ MASS SPECTROMETER user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) if (M.reagents && M.reagents.get_reagent_amount("inaprovaline")) user.show_message(text("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1) - if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0) + if (M.getBrainLoss() >= 100 || !getbrain(M)) user.show_message(text("\red Subject is brain dead."), 1) else if (M.getBrainLoss() >= 60) user.show_message(text("\red Severe brain damage detected. Subject likely to have mental retardation."), 1) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index ab13713ce88..089ca6c1f68 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -21,7 +21,7 @@ flags = FPRINT | TABLEPASS | CONDUCT w_class = 1.0 origin_tech = "materials=1;biotech=1" - +/* /obj/item/weapon/retractor/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M)) return @@ -130,7 +130,7 @@ return ..() return - +*/ /* * Hemostat */ @@ -145,7 +145,7 @@ w_class = 1.0 origin_tech = "materials=1;biotech=1" attack_verb = list("attacked", "pinched") - +/* /obj/item/weapon/hemostat/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M)) return @@ -295,7 +295,7 @@ return ..() return - +*/ /* * Cautery */ @@ -310,7 +310,7 @@ w_class = 1.0 origin_tech = "materials=1;biotech=1" attack_verb = list("burnt") - +/* /obj/item/weapon/cautery/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M)) return @@ -383,7 +383,7 @@ return ..() return - +*/ /* * Surgical Drill */ @@ -429,7 +429,7 @@ "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \ "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") return (BRUTELOSS) - +/* /obj/item/weapon/scalpel/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M)) return ..() @@ -654,7 +654,7 @@ return ..() */ return - +*/ /* * Circular Saw @@ -663,7 +663,7 @@ name = "circular saw" desc = "For heavy duty cutting." icon = 'icons/obj/surgery.dmi' - icon_state = "saw3" + icon_state = "saw" hitsound = 'sound/weapons/circsawhit.ogg' flags = FPRINT | TABLEPASS | CONDUCT force = 15.0 @@ -675,7 +675,7 @@ g_amt = 10000 origin_tech = "materials=1;biotech=1" attack_verb = list("attacked", "slashed", "sawed", "cut") - +/* /obj/item/weapon/circular_saw/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M)) return ..() @@ -781,7 +781,7 @@ log_attack("[user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") - var/obj/item/brain/B = new(M.loc) + var/obj/item/organ/brain/B = new(M.loc) B.transfer_identity(M) M:brain_op_stage = 4.0 @@ -824,3 +824,4 @@ return ..() */ return +*/ \ No newline at end of file diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index a14d078878e..2288be5fa3b 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -18,6 +18,10 @@ LINEN BINS color = "white" +/obj/item/weapon/bedsheet/attack(mob/living/M, mob/user) + if(!attempt_initiate_surgery(src, M, user)) + ..() + /obj/item/weapon/bedsheet/attack_self(mob/user as mob) user.drop_item() if(layer == initial(layer)) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index c1774723f9f..fcce1e06939 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -1,5 +1,5 @@ /obj/structure/closet/secure_closet/medical1 - name = "Medicine Closet" + name = "medicine closet" desc = "Filled with medical junk." icon_state = "medical1" icon_closed = "medical" @@ -27,7 +27,7 @@ /obj/structure/closet/secure_closet/medical2 - name = "Anesthetic" + name = "anesthetic closet" desc = "Used to knock people out." icon_state = "medical1" icon_closed = "medical" @@ -52,7 +52,7 @@ /obj/structure/closet/secure_closet/medical3 - name = "Medical Doctor's Locker" + name = "medical doctor's locker" req_access = list(access_surgery) icon_state = "securemed1" icon_closed = "securemed" @@ -95,7 +95,7 @@ /obj/structure/closet/secure_closet/CMO - name = "Chief Medical Officer's Locker" + name = "chief medical officer's locker" req_access = list(access_cmo) icon_state = "cmosecure1" icon_closed = "cmosecure" @@ -127,7 +127,7 @@ /obj/structure/closet/secure_closet/animal - name = "Animal Control" + name = "animal control" req_access = list(access_surgery) @@ -143,7 +143,7 @@ /obj/structure/closet/secure_closet/chemical - name = "Chemical Closet" + name = "chemical closet" desc = "Store dangerous chemicals in here." icon_state = "medical1" icon_closed = "medical" @@ -162,7 +162,7 @@ return /obj/structure/closet/secure_closet/medical_wall - name = "First Aid Closet" + name = "first aid closet" desc = "It's a secure wall-mounted storage unit for first aid supplies." icon_state = "medical_wall_locked" icon_closed = "medical_wall_unlocked" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index f234a3d661a..3911bfed06a 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -10,7 +10,14 @@ item_state = "apron" blood_overlay_type = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO - allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/nutrient,/obj/item/weapon/minihoe) + allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/nutrient,/obj/item/weapon/minihoe) + +//Surgeon +/obj/item/clothing/suit/apron/surgical + name = "surgical apron" + desc = "A sterile blue surgical apron." + icon_state = "surgical" + allowed = list(/obj/item/weapon/scalpel, /obj/item/weapon/surgical_drapes, /obj/item/weapon/cautery, /obj/item/weapon/hemostat, /obj/item/weapon/retractor) //Captain /obj/item/clothing/suit/captunic diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 82a9e9c9c74..20fc68bf4ed 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -118,7 +118,7 @@ I said no! /datum/recipe/brainburger reagents = list("flour" = 5) items = list( - /obj/item/brain + /obj/item/organ/brain ) result = /obj/item/weapon/reagent_containers/food/snacks/brainburger @@ -1016,7 +1016,7 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/brain + /obj/item/organ/brain ) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 7487ffa6313..e8cf1555e27 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -27,7 +27,7 @@ // Queen check var/no_queen = 1 for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list) - if(!Q.key && Q.brain_op_stage != 4) + if(!Q.key || !getbrain(Q)) continue no_queen = 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 4eec8d5f3da..084239ce187 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -304,7 +304,7 @@ blinded = 1 silent = 0 else //ALIVE. LIGHTS ARE ON - if(health < config.health_threshold_dead || brain_op_stage == 4.0) + if(health < config.health_threshold_dead || !getbrain(src)) death() blinded = 1 stat = DEAD diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index f5d1d0c274e..6c83e95842c 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -222,7 +222,7 @@ blinded = 1 silent = 0 else //ALIVE. LIGHTS ARE ON - if(health < -25 || brain_op_stage == 4.0) + if(health < -25 || !getbrain(src)) death() blinded = 1 silent = 0 diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 6959828f9b5..d0f752b01a5 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -22,7 +22,7 @@ var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm. attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O,/obj/item/brain) && !brainmob) //Time to stick a brain in it --NEO + if(istype(O,/obj/item/organ/brain) && !brainmob) //Time to stick a brain in it --NEO if(!O:brainmob) user << "\red You aren't sure where this brain came from, but you're pretty sure it's a useless brain." return @@ -68,7 +68,7 @@ user << "\red You upend the MMI, but the brain is clamped into place." else user << "\blue You upend the MMI, spilling the brain onto the floor." - var/obj/item/brain/brain = new(user.loc) + var/obj/item/organ/brain/brain = new(user.loc) brainmob.container = null//Reset brainmob mmi var. brainmob.loc = brain//Throw mob into brain. living_mob_list -= brainmob//Get outta here diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 8fdf3c79766..74668c5435c 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -1,8 +1,8 @@ -/obj/item/brain +/obj/item/organ/brain name = "brain" desc = "A piece of juicy meat found in a persons head." icon = 'icons/obj/surgery.dmi' - icon_state = "brain2" + icon_state = "brain" flags = TABLEPASS force = 1.0 w_class = 1.0 @@ -11,34 +11,32 @@ throw_range = 5 origin_tech = "biotech=3" attack_verb = list("attacked", "slapped", "whacked") - var/mob/living/carbon/brain/brainmob = null - New() - ..() - //Shifting the brain "mob" over to the brain object so it's easier to keep track of. --NEO - //WASSSSSUUUPPPP /N - spawn(5) - if(brainmob && brainmob.client) - brainmob.client.screen.len = null //clear the hud - proc - transfer_identity(var/mob/living/carbon/H) - name = "[H]'s brain" - brainmob = new(src) - brainmob.name = H.real_name - brainmob.real_name = H.real_name - brainmob.dna = H.dna - brainmob.timeofhostdeath = H.timeofdeath - if(H.mind) - H.mind.transfer_to(brainmob) - brainmob << "\blue You feel slightly disoriented. That's normal when you're just a brain." - return +/obj/item/organ/brain/New() + ..() + //Shifting the brain "mob" over to the brain object so it's easier to keep track of. --NEO + spawn(5) + if(brainmob && brainmob.client) + brainmob.client.screen.len = null //clear the hud -/obj/item/brain/examine() // -- TLE + +/obj/item/organ/brain/proc/transfer_identity(mob/living/carbon/H) + name = "[H]'s brain" + brainmob = new(src) + brainmob.name = H.real_name + brainmob.real_name = H.real_name + brainmob.dna = H.dna + brainmob.timeofhostdeath = H.timeofdeath + if(H.mind) + H.mind.transfer_to(brainmob) + brainmob << "You feel slightly disoriented. That's normal when you're just a brain." + + +/obj/item/organ/brain/examine() // -- TLE set src in oview(12) - if (!( usr )) - return + if(!usr) return usr << "This is \icon[src] \an [name]." if(brainmob && brainmob.client)//if thar be a brain inside... the brain. @@ -46,43 +44,41 @@ else usr << "This one seems particularly lifeless. Perhaps it will regain some of its luster later.." -/obj/item/brain/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + +/obj/item/organ/brain/attack(mob/living/carbon/M, mob/living/carbon/user) if(!istype(M, /mob)) return add_fingerprint(user) - if(!(user.zone_sel.selecting == ("head")) || !istype(M, /mob/living/carbon/human)) - return ..() - - if( !(locate(/obj/machinery/optable, M.loc) && M.resting) && ( !(locate(/obj/structure/table/, M.loc) && M.lying) && prob(50) ) ) + if(user.zone_sel.selecting != "head") return ..() var/mob/living/carbon/human/H = M if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))) - // you can't stab someone in the eyes wearing a mask! - user << "\blue You're going to need to remove their head cover first." + user << "You're going to need to remove their head cover first." return //since these people will be dead M != usr - if(M:brain_op_stage == 4.0) + if(!getbrain(M)) + user.drop_item() for(var/mob/O in viewers(M, null)) if(O == (user || M)) continue if(M == user) - O.show_message(text("\red [user] inserts [src] into his head!"), 1) + O << "[user] inserts [src] into \his head!" else - O.show_message(text("\red [M] has [src] inserted into his head by [user]."), 1) + O << "[M] has [src] inserted into \his head by [user]." if(M != user) - M << "\red [user] inserts [src] into your head!" - user << "\red You insert [src] into [M]'s head!" + M << "[user] inserts [src] into your head!" + user << "You insert [src] into [M]'s head!" else - user << "\red You insert [src] into your head!" + user << "You insert [src] into your head!" //LOL //this might actually be outdated since barring badminnery, a debrain'd body will have any client sucked out to the brain's internal mob. Leaving it anyway to be safe. --NEO - if(M.key)//Revised. /N + if(M.key) M.ghostize() if(brainmob.mind) @@ -90,9 +86,9 @@ else M.key = brainmob.key - M:brain_op_stage = 3.0 + M.internal_organs += src + loc = null - del(src) else ..() return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index 62916d818da..897b03c8a14 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -36,7 +36,7 @@ if(container && istype(container, /obj/item/device/mmi)) del(container)//Gets rid of the MMI if there is one if(loc) - if(istype(loc,/obj/item/brain)) + if(istype(loc,/obj/item/organ/brain)) del(loc)//Gets rid of the brain item spawn(15) if(animation) del(animation) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index fc719ab75c3..bf39a4ee959 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -443,4 +443,15 @@
"} user << browse(dat, text("window=mob[];size=325x500", name)) onclose(user, "mob[name]") - return \ No newline at end of file + return + +/mob/living/carbon/attackby(obj/item/I, mob/user) + if(surgeries.len) + var/success = 0 + for(var/datum/surgery/S in surgeries) + if(S.next_step(user, src)) + success = 1 + if(success) + return + + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 1a1907fd8ee..3abab019b81 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,11 +1,7 @@ /mob/living/carbon/ gender = MALE - var/list/stomach_contents = list() - - var/brain_op_stage = 0.0 - var/eye_op_stage = 0.0 - var/appendix_op_stage = 0.0 - var/alien_op_stage = 0.0 + var/list/stomach_contents = list() + var/list/internal_organs = list() //List of /obj/item/organ in the mob. they don't go in the contents. var/antibodies = 0 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 943c93a7cd9..da45c00dce3 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -194,7 +194,7 @@ msg += "[t_He] appears to have commited suicide... there is no hope of recovery.\n" if(stat == DEAD || (status_flags & FAKEDEATH)) - if(brain_op_stage != 4)//Only perform these checks if there is no brain + if(getbrain(src))//Only perform these checks if there is no brain msg += "[t_He] [t_is] limp and unresponsive; there are no signs of life" if(!key) @@ -251,9 +251,9 @@ else if(getBrainLoss() >= 60) msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" - if(!key && brain_op_stage != 4 && stat != DEAD) + if(!key && getbrain(src) && stat != DEAD) msg += "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely\n" - else if(!client && brain_op_stage != 4 && stat != DEAD) + else if(!client && getbrain(src) && stat != DEAD) msg += "[t_He] [t_has] a vacant, braindead stare...\n" if(digitalcamo) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d4ac08b1432..d1322c6c25f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -26,6 +26,10 @@ for(var/datum/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/brain + ..() if(dna) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index e91a4ac176b..78f86b54d5f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -828,7 +828,7 @@ silent = 0 else //ALIVE. LIGHTS ARE ON updatehealth() //TODO - if(health <= config.health_threshold_dead || brain_op_stage == 4.0) + if(health <= config.health_threshold_dead || !getbrain(src)) death() blinded = 1 silent = 0 diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 8e2efdc0423..930b80da974 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -398,7 +398,7 @@ blinded = 1 silent = 0 else //ALIVE. LIGHTS ARE ON - if(health < config.health_threshold_dead || brain_op_stage == 4.0) + if(health < config.health_threshold_dead || !getbrain(src)) death() blinded = 1 stat = DEAD diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index c261972b5fc..69d0b57b7c2 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -16,6 +16,10 @@ reagents = R R.my_atom = src + internal_organs += new /obj/item/organ/appendix + internal_organs += new /obj/item/organ/heart + internal_organs += new /obj/item/organ/brain + if(name == "monkey") name = text("monkey ([rand(1, 1000)])") real_name = name diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 19d94b42f5a..2753099dfd4 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -24,6 +24,7 @@ //Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas. + var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them. var/t_plasma = null var/t_oxygen = null diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index d3fedb489a3..800613290ca 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -505,21 +505,6 @@ ..() reagents.add_reagent("nutriment", 1)*/ -/obj/item/weapon/reagent_containers/food/snacks/appendix //yes, this is the same as meat. I might do something different in future - name = "appendix" - desc = "An appendix which looks perfectly healthy." - icon = 'icons/obj/surgery.dmi' - icon_state = "appendix" - New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed - name = "inflamed appendix" - desc = "An appendix which appears to be inflamed." - icon_state = "appendixinflamed" - /obj/item/weapon/reagent_containers/food/snacks/tofu name = "Tofu" icon_state = "tofu" diff --git a/code/WorkInProgress/surgery/appendectomy.dm b/code/modules/surgery/appendectomy.dm similarity index 82% rename from code/WorkInProgress/surgery/appendectomy.dm rename to code/modules/surgery/appendectomy.dm index 906936184e3..354535ee264 100644 --- a/code/WorkInProgress/surgery/appendectomy.dm +++ b/code/modules/surgery/appendectomy.dm @@ -1,6 +1,7 @@ /datum/surgery/appendectomy name = "appendectomy" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_appendix, /datum/surgery_step/close) + species = list(/mob/living/carbon/human, /mob/living/carbon/monkey) location = "groin" @@ -11,7 +12,7 @@ var/obj/item/organ/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(/obj/item/organ/appendix) in target.internal_organs + A = locate() in target.internal_organs if(A) user.visible_message("[user] begins to extract [target]'s appendix.") else @@ -22,5 +23,7 @@ user.visible_message("[user] successfully removes [target]'s appendix!") A.loc = get_turf(target) target.internal_organs -= A + for(var/datum/disease/appendicitis in target.viruses) + appendicitis.cure() else user.visible_message("[user] can't find an appendix in [target]!") \ No newline at end of file diff --git a/code/modules/surgery/brain_removal.dm b/code/modules/surgery/brain_removal.dm new file mode 100644 index 00000000000..18c67ce0eb8 --- /dev/null +++ b/code/modules/surgery/brain_removal.dm @@ -0,0 +1,31 @@ +/datum/surgery/brain_removal + name = "brain removal" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/extract_brain, /datum/surgery_step/close) + species = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + location = "head" + + +//extract brain +/datum/surgery_step/extract_brain + implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 55) + time = 64 + var/obj/item/organ/brain/B = null + +/datum/surgery_step/extract_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + B = getbrain(target) + if(B) + user.visible_message("[user] begins to extract [target]'s brain.") + else + user.visible_message("[user] looks for an brain in [target].") + +/datum/surgery_step/extract_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(B) + user.visible_message("[user] successfully removes [target]'s brain!") + B.loc = get_turf(target) + B.transfer_identity(target) + target.internal_organs -= B + user.attack_log += "\[[time_stamp()]\] Debrained [target.name] ([target.ckey]) INTENT: [uppertext(user.a_intent)])" + target.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])" + log_attack("[user.name] ([user.ckey]) debrained [target.name] ([target.ckey]) (INTENT: [uppertext(user.a_intent)])") + else + user.visible_message("[user] can't find an brain in [target]!") \ No newline at end of file diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm new file mode 100644 index 00000000000..3e13c42fe58 --- /dev/null +++ b/code/modules/surgery/core_removal.dm @@ -0,0 +1,28 @@ +/datum/surgery/core_removal + name = "core removal" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/incise, /datum/surgery_step/extract_core) + species = list(/mob/living/carbon/slime) + target_must_be_dead = 1 + + +//extract brain +/datum/surgery_step/extract_core + implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 100) + time = 16 + +/datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to extract a core from [target].") + +/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/mob/living/carbon/slime/slime = target + if(slime.cores > 0) + slime.cores-- + user.visible_message("[user] successfully extracts a core from [target]!") + user << "[slime.cores] core\s remaining." + + new slime.coretype(slime.loc) + + if(slime.cores <= 0) + slime.icon_state = "[slime.colour] baby slime dead-nocore" + else + user.visible_message("There aren't any cores left in [target].") \ No newline at end of file diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm new file mode 100644 index 00000000000..085c9b1f897 --- /dev/null +++ b/code/modules/surgery/eye_surgery.dm @@ -0,0 +1,28 @@ +/datum/surgery/eye_surgery + 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" + + +//fix eyes +/datum/surgery_step/fix_eyes + implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/pen = 25) + time = 64 + +/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to fix [target]'s eyes.") + +/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] successfully fixes [target]'s eyes!") + target.sdisabilities &= ~BLIND + target.disabilities &= ~NEARSIGHTED + target.eye_blurry = 35 //this will fix itself slowly. + target.eye_stat = 0 + +/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(getbrain(target)) + user.visible_message("[user] accidentally stabs [target] right in the brain!") + target.adjustBrainLoss(100) + else + user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.") \ No newline at end of file diff --git a/code/WorkInProgress/surgery/generic_steps.dm b/code/modules/surgery/generic_steps.dm similarity index 76% rename from code/WorkInProgress/surgery/generic_steps.dm rename to code/modules/surgery/generic_steps.dm index 0be543975a1..04d49a82ef9 100644 --- a/code/WorkInProgress/surgery/generic_steps.dm +++ b/code/modules/surgery/generic_steps.dm @@ -31,4 +31,13 @@ time = 32 /datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to mend the incision in [target]'s [target_zone].") \ No newline at end of file + user.visible_message("[user] begins to mend the incision in [target]'s [target_zone].") + + +//saw bone +/datum/surgery_step/saw + implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/hatchet = 35, /obj/item/weapon/butch = 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 [target_zone].") \ No newline at end of file diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm new file mode 100644 index 00000000000..c4e4f929567 --- /dev/null +++ b/code/modules/surgery/helpers.dm @@ -0,0 +1,41 @@ +proc/get_location_modifier(mob/M) + var/turf/T = get_turf(M) + if(locate(/obj/machinery/optable, T)) + return 1 + else if(locate(/obj/structure/table, T)) + return 0.8 + else if(locate(/obj/structure/stool/bed, T)) + return 0.7 + else + return 0.5 + +/proc/attempt_initiate_surgery(obj/item/I, mob/living/M, mob/user) + if(istype(M)) + 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(locate(S.type) in M.surgeries) + continue + if(S.target_must_be_dead && M.stat != DEAD) + continue + for(var/path in S.species) + if(istype(M, path)) + available_surgeries[S.name] = S + break + + var/P = input("Begin which procedure?", "Surgery", null, null) as null|anything in available_surgeries + if(P) + var/datum/surgery/S = available_surgeries[P] + var/datum/surgery/procedure = new S.type + if(procedure) + M.surgeries += procedure + user.visible_message("[user] drapes [I] over [M]'s [procedure.location] to prepare for \an [procedure.name].") + + user.attack_log += "\[[time_stamp()]\]Initiated a [procedure.name] on [M.name] ([M.ckey])" + M.attack_log += "\[[time_stamp()]\][user.name] ([user.ckey]) initiated a [procedure.name]" + log_attack("[user.name] ([user.ckey]) initiated a [procedure.name] on [M.name] ([M.ckey])") + return 1 + return 0 \ No newline at end of file diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm new file mode 100644 index 00000000000..985c96013c1 --- /dev/null +++ b/code/modules/surgery/implant_removal.dm @@ -0,0 +1,31 @@ +/datum/surgery/implant_removal + 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" + + +//extract implant +/datum/surgery_step/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 + if(I) + user.visible_message("[user] begins to extract [I] implant from [target]'s [target_zone].") + else + user.visible_message("[user] looks for an implant in [target]'s [target_zone].") + +/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] implant from [target]'s [target_zone]!") + if(istype(I, /obj/item/weapon/implant/loyalty)) + target << "You feel a sense of liberation as Nanotrasen's grip on your mind fades away." + del(I) + else + user.visible_message("[user] can't find anything in [target]'s [target_zone].") \ No newline at end of file diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm new file mode 100644 index 00000000000..628998edbd0 --- /dev/null +++ b/code/modules/surgery/organs/helpers.dm @@ -0,0 +1,9 @@ +proc/getbrain(mob/living/carbon/M) + if(istype(M)) + var/obj/item/organ/brain/B = locate() in M.internal_organs + return B + +proc/getappendix(mob/living/carbon/M) + if(istype(M)) + var/obj/item/organ/appendix/A = locate() in M.internal_organs + return A \ No newline at end of file diff --git a/code/WorkInProgress/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm similarity index 80% rename from code/WorkInProgress/surgery/organs/organ.dm rename to code/modules/surgery/organs/organ.dm index 965ae0e46d3..5a57dc539eb 100644 --- a/code/WorkInProgress/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -3,18 +3,6 @@ icon = 'icons/obj/surgery.dmi' -/obj/item/organ/appendix - name = "appendix" - icon_state = "appendix" - var/inflamed = 0 - -/obj/item/organ/appendix/update_icon() - if(inflamed) - icon_state = "appendixinflamed" - else - icon_state = "appendix" - - /obj/item/organ/heart name = "heart" icon_state = "heart-on" @@ -24,4 +12,16 @@ if(beating) icon_state = "heart-on" else - icon_state = "heart-off" \ No newline at end of file + 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" \ No newline at end of file diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm new file mode 100644 index 00000000000..c9bff7f1435 --- /dev/null +++ b/code/modules/surgery/surgery.dm @@ -0,0 +1,45 @@ +/datum/surgery + var/name = "surgery" + var/status = 1 + var/list/steps = list() + var/step_in_progress = 0 + var/list/species = list(/mob/living/carbon/human) + var/location = "chest" + var/target_must_be_dead = 0 + + +/datum/surgery/proc/next_step(mob/user, mob/living/carbon/target) + if(step_in_progress) return + + var/procedure = steps[status] + var/datum/surgery_step/S = new procedure + if(S) + if(S.try_op(user, target, user.zone_sel.selecting, user.get_active_hand(), src)) + return 1 + return 0 + + +/datum/surgery/proc/complete(mob/living/carbon/human/target) + target.surgeries -= src + src = null + + +//INFO +//Check /mob/living/carbon/attackby for how surgery progresses. +//As of Feb 14 2013 it's in code/modules/mob/living/carbon/carbon.dm, line 448. +//Other important variables are var/list/surgeries (/mob/living) and var/list/internal_organs (/mob/living/carbon). +//Surgical procedures are initiated by attempt_initiate_surgery(), which is called by surgical drapes and bedsheets. + + +//TODO +//empty hand surgery steps, surgery steps with any item +//specific steps for some surgeries (fluff text) +//R&D researching new surgeries (especially for non-humans) +//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) +//more interesting failure options +//randomised complications +//more surgeries! +//add a generic proc to check if target location is unclothed +//add a probability modifier for the state of the surgeon- health, twitching, etc. blindness, god forbid. +//helper for converting a zone_sel.selecting to body part (for damage) +//combine hands/feet into the arms \ No newline at end of file diff --git a/code/WorkInProgress/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm similarity index 94% rename from code/WorkInProgress/surgery/surgery_step.dm rename to code/modules/surgery/surgery_step.dm index 50be1ce9b08..a8fc39e6536 100644 --- a/code/WorkInProgress/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -16,7 +16,10 @@ preop(user, target, target_zone, tool) if(do_after(user, time)) + var/prob_chance = implements[tool.type] + prob_chance *= get_location_modifier(target) + if(prob(prob_chance)) success(user, target, target_zone, tool, surgery) surgery.status++ diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm new file mode 100644 index 00000000000..b098cd6c1e8 --- /dev/null +++ b/code/modules/surgery/tools.dm @@ -0,0 +1,111 @@ +/obj/item/weapon/retractor + name = "retractor" + desc = "Retracts stuff." + icon = 'icons/obj/surgery.dmi' + icon_state = "retractor" + m_amt = 10000 + g_amt = 5000 + flags = FPRINT | TABLEPASS | CONDUCT + w_class = 1.0 + origin_tech = "materials=1;biotech=1" + + +/obj/item/weapon/hemostat + name = "hemostat" + desc = "You think you have seen this before." + icon = 'icons/obj/surgery.dmi' + icon_state = "hemostat" + m_amt = 5000 + g_amt = 2500 + flags = FPRINT | TABLEPASS | CONDUCT + w_class = 1.0 + origin_tech = "materials=1;biotech=1" + attack_verb = list("attacked", "pinched") + + +/obj/item/weapon/cautery + name = "cautery" + desc = "This stops bleeding." + icon = 'icons/obj/surgery.dmi' + icon_state = "cautery" + m_amt = 5000 + g_amt = 2500 + flags = FPRINT | TABLEPASS | CONDUCT + w_class = 1.0 + origin_tech = "materials=1;biotech=1" + attack_verb = list("burnt") + + +/obj/item/weapon/surgicaldrill + name = "surgical drill" + desc = "You can drill using this item. You dig?" + icon = 'icons/obj/surgery.dmi' + icon_state = "drill" + hitsound = 'sound/weapons/circsawhit.ogg' + m_amt = 15000 + g_amt = 10000 + flags = FPRINT | TABLEPASS | CONDUCT + force = 15.0 + w_class = 3.0 + origin_tech = "materials=1;biotech=1" + attack_verb = list("drilled") + + suicide_act(mob/user) + viewers(user) << pick("/red [user] is pressing the [src.name] to \his temple and activating it! It looks like \he's trying to commit suicide.", \ + "/red [user] is pressing the [src.name] to \his chest and activating it! It looks like \he's trying to commit suicide.") + return (BRUTELOSS) + + +/obj/item/weapon/scalpel + name = "scalpel" + desc = "Cut, cut, and once more cut." + icon = 'icons/obj/surgery.dmi' + icon_state = "scalpel" + flags = FPRINT | TABLEPASS | CONDUCT + force = 10.0 + w_class = 1.0 + throwforce = 5.0 + throw_speed = 3 + throw_range = 5 + m_amt = 10000 + g_amt = 5000 + origin_tech = "materials=1;biotech=1" + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + + suicide_act(mob/user) + viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ + "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \ + "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") + return (BRUTELOSS) + + +/obj/item/weapon/circular_saw + name = "circular saw" + desc = "For heavy duty cutting." + icon = 'icons/obj/surgery.dmi' + icon_state = "saw" + hitsound = 'sound/weapons/circsawhit.ogg' + flags = FPRINT | TABLEPASS | CONDUCT + force = 15.0 + w_class = 3.0 + throwforce = 9.0 + throw_speed = 3 + throw_range = 5 + m_amt = 20000 + g_amt = 10000 + origin_tech = "materials=1;biotech=1" + attack_verb = list("attacked", "slashed", "sawed", "cut") + + +/obj/item/weapon/surgical_drapes + name = "surgical drapes" + desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control." + icon = 'icons/obj/surgery.dmi' + icon_state = "surgical_drapes" + w_class = 1.0 + origin_tech = "biotech=1" + attack_verb = list("slapped") + +/obj/item/weapon/surgical_drapes/attack(mob/living/M, mob/user) + if(!attempt_initiate_surgery(src, M, user)) + ..() \ No newline at end of file diff --git a/code/modules/surgery/xenomorph_removal.dm b/code/modules/surgery/xenomorph_removal.dm new file mode 100644 index 00000000000..4335245e6ec --- /dev/null +++ b/code/modules/surgery/xenomorph_removal.dm @@ -0,0 +1,40 @@ +/datum/surgery/xenomorph_removal + name = "xenomorph removal" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/xenomorph_removal, /datum/surgery_step/close) + species = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + location = "chest" + + +//remove xeno from premises +/datum/surgery_step/xenomorph_removal + implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/shovel/spade = 65, /obj/item/weapon/minihoe = 50, /obj/item/weapon/crowbar = 35) + time = 64 + +/datum/surgery_step/xenomorph_removal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to search in [target]'s chest for a xenomorph.") + +/datum/surgery_step/xenomorph_removal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/obj/item/alien_embryo/A = locate() in target.contents + if(A) + user << "You found an unknown alien organism in [target]'s chest!" + if(A.stage < 4) + user << "It's small and weak, barely the size of a foetus." + else + user << "It's grown quite large, and writhes slightly as you look at it." + if(prob(10)) + A.AttemptGrow() + + A.loc = get_turf(target) + user.visible_message("[user] successfully extracts the xenomorph from [target]!") + else + user.visible_message("[user] can't find anything in [target]'s chest!") + +/datum/surgery_step/xenomorph_removal/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/obj/item/alien_embryo/A = locate() in target.contents + if(A) + if(prob(50)) + A.AttemptGrow(0) + user.visible_message("[user] accidentally pokes the xenomorph in [target]!") + else + target.adjustOxyLoss(30) + user.visible_message("[user] accidentally pokes [target] in the lungs!") \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index fe31d894bda..ba83ac33c9f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -48,6 +48,14 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit tho. Thanks. --> +
+

14 February 2013

+

Petethegoat updated:

+ +
+

13 February 2013

Giacom updated:

@@ -56,11 +64,16 @@ should be listed in the changelog upon commit tho. Thanks. -->
  • New staff of animation icon by Teh Wolf!
  • You can now hack plastic explosives (C4)!
  • You can now use NTSL to send signals! With the function signal(frequency, code) you can create some clever ways to trigger a bomb. NTSL also has two new additions; return in the global scope will now stop the remaining code from executing and NTSL now has "elseif"s, huzzah!
  • +

    Kor "I'm quitting I swear" Phaeron updated:

    +

    Petethegoat updated:

    +
    diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index e11d43e2eda..520b5caa643 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index dedfe71eb6c..1e6ff33b820 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 731ace6838b..ddeb14db266 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 4e0e86820f3..613f4845fd1 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 4a093d06abc..87d77f7e9d1 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/maps/tgstation.2.1.1.dmm b/maps/tgstation.2.1.1.dmm index fa1d2632c5c..2b2a6768842 100644 --- a/maps/tgstation.2.1.1.dmm +++ b/maps/tgstation.2.1.1.dmm @@ -3926,11 +3926,11 @@ "bxz" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bxA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/asmaint) "bxB" = (/obj/machinery/vending/cigarette,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central) -"bxC" = (/obj/structure/disposalpipe/segment,/obj/structure/table,/obj/item/weapon/hemostat,/turf/simulated/floor,/area/medical/sleeper) -"bxD" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/sleeper) +"bxC" = (/obj/structure/disposalpipe/segment,/obj/structure/table,/obj/item/weapon/surgicaldrill,/turf/simulated/floor,/area/medical/sleeper) +"bxD" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/hemostat,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/sleeper) "bxE" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bxF" = (/obj/structure/table,/obj/item/weapon/cautery{pixel_x = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/sleeper) -"bxG" = (/obj/structure/table,/obj/item/weapon/retractor,/turf/simulated/floor,/area/medical/sleeper) +"bxF" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/retractor,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/sleeper) +"bxG" = (/obj/structure/table,/obj/item/weapon/cautery{pixel_x = 4},/turf/simulated/floor,/area/medical/sleeper) "bxH" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/gun/syringe,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bxI" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{dir = 2; icon_state = "whitegreencorner"},/area/medical/sleeper) "bxJ" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) @@ -3995,11 +3995,11 @@ "byQ" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r-f"; level = 1; name = "pipe"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/asmaint) "byR" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r-f"; level = 1; name = "pipe"},/turf/simulated/wall,/area/maintenance/asmaint) "byS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall,/area/maintenance/asmaint) -"byT" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{dir = 4; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) +"byT" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/table,/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/clothing/suit/apron/surgical,/turf/simulated/floor{dir = 4; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) "byU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "byV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "byW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"byX" = (/obj/machinery/power/apc{dir = 4; name = "Treatment Center APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/medical/sleeper) +"byX" = (/obj/machinery/power/apc{dir = 4; name = "Treatment Center APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/surgical_drapes,/turf/simulated/floor{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/medical/sleeper) "byY" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = 2},/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/sleeper) "byZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) "bza" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "45"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) @@ -5393,7 +5393,7 @@ "bZK" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "bZL" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/toxins/xenobiology) "bZM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/toxins/xenobiology) -"bZN" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/turf/simulated/floor,/area/toxins/xenobiology) +"bZN" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel{pixel_y = 4},/obj/item/weapon/surgical_drapes,/turf/simulated/floor,/area/toxins/xenobiology) "bZO" = (/obj/machinery/power/tracker,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/solar/port) "bZP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/solar/port) "bZQ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/port) @@ -7012,7 +7012,7 @@ "cER" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station) "cES" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "cET" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"cEU" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{info = "

    LIST OF SPELLS AVAILABLE

    Magic Missile:
    This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.

    Fireball:
    This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you.

    Disintegrate:
    This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.

    Disable Technology:
    This spell disables all weapons, cameras and most other technology in range.

    Smoke:
    This spell spawns a cloud of choking smoke at your location and does not require wizard garb.

    Blind:
    This spell temporarly blinds a single person and does not require wizard garb.

    Forcewall:
    This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb.

    Blink:
    This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.

    Teleport:
    This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.

    Mutate:
    This spell causes you to turn into a hulk, and gain telekinesis for a short while.

    Ethereal Jaunt:
    This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.

    Knock:
    This spell opens nearby doors and does not require wizard garb.

    "; name = "List of Available Spells (READ)"},/obj/item/trash/tray,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station) +"cEU" = (/obj/structure/table/woodentable,/obj/item/trash/tray,/obj/item/weapon/reagent_containers/food/snacks/badrecipe,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station) "cEV" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/wizard_station) "cEW" = (/obj/structure/table/woodentable,/obj/effect/landmark{name = "Teleport-Scroll"},/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/wizard_station) "cEX" = (/obj/structure/stool/bed/chair,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) diff --git a/tgstation.dme b/tgstation.dme index e47928d42aa..863bf6a330e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6,229 +6,6 @@ // BEGIN_FILE_DIR #define FILE_DIR . -#define FILE_DIR "code" -#define FILE_DIR "code/__HELPERS" -#define FILE_DIR "code/ATMOSPHERICS" -#define FILE_DIR "code/ATMOSPHERICS/components" -#define FILE_DIR "code/ATMOSPHERICS/components/binary_devices" -#define FILE_DIR "code/ATMOSPHERICS/components/trinary_devices" -#define FILE_DIR "code/ATMOSPHERICS/components/unary" -#define FILE_DIR "code/controllers" -#define FILE_DIR "code/datums" -#define FILE_DIR "code/datums/diseases" -#define FILE_DIR "code/datums/diseases/advance" -#define FILE_DIR "code/datums/diseases/advance/symptoms" -#define FILE_DIR "code/datums/helper_datums" -#define FILE_DIR "code/datums/spells" -#define FILE_DIR "code/datums/wires" -#define FILE_DIR "code/defines" -#define FILE_DIR "code/defines/obj" -#define FILE_DIR "code/defines/procs" -#define FILE_DIR "code/FEA" -#define FILE_DIR "code/game" -#define FILE_DIR "code/game/area" -#define FILE_DIR "code/game/gamemodes" -#define FILE_DIR "code/game/gamemodes/blob" -#define FILE_DIR "code/game/gamemodes/blob/blobs" -#define FILE_DIR "code/game/gamemodes/changeling" -#define FILE_DIR "code/game/gamemodes/cult" -#define FILE_DIR "code/game/gamemodes/events" -#define FILE_DIR "code/game/gamemodes/events/holidays" -#define FILE_DIR "code/game/gamemodes/extended" -#define FILE_DIR "code/game/gamemodes/malfunction" -#define FILE_DIR "code/game/gamemodes/meteor" -#define FILE_DIR "code/game/gamemodes/nuclear" -#define FILE_DIR "code/game/gamemodes/revolution" -#define FILE_DIR "code/game/gamemodes/sandbox" -#define FILE_DIR "code/game/gamemodes/traitor" -#define FILE_DIR "code/game/gamemodes/wizard" -#define FILE_DIR "code/game/jobs" -#define FILE_DIR "code/game/jobs/job" -#define FILE_DIR "code/game/machinery" -#define FILE_DIR "code/game/machinery/atmoalter" -#define FILE_DIR "code/game/machinery/bots" -#define FILE_DIR "code/game/machinery/camera" -#define FILE_DIR "code/game/machinery/computer" -#define FILE_DIR "code/game/machinery/doors" -#define FILE_DIR "code/game/machinery/embedded_controller" -#define FILE_DIR "code/game/machinery/kitchen" -#define FILE_DIR "code/game/machinery/pipe" -#define FILE_DIR "code/game/machinery/telecomms" -#define FILE_DIR "code/game/mecha" -#define FILE_DIR "code/game/mecha/combat" -#define FILE_DIR "code/game/mecha/equipment" -#define FILE_DIR "code/game/mecha/equipment/tools" -#define FILE_DIR "code/game/mecha/equipment/weapons" -#define FILE_DIR "code/game/mecha/medical" -#define FILE_DIR "code/game/mecha/working" -#define FILE_DIR "code/game/objects" -#define FILE_DIR "code/game/objects/effects" -#define FILE_DIR "code/game/objects/effects/decals" -#define FILE_DIR "code/game/objects/effects/decals/Cleanable" -#define FILE_DIR "code/game/objects/effects/spawners" -#define FILE_DIR "code/game/objects/items" -#define FILE_DIR "code/game/objects/items/devices" -#define FILE_DIR "code/game/objects/items/devices/PDA" -#define FILE_DIR "code/game/objects/items/devices/radio" -#define FILE_DIR "code/game/objects/items/robot" -#define FILE_DIR "code/game/objects/items/stacks" -#define FILE_DIR "code/game/objects/items/stacks/sheets" -#define FILE_DIR "code/game/objects/items/stacks/tiles" -#define FILE_DIR "code/game/objects/items/weapons" -#define FILE_DIR "code/game/objects/items/weapons/grenades" -#define FILE_DIR "code/game/objects/items/weapons/implants" -#define FILE_DIR "code/game/objects/items/weapons/melee" -#define FILE_DIR "code/game/objects/items/weapons/storage" -#define FILE_DIR "code/game/objects/items/weapons/tanks" -#define FILE_DIR "code/game/objects/structures" -#define FILE_DIR "code/game/objects/structures/crates_lockers" -#define FILE_DIR "code/game/objects/structures/crates_lockers/closets" -#define FILE_DIR "code/game/objects/structures/crates_lockers/closets/secure" -#define FILE_DIR "code/game/objects/structures/stool_bed_chair_nest" -#define FILE_DIR "code/game/turfs" -#define FILE_DIR "code/game/turfs/simulated" -#define FILE_DIR "code/game/turfs/space" -#define FILE_DIR "code/game/turfs/unsimulated" -#define FILE_DIR "code/game/verbs" -#define FILE_DIR "code/js" -#define FILE_DIR "code/modules" -#define FILE_DIR "code/modules/admin" -#define FILE_DIR "code/modules/admin/DB ban" -#define FILE_DIR "code/modules/admin/permissionverbs" -#define FILE_DIR "code/modules/admin/verbs" -#define FILE_DIR "code/modules/assembly" -#define FILE_DIR "code/modules/awaymissions" -#define FILE_DIR "code/modules/awaymissions/maploader" -#define FILE_DIR "code/modules/client" -#define FILE_DIR "code/modules/clothing" -#define FILE_DIR "code/modules/clothing/glasses" -#define FILE_DIR "code/modules/clothing/gloves" -#define FILE_DIR "code/modules/clothing/head" -#define FILE_DIR "code/modules/clothing/masks" -#define FILE_DIR "code/modules/clothing/shoes" -#define FILE_DIR "code/modules/clothing/spacesuits" -#define FILE_DIR "code/modules/clothing/suits" -#define FILE_DIR "code/modules/clothing/under" -#define FILE_DIR "code/modules/clothing/under/jobs" -#define FILE_DIR "code/modules/detectivework" -#define FILE_DIR "code/modules/events" -#define FILE_DIR "code/modules/flufftext" -#define FILE_DIR "code/modules/food" -#define FILE_DIR "code/modules/library" -#define FILE_DIR "code/modules/mining" -#define FILE_DIR "code/modules/mob" -#define FILE_DIR "code/modules/mob/dead" -#define FILE_DIR "code/modules/mob/dead/observer" -#define FILE_DIR "code/modules/mob/living" -#define FILE_DIR "code/modules/mob/living/blob" -#define FILE_DIR "code/modules/mob/living/carbon" -#define FILE_DIR "code/modules/mob/living/carbon/alien" -#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid" -#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid/caste" -#define FILE_DIR "code/modules/mob/living/carbon/alien/larva" -#define FILE_DIR "code/modules/mob/living/carbon/alien/special" -#define FILE_DIR "code/modules/mob/living/carbon/brain" -#define FILE_DIR "code/modules/mob/living/carbon/human" -#define FILE_DIR "code/modules/mob/living/carbon/metroid" -#define FILE_DIR "code/modules/mob/living/carbon/monkey" -#define FILE_DIR "code/modules/mob/living/silicon" -#define FILE_DIR "code/modules/mob/living/silicon/ai" -#define FILE_DIR "code/modules/mob/living/silicon/ai/freelook" -#define FILE_DIR "code/modules/mob/living/silicon/decoy" -#define FILE_DIR "code/modules/mob/living/silicon/pai" -#define FILE_DIR "code/modules/mob/living/silicon/robot" -#define FILE_DIR "code/modules/mob/living/simple_animal" -#define FILE_DIR "code/modules/mob/living/simple_animal/friendly" -#define FILE_DIR "code/modules/mob/living/simple_animal/hostile" -#define FILE_DIR "code/modules/mob/living/simple_animal/hostile/retaliate" -#define FILE_DIR "code/modules/mob/new_player" -#define FILE_DIR "code/modules/paperwork" -#define FILE_DIR "code/modules/power" -#define FILE_DIR "code/modules/power/antimatter" -#define FILE_DIR "code/modules/power/singularity" -#define FILE_DIR "code/modules/power/singularity/particle_accelerator" -#define FILE_DIR "code/modules/projectiles" -#define FILE_DIR "code/modules/projectiles/ammunition" -#define FILE_DIR "code/modules/projectiles/guns" -#define FILE_DIR "code/modules/projectiles/guns/energy" -#define FILE_DIR "code/modules/projectiles/guns/projectile" -#define FILE_DIR "code/modules/projectiles/projectile" -#define FILE_DIR "code/modules/reagents" -#define FILE_DIR "code/modules/reagents/reagent_containers" -#define FILE_DIR "code/modules/reagents/reagent_containers/food" -#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks" -#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks/bottle" -#define FILE_DIR "code/modules/reagents/reagent_containers/food/snacks" -#define FILE_DIR "code/modules/reagents/reagent_containers/glass" -#define FILE_DIR "code/modules/reagents/reagent_containers/glass/bottle" -#define FILE_DIR "code/modules/recycling" -#define FILE_DIR "code/modules/research" -#define FILE_DIR "code/modules/scripting" -#define FILE_DIR "code/modules/scripting/AST" -#define FILE_DIR "code/modules/scripting/AST/Operators" -#define FILE_DIR "code/modules/scripting/Implementations" -#define FILE_DIR "code/modules/scripting/Interpreter" -#define FILE_DIR "code/modules/scripting/Parser" -#define FILE_DIR "code/modules/scripting/Scanner" -#define FILE_DIR "code/modules/security levels" -#define FILE_DIR "code/unused" -#define FILE_DIR "code/unused/beast" -#define FILE_DIR "code/unused/computer2" -#define FILE_DIR "code/unused/disease2" -#define FILE_DIR "code/unused/gamemodes" -#define FILE_DIR "code/unused/hivebot" -#define FILE_DIR "code/unused/mining" -#define FILE_DIR "code/unused/optics" -#define FILE_DIR "code/unused/pda2" -#define FILE_DIR "code/unused/powerarmor" -#define FILE_DIR "code/unused/spacecraft" -#define FILE_DIR "code/WorkInProgress" -#define FILE_DIR "code/WorkInProgress/carn" -#define FILE_DIR "code/WorkInProgress/mapload" -#define FILE_DIR "code/WorkInProgress/organs" -#define FILE_DIR "code/WorkInProgress/Sigyn" -#define FILE_DIR "code/WorkInProgress/Sigyn/Department Sec" -#define FILE_DIR "code/WorkInProgress/Sigyn/Softcurity" -#define FILE_DIR "code/WorkInProgress/surgery" -#define FILE_DIR "code/WorkInProgress/surgery/organs" -#define FILE_DIR "code/WorkInProgress/virus2" -#define FILE_DIR "html" -#define FILE_DIR "icons" -#define FILE_DIR "icons/effects" -#define FILE_DIR "icons/mecha" -#define FILE_DIR "icons/misc" -#define FILE_DIR "icons/mob" -#define FILE_DIR "icons/obj" -#define FILE_DIR "icons/obj/assemblies" -#define FILE_DIR "icons/obj/atmospherics" -#define FILE_DIR "icons/obj/clothing" -#define FILE_DIR "icons/obj/doors" -#define FILE_DIR "icons/obj/flora" -#define FILE_DIR "icons/obj/machines" -#define FILE_DIR "icons/obj/pipes" -#define FILE_DIR "icons/pda_icons" -#define FILE_DIR "icons/spideros_icons" -#define FILE_DIR "icons/Testing" -#define FILE_DIR "icons/turf" -#define FILE_DIR "icons/vending_icons" -#define FILE_DIR "interface" -#define FILE_DIR "maps" -#define FILE_DIR "maps/RandomZLevels" -#define FILE_DIR "sound" -#define FILE_DIR "sound/AI" -#define FILE_DIR "sound/ambience" -#define FILE_DIR "sound/effects" -#define FILE_DIR "sound/hallucinations" -#define FILE_DIR "sound/items" -#define FILE_DIR "sound/machines" -#define FILE_DIR "sound/mecha" -#define FILE_DIR "sound/misc" -#define FILE_DIR "sound/piano" -#define FILE_DIR "sound/violin" -#define FILE_DIR "sound/voice" -#define FILE_DIR "sound/weapons" -#define FILE_DIR "tools" -#define FILE_DIR "tools/Redirector" // END_FILE_DIR // BEGIN_PREFERENCES @@ -328,15 +105,12 @@ #include "code\datums\diseases\advance\symptoms\damage_converter.dm" #include "code\datums\diseases\advance\symptoms\dizzy.dm" #include "code\datums\diseases\advance\symptoms\fever.dm" -#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" #include "code\datums\diseases\advance\symptoms\hallucigen.dm" #include "code\datums\diseases\advance\symptoms\headache.dm" #include "code\datums\diseases\advance\symptoms\heal.dm" #include "code\datums\diseases\advance\symptoms\itching.dm" -#include "code\datums\diseases\advance\symptoms\shedding.dm" #include "code\datums\diseases\advance\symptoms\shivering.dm" #include "code\datums\diseases\advance\symptoms\sneeze.dm" -#include "code\datums\diseases\advance\symptoms\stimulant.dm" #include "code\datums\diseases\advance\symptoms\symptoms.dm" #include "code\datums\diseases\advance\symptoms\voice_change.dm" #include "code\datums\diseases\advance\symptoms\vomit.dm" @@ -1306,6 +1080,19 @@ #include "code\modules\scripting\Scanner\Tokens.dm" #include "code\modules\security levels\keycard authentication.dm" #include "code\modules\security levels\security levels.dm" +#include "code\modules\surgery\appendectomy.dm" +#include "code\modules\surgery\brain_removal.dm" +#include "code\modules\surgery\core_removal.dm" +#include "code\modules\surgery\eye_surgery.dm" +#include "code\modules\surgery\generic_steps.dm" +#include "code\modules\surgery\helpers.dm" +#include "code\modules\surgery\implant_removal.dm" +#include "code\modules\surgery\surgery.dm" +#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\helpers.dm" +#include "code\modules\surgery\organs\organ.dm" #include "code\WorkInProgress\buildmode.dm" #include "code\WorkInProgress\explosion_particles.dm" #include "code\WorkInProgress\Sigyn\Department Sec\jobs.dm"