From e8f8138e0497332c8489e3b197e96bb95e3931c3 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 22 Feb 2013 23:06:37 +0400 Subject: [PATCH 1/8] Added priority system for surgery steps. Steps with higher priority would be attempted first. Added preparation step for item insertion surgery. --- baystation12.dme | 1 + code/__HELPERS/global_lists.dm | 1 + code/modules/surgery/appendix.dm | 1 + code/modules/surgery/bones.dm | 1 + code/modules/surgery/braincore.dm | 1 + code/modules/surgery/eye.dm | 1 + code/modules/surgery/face.dm | 1 + code/modules/surgery/other.dm | 118 +----------------------------- code/modules/surgery/ribcage.dm | 3 +- code/modules/surgery/surgery.dm | 17 +++++ 10 files changed, 27 insertions(+), 118 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index e1657ada890..734f6ae9319 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1174,6 +1174,7 @@ #include "code\modules\surgery\eye.dm" #include "code\modules\surgery\face.dm" #include "code\modules\surgery\generic.dm" +#include "code\modules\surgery\implant.dm" #include "code\modules\surgery\other.dm" #include "code\modules\surgery\ribcage.dm" #include "code\modules\surgery\robolimbs.dm" diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index d0b8b90d6b5..566a587b8a0 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -66,6 +66,7 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al for(var/T in paths) var/datum/surgery_step/S = new T surgery_steps += S + sort_surgeries() /* // Uncomment to debug chemical reaction list. /client/verb/debug_chemical_list() diff --git a/code/modules/surgery/appendix.dm b/code/modules/surgery/appendix.dm index 9443b7aca34..027e323c576 100644 --- a/code/modules/surgery/appendix.dm +++ b/code/modules/surgery/appendix.dm @@ -4,6 +4,7 @@ ////////////////////////////////////////////////////////////////// /datum/surgery_step/appendectomy/ + priority = 2 can_infect = 1 blood_level = 1 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 95d173acbe6..e0eaab854ff 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -4,6 +4,7 @@ ////////////////////////////////////////////////////////////////// /datum/surgery_step/glue_bone + priority = 2 required_tool = /obj/item/weapon/bonegel allowed_tools = list(/obj/item/weapon/screwdriver) can_infect = 1 diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm index e809f3cb954..d08d6d98784 100644 --- a/code/modules/surgery/braincore.dm +++ b/code/modules/surgery/braincore.dm @@ -4,6 +4,7 @@ ////////////////////////////////////////////////////////////////// /datum/surgery_step/brain/ + priority = 2 blood_level = 1 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) return target_zone == "head" && hasorgans(target) diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm index 224afc5af83..8f100aee173 100644 --- a/code/modules/surgery/eye.dm +++ b/code/modules/surgery/eye.dm @@ -4,6 +4,7 @@ ////////////////////////////////////////////////////////////////// /datum/surgery_step/eye + priority = 2 can_infect = 1 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if (!hasorgans(target)) diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index 2e6e0c65d05..90ce1d81349 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -4,6 +4,7 @@ ////////////////////////////////////////////////////////////////// /datum/surgery_step/face + priority = 2 can_infect = 0 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if (!hasorgans(target)) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 3c3dd477b40..d75bb538f3d 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -5,6 +5,7 @@ /datum/surgery_step/fix_vein + priority = 2 required_tool = /obj/item/weapon/FixOVein allowed_tools = list(/obj/item/weapon/cable_coil) can_infect = 1 @@ -45,120 +46,3 @@ user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \ "\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!") affected.take_damage(5, 0) - -////////////////////////////////////////////////////////////////// -// IMPLANT REMOVAL SURGERY // -////////////////////////////////////////////////////////////////// - -/datum/surgery_step/implant_removal - required_tool = /obj/item/weapon/hemostat - allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork) - - min_duration = 80 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return affected.open == 2 && !(affected.status & ORGAN_BLEEDING) - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.display_name] with \the [tool].", \ - "You start poking around inside the incision on [target]'s [affected.display_name] with \the [tool]" ) - target.custom_pain("The pain in your chest is living hell!",1) - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/chest/affected = target.get_organ(target_zone) - - var/find_prob = 0 - if (affected.implants.len) - var/obj/item/weapon/implant/imp = affected.implants[1] - if (imp.islegal()) - find_prob +=60 - else - find_prob +=40 - if (isright(tool)) - find_prob +=20 - if (prob(find_prob)) - user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \ - "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." ) - affected.implants -= imp - imp.loc = get_turf(target) - imp.imp_in = null - imp.implanted = 0 - else if (affected.hidden) - user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \ - "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." ) - affected.hidden.loc = get_turf(target) - if(!affected.hidden.blood_DNA) - affected.hidden.blood_DNA = list() - affected.hidden.blood_DNA[target.dna.unique_enzymes] = target.dna.b_type - affected.hidden.update_icon() - affected.hidden = null - - else - user.visible_message("\blue [user] could not find anything inside [target]'s [affected.display_name], and pulls \the [tool] out.", \ - "\blue You could not find anything inside [target]'s [affected.display_name]." ) - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/chest/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \ - "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!") - affected.createwound(CUT, 20) - if (affected.implants.len) - var/fail_prob = 10 - if (!isright(tool)) - fail_prob += 30 - if (prob(fail_prob)) - var/obj/item/weapon/implant/imp = affected.implants[1] - user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!") - playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3) - spawn(25) - imp.activate() - -////////////////////////////////////////////////////////////////// -// ITEM PLACEMENT SURGERY // -////////////////////////////////////////////////////////////////// - -/datum/surgery_step/item_place - required_tool = /obj/item - - min_duration = 80 - max_duration = 100 - var/max_size = 2 //maximum w_class of item that fits. - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - if (affected.name in list("chest","groin","head")) - max_size = 3 - else - max_size = 2 - return affected.open == 2 && !(affected.status & ORGAN_BLEEDING) && tool.w_class <= max_size && !affected.hidden - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts putting [tool] inside the incision on [target]'s [affected.display_name].", \ - "You start putting [tool] inside the incision on [target]'s [affected.display_name]." ) - target.custom_pain("The pain in your chest is living hell!",1) - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/chest/affected = target.get_organ(target_zone) - - user.visible_message("\blue [user] puts [tool] inside [target]'s [affected.display_name].", \ - "\blue You put [tool] inside [target]'s [affected.display_name]." ) - if (tool.w_class > max_size/2 && prob(50)) - user << "\red You tear some vessels trying to fit such big object in this cavity." - var/datum/wound/internal_bleeding/I = new (15) - affected.wounds += I - affected.owner.custom_pain("You feel something rip in your [affected.display_name]!", 1) - user.drop_item() - affected.hidden = tool - tool.loc = target - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/chest/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \ - "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!") - affected.createwound(CUT, 20) diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm index 04c09cd02ed..de5325f9821 100644 --- a/code/modules/surgery/ribcage.dm +++ b/code/modules/surgery/ribcage.dm @@ -3,6 +3,7 @@ // GENERIC RIBCAGE SURGERY // ////////////////////////////////////////////////////////////////// /datum/surgery_step/ribcage + priority = 2 can_infect = 1 blood_level = 1 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -195,4 +196,4 @@ var/datum/organ/external/chest/affected = target.get_organ("chest") user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s chest with \the [tool]!", \ "\red Your hand slips, slicing an artery inside [target]'s chest with \the [tool]!") - affected.createwound(CUT, 20) \ No newline at end of file + affected.createwound(CUT, 20) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 0b2919214da..62b9afb52c0 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -1,6 +1,7 @@ /* SURGERY STEPS */ /datum/surgery_step + var/priority = 0 //steps with higher priority would be attempted first // type path referencing the required tool for this step var/required_tool = null @@ -78,6 +79,22 @@ proc/do_surgery(mob/living/M, mob/living/user, obj/item/tool) return 1 //don't want to do weapony things after surgery return 0 +proc/sort_surgeries() + var/gap = surgery_steps.len + var/swapped = 1 + while (gap > 1 || swapped) + swapped = 0 + if(gap > 1) + gap = round(gap / 1.247330950103979) + if(gap < 1) + gap = 1 + for(var/i = 1; gap + i <= surgery_steps.len; i++) + var/datum/surgery_step/l = surgery_steps[i] //Fucking hate + var/datum/surgery_step/r = surgery_steps[gap+i] //how lists work here + if(l.priority < r.priority) + surgery_steps.Swap(i, gap + i) + swapped = 1 + /datum/surgery_status/ var/eyes = 0 var/face = 0 From f50fd49032229829388b1ba5d06c765394d90461 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 22 Feb 2013 23:12:27 +0400 Subject: [PATCH 2/8] Gangrene! Now germ level for organ has three thresholds. LEVEL 1: Occasional (prob(10) every tick) tox damage and germ level raise. LEVEL 2: In addition to that, tox damage and germ level raise every tick. LEVEL 3: Limb necrosis. Currently does nothing but icon change. Also at this stage germs start leaking to connected organs, so amputations is necessary. --- code/datums/organs/organ_external.dm | 58 +++++++++++++++---- code/datums/organs/wound.dm | 17 ++++++ .../mob/living/carbon/human/update_icons.dm | 4 ++ code/setup.dm | 1 + 4 files changed, 70 insertions(+), 10 deletions(-) diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index a90389dc214..b8da2f66a47 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -31,6 +31,7 @@ var/status = 0 var/open = 0 var/stage = 0 + var/cavity = 0 var/obj/item/hidden = null var/list/implants = list() @@ -239,25 +240,64 @@ // process wounds, doing healing etc., only do this every 4 ticks to save processing power if(owner.life_tick % wound_update_accuracy == 0) update_wounds() + + //Dismemberment if(status & ORGAN_DESTROYED) if(!destspawn && config.limbs_can_break) droplimb() return - if(!(status & ORGAN_BROKEN)) - perma_injury = 0 if(parent) if(parent.status & ORGAN_DESTROYED) status |= ORGAN_DESTROYED owner.update_body(1) return + + //Bone fracurtes if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT)) src.fracture() - if(germ_level > 0) - for(var/datum/wound/W in wounds) if(!W.bandaged && !W.salved) - W.germ_level = max(W.germ_level, germ_level) + if(!(status & ORGAN_BROKEN)) + perma_injury = 0 + + update_germs() update_icon() return +//Updating germ levels. Handles organ germ levels and necrosis. +#define GANGREN_LEVEL_ONE 100 +#define GANGREN_LEVEL_TWO 105 +#define GANGREN_LEVEL_TERMINAL 110 +#define GERM_TRANSFER_AMOUNT germ_level/500 +/datum/organ/external/proc/update_germs() + if(germ_level > 0 && owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs + //Syncing germ levels with external wounds + for(var/datum/wound/W in wounds) + if(!W.bandaged && !W.salved) + W.germ_level = max(W.germ_level, germ_level) //Wounds get all the germs + if (W.germ_level > germ_level) //Badly infected wounds raise internal germ levels + germ_level++ + + if(germ_level > GANGREN_LEVEL_ONE && prob(round(germ_level/100))) + germ_level++ + owner.adjustToxLoss(1) + + if(germ_level > GANGREN_LEVEL_TWO) + germ_level++ + owner.adjustToxLoss(1) + + if(germ_level > GANGREN_LEVEL_TERMINAL) + if (!(status & ORGAN_DEAD)) + status |= ORGAN_DEAD + owner << "You can't feel your [display_name] anymore..." + owner.update_body(1) + if (prob(10)) //Spreading the fun + if (children) //To child organs + for (var/datum/organ/external/child in children) + if (!(child.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT))) + child.germ_level += round(GERM_TRANSFER_AMOUNT) + if (parent) + if (!(parent.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT))) + parent.germ_level += round(GERM_TRANSFER_AMOUNT) + //Updating wounds. Handles wound natural healing, internal bleedings and infections /datum/organ/external/proc/update_wounds() for(var/datum/wound/W in wounds) @@ -281,14 +321,12 @@ // amount of healing is spread over all the wounds W.heal_damage((wound_update_accuracy * amount * W.amount * config.organ_regeneration_multiplier) / (20*owner.number_wounds+1)) - if(W.germ_level > 100 && prob(10)) - owner.adjustToxLoss(1 * wound_update_accuracy) - if(W.germ_level > 1000) - owner.adjustToxLoss(1 * wound_update_accuracy) - // Salving also helps against infection if(W.germ_level > 0 && W.salved && prob(2)) W.germ_level = 0 + W.disinfected = 1 + + // sync the organ's damage with its wounds src.update_damages() diff --git a/code/datums/organs/wound.dm b/code/datums/organs/wound.dm index b90ddfca81a..90909a3f62d 100644 --- a/code/datums/organs/wound.dm +++ b/code/datums/organs/wound.dm @@ -96,6 +96,23 @@ else if(damage_type == BURN) return salved + // checks if wound is considered open for external infections + // untreated cuts (and bleeding bruises) and burns are possibly infectable, chance higher if wound is bigger + proc/can_infect() + if (is_treated() && damage < 10) + return 0 + if (disinfected) + return 0 + var/dam_coef = round(damage/10) + switch (damage_type) + if (BRUISE) + return prob(dam_coef*5) && bleeding() //bruises only infectable if bleeding + if (BURN) + return prob(dam_coef*10) + if (CUT) + return prob(dam_coef*20) + + return 0 // heal the given amount of damage, and if the given amount of damage was more // than what needed to be healed, return how much heal was left // set @heals_internal to also heal internal organ damage diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 478416aae1c..88b96a13deb 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -222,6 +222,7 @@ proc/get_damage_icon_part(damage_state, body_part) var/husk_color_mod = rgb(96,88,80) var/hulk_color_mod = rgb(48,224,40) var/plant_color_mod = rgb(144,224,144) + var/necrosis_color_mod = rgb(10,50,0) var/husk = (HUSK in src.mutations) //100% unnecessary -Agouri //nope, do you really want to iterate through src.mutations repeatedly? -Pete var/fat = (FAT in src.mutations) @@ -283,6 +284,9 @@ proc/get_damage_icon_part(damage_state, body_part) temp = new /icon(icobase, "[part.icon_name]") if(part.status & ORGAN_ROBOT) temp.GrayScale() + if(part.status & ORGAN_DEAD) + temp.ColorTone(necrosis_color_mod) + temp.SetIntensity(0.7) else if(!skeleton) if(husk) temp.ColorTone(husk_color_mod) diff --git a/code/setup.dm b/code/setup.dm index 33202de26f0..e3cc19a30ff 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -580,6 +580,7 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define ORGAN_ROBOT 128 #define ORGAN_SPLINTED 256 #define SALVED 512 +#define ORGAN_DEAD 1024 #define ROUNDSTART_LOGOUT_REPORT_TIME 6000 //Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued. From a8fdc167291aabbca2c48d2cfb5cd75ed2029ac7 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 22 Feb 2013 23:13:22 +0400 Subject: [PATCH 3/8] Debug verb to check how long it would take for gangrene to kick in. --- code/modules/mob/living/carbon/human/human.dm | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 491a457e648..218637c3843 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -920,3 +920,31 @@ E.ruptured_lungs = 1 +/mob/living/carbon/human/verb/simulate() + set name = "sim" + set background = 1 + + var/damage = input("Wound damage","Wound damage") as num + + var/germs = 0 + var/tdamage = 0 + var/ticks = 0 + while (germs < 2501 && ticks < 100000 && round(damage/10)*20) + diary << "VIRUS TESTING: [ticks] : germs [germs] tdamage [tdamage] prob [round(damage/10)*20]" + ticks++ + if (prob(round(damage/10)*20)) + germs++ + if (germs == 100) + world << "Reached stage 1 in [ticks] ticks" + if (germs > 100) + if (prob(10)) + damage++ + germs++ + if (germs == 1000) + world << "Reached stage 2 in [ticks] ticks" + if (germs > 1000) + damage++ + germs++ + if (germs == 2500) + world << "Reached stage 3 in [ticks] ticks" + world << "Mob took [tdamage] tox damage" \ No newline at end of file From 83eb9cac83dd4da7df0132c356adb0bcd24868c4 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 22 Feb 2013 23:24:33 +0400 Subject: [PATCH 4/8] Commented out gangrene for now. I suck at branches, it got caught with my surgery fixes. --- code/datums/organs/organ_external.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index b8da2f66a47..7710fb6a4f7 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -264,8 +264,8 @@ //Updating germ levels. Handles organ germ levels and necrosis. #define GANGREN_LEVEL_ONE 100 -#define GANGREN_LEVEL_TWO 105 -#define GANGREN_LEVEL_TERMINAL 110 +#define GANGREN_LEVEL_TWO 1000 +#define GANGREN_LEVEL_TERMINAL 2500 #define GERM_TRANSFER_AMOUNT germ_level/500 /datum/organ/external/proc/update_germs() if(germ_level > 0 && owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs @@ -283,7 +283,7 @@ if(germ_level > GANGREN_LEVEL_TWO) germ_level++ owner.adjustToxLoss(1) - +/* if(germ_level > GANGREN_LEVEL_TERMINAL) if (!(status & ORGAN_DEAD)) status |= ORGAN_DEAD @@ -297,6 +297,7 @@ if (parent) if (!(parent.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT))) parent.germ_level += round(GERM_TRANSFER_AMOUNT) +*/ //Updating wounds. Handles wound natural healing, internal bleedings and infections /datum/organ/external/proc/update_wounds() From b208a953d0dc4b74af94aee6579d8f24e627c284 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 23 Feb 2013 00:09:05 +0400 Subject: [PATCH 5/8] Made EMP less instarape switch for Nuke Team. Instead of 50% chance to go off, it goes like that 30% Nothing happens 70% Malfunction: 50% Tear off limb / big wound 50% Bad malfunction: 50% BOOM 50% meltdown, won't activate ever Which takes it from 50% to 17.5% --- .../objects/items/weapons/implants/implant.dm | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index c123ebde2bb..5f38e4439ea 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -180,22 +180,7 @@ Implant Specifics:
"} switch (severity) if (2.0) //Weak EMP will make implant tear limbs off. if (prob(50)) - if (ishuman(imp_in) && part) - imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.display_name]" : ""]!") - playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3) - spawn(25) - if (ishuman(imp_in) && part) - //No tearing off these parts since it's pretty much killing - //and you can't replace groins - if (istype(part,/datum/organ/external/chest) || \ - istype(part,/datum/organ/external/groin) || \ - istype(part,/datum/organ/external/head)) - part.createwound(BRUISE, 60) //mangle them instead - else - part.droplimb(1) - explosion(get_turf(imp_in), -1, -1, 2, 3, 3) - del(src) - + small_boom() if (1.0) //strong EMP will melt implant either making it go off, or disarming it if (prob(50)) activate() //50% chance of bye bye @@ -207,6 +192,23 @@ Implant Specifics:
"} islegal() return 0 + proc/small_boom() + if (ishuman(imp_in) && part) + imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.display_name]" : ""]!") + playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3) + spawn(25) + if (ishuman(imp_in) && part) + //No tearing off these parts since it's pretty much killing + //and you can't replace groins + if (istype(part,/datum/organ/external/chest) || \ + istype(part,/datum/organ/external/groin) || \ + istype(part,/datum/organ/external/head)) + part.createwound(BRUISE, 60) //mangle them instead + else + part.droplimb(1) + explosion(get_turf(imp_in), -1, -1, 2, 3, 3) + del(src) + /obj/item/weapon/implant/chem name = "chem" desc = "Injects things." From 29b1ef1c637f0495897dc159ef64eda58a7732c1 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 23 Feb 2013 00:41:20 +0400 Subject: [PATCH 6/8] Derp, forgot main part of explosive implant EMP code and changelog. --- code/game/objects/items/weapons/implants/implant.dm | 12 ++++++++---- html/changelog.html | 8 ++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 5f38e4439ea..903bb1b1bf9 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -182,10 +182,14 @@ Implant Specifics:
"} if (prob(50)) small_boom() if (1.0) //strong EMP will melt implant either making it go off, or disarming it - if (prob(50)) - activate() //50% chance of bye bye - else - meltdown() //50% chance of implant disarming + if (prob(70)) + if (prob(50)) + small_boom() + else + if (prob(50)) + activate() //50% chance of bye bye + else + meltdown() //50% chance of implant disarming spawn (20) malfunction-- diff --git a/html/changelog.html b/html/changelog.html index 9559cb76328..2071172483a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -58,6 +58,14 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit though. Thanks. --> +
+

