From 5b8253fb57d586a0efd7600a56d769fe98ba4518 Mon Sep 17 00:00:00 2001 From: VampyrBytes Date: Tue, 19 Aug 2014 07:06:12 +0100 Subject: [PATCH 1/6] IPC and nuke disk fixes Fix for IPC revival Prevents nuke disk from being inserted via cavity surgery --- code/game/objects/items/weapons/tools.dm | 3 +++ .../mob/living/carbon/human/human_damage.dm | 9 ++++++- code/modules/power/cable.dm | 3 +++ code/modules/surgery/headreattach.dm | 4 --- code/modules/surgery/implant.dm | 27 ++++++++++--------- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index b38ed25be23..030028eae67 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -477,6 +477,9 @@ if(S.brute_dam) S.heal_damage(15,0,0,1) user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src].") + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + H.updatehealth() return else user << "Nothing to fix!" diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 094a8064287..77a88796660 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -11,8 +11,15 @@ total_burn += O.burn_dam health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute //TODO: fix husking - if( ((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist + if( (((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) && (!species.flags & IS_SYNTHETIC))//100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist ChangeToHusk() + if (species.flags & IS_SYNTHETIC) + var/datum/organ/external/H = get_organ(head) + if (!H.amputated) + if ((health >= (config.health_threshold_dead/100*75)) && stat == DEAD) //need to get them 25% away from death point before reviving them + dead_mob_list -= src + living_mob_list += src + stat = CONSCIOUS return /mob/living/carbon/human/getBrainLoss() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 6ca34f77e81..c688127ad2b 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -630,6 +630,9 @@ obj/structure/cable/proc/cableColor(var/colorC) if(S.burn_dam > 0 && use(1)) S.heal_damage(0,15,0,1) user.visible_message("\red \The [user] repairs some burn damage on \the [M]'s [S.display_name] with \the [src].") + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + H.updatehealth() return else user << "Nothing to fix!" diff --git a/code/modules/surgery/headreattach.dm b/code/modules/surgery/headreattach.dm index 704cdf98d2b..43d5c3c44d2 100644 --- a/code/modules/surgery/headreattach.dm +++ b/code/modules/surgery/headreattach.dm @@ -180,10 +180,6 @@ var/obj/item/weapon/organ/head/B = tool if (B.brainmob.mind) B.brainmob.mind.transfer_to(target) - if ((istype(B, /obj/item/weapon/organ/head/posi)) && (affected.status & ORGAN_ROBOT)) // cos you just know someone's going to put a robot head on a human body at some point! - dead_mob_list -= target - living_mob_list += target - target.stat = CONSCIOUS target.update_body() target.updatehealth() target.UpdateDamageIcon() diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 5408cbea2c5..6697c4cfc56 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -122,17 +122,20 @@ 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 + if(istype(tool, /obj/item/weapon/disk/nuclear)) + user << "Central command would kill you if you implanted the disk into someone." + else + 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) @@ -185,7 +188,7 @@ affected.implants -= obj target.hud_updateflag |= 1 << IMPLOYAL_HUD - + //Handle possessive brain borers. if(istype(obj,/mob/living/simple_animal/borer)) var/mob/living/simple_animal/borer/worm = obj From b5fcd209b2cfe573f4e294bef7be5d7e5a84948c Mon Sep 17 00:00:00 2001 From: Bone White Date: Wed, 20 Aug 2014 07:28:44 +0100 Subject: [PATCH 2/6] Rigid suit equip delay rework now uses a couple of new procs, allowing for per-suit tweaking of time. You now cannot equip eva helms without first attaching them to the suit (target head use helmet on suit) --- code/game/objects/items.dm | 14 +++++++--- code/modules/clothing/clothing.dm | 7 +++-- code/modules/clothing/spacesuits/rig.dm | 4 +-- code/modules/mob/inventory.dm | 29 ++++++++++++++------ code/modules/mob/mob.dm | 36 ++++++++++++++++++++++++- 5 files changed, 74 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index fcda1df0199..f6bd2b4bead 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -151,8 +151,17 @@ //canremove==0 means that object may not be removed. You can still wear it. This only applies to clothing. /N if(!src.canremove) return 0 - else + if(istype(user,/mob/living/carbon/human)) + if(istype(src, /obj/item/clothing/suit/space/rig)) // If the item to be unequipped is a rigid suit + if(user.delay_clothing_u_equip(src) == 0) + return 0 + else + user.u_equip(src) + else + user.u_equip(src) + + /* if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(istype(src, /obj/item/clothing/suit/space/rig)) // If the item to unequip item is a rigid suit @@ -186,8 +195,7 @@ H << "\red \The [src] is too fiddly to remove whilst moving." return 0 H << "\blue You finish removing the [src]." - - user.u_equip(src) + */ else if(isliving(src.loc)) return 0 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d89fc8185fd..17e9974cd1a 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,10 +1,13 @@ /obj/item/clothing name = "clothing" var/list/species_restricted = null //Only these species can wear this kit. + var/equip_time = 0 + var/equipping = 0 + var/rig_restrict_helmet = 0 // Stops the user from equipping a rig helmet without attaching it to the suit first. //BS12: Species-restricted clothing check. /obj/item/clothing/mob_can_equip(M as mob, slot) - +/* if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M if(istype(src, /obj/item/clothing/head/helmet/space/rig)) // If the item to be equipped is a rigid suit helmet @@ -39,7 +42,7 @@ H << "\red \The [src] is too fiddly to fasten whilst moving. \..." return 0 M << "\blue You have finished fastening the [src]'s seals." - +*/ //if we can equip the item anyway, don't bother with species_restricted (aslo cuts down on spam) if (!..()) return 0 diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 49ac911f3f1..dd3b2778aa4 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -57,7 +57,7 @@ desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." icon_state = "rig0-engineering" item_state = "eng_helm" - var/equip_time = 60 // Bone White - time to equip/unequip. see /obj/item/attack_hand (items.dm) and /obj/item/clothing/mob_can_equip (clothing.dm) + rig_restrict_helmet = 1 armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) allowed = list(/obj/item/device/flashlight) var/brightness_on = 4 //luminosity when on @@ -103,7 +103,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." icon_state = "rig-engineering" item_state = "eng_hardsuit" - var/equip_time = 100 // Bone White - time to equip/unequip. see /obj/item/attack_hand (items.dm) and /obj/item/clothing/mob_can_equip (clothing.dm) + equip_time = 100 // Bone White - time to equip/unequip. see /obj/item/attack_hand (items.dm) and /obj/item/clothing/mob_can_equip (clothing.dm) slowdown = 4 armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 1011238609e..9b8b3f072c8 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -138,14 +138,6 @@ if(hand) return drop_l_hand(Target) else return drop_r_hand(Target) - - - - - - - - //TODO: phase out this proc /mob/proc/before_take_item(var/obj/item/W) //TODO: what is this? W.loc = null @@ -154,6 +146,27 @@ update_icons() return +/mob/proc/delay_clothing_u_equip(obj/item/clothing/X as obj) // Bone White - delays unequipping by parameter. Requires W to be /obj/item/clothing/ + + if(!istype(X)) return 0 + + if(X.equipping == 1) return 0 // Item is already being (un)equipped + + var/tempX = usr.x + var/tempY = usr.y + usr << "\blue You start unequipping the [X]." + X.equipping = 1 + var/equip_time = round(X.equip_time/10) + var/i + for(i=1; i<=equip_time; i++) + sleep (10) // Check if they've moved every 10 time units + if ((tempX != usr.x) || (tempY != usr.y)) + src << "\red \The [X] is too fiddly to unequip whilst moving." + X.equipping = 0 + return 0 + u_equip(X) + usr << "\blue You have finished unequipping the [X]." + X.equipping = 0 /mob/proc/u_equip(W as obj) if (W == r_hand) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 701fef237be..5fafcc4f136 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -105,8 +105,19 @@ /mob/proc/attack_ui(slot) var/obj/item/W = get_active_hand() + //if(istype(W)) + // equip_to_slot_if_possible(W, slot) + if(istype(W)) - equip_to_slot_if_possible(W, slot) + + if(W:rig_restrict_helmet) + src << "\red You must fasten the helmet to a hardsuit first. (Target the head)" // Stop eva helms equipping. + else + if(W:equip_time > 0) + delay_clothing_equip_to_slot_if_possible(W, slot) + else + equip_to_slot_if_possible(W, slot) + if(ishuman(src) && W == src:head) src:update_hair() @@ -117,6 +128,29 @@ return 1 return 0 +//This is a SAFE proc. Use this instead of equip_to_splot()! +/mob/proc/delay_clothing_equip_to_slot_if_possible(obj/item/clothing/X as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1, delay_time = 0) + if(!istype(X)) return 0 + + if(X.equipping == 1) return 0 // Item is already being equipped + + var/tempX = usr.x + var/tempY = usr.y + usr << "\blue You start equipping the [X]." + X.equipping = 1 + var/equip_time = round(X.equip_time/10) + var/i + for(i=1; i<=equip_time; i++) + sleep (10) // Check if they've moved every 10 time units + if ((tempX != usr.x) || (tempY != usr.y)) + src << "\red \The [X] is too fiddly to fasten whilst moving." + X.equipping = 0 + return 0 + equip_to_slot_if_possible(X, slot) + usr << "\blue You have finished equipping the [X]." + X.equipping = 0 + + //This is a SAFE proc. Use this instead of equip_to_splot()! //set del_on_fail to have it delete W if it fails to equip //set disable_warning to disable the 'you are unable to equip that' warning. From 98a0e852277735c1318b3837f9fba983086847cc Mon Sep 17 00:00:00 2001 From: VampyrBytes Date: Wed, 20 Aug 2014 14:04:07 +0100 Subject: [PATCH 3/6] fix for runtime caused by #398 God knows why this was a var/tmp --- code/modules/organs/organ_external.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index d7f7d20aacc..eaa23c0ad99 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -20,7 +20,7 @@ var/tmp/perma_injury = 0 var/tmp/destspawn = 0 //Has it spawned the broken limb? - var/tmp/amputated = 0 //Whether this has been cleanly amputated, thus causing no pain + var/amputated = 0 //Whether this has been cleanly amputated, thus causing no pain var/min_broken_damage = 30 var/datum/organ/external/parent From 32b6eb981317e2086267bae9940ce9664cb9eb31 Mon Sep 17 00:00:00 2001 From: VampyrBytes Date: Thu, 21 Aug 2014 10:09:34 +0100 Subject: [PATCH 4/6] Revert "fix for runtime caused by #398" This reverts commit 98a0e852277735c1318b3837f9fba983086847cc. --- code/modules/organs/organ_external.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index eaa23c0ad99..d7f7d20aacc 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -20,7 +20,7 @@ var/tmp/perma_injury = 0 var/tmp/destspawn = 0 //Has it spawned the broken limb? - var/amputated = 0 //Whether this has been cleanly amputated, thus causing no pain + var/tmp/amputated = 0 //Whether this has been cleanly amputated, thus causing no pain var/min_broken_damage = 30 var/datum/organ/external/parent From c0f5132664923e91156a400e36ce7de35218a606 Mon Sep 17 00:00:00 2001 From: VampyrBytes Date: Thu, 21 Aug 2014 10:24:13 +0100 Subject: [PATCH 5/6] Cleanup of internal organs Both internal and external organs are a mess, which is making maintaining and updating them nasty, so I'm cleaning them up, this is the first stage mechanical and assisted internal organs are now an object type rather than a var in the organ which makes it much cleaner and easier to adjust removed duplicate list of internal organs as there's no reason to have the same objects in 2 separate lists made New() a lot cleaner and more robust External organs will be next --- code/ZAS/Plasma.dm | 2 +- .../gamemodes/changeling/changeling_powers.dm | 3 +- code/game/machinery/adv_med.dm | 10 +- code/game/objects/items.dm | 4 +- code/modules/events/organ_failure.dm | 5 +- code/modules/mob/living/carbon/human/human.dm | 3 +- .../mob/living/carbon/human/human_damage.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 1 - code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/mob/living/carbon/species.dm | 61 ++-- code/modules/organs/organ.dm | 3 +- code/modules/organs/organ_internal.dm | 324 ++++++++++++------ code/modules/organs/pain.dm | 3 +- code/modules/reagents/Chemistry-Reagents.dm | 5 +- code/modules/surgery/braincore.dm | 2 +- code/modules/surgery/ribcage.dm | 18 +- 16 files changed, 300 insertions(+), 148 deletions(-) diff --git a/code/ZAS/Plasma.dm b/code/ZAS/Plasma.dm index d50b247d0b1..203d86da164 100644 --- a/code/ZAS/Plasma.dm +++ b/code/ZAS/Plasma.dm @@ -126,7 +126,7 @@ obj/var/contaminated = 0 /mob/living/carbon/human/proc/burn_eyes() //The proc that handles eye burning. if(prob(20)) src << "\red Your eyes burn!" - var/datum/organ/internal/eyes/E = internal_organs["eyes"] + var/datum/organ/internal/eyes/E = internal_organs_by_name["eyes"] E.damage += 2.5 eye_blurry = min(eye_blurry+1.5,50) if (prob(max(0,E.damage - 15) + 1) && !eye_blind) diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 1cb66b7c369..26ea6b40bd9 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -502,7 +502,8 @@ O.trace_chemicals = list() O.wounds = list() O.wound_update_accuracy = 1 - for(var/datum/organ/internal/IO in H.internal_organs) + for(var/n in H.internal_organs_by_name) + var/datum/organ/internal/IO = H.internal_organs_by_name[n] IO.damage = 0 IO.trace_chemicals = list() H.updatehealth() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index b48ebca6fe4..c87996cda7e 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -393,13 +393,9 @@ else dat += "[e.display_name]--Not Found" dat += "" - for(var/datum/organ/internal/i in occupant.internal_organs) - var/mech = "" - if(i.robotic == 1) - mech = "Assisted:" - if(i.robotic == 2) - mech = "Mechanical:" - + for(var/n in occupant.internal_organs_by_name) + var/datum/organ/internal/i = occupant.internal_organs_by_name[n] + var/mech = i.desc var/infection = "None" switch (i.germ_level) if (1 to INFECTION_LEVEL_ONE + 200) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index f6bd2b4bead..d104a41f27d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -660,10 +660,10 @@ var/datum/organ/internal/eyes/eyes = H.internal_organs_by_name["eyes"] if(!eyes) return - eyes.damage += rand(3,4) + eyes.take_damage(rand(3,4), 1) if(eyes.damage >= eyes.min_bruised_damage) if(M.stat != 2) - if(eyes.robotic <= 1) //robot eyes bleeding might be a bit silly + if(!(istype(eyes, /datum/organ/internal/eyes/robotic)) || istype(eyes, /datum/organ/internal/eyes/assisted)) //robot eyes bleeding might be a bit silly M << "\red Your eyes start to bleed profusely!" if(prob(50)) if(M.stat != 2) diff --git a/code/modules/events/organ_failure.dm b/code/modules/events/organ_failure.dm index 329044ef735..7eb172be1ea 100644 --- a/code/modules/events/organ_failure.dm +++ b/code/modules/events/organ_failure.dm @@ -13,7 +13,7 @@ datum/event/organ_failure/announce() datum/event/organ_failure/start() var/list/candidates = list() //list of candidate keys for(var/mob/living/carbon/human/G in player_list) - if(G.mind && G.mind.current && G.mind.current.stat != DEAD && G.health > 70 && G.internal_organs) + if(G.mind && G.mind.current && G.mind.current.stat != DEAD && G.health > 70 && G.internal_organs_by_name) candidates += G if(!candidates.len) return candidates = shuffle(candidates)//Incorporating Donkie's list shuffle @@ -24,7 +24,8 @@ datum/event/organ_failure/start() var/acute = prob(15) if (prob(75)) //internal organ infection - var/datum/organ/internal/I = pick(C.internal_organs) + var/org = pick(C.internal_organs_by_name) + var/datum/organ/internal/I = C.internal_organs_by_name[org] if (acute) I.germ_level = max(INFECTION_LEVEL_TWO, I.germ_level) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f86778f27a2..1d6816d4445 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1090,7 +1090,8 @@ H.brainmob.mind.transfer_to(src) del(H) - for(var/datum/organ/internal/I in internal_organs) + for(var/name in internal_organs_by_name) + var/datum/organ/internal/I = internal_organs_by_name[name] I.damage = 0 for (var/ID in virus2) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 77a88796660..2de850b7412 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -14,7 +14,7 @@ if( (((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) && (!species.flags & IS_SYNTHETIC))//100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist ChangeToHusk() if (species.flags & IS_SYNTHETIC) - var/datum/organ/external/H = get_organ(head) + var/datum/organ/external/H = organs_by_name["head"] if (!H.amputated) if ((health >= (config.health_threshold_dead/100*75)) && stat == DEAD) //need to get them 25% away from death point before reviving them dead_mob_list -= src diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ec4d65d8973..e08a8dde3e5 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -179,7 +179,6 @@ emp_act if(O.status & ORGAN_DESTROYED) continue O.emp_act(severity) for(var/datum/organ/internal/I in O.internal_organs) - if(I.robotic == 0) continue I.emp_act(severity) ..() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 7b112291a1c..7bbb5cc1a35 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -998,7 +998,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc // Sobering multiplier. // Sober block grants quadruple the alcohol metabolism. - var/sober_str=!(M_SOBER in mutations)?1:4 +// var/sober_str=!(M_SOBER in mutations)?1:4 updatehealth() //TODO if(!in_stasis) diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 02ade71adaa..c93d37fb5c4 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -82,28 +82,17 @@ H.organs_by_name["r_foot"] = new/datum/organ/external/r_foot(H.organs_by_name["r_leg"]) if (name!="Slime People") - H.internal_organs = list() - H.internal_organs_by_name["heart"] = new/datum/organ/internal/heart(H) - H.internal_organs_by_name["lungs"] = new/datum/organ/internal/lungs(H) - H.internal_organs_by_name["liver"] = new/datum/organ/internal/liver(H) - H.internal_organs_by_name["kidney"] = new/datum/organ/internal/kidney(H) - H.internal_organs_by_name["brain"] = new/datum/organ/internal/brain(H) - H.internal_organs_by_name["eyes"] = new/datum/organ/internal/eyes(H) + new/datum/organ/internal/heart(H) + new/datum/organ/internal/lungs(H) + new/datum/organ/internal/liver(H) + new/datum/organ/internal/kidney(H) + new/datum/organ/internal/brain(H) + new/datum/organ/internal/eyes(H) - for(var/name in H.organs_by_name) - H.organs += H.organs_by_name[name] - - for(var/datum/organ/external/O in H.organs) + for(var/n in H.organs_by_name) + var/datum/organ/external/O = H.organs_by_name[n] O.owner = H - - if(flags & IS_SYNTHETIC) - for(var/datum/organ/external/E in H.organs) - if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue - E.status |= ORGAN_ROBOT - for(var/datum/organ/internal/I in H.internal_organs) - I.mechanize() - - + H.organs += O return /datum/species/proc/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H) @@ -601,6 +590,38 @@ var/datum/organ/external/O = H.organs_by_name["head"] O.droplimb(1) +/datum/species/machine/create_organs(var/mob/living/carbon/human/H) + + H.organs = new /list() + H.organs_by_name["chest"] = new/datum/organ/external/chest() + H.organs_by_name["groin"] = new/datum/organ/external/groin(H.organs_by_name["chest"]) + H.organs_by_name["head"] = new/datum/organ/external/head(H.organs_by_name["chest"]) + H.organs_by_name["l_arm"] = new/datum/organ/external/l_arm(H.organs_by_name["chest"]) + H.organs_by_name["r_arm"] = new/datum/organ/external/r_arm(H.organs_by_name["chest"]) + H.organs_by_name["r_leg"] = new/datum/organ/external/r_leg(H.organs_by_name["groin"]) + H.organs_by_name["l_leg"] = new/datum/organ/external/l_leg(H.organs_by_name["groin"]) + H.organs_by_name["l_hand"] = new/datum/organ/external/l_hand(H.organs_by_name["l_arm"]) + H.organs_by_name["r_hand"] = new/datum/organ/external/r_hand(H.organs_by_name["r_arm"]) + H.organs_by_name["l_foot"] = new/datum/organ/external/l_foot(H.organs_by_name["l_leg"]) + H.organs_by_name["r_foot"] = new/datum/organ/external/r_foot(H.organs_by_name["r_leg"]) + + new/datum/organ/internal/heart/robotic(H) + new/datum/organ/internal/lungs/robotic(H) + new/datum/organ/internal/liver/robotic(H) + new/datum/organ/internal/kidney/robotic(H) + new/datum/organ/internal/brain/robotic(H) + new/datum/organ/internal/eyes/robotic(H) + + + for(var/n in H.organs_by_name) + var/datum/organ/external/O = H.organs_by_name[n] + O.owner = H + if(!(O.status & ORGAN_CUT_AWAY || O.status & ORGAN_DESTROYED)) + O.status |= ORGAN_ROBOT + H.organs += O + return + + //Species unarmed attacks /datum/unarmed_attack diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 04865cf9def..970ec6f865f 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -69,7 +69,8 @@ bad_external_organs += Ex //processing internal organs is pretty cheap, do that first. - for(var/datum/organ/internal/I in internal_organs) + for(var/name in internal_organs_by_name) + var/datum/organ/internal/I = internal_organs_by_name[name] I.process() //Check arms and legs for existence diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index a9f75cbc631..940c8b155ef 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -2,15 +2,15 @@ INTERNAL ORGANS ****************************************************/ -/mob/living/carbon/human/var/list/internal_organs = list() - /datum/organ/internal // amount of damage to the organ var/damage = 0 var/min_bruised_damage = 10 var/min_broken_damage = 30 var/parent_organ = "chest" - var/robotic = 0 //For being a robot + var/desc = "" + var/list/emplevel = list(0,0,0) // [1] is the highest amount of emp damage, [3] is the least + var/damagelevel = 1 /datum/organ/internal/proc/rejuvenate() damage=0 @@ -21,21 +21,19 @@ /datum/organ/internal/proc/is_broken() return damage >= min_broken_damage - - /datum/organ/internal/New(mob/living/carbon/human/H) ..() - var/datum/organ/external/E = H.organs_by_name[src.parent_organ] - if(E.internal_organs == null) - E.internal_organs = list() - E.internal_organs |= src - H.internal_organs |= src - src.owner = H + if(H) + var/datum/organ/internal/check = H.internal_organs_by_name[name] + if(check) + remove(H) + add(H) + /datum/organ/internal/process() //Process infections - if (robotic >= 2 || (owner.species && owner.species.flags & IS_PLANT)) //TODO make robotic internal and external organs separate types of organ instead of a flag + if (owner.species && owner.species.flags & IS_PLANT) germ_level = 0 return @@ -64,49 +62,42 @@ take_damage(1,silent=prob(30)) /datum/organ/internal/proc/take_damage(amount, var/silent=0) - if(src.robotic == 2) - src.damage += amount * 0.8 - else - src.damage += amount + + damage += amount * damagelevel var/datum/organ/external/parent = owner.get_organ(parent_organ) if (!silent) owner.custom_pain("Something inside your [parent.display_name] hurts a lot.", 1) /datum/organ/internal/proc/emp_act(severity) - switch(robotic) - if(0) - return - if(1) - switch (severity) - if (1.0) - take_damage(20,0) - return - if (2.0) - take_damage(7,0) - return - if(3.0) - take_damage(3,0) - return - if(2) - switch (severity) - if (1.0) - take_damage(40,0) - return - if (2.0) - take_damage(15,0) - return - if(3.0) - take_damage(10,0) - return + + if(emplevel[1]) + take_damage(emplevel[severity]) /datum/organ/internal/proc/mechanize() //Being used to make robutt hearts, etc - robotic = 2 /datum/organ/internal/proc/mechassist() //Used to add things like pacemakers, etc - robotic = 1 - min_bruised_damage = 15 - min_broken_damage = 35 + +/datum/organ/internal/proc/remove(var/mob/living/carbon/human/H) + if(H) + var/datum/organ/internal/toremove = H.internal_organs_by_name[name] + if(toremove) + var/datum/organ/external/E = H.organs_by_name[toremove.parent_organ] + for (var/datum/organ/internal/I in E.internal_organs) + if (I == toremove) + I = null + + return + +/datum/organ/internal/proc/add(var/mob/living/carbon/human/H) + var/datum/organ/external/P = H.organs_by_name[parent_organ] + if(P) + if(P.internal_organs == null) + P.internal_organs = list() + P.internal_organs += src + H.internal_organs_by_name[name] = src + owner = H + return /**************************************************** INTERNAL ORGANS DEFINES @@ -116,85 +107,224 @@ name = "heart" parent_organ = "chest" +/datum/organ/internal/heart/robotic + damagelevel = 0.8 + emplevel = list(40,15,10) + desc = "Mechanical" + +/datum/organ/internal/heart/robotic/process() + germ_level = 0 + return + +/datum/organ/internal/heart/mechanize() + new /datum/organ/internal/heart/robotic(owner) + return + +/datum/organ/internal/heart/assisted + min_bruised_damage = 15 + min_broken_damage = 35 + emplevel = list(20,7,3) + desc = "Assisted" + +/datum/organ/internal/heart/mechassist() + new /datum/organ/internal/heart/assisted(owner) + return /datum/organ/internal/lungs name = "lungs" parent_organ = "chest" - process() - ..() - if (germ_level > INFECTION_LEVEL_ONE) - if(prob(5)) - owner.emote("cough") //respitory tract infection +/datum/organ/internal/lungs/process() + ..() + if (germ_level > INFECTION_LEVEL_ONE) + if(prob(5)) + owner.emote("cough") //respitory tract infection - if(is_bruised()) - if(prob(2)) - spawn owner.emote("me", 1, "coughs up blood!") - owner.drip(10) - if(prob(4)) - spawn owner.emote("me", 1, "gasps for air!") - owner.losebreath += 15 + if(is_bruised()) + if(prob(2)) + spawn owner.emote("me", 1, "coughs up blood!") + owner.drip(10) + if(prob(4)) + spawn owner.emote("me", 1, "gasps for air!") + owner.losebreath += 15 + +/datum/organ/internal/lungs/robotic + damagelevel = 0.8 + emplevel = list(40,15,10) + desc = "Mechanical" + +/datum/organ/internal/lungs/robotic/process() + germ_level = 0 + return + +/datum/organ/internal/lungs/mechanize() + new /datum/organ/internal/lungs/robotic(owner) + return + +/datum/organ/internal/lungs/assisted + min_bruised_damage = 15 + min_broken_damage = 35 + emplevel = list(20,7,3) + desc = "Assisted" + +/datum/organ/internal/lungs/mechassist() + new /datum/organ/internal/lungs/assisted(owner) + return /datum/organ/internal/liver name = "liver" parent_organ = "chest" var/process_accuracy = 10 - process() - ..() - if (germ_level > INFECTION_LEVEL_ONE) - if(prob(1)) - owner << "\red Your skin itches." - if (germ_level > INFECTION_LEVEL_TWO) - if(prob(1)) - spawn owner.vomit() +/datum/organ/internal/liver/process() + ..() + if (germ_level > INFECTION_LEVEL_ONE) + if(prob(1)) + owner << "\red Your skin itches." + if (germ_level > INFECTION_LEVEL_TWO) + if(prob(1)) + spawn owner.vomit() - if(owner.life_tick % process_accuracy == 0) - if(src.damage < 0) - src.damage = 0 + if(owner.life_tick % process_accuracy == 0) + if(src.damage < 0) + src.damage = 0 - //High toxins levels are dangerous - if(owner.getToxLoss() >= 60 && !owner.reagents.has_reagent("anti_toxin")) - //Healthy liver suffers on its own - if (src.damage < min_broken_damage) - src.damage += 0.2 * process_accuracy - //Damaged one shares the fun - else - var/datum/organ/internal/O = pick(owner.internal_organs) - if(O) - O.damage += 0.2 * process_accuracy + //High toxins levels are dangerous + if(owner.getToxLoss() >= 60 && !owner.reagents.has_reagent("anti_toxin")) + //Healthy liver suffers on its own + if (src.damage < min_broken_damage) + src.damage += 0.2 * process_accuracy + //Damaged one shares the fun + else + var/datum/organ/internal/O = pick(owner.internal_organs_by_name) + if(O) + O.damage += 0.2 * process_accuracy - //Detox can heal small amounts of damage - if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("anti_toxin")) - src.damage -= 0.2 * process_accuracy + //Detox can heal small amounts of damage + if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("anti_toxin")) + src.damage -= 0.2 * process_accuracy - // Damaged liver means some chemicals are very dangerous - if(src.damage >= src.min_bruised_damage) - for(var/datum/reagent/R in owner.reagents.reagent_list) - // Ethanol and all drinks are bad - if(istype(R, /datum/reagent/ethanol)) - owner.adjustToxLoss(0.1 * process_accuracy) + // Damaged liver means some chemicals are very dangerous + if(src.damage >= src.min_bruised_damage) + for(var/datum/reagent/R in owner.reagents.reagent_list) + // Ethanol and all drinks are bad + if(istype(R, /datum/reagent/ethanol)) + owner.adjustToxLoss(0.1 * process_accuracy) - // Can't cope with toxins at all - for(var/toxin in list("toxin", "plasma", "sacid", "pacid", "cyanide", "lexorin", "amatoxin", "chloralhydrate", "carpotoxin", "zombiepowder", "mindbreaker")) - if(owner.reagents.has_reagent(toxin)) - owner.adjustToxLoss(0.3 * process_accuracy) + // Can't cope with toxins at all + for(var/toxin in list("toxin", "plasma", "sacid", "pacid", "cyanide", "lexorin", "amatoxin", "chloralhydrate", "carpotoxin", "zombiepowder", "mindbreaker")) + if(owner.reagents.has_reagent(toxin)) + owner.adjustToxLoss(0.3 * process_accuracy) + +/datum/organ/internal/liver/robotic + damagelevel = 0.8 + emplevel = list(40,15,10) + +/datum/organ/internal/liver/robotic/process() + germ_level = 0 + return + +/datum/organ/internal/liver/mechanize() + new /datum/organ/internal/liver/robotic(owner) + return + +/datum/organ/internal/liver/assisted + min_bruised_damage = 15 + min_broken_damage = 35 + emplevel = list(20,7,3) + desc = "Assisted" + +/datum/organ/internal/liver/mechassist() + new /datum/organ/internal/liver/assisted(owner) + return /datum/organ/internal/kidney name = "kidney" parent_organ = "chest" +/datum/organ/internal/kidney/robotic + damagelevel = 0.8 + emplevel = list(40,15,10) + desc = "Mechanical" + +/datum/organ/internal/kidney/robotic/process() + germ_level = 0 + return + +/datum/organ/internal/kidney/mechanize() + new /datum/organ/internal/kidney/robotic(owner) + return + +/datum/organ/internal/kidney/assisted + min_bruised_damage = 15 + min_broken_damage = 35 + emplevel = list(20,7,3) + desc = "Assisted" + +/datum/organ/internal/kidney/mechassist() + new /datum/organ/internal/kidney/assisted(owner) + return + /datum/organ/internal/brain name = "brain" parent_organ = "head" +/datum/organ/internal/brain/robotic + damagelevel = 0.8 + emplevel = list(40,15,10) + desc = "Mechanical" + +/datum/organ/internal/brain/robotic/process() + germ_level = 0 + return + +/datum/organ/internal/brain/mechanize() + new /datum/organ/internal/brain/robotic(owner) + return + +/datum/organ/internal/brain/assisted + min_bruised_damage = 15 + min_broken_damage = 35 + emplevel = list(20,7,3) + desc = "Assisted" + +/datum/organ/internal/brain/mechassist() + new /datum/organ/internal/brain/assisted(owner) + return + /datum/organ/internal/eyes name = "eyes" parent_organ = "head" - process() //Eye damage replaces the old eye_stat var. - ..() - if(is_bruised()) - owner.eye_blurry = 20 - if(is_broken()) - owner.eye_blind = 20 +/datum/organ/internal/eyes/process() //Eye damage replaces the old eye_stat var. + ..() + if(is_bruised()) + owner.eye_blurry = 20 + if(is_broken()) + owner.eye_blind = 20 + +/datum/organ/internal/eyes/robotic + damagelevel = 0.8 + emplevel = list(40,15,10) + desc = "Mechanical" + +/datum/organ/internal/eyes/robotic/process() + germ_level = 0 + if(is_bruised()) + owner.eye_blurry = 20 + if(is_broken()) + owner.eye_blind = 20 + +/datum/organ/internal/eyes/mechanize() + new /datum/organ/internal/eyes/robotic(owner) + return + +/datum/organ/internal/eyes/assisted + min_bruised_damage = 15 + min_broken_damage = 35 + emplevel = list(20,7,3) + desc = "Assisted" + +/datum/organ/internal/eyes/mechassist() + new /datum/organ/internal/eyes/assisted(owner) + return \ No newline at end of file diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index 192947b513c..b064fdf6621 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -102,7 +102,8 @@ mob/living/carbon/human/proc/handle_pain() pain(damaged_organ.display_name, maxdam, 0) // Damage to internal organs hurts a lot. - for(var/datum/organ/internal/I in internal_organs) + for(var/n in internal_organs_by_name) + var/datum/organ/internal/I = internal_organs_by_name[n] if(I.damage > 2) if(prob(2)) var/datum/organ/external/parent = get_organ(I.parent_organ) src.custom_pain("You feel a sharp pain in your [parent.display_name]", 1) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index e453e9c682d..0466235341e 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1910,7 +1910,8 @@ datum var/mob/living/carbon/human/H = M //Peridaxon is hard enough to get, it's probably fair to make this all internal organs - for(var/datum/organ/internal/I in H.internal_organs) + for(var/name in H.internal_organs_by_name) + var/datum/organ/internal/I = H.internal_organs_by_name[name] if(I.damage > 0) I.damage -= 0.20 ..() @@ -2804,7 +2805,7 @@ datum description = "Finely shredded tea leaves, used for making tea." reagent_state = SOLID color = "#7F8400" // rgb: 127, 132, 0 - + //Reagents used for plant fertilizers. toxin/fertilizer name = "fertilizer" diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm index e001914cc7f..7445fc2233e 100644 --- a/code/modules/surgery/braincore.dm +++ b/code/modules/surgery/braincore.dm @@ -111,7 +111,7 @@ B = new(target.loc) B.transfer_identity(target) - target.internal_organs -= B + target.internal_organs_by_name -= B target.internal_organs_by_name -= "brain" target:brain_op_stage = 4.0 diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm index 84aba221f29..9490c89eb94 100644 --- a/code/modules/surgery/ribcage.dm +++ b/code/modules/surgery/ribcage.dm @@ -219,10 +219,10 @@ user.visible_message("[user] starts sealing the rupture in [target]'s lungs with regenerative membrane.", \ "You start mending the rupture in [target]'s lungs with regenerative membrane." ) if(heart.damage > 0) - if(heart.robotic < 2) + if(!heart.desc == "Mechanical") user.visible_message("[user] starts mending the bruises on [target]'s heart with regenerative membrane.", \ "You start mending the bruises on [target]'s heart with regenerative membrane." ) - if(heart.robotic == 2) + else user.visible_message("\blue [user] attempts to repair [target]'s mechanical heart with regenerative membrane...", \ "\blue You attempt to repair [target]'s heart with regenerative membrane...") if(liver.damage > 0) @@ -237,10 +237,10 @@ user.visible_message("[user] starts covering the rupture in [target]'s lungs with the poultice.", \ "You start covering the rupture in [target]'s lungs with the poultice." ) if(heart.damage > 0) - if(heart.robotic < 2) + if(!heart.desc == "Mechanical") user.visible_message("[user] starts mending the bruises on [target]'s heart with the poultice.", \ "You start mending the bruises on [target]'s heart with the poultice." ) - if(heart.robotic == 2) + else user.visible_message("\blue [user] attempts to repair [target]'s mechanical heart with \the [tool]...", \ "\blue You attempt to repair [target]'s heart with \the [tool]...") if(liver.damage > 0) @@ -254,10 +254,10 @@ "You start mending the rupture in [target]'s lungs \the [tool]." ) else if(heart.damage > 0) - if(heart.robotic < 2) + if(!heart.desc == "Mechanical") user.visible_message("[user] starts mending the bruises on [target]'s heart with \the [tool].", \ "You start mending the bruises on [target]'s heart with \the [tool]." ) - if(heart.robotic == 2) + else user.visible_message("\blue [user] attempts to repair [target]'s mechanical heart with \the [tool]...", \ "\blue You attempt to repair [target]'s heart with \the [tool]...") if(liver.damage > 0) @@ -281,7 +281,7 @@ lungs.damage = 0 if(heart.damage > 0) - if(heart.robotic == 2) + if(heart.desc == "Mechanical") user.visible_message("\blue [user] pokes [target]'s mechanical heart with \the [tool].", \ "\red [target]'s heart is not organic, you cannot operate on it with \the [tool]!") else @@ -363,7 +363,7 @@ var/datum/organ/internal/heart/heart = target.internal_organs_by_name["heart"] if(heart.damage > 0) - if(heart.robotic == 2) + if(heart.desc == "Mechanical") user.visible_message("[user] starts mending the mechanisms on [target]'s heart with \the [tool].", \ "You start mending the mechanisms on [target]'s heart with \the [tool]." ) else @@ -375,7 +375,7 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/internal/heart/heart = target.internal_organs_by_name["heart"] if(heart.damage > 0) - if(heart.robotic == 2) + if(heart.desc == "Mechanical") user.visible_message("\blue [user] repairs [target]'s heart with \the [tool].", \ "\blue You repair [target]'s heart with \the [tool]." ) heart.damage = 0 From 80d3bff88502283a89f3fd4deb784950065c3ecf Mon Sep 17 00:00:00 2001 From: Bone White Date: Thu, 21 Aug 2014 11:23:55 +0100 Subject: [PATCH 6/6] Fixes a minor bug with pipe laying --- code/game/turfs/simulated/floor.dm | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index c911d8d3617..3691f877890 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -590,11 +590,22 @@ turf/simulated/floor/proc/update_icon() var/obj/item/pipe/P = C user.visible_message( \ - "[user] starts sliding a [P] along \the [src].", \ - "\blue You slide a [P] along \the [src].", \ + "[user] starts sliding [P] along \the [src].", \ + "\blue You slide [P] along \the [src].", \ "You hear the scrape of metal against something.") user.drop_item() - P.dir = user.dir + if (P.pipe_type in list (1,3,12)) // bent pipe rotation fix see construction.dm + P.dir = 5 + if (user.dir == 1) + P.dir = 6 + if (user.dir == 2) + P.dir = 9 + if (user.dir == 4) + P.dir = 10 + if (user.dir == 5) + P.dir = 8 + else + P.dir = user.dir P.x = src.x P.y = src.y P.z = src.z