From 2cf2eb2014674c841211339712f6ef519dc963c5 Mon Sep 17 00:00:00 2001 From: skull132 Date: Tue, 13 Oct 2015 13:34:40 +0300 Subject: [PATCH 1/9] Removing outdated & duplicate species.dm This file exists as an older duplicate. Why does it exist? No clue, but it's not used ever. So here. --- code/modules/mob/living/carbon/species.dm | 388 ---------------------- 1 file changed, 388 deletions(-) delete mode 100644 code/modules/mob/living/carbon/species.dm diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm deleted file mode 100644 index b5043fd2..00000000 --- a/code/modules/mob/living/carbon/species.dm +++ /dev/null @@ -1,388 +0,0 @@ -/* - Datum-based species. Should make for much cleaner and easier to maintain mutantrace code. -*/ - -/datum/species - var/name // Species name. - - var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set. - var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set. - var/eyes = "eyes_s" // Icon for eyes. - - var/primitive // Lesser form, if any (ie. monkey for humans) - var/tail // Name of tail image in species effects icon file. - var/language // Default racial language, if any. - var/unarmed //For empty hand harm-intent attack - var/unarmed_type = /datum/unarmed_attack - var/secondary_langs = list() // The names of secondary languages that are available to this species. - var/mutantrace // Safeguard due to old code. - - var/breath_type = "oxygen" // Non-oxygen gas breathed, if any. - var/poison_type = "phoron" // Poisonous air. - var/exhale_type = "carbon_dioxide" // Exhaled gas type. - - var/cold_level_1 = 260 // Cold damage level 1 below this point. - var/cold_level_2 = 200 // Cold damage level 2 below this point. - var/cold_level_3 = 120 // Cold damage level 3 below this point. - - var/heat_level_1 = 360 // Heat damage level 1 above this point. - var/heat_level_2 = 400 // Heat damage level 2 above this point. - var/heat_level_3 = 1000 // Heat damage level 2 above this point. - - var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing) - var/synth_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second - var/reagent_tag //Used for metabolizing reagents. - - var/darksight = 2 - var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. - var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. - var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning. - var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure. - - var/brute_mod = null // Physical damage reduction/malus. - var/burn_mod = null // Burn damage reduction/malus. - - var/flags = 0 // Various specific features. - - var/list/abilities = list() // For species-derived or admin-given powers - - var/blood_color = "#A10808" //Red. - var/flesh_color = "#FFC896" //Pink. - var/base_color //Used when setting species. - - //Used in icon caching. - var/race_key = 0 - var/icon/icon_template - -/datum/species/New() - unarmed = new unarmed_type() - -/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs. - //This is a basic humanoid limb setup. - H.organs = 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"]) - - 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) - - for(var/name in H.organs_by_name) - H.organs += H.organs_by_name[name] - - for(var/datum/organ/external/O in H.organs) - 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() - -/datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. - return - -/datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns). - if(flags & IS_SYNTHETIC) - //H.make_jittery(200) //S-s-s-s-sytem f-f-ai-i-i-i-i-lure-ure-ure-ure - H.h_style = "" - spawn(100) - //H.is_jittery = 0 - //H.jitteriness = 0 - H.update_hair() - return - - -/datum/species/proc/get_eye_icon() - return eyes - - -/datum/species/human - name = "Human" - language = "Sol Common" - primitive = /mob/living/carbon/monkey - unarmed_type = /datum/unarmed_attack/punch - - flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR - - //If you wanted to add a species-level ability: - /*abilities = list(/client/proc/test_ability)*/ - -/datum/species/unathi - name = "Unathi" - icobase = 'icons/mob/human_races/r_lizard.dmi' - deform = 'icons/mob/human_races/r_def_lizard.dmi' - language = "Sinta'unathi" - tail = "sogtail" - unarmed_type = /datum/unarmed_attack/claws - primitive = /mob/living/carbon/monkey/unathi - darksight = 3 - - cold_level_1 = 280 //Default 260 - Lower is better - cold_level_2 = 220 //Default 200 - cold_level_3 = 130 //Default 120 - - heat_level_1 = 420 //Default 360 - Higher is better - heat_level_2 = 480 //Default 400 - heat_level_3 = 1100 //Default 1000 - - flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL | HAS_SKIN_COLOR - - flesh_color = "#34AF10" - - reagent_tag = IS_UNATHI - base_color = "#066000" - -/datum/species/tajaran - name = "Tajaran" - icobase = 'icons/mob/human_races/r_tajaran.dmi' - deform = 'icons/mob/human_races/r_def_tajaran.dmi' - language = "Siik'Maas" - tail = "tajtail" - unarmed_type = /datum/unarmed_attack/claws - darksight = 8 - - cold_level_1 = 200 //Default 260 - cold_level_2 = 140 //Default 200 - cold_level_3 = 80 //Default 120 - - heat_level_1 = 330 //Default 360 - heat_level_2 = 380 //Default 400 - heat_level_3 = 800 //Default 1000 - - primitive = /mob/living/carbon/monkey/tajara - - flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL | HAS_SKIN_COLOR - - flesh_color = "#AFA59E" - base_color = "#333333" - -/datum/species/skrell - name = "Skrell" - icobase = 'icons/mob/human_races/r_skrell.dmi' - deform = 'icons/mob/human_races/r_def_skrell.dmi' - language = "Skrellian" - primitive = /mob/living/carbon/monkey/skrell - unarmed_type = /datum/unarmed_attack/punch - - flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR - - flesh_color = "#8CD7A3" - - reagent_tag = IS_SKRELL - -/datum/species/vox - name = "Vox" - icobase = 'icons/mob/human_races/r_vox.dmi' - deform = 'icons/mob/human_races/r_def_vox.dmi' - language = "Vox-pidgin" - unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. - - warning_low_pressure = 50 - hazard_low_pressure = 0 - - cold_level_1 = 80 - cold_level_2 = 50 - cold_level_3 = 0 - - eyes = "vox_eyes_s" - - breath_type = "nitrogen" - poison_type = "oxygen" - - flags = NO_SCAN - - blood_color = "#2299FC" - flesh_color = "#808D11" - - reagent_tag = IS_VOX - -/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) - - H.verbs += /mob/living/carbon/human/proc/leap - ..() - -/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H) - - H.verbs += /mob/living/carbon/human/proc/gut - H.verbs += /mob/living/carbon/human/proc/commune - ..() - -/datum/species/vox/armalis - name = "Vox Armalis" - icobase = 'icons/mob/human_races/r_armalis.dmi' - deform = 'icons/mob/human_races/r_armalis.dmi' - language = "Vox-pidgin" - unarmed_type = /datum/unarmed_attack/claws/armalis - - warning_low_pressure = 50 - hazard_low_pressure = 0 - - cold_level_1 = 80 - cold_level_2 = 50 - cold_level_3 = 0 - - heat_level_1 = 2000 - heat_level_2 = 3000 - heat_level_3 = 4000 - - brute_mod = 0.2 - burn_mod = 0.2 - - eyes = "blank_eyes" - breath_type = "nitrogen" - poison_type = "oxygen" - - flags = NO_SCAN | NO_BLOOD | HAS_TAIL | NO_PAIN | IS_WHITELISTED - - blood_color = "#2299FC" - flesh_color = "#808D11" - - tail = "armalis_tail" - icon_template = 'icons/mob/human_races/r_armalis.dmi' - - reagent_tag = IS_VOX - -/datum/species/diona - name = "Diona" - icobase = 'icons/mob/human_races/r_diona.dmi' - deform = 'icons/mob/human_races/r_def_plant.dmi' - language = "Rootspeak" - unarmed_type = /datum/unarmed_attack/diona - primitive = /mob/living/carbon/monkey/diona - - warning_low_pressure = 50 - hazard_low_pressure = -1 - - cold_level_1 = 50 - cold_level_2 = -1 - cold_level_3 = -1 - - heat_level_1 = 2000 - heat_level_2 = 3000 - heat_level_3 = 4000 - - body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not - - flags = IS_WHITELISTED | NO_BREATHE | REQUIRE_LIGHT | NO_SCAN | IS_PLANT | RAD_ABSORB | NO_BLOOD | IS_SLOW | NO_PAIN - - blood_color = "#004400" - flesh_color = "#907E4A" - - reagent_tag = IS_DIONA - -/datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H) - H.gender = NEUTER - - return ..() - -/datum/species/diona/handle_death(var/mob/living/carbon/human/H) - - var/mob/living/carbon/monkey/diona/S = new(get_turf(H)) - - if(H.mind) - H.mind.transfer_to(S) - - for(var/mob/living/carbon/monkey/diona/D in H.contents) - if(D.client) - D.loc = H.loc - else - del(D) - - H.visible_message("\red[H] splits apart with a wet slithering noise!") - -/datum/species/machine - name = "Machine" - icobase = 'icons/mob/human_races/r_machine.dmi' - deform = 'icons/mob/human_races/r_machine.dmi' - language = "Tradeband" - unarmed_type = /datum/unarmed_attack/punch - - eyes = "blank_eyes" - brute_mod = 0.5 - burn_mod = 1 - - warning_low_pressure = 50 - hazard_low_pressure = 0 - - cold_level_1 = 50 - cold_level_2 = -1 - cold_level_3 = -1 - - heat_level_1 = 500 //gives them about 25 seconds in space before taking damage - heat_level_2 = 1000 - heat_level_3 = 2000 - - synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. - - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC | NO_POISON - - blood_color = "#1F181F" - flesh_color = "#575757" - - var/brain_type = 'posibrain' // default is robots - - -//Species unarmed attacks - -/datum/unarmed_attack - var/attack_verb = list("attack") // Empty hand hurt intent verb. - var/damage = 0 // Extra empty hand attack damage. - var/attack_sound = "punch" - var/miss_sound = 'sound/weapons/punchmiss.ogg' - var/sharp = 0 - var/edge = 0 - -/datum/unarmed_attack/punch - attack_verb = list("punch") - -/datum/unarmed_attack/diona - attack_verb = list("lash", "bludgeon") - damage = 5 - -/datum/unarmed_attack/claws - attack_verb = list("scratch", "claw") - attack_sound = 'sound/weapons/slice.ogg' - miss_sound = 'sound/weapons/slashmiss.ogg' - damage = 5 - sharp = 1 - edge = 1 - -/datum/unarmed_attack/claws/armalis - attack_verb = list("slash", "claw") - damage = 10 //they're huge! they should do a little more damage, i'd even go for 15-20 maybe... - -/datum/species/kocasslani - name = "Kocasslani" - icobase = 'icons/mob/human_races/r_kocasslani.dmi' - deform = 'icons/mob/human_races/r_def_kocasslani.dmi' - language = "Sini" - darksight = 8 - - cold_level_1 = 160 //Default 260 - cold_level_2 = 100 //Default 200 - cold_level_3 = 60 //Default 120 - - heat_level_1 = 300 //Default 360 - heat_level_2 = 360 //Default 400 - heat_level_3 = 800 //Default 1000 - - flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR - -/* blood_color = "#659CEF" - flesh_color = "#D3AA8E" -*/ \ No newline at end of file From cf810e7c9da8664376eb66f2aad905f4ea66fe53 Mon Sep 17 00:00:00 2001 From: skull132 Date: Tue, 13 Oct 2015 13:36:02 +0300 Subject: [PATCH 2/9] IPC Organs - Initial Commit The basics are all here, but there are complications with making surgery code function with them properly. To be tested and troubeshot, and patched. --- code/game/mecha/mech_fabricator.dm | 6 +- code/modules/mob/living/carbon/human/life.dm | 54 ++++++-- .../mob/living/carbon/human/species.dm | 42 ++++--- .../mob/living/silicon/robot/component.dm | 25 +++- code/modules/organs/organ_alien.dm | 117 +++++++++++++++++- code/modules/organs/organ_internal.dm | 19 +-- code/modules/organs/organ_objects.dm | 23 +++- code/modules/surgery/generic.dm | 7 +- code/modules/surgery/organs_internal.dm | 34 ++++- 9 files changed, 271 insertions(+), 56 deletions(-) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index a1199642..19d78991 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -127,7 +127,9 @@ /obj/item/borg/upgrade/tasercooler, /obj/item/borg/upgrade/jetpack), - "Synthetic Coverings" = list( /obj/item/weapon/synth_skin_spray, + "Synthetic Shell Components" = list( + /obj/item/organ/eyes/robot, + /obj/item/weapon/synth_skin_spray, /obj/item/weapon/synth_skin_cartridge/paint, /obj/item/weapon/synth_skin_cartridge/skin, /obj/item/weapon/synth_skin_cartridge/fur, @@ -887,4 +889,4 @@ target.apply_damage(10, HALLOSS) target.say("*scream") spawn(10) - user.visible_message("\red [user] stops the [src] and leaves [target] resting as they are.", "\red You turn the [src] off and let go of [target].") \ No newline at end of file + user.visible_message("\red [user] stops the [src] and leaves [target] resting as they are.", "\red You turn the [src] off and let go of [target].") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1a0399fa..252a35bd 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -801,7 +801,17 @@ proc/stabilize_body_temperature() if (species.flags & IS_SYNTHETIC) - bodytemperature += species.synth_temp_gain //just keep putting out heat. + //TODO: Test these constants + var/temperatureModifier = 0 //all IS_SYNTHETIC species -need- radiators + if(!has_organ("radiator")) + temperatureModifier = 25 + else + var/datum/organ/internal/Radiator = internal_organs_by_name["radiator"] + if(Radiator.is_broken()) + temperatureModifier = 25 + else if(Radiator.is_bruised()) + temperatureModifier = 17 + bodytemperature += species.synth_temp_gain + temperatureModifier //just keep putting out heat. return var/body_temperature_difference = species.body_temperature - bodytemperature @@ -1432,15 +1442,26 @@ if(1) healths.icon_state = "health6" if(2) healths.icon_state = "health7" else - //switch(health - halloss) - switch(100 - ((species && species.flags & NO_PAIN & !IS_SYNTHETIC) ? 0 : traumatic_shock)) - if(100 to INFINITY) healths.icon_state = "health0" - if(80 to 100) healths.icon_state = "health1" - if(60 to 80) healths.icon_state = "health2" - if(40 to 60) healths.icon_state = "health3" - if(20 to 40) healths.icon_state = "health4" - if(0 to 20) healths.icon_state = "health5" - else healths.icon_state = "health6" + var/numb = 0 + if (species && (species.flags & IS_SYNTHETIC)) + var/datum/organ/internal/machine/Diagnosis_unit = internal_organs_by_name["diagnosis unit"] + if (Diagnosis_unit.is_broken()) + numb = 1 + else if (Diagnosis_unit.is_bruised() && prob(35)) + numb = 1 + + if (numb) + healths.icon_state = "health_numb" + else + //switch(health - halloss) + switch(100 - ((species && species.flags & NO_PAIN & !IS_SYNTHETIC) ? 0 : traumatic_shock)) + if(100 to INFINITY) healths.icon_state = "health0" + if(80 to 100) healths.icon_state = "health1" + if(60 to 80) healths.icon_state = "health2" + if(40 to 60) healths.icon_state = "health3" + if(20 to 40) healths.icon_state = "health4" + if(0 to 20) healths.icon_state = "health5" + else healths.icon_state = "health6" if(nutrition_icon) switch(nutrition) @@ -1483,7 +1504,18 @@ else bodytemp.icon_state = "temp-4" else var/temp_step - if (bodytemperature >= species.body_temperature) + var/numb = 0 + if (species && (species.flags & IS_SYNTHETIC)) + var/datum/organ/internal/machine/Diagnosis_unit = internal_organs_by_name["diagnosis unit"] + if (Diagnosis_unit.is_broken()) + numb = 1 + else if (Diagnosis_unit.is_bruised() && prob(35)) + numb = 1 + + if (numb) + bodytemp.icon_state = "temp_numb" + + else if (bodytemperature >= species.body_temperature) temp_step = (species.heat_level_1 - species.body_temperature)/4 if (bodytemperature >= species.heat_level_1) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ddfb8577..6fc004aa 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -201,17 +201,17 @@ // Grabs the window recieved when you click-drag someone onto you. /datum/species/proc/get_inventory_dialogue(var/mob/living/carbon/human/H) return - + //Used by xenos understanding larvae and dionaea understanding nymphs. /datum/species/proc/can_understand(var/mob/other) return - - + + /datum/species/proc/blend_preview_icon(var/icon/main_icon,var/datum/preferences/preferences,var/paint_colour) if(paint_colour) main_icon.Blend(paint_colour, ICON_ADD) - return + return if(flags & HAS_SKIN_COLOR) main_icon.Blend(rgb(preferences.r_skin, preferences.g_skin, preferences.b_skin), ICON_ADD) return @@ -220,8 +220,8 @@ main_icon.Blend(rgb(preferences.s_tone, preferences.s_tone, preferences.s_tone), ICON_ADD) else main_icon.Blend(rgb(-preferences.s_tone, -preferences.s_tone, -preferences.s_tone), ICON_SUBTRACT) - - + + /datum/species/proc/get_organ_preview_icon(var/name, var/robot, var/gendered, var/gender_string, var/datum/preferences/preferences, var/datum/synthetic_limb_cover/covering, var/paint_colour) var/icon_name = icobase if (robot) @@ -236,7 +236,7 @@ var/icon/result = new /icon(icon_name,state_name) blend_preview_icon(result,preferences,paint_colour) return result - + /datum/species/proc/get_is_preview_organ_robotic(var/name,var/datum/preferences/preferences) if (flags & IS_SYNTHETIC) @@ -245,7 +245,7 @@ var/list/organ_robotic_info=preferences.organ_data[name] if (istype(organ_robotic_info)) return TRUE - + /datum/species/proc/get_preview_organ_covering(var/name,var/datum/preferences/preferences) if (name in preferences.organ_data) var/list/organ_robotic_info=preferences.organ_data[name] @@ -254,8 +254,8 @@ if (preferences.species=="Machine") if (preferences.covering_type) return list(preferences.covering_type,rgb(preferences.r_skin,preferences.g_skin,preferences.b_skin)) - - + + /datum/species/proc/get_tail_preview_icon(var/list/preview_coverings,var/datum/preferences/preferences) var/tail_state=null if (!(isnull(preview_coverings["groin"]))) @@ -268,8 +268,8 @@ var/icon/result = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = tail_state) result.Blend(rgb(preferences.r_hair,preferences.g_hair,preferences.b_hair),ICON_ADD) return result - - + + /datum/species/proc/get_eyes_preview_icon(var/list/preview_coverings,var/datum/preferences/preferences) var/eye_state=null if (!(isnull(preview_coverings["head"]))) @@ -280,13 +280,13 @@ var/icon/result = new/icon('icons/mob/human_face.dmi',eye_state) result.Blend(rgb(preferences.r_eyes,preferences.g_eyes,preferences.b_eyes),ICON_ADD) return result - + /* This function takes a preferences object and generates a complete body and hair icon for that set of preferences. It's needlessly complicated and duplicates a lot of what's going on in update_icons. The two systems should be combined somehow, possibly by using a 'visual identity' object -that could be created from either a living human or a preferences object and then passing that to a single render function, but I'll leave that +that could be created from either a living human or a preferences object and then passing that to a single render function, but I'll leave that exercise for another day. -See code\modules\mob\new_player\preferences_setup.dm for where it's used. +See code\modules\mob\new_player\preferences_setup.dm for where it's used. - jack_fractal*/ /datum/species/proc/create_body_preview_icon(var/datum/preferences/preferences) var/gender_string = (preferences.gender==FEMALE) ? "f" : "m" @@ -578,7 +578,7 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used. rarity_value = 2 eyes = "blank_eyes" - brute_mod = 0.5 + brute_mod = 1 //Fuck yo brute mod. burn_mod = 1 warning_low_pressure = 50 @@ -602,6 +602,10 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used. has_organ = list( "heart" = /datum/organ/internal/heart, "brain" = /datum/organ/internal/brain/robot, + "eyes" = /datum/organ/internal/eyes/robot, + "radiator" = /datum/organ/internal/machine/radiator, + "chemical containment" = /datum/organ/internal/machine/bladder, + "diagnosis unit" = /datum/organ/internal/machine/diagnosis_unit, ) /datum/species/machine/create_organs(var/mob/living/carbon/human/H) ..() @@ -609,8 +613,8 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used. if (istype(brain_datum)) if (isnull(brain_datum.machine_brain_type)) brain_datum.machine_brain_type="Posibrain" - - + + /datum/species/bug name = "Vaurca" name_plural = "varucae" @@ -778,4 +782,4 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used. if(slot_back in equip_slots) equip_slots |= slot_in_backpack - equip_slots |= slot_legcuffed \ No newline at end of file + equip_slots |= slot_legcuffed diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index bb03edb4..b5208494 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -147,6 +147,7 @@ var/brute = 0 var/burn = 0 var/icon_state_broken = "broken" + var/obj/item/organ/organ_type = null // for shells. Only define if this can be placed inside an IPC during organ replacement surgery. // TODO: actual icons ;) /obj/item/robot_parts/robot_component/binary_communication_device @@ -168,7 +169,8 @@ name = "camera" icon_state = "camera" icon_state_broken = "camera_broken" - + organ_type = /obj/item/organ/eyes/robot + /obj/item/robot_parts/robot_component/law_computer name = "law computer" icon_state = "radio" @@ -178,12 +180,25 @@ name = "diagnosis unit" icon_state = "analyser" icon_state_broken = "analyser_broken" + organ_type = /obj/item/organ/machine/diagnosis_unit /obj/item/robot_parts/robot_component/radio name = "radio" icon_state = "radio" icon_state_broken = "radio_broken" +/obj/item/robot_parts/robot_component/radiator + name = "radiator" + icon_state = "radiator" + icon_state_broken = "radiator_broken" + organ_type = /obj/item/organ/machine/radiator + +/obj/item/robot_parts/robot_component/bladder + name = "chemical containment" + icon_state = "bladder" + icon_state_broken = "bladder_broken" + organ_type = /obj/item/organ/machine/bladder + // //Robotic Component Analyser, basically a health analyser for robots // @@ -227,7 +242,7 @@ user.show_message("\t Damage Specifics: [BU] - [BR]") if(M.tod && M.stat == DEAD) user.show_message("\blue Time of Disable: [M.tod]") - + if (istype(M, /mob/living/silicon/robot)) var/mob/living/silicon/robot/H = M var/list/damaged = H.get_damaged_components(1,1,1) @@ -245,7 +260,7 @@ user.show_message("\blue \t Components are OK.",1) if(H.emagged && prob(5)) user.show_message("\red \t ERROR: INTERNAL SYSTEMS COMPROMISED",1) - + if (ishuman(M) && (M:species.flags & IS_SYNTHETIC)) var/mob/living/carbon/human/H = M var/list/damaged = H.get_damaged_organs(1,1) @@ -258,8 +273,8 @@ (org.burn_dam > 0) ? "[org.burn_dam]" :0),1) else user.show_message("\blue \t Components are OK.",1) - + user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) - + src.add_fingerprint(user) return diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index 9d4bfa0b..9300c55d 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -224,4 +224,119 @@ robotic = 2 /obj/item/organ/stack/vox - name = "vox cortical stack" \ No newline at end of file + name = "vox cortical stack" + +//IPC/SHELL ORGANS. +//TODO: Make the robot_components required for these +//TODO: Make said components printable +//TODO: sprites +/datum/organ/internal/machine + removed_type = /obj/item/organ/machine + +/datum/organ/internal/machine/process() + return + +/datum/organ/internal/machine/radiator + name = "internal cooling unit" + parent_organ = "chest" + robotic = 2 + min_bruised_damage = 15 + min_broken_damage = 40 + removed_type = /obj/item/organ/machine/radiator + +/obj/item/organ/machine/radiator + name = "internal cooling unit" + icon_state = "radiator" + organ_tag = "radiator" + organ_type = /datum/organ/internal/machine/radiator + robotic = 2 + +/obj/item/organ/machine/radiator/exposed_to_the_world() + var/obj/item/robot_parts/robot_component/radiator/Radiator = new(src.loc) + if(organ_data.damage) + Radiator.brute = organ_data.damage + del(src) + return Radiator + +/datum/organ/internal/machine/bladder + name = "chemical containment" + parent_organ = "groin" + robotic = 2 + removed_type = /obj/item/organ/machine/bladder + +/datum/organ/internal/machine/bladder/process() + if(is_bruised()) + var/leakSmall = rand(1,25) + if(owner.reagents.total_volume > 0) + owner.reagents.remove_any(leakSmall) + if(owner.reagents.maximum_volume > 500) + owner.reagents.maximum_volume -= leakSmall + + if(is_broken()) + var/leakLarge = rand(25,50) + if(owner.reagents.total_volume > 0) + owner.reagents.remove_any(leakLarge) + if(owner.reagents.maximum_volume > 0) + if(owner.reagents.maximum_volume < leakLarge) + owner.reagents.maximum_volume = 0 + else + owner.reagents.maximum_volume -= leakLarge + + if(!is_bruised() && !is_broken() && owner.reagents.maximum_volume < 1000) + owner.reagents.maximum_volume = 1000 + + if(owner.reagents.reagent_list.len) + if(owner.reagents.has_reagent("sacid") || owner.reagents.has_reagent("pacid")) + take_damage(rand(0,2.5), 1) + +/obj/item/organ/machine/bladder + name = "chemical containment" + icon_state = "bladder" + organ_tag = "chemical containment" + organ_type = /datum/organ/internal/machine/bladder + robotic = 2 + +/obj/item/organ/machine/bladder/replaced(var/mob/living/carbon/human/target) + if(istype(target) && (target.species.flags & IS_SYNTHETIC)) + if(target.reagents.maximum_volume < 1000) + target.reagents.maximum_volume = 1000 + + ..() + +/obj/item/organ/machine/bladder/removed(var/mob/living/target, var/mob/living/user) + ..() + + if(istype(target, /mob/living/carbon/human)) + var/mob/living/carbon/human/Machine = target + if(Machine.species.flags & IS_SYNTHETIC) + Machine.reagents.clear_reagents() + Machine.reagents.maximum_volume = 0 + +/obj/item/organ/machine/bladder/exposed_to_the_world() + msg_scopes("We went here x2.") + var/obj/item/robot_parts/robot_component/bladder/Bladder = new(src.loc) + if(organ_data.damage) + Bladder.brute = organ_data.damage + del(src) + return Bladder + +/datum/organ/internal/machine/diagnosis_unit + name = "diagnosis unit" + parent_organ = "head" + robotic = 2 + removed_type = /obj/item/organ/machine/diagnosis_unit + +/obj/item/organ/machine/diagnosis_unit + name = "diagnosis unit" + icon_state = "diagnosis_unit" + organ_tag = "diagnosis unit" + organ_type = /datum/organ/internal/machine/diagnosis_unit + robotic = 2 + +/obj/item/organ/machine/diagnosis_unit/exposed_to_the_world() + msg_scopes("We went here.") + var/obj/item/robot_parts/robot_component/diagnosis_unit/Diagnosis_unit = new(src.loc) + if(organ_data.damage) + Diagnosis_unit.brute = organ_data.damage + del(src) + return Diagnosis_unit diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 3ee262b7..53f28e83 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -249,12 +249,12 @@ parent_organ = "head" removed_type = /obj/item/organ/brain vital = 1 - - + + /datum/organ/internal/brain/robot // brains for shells - var/machine_brain_type=null - - + var/machine_brain_type=null + + /datum/organ/internal/brain/robot/proc/create_robot_brain_replacement(var/target,var/new_location) var/obj/item/device/mmi/new_mmi if (machine_brain_type=="Posibrain") @@ -267,7 +267,7 @@ new_mmi.transfer_identity(target) new_mmi.loc = new_location return new_mmi - + /datum/organ/internal/brain/xeno removed_type = /obj/item/organ/brain/xeno @@ -284,6 +284,11 @@ if(is_broken()) owner.eye_blind = 20 +/datum/organ/internal/eyes/robot // eyes for shells + name = "charge-coupled device" + parent_organ = "head" + removed_type = /obj/item/organ/eyes/robot + /datum/organ/internal/appendix name = "appendix" parent_organ = "groin" @@ -306,4 +311,4 @@ removed_organ.update() organ_holder = removed_organ - return removed_organ \ No newline at end of file + return removed_organ diff --git a/code/modules/organs/organ_objects.dm b/code/modules/organs/organ_objects.dm index c375cbb4..2340a34e 100644 --- a/code/modules/organs/organ_objects.dm +++ b/code/modules/organs/organ_objects.dm @@ -150,6 +150,19 @@ /obj/item/organ/eyes/prosthetic robotic = 2 +/obj/item/organ/eyes/robot + name = "charge-coupled device" + icon_state = "" + organ_type = /datum/organ/internal/eyes/robot + robotic = 2 + + exposed_to_the_world() + var/obj/item/robot_parts/robot_component/camera/Camera = new() + if(organ_data.damage) + Camera.brute = organ_data.damage + del(src) + return Camera + /obj/item/organ/liver/prosthetic robotic = 2 @@ -180,11 +193,11 @@ msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [target.name] ([target.ckey]) (INTENT: [uppertext(user.a_intent)]) (JMP)") target.death() - + /obj/item/organ/proc/exposed_to_the_world() // this is only useful for organs that change when actually removed from the body - return - - + return + + /obj/item/organ/appendix/removed(var/mob/living/target,var/mob/living/user) ..() @@ -277,4 +290,4 @@ if(fingerprintslast) O.fingerprintslast = fingerprintslast user.put_in_active_hand(O) - del(src) \ No newline at end of file + del(src) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 0cf7dfef..b9a234aa 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -17,10 +17,11 @@ return 0 if (affected.status & ORGAN_DESTROYED) return 0 - if (target_zone == "head" && target.species && (target.species.flags & IS_SYNTHETIC)) - return 1 if (affected.status & ORGAN_ROBOT) - return 0 + if (target.species && (target.species.flags & IS_SYNTHETIC) && affected.internal_organs.len) + return 1 + else + return 0 return 1 /datum/surgery_step/generic/cut_with_laser diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 3ea958bb..77076203 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -320,7 +320,8 @@ /datum/surgery_step/internal/replace_organ allowed_tools = list( - /obj/item/organ = 100 + /obj/item/organ = 100, + /obj/item/robot_parts/robot_component = 100 ) min_duration = 60 @@ -334,7 +335,16 @@ var/organ_compatible var/organ_missing - if(!istype(O)) + if(!istype(O) && istype(O, /obj/item/robot_parts/robot_component)) + msg_scopes("Component's type: [tool.type].") + var/obj/item/robot_parts/robot_component/A = tool + msg_scopes("Component's organ_type: [A.organ_type].") + if(A.organ_type) + O = new A.organ_type() + O.update() + else + return 0 + else return 0 if(!target.species) @@ -357,6 +367,19 @@ user << "\red \The [target] already has [o_a][O.organ_tag]." return 2 + msg_scopes("Affected.name: [affected.name].") + msg_scopes("Parent_organ: [O.organ_data.parent_organ].") + msg_scopes("Organ_data.type: [O.organ_data.type].") + if(O.organ_data) + msg_scopes("We have organ data.") + else + msg_scopes("No organ data.") + + if(affected.name == O.organ_data.parent_organ) + msg_scopes("Affected name matches parent_organ.") + else + msg_scopes("Affected name does not match parent_organ.") + if(O.organ_data && affected.name == O.organ_data.parent_organ) organ_compatible = 1 else @@ -383,6 +406,11 @@ var/obj/item/organ/O = tool if(istype(O)) O.replaced(target,affected) + else if(istype(tool, /obj/item/robot_parts/robot_component)) + var/obj/item/robot_parts/robot_component/A = tool + if(A.organ_type) + O = A.organ_type + O.replaced(target,affected) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\red [user]'s hand slips, damaging \the [tool]!", \ @@ -455,4 +483,4 @@ // max_duration = 40 // can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) -// return ..() && target.op_stage.ribcage == 2 \ No newline at end of file +// return ..() && target.op_stage.ribcage == 2 From 5ff3f5f13c7f4a358475632adad5eabea513a9ec Mon Sep 17 00:00:00 2001 From: skull132 Date: Tue, 13 Oct 2015 13:36:31 +0300 Subject: [PATCH 3/9] IPC Organs - robot_component.dmi update Adds new icons for the IPC organs/internal components. --- icons/obj/robot_component.dmi | Bin 2415 -> 2966 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/robot_component.dmi b/icons/obj/robot_component.dmi index 1129f25ab1c10c0121614dd223c23cac16a06fd2..bb53a0ab69242ae0763ffde605bd63bbd77b4a72 100644 GIT binary patch delta 2853 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 DZ_#Jn delta 2313 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 From b2e8f126a4768c5e62162b5654009a2d51bdcf0a Mon Sep 17 00:00:00 2001 From: skull132 Date: Tue, 13 Oct 2015 13:37:10 +0300 Subject: [PATCH 4/9] IPC Organs - surgery.dmi update Adds organs to surgery.dmi. I'm unsure if this is necessary, so it may get reverted later on. --- icons/obj/surgery.dmi | Bin 14743 -> 15388 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 202ec39bc8c2a8b13c4f403a0cf437b559e69e45..694752e10824a7532c4e7dac28b5f3b7ab2ea804 100644 GIT binary patch literal 15388 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 From 2c9f9a1854e11cae4fcdcd9089cdd28301acd637 Mon Sep 17 00:00:00 2001 From: skull132 Date: Wed, 21 Oct 2015 20:43:05 +0300 Subject: [PATCH 5/9] Admin - Identify target species So that admins and mods can easily see what species a specific mob is, through the "More information" button (?). --- code/modules/admin/topic.dm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index dfb14c9e..d985f847 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1366,6 +1366,7 @@ var/special_role_description = "" var/health_description = "" var/gender_description = "" + var/species_description = "" var/turf/T = get_turf(M) //Location @@ -1399,8 +1400,18 @@ if(MALE,FEMALE) gender_description = "[M.gender]" else gender_description = "[M.gender]" + //Species + if(ishuman(M)) + var/mob/living/carbon/human/K = M + if(K.species) + species_description = "[K.species.name]" + else + species_description = "Unknown" + else + species_description = "N/A" + src.owner << "Info about [M.name]: " - src.owner << "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]" + src.owner << "Mob type = [M.type]; Species = [species_description]; Gender = [gender_description]; Damage = [health_description]" src.owner << "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];" src.owner << "Location = [location_description];" src.owner << "[special_role_description]" From 563c584d585d43a6331a1dfed7c552edaf3f4dc1 Mon Sep 17 00:00:00 2001 From: skull132 Date: Wed, 21 Oct 2015 20:44:00 +0300 Subject: [PATCH 6/9] IPC Organs - surgery fixes, debug removal Fixes the glitches and runtime errors with surgery code. Removes the debug messages put in place. --- .../mob/living/silicon/robot/component.dm | 15 +++++++++++---- code/modules/surgery/organs_internal.dm | 18 +----------------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index b5208494..8f836208 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -149,6 +149,13 @@ var/icon_state_broken = "broken" var/obj/item/organ/organ_type = null // for shells. Only define if this can be placed inside an IPC during organ replacement surgery. +// In case the robot_component has a child organ, it is updated to have the proper datums and so on. +/obj/item/robot_parts/robot_component/New() + ..() + spawn(5) + if(organ_type) + organ_type.update() + // TODO: actual icons ;) /obj/item/robot_parts/robot_component/binary_communication_device name = "binary communication device" @@ -169,7 +176,7 @@ name = "camera" icon_state = "camera" icon_state_broken = "camera_broken" - organ_type = /obj/item/organ/eyes/robot + organ_type = new /obj/item/organ/eyes/robot() /obj/item/robot_parts/robot_component/law_computer name = "law computer" @@ -180,7 +187,7 @@ name = "diagnosis unit" icon_state = "analyser" icon_state_broken = "analyser_broken" - organ_type = /obj/item/organ/machine/diagnosis_unit + organ_type = new /obj/item/organ/machine/diagnosis_unit() /obj/item/robot_parts/robot_component/radio name = "radio" @@ -191,13 +198,13 @@ name = "radiator" icon_state = "radiator" icon_state_broken = "radiator_broken" - organ_type = /obj/item/organ/machine/radiator + organ_type = new /obj/item/organ/machine/radiator() /obj/item/robot_parts/robot_component/bladder name = "chemical containment" icon_state = "bladder" icon_state_broken = "bladder_broken" - organ_type = /obj/item/organ/machine/bladder + organ_type = new /obj/item/organ/machine/bladder() // //Robotic Component Analyser, basically a health analyser for robots diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 77076203..71189a51 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -336,12 +336,9 @@ var/organ_missing if(!istype(O) && istype(O, /obj/item/robot_parts/robot_component)) - msg_scopes("Component's type: [tool.type].") var/obj/item/robot_parts/robot_component/A = tool - msg_scopes("Component's organ_type: [A.organ_type].") if(A.organ_type) - O = new A.organ_type() - O.update() + O = A.organ_type else return 0 else @@ -367,19 +364,6 @@ user << "\red \The [target] already has [o_a][O.organ_tag]." return 2 - msg_scopes("Affected.name: [affected.name].") - msg_scopes("Parent_organ: [O.organ_data.parent_organ].") - msg_scopes("Organ_data.type: [O.organ_data.type].") - if(O.organ_data) - msg_scopes("We have organ data.") - else - msg_scopes("No organ data.") - - if(affected.name == O.organ_data.parent_organ) - msg_scopes("Affected name matches parent_organ.") - else - msg_scopes("Affected name does not match parent_organ.") - if(O.organ_data && affected.name == O.organ_data.parent_organ) organ_compatible = 1 else From 692b3dc779d7c79878b4140b4047c0206870457f Mon Sep 17 00:00:00 2001 From: skull132 Date: Wed, 21 Oct 2015 23:18:56 +0300 Subject: [PATCH 7/9] IPC Organs - life.dm fixes Reads the presence and status of organs properly! --- code/modules/mob/living/carbon/human/life.dm | 47 +++++++++++--------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 252a35bd..5e14402c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -801,16 +801,18 @@ proc/stabilize_body_temperature() if (species.flags & IS_SYNTHETIC) - //TODO: Test these constants - var/temperatureModifier = 0 //all IS_SYNTHETIC species -need- radiators - if(!has_organ("radiator")) - temperatureModifier = 25 - else - var/datum/organ/internal/Radiator = internal_organs_by_name["radiator"] - if(Radiator.is_broken()) + var/temperatureModifier = 0 + if(species.has_organ["radiator"]) + if(internal_organs_by_name["radiator"]) + var/datum/organ/internal/Radiator = internal_organs_by_name["radiator"] + if(Radiator.is_broken()) + temperatureModifier = 25 + if(bodytemperature > 450 && prob(10)) + apply_damage(rand(1, 5), BURN) + else if(Radiator.is_bruised()) + temperatureModifier = 18 + else temperatureModifier = 25 - else if(Radiator.is_bruised()) - temperatureModifier = 17 bodytemperature += species.synth_temp_gain + temperatureModifier //just keep putting out heat. return @@ -1443,11 +1445,14 @@ if(2) healths.icon_state = "health7" else var/numb = 0 - if (species && (species.flags & IS_SYNTHETIC)) - var/datum/organ/internal/machine/Diagnosis_unit = internal_organs_by_name["diagnosis unit"] - if (Diagnosis_unit.is_broken()) - numb = 1 - else if (Diagnosis_unit.is_bruised() && prob(35)) + if (species.has_organ["diagnosis unit"]) + if (internal_organs_by_name["diagnosis unit"]) + var/datum/organ/internal/machine/Diagnosis_unit = internal_organs_by_name["diagnosis unit"] + if (Diagnosis_unit.is_broken()) + numb = 1 + else if (Diagnosis_unit.is_bruised() && prob(35)) + numb = 1 + else numb = 1 if (numb) @@ -1505,12 +1510,14 @@ else var/temp_step var/numb = 0 - if (species && (species.flags & IS_SYNTHETIC)) - var/datum/organ/internal/machine/Diagnosis_unit = internal_organs_by_name["diagnosis unit"] - if (Diagnosis_unit.is_broken()) - numb = 1 - else if (Diagnosis_unit.is_bruised() && prob(35)) - numb = 1 + if (species.has_organ["diagnosis unit"]) + if(internal_organs_by_name["diagnosis unit"]) + var/datum/organ/internal/machine/Diagnosis_unit = internal_organs_by_name["diagnosis unit"] + if (Diagnosis_unit.is_broken()) + numb = 1 + else if (Diagnosis_unit.is_bruised() && prob(35)) + numb = 1 + else numb = 1 if (numb) bodytemp.icon_state = "temp_numb" From e08b1859af4a2ca28deba44a6388bd884aedc1a6 Mon Sep 17 00:00:00 2001 From: skull132 Date: Wed, 21 Oct 2015 23:19:27 +0300 Subject: [PATCH 8/9] IPC Organs - final fixes, debug removal More debug message removals. Also fixes the bladder to work properly, depending on its status and so on. --- code/modules/organs/organ_alien.dm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index 9300c55d..c473d377 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -265,8 +265,11 @@ removed_type = /obj/item/organ/machine/bladder /datum/organ/internal/machine/bladder/process() + if(status & ORGAN_CUT_AWAY) + return + if(is_bruised()) - var/leakSmall = rand(1,25) + var/leakSmall = rand(1,5) if(owner.reagents.total_volume > 0) owner.reagents.remove_any(leakSmall) if(owner.reagents.maximum_volume > 500) @@ -282,9 +285,6 @@ else owner.reagents.maximum_volume -= leakLarge - if(!is_bruised() && !is_broken() && owner.reagents.maximum_volume < 1000) - owner.reagents.maximum_volume = 1000 - if(owner.reagents.reagent_list.len) if(owner.reagents.has_reagent("sacid") || owner.reagents.has_reagent("pacid")) take_damage(rand(0,2.5), 1) @@ -313,7 +313,6 @@ Machine.reagents.maximum_volume = 0 /obj/item/organ/machine/bladder/exposed_to_the_world() - msg_scopes("We went here x2.") var/obj/item/robot_parts/robot_component/bladder/Bladder = new(src.loc) if(organ_data.damage) Bladder.brute = organ_data.damage @@ -334,7 +333,6 @@ robotic = 2 /obj/item/organ/machine/diagnosis_unit/exposed_to_the_world() - msg_scopes("We went here.") var/obj/item/robot_parts/robot_component/diagnosis_unit/Diagnosis_unit = new(src.loc) if(organ_data.damage) Diagnosis_unit.brute = organ_data.damage From d8cccc80f54f2214fc0181d08e28c8e19412450b Mon Sep 17 00:00:00 2001 From: skull132 Date: Wed, 21 Oct 2015 23:21:32 +0300 Subject: [PATCH 9/9] IPC Organs - adding new components to mecha fabs --- code/game/mecha/mech_fabricator.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 19d78991..bb3641de 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -52,7 +52,9 @@ /obj/item/robot_parts/robot_component/diagnosis_unit, /obj/item/robot_parts/robot_component/camera, /obj/item/robot_parts/robot_component/law_computer, - /obj/item/robot_parts/robot_component/armour + /obj/item/robot_parts/robot_component/armour, + /obj/item/robot_parts/robot_component/radiator, + /obj/item/robot_parts/robot_component/bladder ), "Ripley"=list( /obj/item/mecha_parts/chassis/ripley,