22/02/2013

+

Chinsky updated:

+
    +
  • Change to body cavity surgery. Can only put items in chest, groind and head. Max size for item - 3 (chest), 2 (groin), 1 (head). For chest surgery ribs should be bent open, (lung surgery until second scalpel step). Surgery step needs preparation step, with drill. After that you can place item inside, or seal it with cautery to do other step instead.
  • +
+
+

February 23rd 2013

Cael Aislinn updated:

From 3b95009189ea7b865d9ad8014daec5ca1e989b20 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 23 Feb 2013 00:45:54 +0400 Subject: [PATCH 7/8] Commented out debug verb just in case. Does not really affect anything, but may get a bit resource heavy if spammed. --- code/modules/mob/living/carbon/human/human.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 218637c3843..1adee6f3054 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -919,7 +919,7 @@ src.custom_pain("You feel a stabbing pain in your chest!", 1) E.ruptured_lungs = 1 - +/* /mob/living/carbon/human/verb/simulate() set name = "sim" set background = 1 @@ -947,4 +947,5 @@ germs++ if (germs == 2500) world << "Reached stage 3 in [ticks] ticks" - world << "Mob took [tdamage] tox damage" \ No newline at end of file + world << "Mob took [tdamage] tox damage" +*/ \ No newline at end of file From 1aafb9ade9455ec2c9f01b539589f34077612d1f Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 23 Feb 2013 02:30:01 +0400 Subject: [PATCH 8/8] Derp, forgot the surgery. --- code/modules/surgery/implant.dm | 200 ++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 code/modules/surgery/implant.dm diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm new file mode 100644 index 00000000000..1a64f37cf2b --- /dev/null +++ b/code/modules/surgery/implant.dm @@ -0,0 +1,200 @@ +//Procedures in this file: Putting items in body cavity. Implant removal. Items removal. + +////////////////////////////////////////////////////////////////// +// ITEM PLACEMENT SURGERY // +////////////////////////////////////////////////////////////////// + +/datum/surgery_step/cavity + priority = 1 + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open == 2 && !(affected.status & ORGAN_BLEEDING) && (target_zone != "chest" || target.op_stage.ribcage == 2) + + proc/get_max_wclass(datum/organ/external/affected) + switch (affected.name) + if ("head") + return 1 + if ("chest") + return 3 + if ("groin") + return 2 + return 0 + + proc/get_cavity(datum/organ/external/affected) + switch (affected.name) + if ("head") + return "cranial" + if ("chest") + return "thoracic" + if ("groin") + return "abdominal" + return "" + +/datum/surgery_step/cavity/make_space + required_tool = /obj/item/weapon/surgicaldrill + allowed_tools = list(/obj/item/weapon/pen,/obj/item/stack/rods) + + min_duration = 60 + max_duration = 80 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + return ..() && !affected.cavity && !affected.hidden + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \ + "You start making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." ) + target.custom_pain("The pain in your chest is living hell!",1) + affected.cavity = 1 + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ(target_zone) + user.visible_message("\blue [user] makes some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \ + "\blue You make some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." ) + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ(target_zone) + user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \ + "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!") + affected.createwound(CUT, 20) + +/datum/surgery_step/cavity/close_space + priority = 2 + required_tool = /obj/item/weapon/cautery + allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter) + + min_duration = 60 + max_duration = 80 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + return ..() && affected.cavity + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts mending [target]'s [get_cavity(affected)] cavity wall with \the [tool].", \ + "You start mending [target]'s [get_cavity(affected)] cavity wall with \the [tool]." ) + target.custom_pain("The pain in your chest is living hell!",1) + affected.cavity = 0 + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ(target_zone) + user.visible_message("\blue [user] mends [target]'s [get_cavity(affected)] cavity walls with \the [tool].", \ + "\blue You mend [target]'s [get_cavity(affected)] cavity walls with \the [tool]." ) + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ(target_zone) + user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \ + "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!") + affected.createwound(CUT, 20) + +/datum/surgery_step/cavity/place_item + priority = 0 + required_tool = /obj/item + + min_duration = 80 + max_duration = 100 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + var/can_fit = !affected.hidden && affected.cavity && tool.w_class <= get_max_wclass(affected) + return ..() && can_fit + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ + "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) + target.custom_pain("The pain in your chest is living hell!",1) + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ(target_zone) + + user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ + "\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) + if (tool.w_class > get_max_wclass(affected)/2 && prob(50)) + user << "\red You tear some vessels trying to fit such big object in this cavity." + var/datum/wound/internal_bleeding/I = new (15) + affected.wounds += I + affected.owner.custom_pain("You feel something rip in your [affected.display_name]!", 1) + user.drop_item() + affected.hidden = tool + tool.loc = target + affected.cavity = 0 + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ(target_zone) + user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \ + "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!") + affected.createwound(CUT, 20) + +////////////////////////////////////////////////////////////////// +// IMPLANT/ITEM REMOVAL SURGERY // +////////////////////////////////////////////////////////////////// + +/datum/surgery_step/cavity/implant_removal + required_tool = /obj/item/weapon/hemostat + allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork) + + min_duration = 80 + max_duration = 100 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.display_name] with \the [tool].", \ + "You start poking around inside the incision on [target]'s [affected.display_name] with \the [tool]" ) + target.custom_pain("The pain in your chest is living hell!",1) + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ(target_zone) + + var/find_prob = 0 + if (affected.implants.len) + var/obj/item/weapon/implant/imp = affected.implants[1] + if (imp.islegal()) + find_prob +=60 + else + find_prob +=40 + if (isright(tool)) + find_prob +=20 + if (prob(find_prob)) + user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \ + "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." ) + affected.implants -= imp + imp.loc = get_turf(target) + imp.imp_in = null + imp.implanted = 0 + else if (affected.hidden) + user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \ + "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." ) + affected.hidden.loc = get_turf(target) + if(!affected.hidden.blood_DNA) + affected.hidden.blood_DNA = list() + affected.hidden.blood_DNA[target.dna.unique_enzymes] = target.dna.b_type + affected.hidden.update_icon() + affected.hidden = null + + else + user.visible_message("\blue [user] could not find anything inside [target]'s [affected.display_name], and pulls \the [tool] out.", \ + "\blue You could not find anything inside [target]'s [affected.display_name]." ) + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ(target_zone) + user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \ + "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!") + affected.createwound(CUT, 20) + if (affected.implants.len) + var/fail_prob = 10 + if (!isright(tool)) + fail_prob += 30 + if (prob(fail_prob)) + var/obj/item/weapon/implant/imp = affected.implants[1] + user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!") + playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3) + spawn(25) + imp.activate() +