From 958494ae751305fd98e8b6e36b68480dd82fe7bb Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 23 May 2015 15:07:40 +0930 Subject: [PATCH] Removed IS_SYNTHETIC and REGENERATES_LIMBS flags. Moved some organ code around, added icons and limbs for IPC, added IPC limb manufacturer. Reimplementing checks in place of IS_SYNTHETIC. Rebalancing EMP a bit for IPC. --- baystation12.dme | 7 +- code/_onclick/other_mobs.dm | 2 - code/game/antagonist/alien/borer.dm | 5 +- code/game/objects/items/devices/scanners.dm | 2 +- .../objects/items/weapons/cigs_lighters.dm | 5 - .../objects/items/weapons/material/shards.dm | 2 +- code/game/objects/items/weapons/tools.dm | 9 - code/modules/client/preferences.dm | 4 - code/modules/mob/living/carbon/breathe.dm | 18 +- .../mob/living/carbon/human/examine.dm | 5 +- code/modules/mob/living/carbon/human/human.dm | 11 +- .../mob/living/carbon/human/human_damage.dm | 6 +- code/modules/mob/living/carbon/human/life.dm | 20 +- .../living/carbon/human/species/species.dm | 10 +- .../carbon/human/species/station/slime.dm | 22 +-- .../carbon/human/species/station/station.dm | 34 ++-- .../mob/living/silicon/robot/analyzer.dm | 18 +- code/modules/mob/mob_helpers.dm | 6 +- code/modules/organs/misc.dm | 73 +++++++ code/modules/organs/organ.dm | 35 ++-- code/modules/organs/organ_external.dm | 183 +---------------- code/modules/organs/organ_icon.dm | 2 +- code/modules/organs/robolimbs.dm | 6 + .../{organ_alien.dm => subtypes/diona.dm} | 186 ------------------ code/modules/organs/subtypes/machine.dm | 67 +++++++ code/modules/organs/subtypes/standard.dm | 163 +++++++++++++++ code/modules/organs/subtypes/unbreakable.dm | 44 +++++ code/modules/organs/subtypes/xenos.dm | 66 +++++++ code/modules/power/apc.dm | 29 +-- code/modules/power/cable.dm | 5 - .../Chemistry-Reagents-Food-Drinks.dm | 8 +- code/modules/reagents/reagent_containers.dm | 18 +- .../reagent_containers/food/snacks.dm | 10 +- .../reagents/reagent_containers/pill.dm | 11 +- code/modules/surgery/generic.dm | 2 - code/modules/virus2/admin.dm | 9 +- code/modules/virus2/disease2.dm | 2 +- code/setup.dm | 20 +- icons/mob/human_races/cyberlimbs/ipc.dmi | Bin 0 -> 1716 bytes icons/mob/human_races/r_machine.dmi | Bin 1825 -> 0 bytes 40 files changed, 564 insertions(+), 561 deletions(-) create mode 100644 code/modules/organs/misc.dm rename code/modules/organs/{organ_alien.dm => subtypes/diona.dm} (52%) create mode 100644 code/modules/organs/subtypes/machine.dm create mode 100644 code/modules/organs/subtypes/standard.dm create mode 100644 code/modules/organs/subtypes/unbreakable.dm create mode 100644 code/modules/organs/subtypes/xenos.dm create mode 100644 icons/mob/human_races/cyberlimbs/ipc.dmi delete mode 100644 icons/mob/human_races/r_machine.dmi diff --git a/baystation12.dme b/baystation12.dme index 76a77ca0a23..1d8f71a79a8 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1334,8 +1334,8 @@ #include "code\modules\nano\modules\power_monitor.dm" #include "code\modules\nano\modules\rcon.dm" #include "code\modules\organs\blood.dm" +#include "code\modules\organs\misc.dm" #include "code\modules\organs\organ.dm" -#include "code\modules\organs\organ_alien.dm" #include "code\modules\organs\organ_external.dm" #include "code\modules\organs\organ_icon.dm" #include "code\modules\organs\organ_internal.dm" @@ -1343,6 +1343,11 @@ #include "code\modules\organs\pain.dm" #include "code\modules\organs\robolimbs.dm" #include "code\modules\organs\wound.dm" +#include "code\modules\organs\subtypes\diona.dm" +#include "code\modules\organs\subtypes\machine.dm" +#include "code\modules\organs\subtypes\standard.dm" +#include "code\modules\organs\subtypes\unbreakable.dm" +#include "code\modules\organs\subtypes\xenos.dm" #include "code\modules\overmap\_defines.dm" #include "code\modules\overmap\sectors.dm" #include "code\modules\overmap\ships\ship.dm" diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 477fb04b7ad..179a470fc6b 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -97,8 +97,6 @@ if (powerlevel > 0 && !istype(A, /mob/living/carbon/slime)) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - return stunprob *= H.species.siemens_coefficient diff --git a/code/game/antagonist/alien/borer.dm b/code/game/antagonist/alien/borer.dm index 9fe4226e5bb..706c8dbece8 100644 --- a/code/game/antagonist/alien/borer.dm +++ b/code/game/antagonist/alien/borer.dm @@ -33,7 +33,10 @@ var/datum/antagonist/xenos/borer/borers /datum/antagonist/xenos/borer/proc/get_hosts() var/list/possible_hosts = list() for(var/mob/living/carbon/human/H in mob_list) - if(H.stat != 2 && !(H.species.flags & IS_SYNTHETIC) && !H.has_brain_worms()) + var/obj/item/organ/external/head/head = H.get_organ("head") + if(head.status & ORGAN_ROBOT) + continue + if(H.stat != 2 && !H.has_brain_worms()) possible_hosts |= H return possible_hosts diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index a29d39743ed..54fd83b162e 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -93,7 +93,7 @@ REAGENT SCANNER return user.visible_message(" [user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.") - if (!istype(M, /mob/living/carbon) || (ishuman(M) && (M:species.flags & IS_SYNTHETIC))) + if (!istype(M, /mob/living/carbon) || ishuman(M)) //these sensors are designed for organic life user.show_message("\blue Analyzing Results for ERROR:\n\t Overall Status: ERROR") user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index d59a1cdea57..a533b9adae8 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -109,11 +109,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(iscarbon(loc)) var/mob/living/carbon/C = loc if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob - if(istype(C, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = C - if(H.species.flags & IS_SYNTHETIC) - return - reagents.trans_to_mob(C, REM, CHEM_INGEST, 0.2) // Most of it is not inhaled... balance reasons. else // else just remove some of the reagents reagents.remove_any(REM) diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 6c2eb7ced35..cf7ebba2b44 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -67,7 +67,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5)) //Thick skin. + if(H.species.siemens_coefficient<0.5) //Thick skin. return if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) ) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 0c563215c73..a8c4fbd44a3 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -329,8 +329,6 @@ var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] if(!E) return - if(H.species.flags & IS_SYNTHETIC) - return switch(safety) if(1) usr << "\red Your eyes sting a little." @@ -427,13 +425,6 @@ if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP) return ..() - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - if(M == user) - user << "\red You can't repair damage to your own body - it's against OH&S." - return - 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.name] with \the [src].") diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index fcbd8902638..0848c17a119 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -634,10 +634,6 @@ datum/preferences dat += "
Has a variety of eye colours." if(current_species.flags & IS_PLANT) dat += "
Has a plantlike physiology." - if(current_species.flags & IS_SYNTHETIC) - dat += "
Is machine-based." - if(current_species.flags & REGENERATES_LIMBS) - dat += "
Has a plantlike physiology." dat += "" dat += "" dat += "

" diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm index b467b88cd2e..62f14da4996 100644 --- a/code/modules/mob/living/carbon/breathe.dm +++ b/code/modules/mob/living/carbon/breathe.dm @@ -2,14 +2,14 @@ /mob/living/carbon/proc/breathe() //if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return - if(species && (species.flags & NO_BREATHE || species.flags & IS_SYNTHETIC)) return - + if(species && (species.flags & NO_BREATHE)) return + var/datum/gas_mixture/breath = null - + //First, check if we can breathe at all if(health < config.health_threshold_crit && !(CE_STABLE in chem_effects)) //crit aka circulatory shock losebreath++ - + if(losebreath>0) //Suffocating so do not take a breath losebreath-- if (prob(10)) //Gasp per 10 ticks? Sounds about right. @@ -17,9 +17,9 @@ else //Okay, we can breathe, now check if we can get air breath = get_breath_from_internal() //First, check for air from internals - if(!breath) + if(!breath) breath = get_breath_from_environment() //No breath from internals so let's try to get air from our location - + handle_breath(breath) handle_post_breath(breath) @@ -40,15 +40,15 @@ /mob/living/carbon/proc/get_breath_from_environment(var/volume_needed=BREATH_VOLUME) var/datum/gas_mixture/breath = null - + var/datum/gas_mixture/environment if(loc) environment = loc.return_air_for_internal_lifeform() - + if(environment) breath = environment.remove_volume(volume_needed) handle_chemical_smoke(environment) //handle chemical smoke while we're at it - + if(breath) //handle mask filtering if(istype(wear_mask, /obj/item/clothing/mask) && breath) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index dad4e902446..d6510c2bf84 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -270,9 +270,8 @@ if(temp) if(temp.status & ORGAN_ROBOT) if(!(temp.brute_dam + temp.burn_dam)) - if(!species.flags & IS_SYNTHETIC) - wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]!\n" - continue + wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]!\n" + continue else wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]. It has[temp.get_wounds_desc()]!\n" else if(temp.wounds.len > 0 || temp.open) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 02f198e9dd1..8bc819657c8 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -746,10 +746,17 @@ xylophone=0 return +/mob/living/carbon/human/proc/check_has_mouth() + // Todo, check stomach organ when implemented. + var/obj/item/organ/external/head/H = get_organ("head") + if(!H || !H.can_intake_reagents) + return 0 + return 1 + /mob/living/carbon/human/proc/vomit() - if(species.flags & IS_SYNTHETIC) - return //Machines don't throw up. + if(!check_has_mouth()) + return if(!lastpuke) lastpuke = 1 diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 04ca8922257..298c4fa6251 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -142,12 +142,12 @@ ..() /mob/living/carbon/human/getCloneLoss() - if(species.flags & (IS_SYNTHETIC | NO_SCAN)) + if(species.flags & (NO_SCAN)) cloneloss = 0 return ..() /mob/living/carbon/human/setCloneLoss(var/amount) - if(species.flags & (IS_SYNTHETIC | NO_SCAN)) + if(species.flags & (NO_SCAN)) cloneloss = 0 else ..() @@ -155,7 +155,7 @@ /mob/living/carbon/human/adjustCloneLoss(var/amount) ..() - if(species.flags & (IS_SYNTHETIC | NO_SCAN)) + if(species.flags & (NO_SCAN)) cloneloss = 0 return diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 84a6fb82902..ca7ed1af3db 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -258,9 +258,6 @@ proc/handle_mutations_and_radiation() - if(species.flags & IS_SYNTHETIC) //Robots don't suffer from mutations or radloss. - return - if(getFireLoss()) if((COLD_RESISTANCE in mutations) || (prob(1))) heal_organ_damage(0,1) @@ -709,9 +706,9 @@ */ proc/stabilize_body_temperature() - if (species.flags & IS_SYNTHETIC) - bodytemperature += species.synth_temp_gain //just keep putting out heat. - return + + if (species.passive_temp_gain) // We produce heat naturally. + bodytemperature += species.passive_temp_gain var/body_temperature_difference = species.body_temperature - bodytemperature @@ -858,7 +855,9 @@ proc/handle_chemicals_in_body() - if(reagents && !(species.flags & IS_SYNTHETIC)) //Synths don't process reagents. + // TODO: stomach and bloodstream organ. + + if(reagents) chem_effects.Cut() analgesic = 0 var/alien = 0 @@ -931,7 +930,8 @@ take_overall_damage(2,0) traumatic_shock++ - if(!(species.flags & IS_SYNTHETIC)) handle_trace_chems() + // TODO: stomach and bloodstream organ. + handle_trace_chems() updatehealth() @@ -1133,7 +1133,7 @@ if(damageoverlay.overlays) damageoverlay.overlays = list() - + if(stat == UNCONSCIOUS) //Critical damage passage overlay if(health <= 0) @@ -1268,7 +1268,7 @@ if(2) healths.icon_state = "health7" else //switch(health - halloss) - switch(100 - ((species && species.flags & NO_PAIN & !IS_SYNTHETIC) ? 0 : traumatic_shock)) + switch(100 - ((species.flags & NO_PAIN) ? 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" diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 1bc6ca880a5..057fabcb5fc 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -29,6 +29,7 @@ var/icon/icon_template // Used for mob icon generation for non-32x32 species. var/is_small var/show_ssd = 1 + var/virus_immune // Language/culture vars. var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers. @@ -69,7 +70,7 @@ 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 3 above this point. - var/synth_temp_gain = 0 // IS_SYNTHETIC species will gain this much temperature every second + var/passive_temp_gain = 0 // Species will gain this much temperature every second 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. @@ -213,13 +214,6 @@ for(var/obj/item/organ/external/O in H.organs) O.owner = H - if(flags & IS_SYNTHETIC) - for(var/obj/item/organ/external/E in H.organs) - if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue - E.robotize() - for(var/obj/item/organ/I in H.internal_organs) - I.robotize() - /datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target) var/t_him = "them" diff --git a/code/modules/mob/living/carbon/human/species/station/slime.dm b/code/modules/mob/living/carbon/human/species/station/slime.dm index 6d5e918a957..d166a655208 100644 --- a/code/modules/mob/living/carbon/human/species/station/slime.dm +++ b/code/modules/mob/living/carbon/human/species/station/slime.dm @@ -30,17 +30,17 @@ push_flags = MONKEY|SLIME|SIMPLE_ANIMAL has_limbs = list( - "chest" = list("path" = /obj/item/organ/external/chest/slime), - "groin" = list("path" = /obj/item/organ/external/groin/slime), - "head" = list("path" = /obj/item/organ/external/head/slime), - "l_arm" = list("path" = /obj/item/organ/external/arm/slime), - "r_arm" = list("path" = /obj/item/organ/external/arm/right/slime), - "l_leg" = list("path" = /obj/item/organ/external/leg/slime), - "r_leg" = list("path" = /obj/item/organ/external/leg/right/slime), - "l_hand" = list("path" = /obj/item/organ/external/hand/slime), - "r_hand" = list("path" = /obj/item/organ/external/hand/right/slime), - "l_foot" = list("path" = /obj/item/organ/external/foot/slime), - "r_foot" = list("path" = /obj/item/organ/external/foot/right/slime) + "chest" = list("path" = /obj/item/organ/external/chest/unbreakable), + "groin" = list("path" = /obj/item/organ/external/groin/unbreakable), + "head" = list("path" = /obj/item/organ/external/head/unbreakable), + "l_arm" = list("path" = /obj/item/organ/external/arm/unbreakable), + "r_arm" = list("path" = /obj/item/organ/external/arm/right/unbreakable), + "l_leg" = list("path" = /obj/item/organ/external/leg/unbreakable), + "r_leg" = list("path" = /obj/item/organ/external/leg/right/unbreakable), + "l_hand" = list("path" = /obj/item/organ/external/hand/unbreakable), + "r_hand" = list("path" = /obj/item/organ/external/hand/right/unbreakable), + "l_foot" = list("path" = /obj/item/organ/external/foot/unbreakable), + "r_foot" = list("path" = /obj/item/organ/external/foot/right/unbreakable) ) /datum/species/slime/handle_death(var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 985a5dac097..e54447dc43a 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -195,7 +195,7 @@ body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not - flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP | REGENERATES_LIMBS + flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP blood_color = "#004400" flesh_color = "#907E4A" @@ -237,8 +237,6 @@ name = "Machine" name_plural = "machines" - icobase = 'icons/mob/human_races/r_machine.dmi' - deform = 'icons/mob/human_races/r_machine.dmi' language = "Tradeband" unarmed_types = list(/datum/unarmed_attack/punch) rarity_value = 2 @@ -254,24 +252,38 @@ cold_level_2 = -1 cold_level_3 = -1 - heat_level_1 = 500 //gives them about 25 seconds in space before taking damage + 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. + passive_temp_gain = 10 // This should cause IPCs to stabilize at ~80 C in a 20 C environment. + siemens_coefficient = 0 // Insulated. - flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC + flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_POISON blood_color = "#1F181F" flesh_color = "#575757" + virus_immune = 1 + reagent_tag = IS_MACHINE has_organ = list() //TODO: Positronic brain. -/datum/species/machine/equip_survival_gear(var/mob/living/carbon/human/H) + has_limbs = list( + "chest" = list("path" = /obj/item/organ/external/chest/ipc), + "groin" = list("path" = /obj/item/organ/external/groin/ipc), + "head" = list("path" = /obj/item/organ/external/head/ipc), + "l_arm" = list("path" = /obj/item/organ/external/arm/ipc), + "r_arm" = list("path" = /obj/item/organ/external/arm/right/ipc), + "l_leg" = list("path" = /obj/item/organ/external/leg/ipc), + "r_leg" = list("path" = /obj/item/organ/external/leg/right/ipc), + "l_hand" = list("path" = /obj/item/organ/external/hand/ipc), + "r_hand" = list("path" = /obj/item/organ/external/hand/right/ipc), + "l_foot" = list("path" = /obj/item/organ/external/foot/ipc), + "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc) + ) /datum/species/machine/handle_death(var/mob/living/carbon/human/H) ..() - if(flags & IS_SYNTHETIC) - H.h_style = "" - spawn(100) - if(H) H.update_hair() + H.h_style = "" + spawn(100) + if(H) H.update_hair() diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index 75556cf3041..c7d2fee533f 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -26,10 +26,7 @@ user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("\blue Body Temperature: ???", 1) return - if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - user << "\red You don't have the dexterity to do this!" - return - if(!istype(M, /mob/living/silicon/robot) && !(ishuman(M) && (M:species.flags & IS_SYNTHETIC))) + if(!istype(M, /mob/living/silicon/robot)) //todo add limb analysis user << "\red You can't analyze non-robotic things!" return @@ -60,19 +57,6 @@ 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) - user.show_message("\blue Localized Damage, Brute/Electronics:",1) - if(length(damaged)>0) - for(var/obj/item/organ/external/org in damaged) - user.show_message(text("\blue \t []: [] - []", \ - capitalize(org.name), \ - (org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \ - (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) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 17def087b35..79115b61b29 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -104,7 +104,11 @@ return 0 /mob/living/carbon/human/isSynthetic() - return species.flags & IS_SYNTHETIC + // If they are 100% robotic, they count as synthetic. + for(var/obj/item/organ/external/E in organs) + if(!(E.status & ORGAN_ROBOT)) + return 0 + return 1 /mob/living/silicon/isSynthetic() return 1 diff --git a/code/modules/organs/misc.dm b/code/modules/organs/misc.dm new file mode 100644 index 00000000000..8a969884529 --- /dev/null +++ b/code/modules/organs/misc.dm @@ -0,0 +1,73 @@ +//CORTICAL BORER ORGANS. +/obj/item/organ/borer + name = "cortical borer" + parent_organ = "head" + vital = 1 + +/obj/item/organ/borer/process() + + // Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss. + for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine")) + if(owner.reagents.get_reagent_amount(chem) < 3) + owner.reagents.add_reagent(chem, 5) + + // They're also super gross and ooze ichor. + if(prob(5)) + var/mob/living/carbon/human/H = owner + if(!istype(H)) + return + + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list + blood_splatter(H,B,1) + var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner) + if(goo) + goo.name = "husk ichor" + goo.desc = "It's thick and stinks of decay." + goo.basecolor = "#412464" + goo.update_icon() + +/obj/item/organ/borer + name = "cortical borer" + icon = 'icons/obj/objects.dmi' + icon_state = "borer" + organ_tag = "brain" + desc = "A disgusting space slug." + +/obj/item/organ/borer/removed(var/mob/living/user) + + ..() + + var/mob/living/simple_animal/borer/B = owner.has_brain_worms() + if(B) + B.leave_host() + B.ckey = owner.ckey + + spawn(0) + qdel(src) + +//VOX ORGANS. +/obj/item/organ/stack + name = "cortical stack" + parent_organ = "head" + robotic = 2 + vital = 1 + var/backup_time = 0 + var/datum/mind/backup + +/obj/item/organ/stack/process() + if(owner && owner.stat != 2 && !is_broken()) + backup_time = world.time + if(owner.mind) backup = owner.mind + +/obj/item/organ/stack/vox + +/obj/item/organ/stack/vox/stack + +/obj/item/organ/stack + name = "cortical stack" + icon_state = "brain-prosthetic" + organ_tag = "stack" + robotic = 2 + +/obj/item/organ/stack/vox + name = "vox cortical stack" diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 405c058a23d..c45d1c7859e 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -220,31 +220,18 @@ var/list/organ_cache = list() min_broken_damage = 35 /obj/item/organ/emp_act(severity) - switch(robotic) - if(0) + if(!(status & ORGAN_ROBOT)) + return + world << "emp on [src] with sev [severity]." + switch (severity) + if (1.0) + take_damage(0,20) 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 (2.0) + take_damage(0,7) + return + if(3.0) + take_damage(0,3) /obj/item/organ/proc/removed(var/mob/living/user) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 0655bb6deb4..4b43e0edac1 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -141,20 +141,11 @@ /obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) if((brute <= 0) && (burn <= 0)) return 0 - if(status & ORGAN_DESTROYED) return 0 if(status & ORGAN_ROBOT ) - var/brmod = 0.66 var/bumod = 0.66 - - if(istype(owner,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = owner - if(H.species && H.species.flags & IS_SYNTHETIC) - brmod = H.species.brute_mod - bumod = H.species.burn_mod - brute *= brmod //~2/3 damage for ROBOLIMBS burn *= bumod //~2/3 damage for ROBOLIMBS @@ -322,10 +313,14 @@ This function completely restores a damaged organ to perfect condition. var/datum/wound/W = pick(compatible_wounds) W.open_wound(damage) if(prob(25)) - //maybe have a separate message for BRUISE type damage? - owner.visible_message("\red The wound on [owner.name]'s [name] widens with a nasty ripping noise.",\ - "\red The wound on your [name] widens with a nasty ripping noise.",\ - "You hear a nasty ripping noise, as if flesh is being torn apart.") + if(status & ORGAN_ROBOT) + owner.visible_message("\red The damage to [owner.name]'s [name] worsens.",\ + "\red The damage to your [name] worsens.",\ + "You hear the screech of abused metal.") + else + owner.visible_message("\red The wound on [owner.name]'s [name] widens with a nasty ripping noise.",\ + "\red The wound on your [name] widens with a nasty ripping noise.",\ + "You hear a nasty ripping noise, as if flesh is being torn apart.") return //Creating wound @@ -981,165 +976,3 @@ Note that amputating the affected organ does in fact remove the infection from t if(6 to INFINITY) flavor_text += "a ton of [wound]\s" return english_list(flavor_text) -/**************************************************** - ORGAN DEFINES -****************************************************/ - -/obj/item/organ/external/chest - name = "upper body" - limb_name = "chest" - icon_name = "torso" - health = 100 - min_broken_damage = 35 - body_part = UPPER_TORSO - vital = 1 - amputation_point = "spine" - joint = "neck" - dislocated = -1 - gendered_icon = 1 - cannot_amputate = 1 - parent_organ = null - encased = "ribcage" - -/obj/item/organ/external/groin - name = "lower body" - limb_name = "groin" - icon_name = "groin" - health = 100 - min_broken_damage = 35 - body_part = LOWER_TORSO - vital = 1 - parent_organ = "chest" - amputation_point = "lumbar" - joint = "hip" - dislocated = -1 - gendered_icon = 1 - -/obj/item/organ/external/arm - limb_name = "l_arm" - name = "left arm" - icon_name = "l_arm" - health = 50 - min_broken_damage = 30 - body_part = ARM_LEFT - parent_organ = "chest" - joint = "left elbow" - amputation_point = "left shoulder" - can_grasp = 1 - -/obj/item/organ/external/arm/right - limb_name = "r_arm" - name = "right arm" - icon_name = "r_arm" - body_part = ARM_RIGHT - joint = "right elbow" - amputation_point = "right shoulder" - -/obj/item/organ/external/leg - limb_name = "l_leg" - name = "left leg" - icon_name = "l_leg" - health = 50 - min_broken_damage = 30 - body_part = LEG_LEFT - icon_position = LEFT - parent_organ = "groin" - joint = "left knee" - amputation_point = "left hip" - can_stand = 1 - -/obj/item/organ/external/leg/right - limb_name = "r_leg" - name = "right leg" - icon_name = "r_leg" - body_part = LEG_RIGHT - icon_position = RIGHT - joint = "right knee" - amputation_point = "right hip" - -/obj/item/organ/external/foot - limb_name = "l_foot" - name = "left foot" - icon_name = "l_foot" - health = 30 - min_broken_damage = 15 - body_part = FOOT_LEFT - icon_position = LEFT - parent_organ = "l_leg" - joint = "left ankle" - amputation_point = "left ankle" - can_stand = 1 - -/obj/item/organ/external/foot/removed() - if(owner) owner.u_equip(owner.shoes) - ..() - -/obj/item/organ/external/foot/right - limb_name = "r_foot" - name = "right foot" - icon_name = "r_foot" - body_part = FOOT_RIGHT - icon_position = RIGHT - parent_organ = "r_leg" - joint = "right ankle" - amputation_point = "right ankle" - -/obj/item/organ/external/hand - limb_name = "l_hand" - name = "left hand" - icon_name = "l_hand" - health = 30 - min_broken_damage = 15 - body_part = HAND_LEFT - parent_organ = "l_arm" - joint = "left wrist" - amputation_point = "left wrist" - can_grasp = 1 - -/obj/item/organ/external/hand/removed() - owner.u_equip(owner.gloves) - ..() - -/obj/item/organ/external/hand/right - limb_name = "r_hand" - name = "right hand" - icon_name = "r_hand" - body_part = HAND_RIGHT - parent_organ = "r_arm" - joint = "right wrist" - amputation_point = "right wrist" - -/obj/item/organ/external/head - limb_name = "head" - icon_name = "head" - name = "head" - health = 75 - min_broken_damage = 35 - body_part = HEAD - vital = 1 - parent_organ = "chest" - joint = "jaw" - amputation_point = "neck" - gendered_icon = 1 - encased = "skull" - -/obj/item/organ/external/head/removed() - if(owner) - name = "[owner.real_name]'s head" - owner.u_equip(owner.glasses) - owner.u_equip(owner.head) - owner.u_equip(owner.l_ear) - owner.u_equip(owner.r_ear) - owner.u_equip(owner.wear_mask) - spawn(1) - owner.update_hair() - ..() - -/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) - ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs) - if (!disfigured) - if (brute_dam > 40) - if (prob(50)) - disfigure("brute") - if (burn_dam > 40) - disfigure("burn") diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index d25ce2f5a26..281cd0c0162 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -99,7 +99,7 @@ var/global/list/limb_icon_cache = list() if(skeletal) mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]") - else if ((status & ORGAN_ROBOT) && !(species && species.flags & IS_SYNTHETIC)) + else if (status & ORGAN_ROBOT) mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") else if (status & ORGAN_MUTATED) diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index bb2d571f5d7..87da7f03534 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -36,3 +36,9 @@ var/global/datum/robolimb/basic_robolimb company = "Xion Manufacturing Group" desc = "This limb has a minimalist black and red casing." icon = 'icons/mob/human_races/cyberlimbs/xion.dmi' + +/datum/robolimb/ipc + company = "Morpheus Cyberkinetics" + desc = "This limb is simple and functional; no effort has been made to make it look human." + icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi' + unavailable_at_chargen = 1 diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/subtypes/diona.dm similarity index 52% rename from code/modules/organs/organ_alien.dm rename to code/modules/organs/subtypes/diona.dm index 0905a612666..cf0d51b2c73 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/subtypes/diona.dm @@ -201,189 +201,3 @@ /obj/item/organ/diona/node/removed() return - -//CORTICAL BORER ORGANS. -/obj/item/organ/borer - name = "cortical borer" - parent_organ = "head" - vital = 1 - -/obj/item/organ/borer/process() - - // Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss. - for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine")) - if(owner.reagents.get_reagent_amount(chem) < 3) - owner.reagents.add_reagent(chem, 5) - - // They're also super gross and ooze ichor. - if(prob(5)) - var/mob/living/carbon/human/H = owner - if(!istype(H)) - return - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list - blood_splatter(H,B,1) - var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner) - if(goo) - goo.name = "husk ichor" - goo.desc = "It's thick and stinks of decay." - goo.basecolor = "#412464" - goo.update_icon() - -/obj/item/organ/borer - name = "cortical borer" - icon = 'icons/obj/objects.dmi' - icon_state = "borer" - organ_tag = "brain" - desc = "A disgusting space slug." - -/obj/item/organ/borer/removed(var/mob/living/user) - - ..() - - var/mob/living/simple_animal/borer/B = owner.has_brain_worms() - if(B) - B.leave_host() - B.ckey = owner.ckey - - spawn(0) - qdel(src) - -//XENOMORPH ORGANS -/obj/item/organ/xenos/eggsac - name = "egg sac" - parent_organ = "groin" - -/obj/item/organ/xenos/plasmavessel - name = "plasma vessel" - parent_organ = "chest" - var/stored_plasma = 0 - var/max_plasma = 500 - -/obj/item/organ/xenos/plasmavessel/queen - name = "bloated plasma vessel" - stored_plasma = 200 - max_plasma = 500 - -/obj/item/organ/xenos/plasmavessel/sentinel - stored_plasma = 100 - max_plasma = 250 - -/obj/item/organ/xenos/plasmavessel/hunter - name = "tiny plasma vessel" - stored_plasma = 100 - max_plasma = 150 - -/obj/item/organ/xenos/acidgland - name = "acid gland" - parent_organ = "head" - -/obj/item/organ/xenos/hivenode - name = "hive node" - parent_organ = "chest" - -/obj/item/organ/xenos/resinspinner - name = "resin spinner" - parent_organ = "head" - -/obj/item/organ/xenos - name = "xeno organ" - icon = 'icons/effects/blood.dmi' - desc = "It smells like an accident in a chemical factory." - -/obj/item/organ/xenos/eggsac - name = "egg sac" - icon_state = "xgibmid1" - organ_tag = "egg sac" - -/obj/item/organ/xenos/plasmavessel - name = "plasma vessel" - icon_state = "xgibdown1" - organ_tag = "plasma vessel" - -/obj/item/organ/xenos/acidgland - name = "acid gland" - icon_state = "xgibtorso" - organ_tag = "acid gland" - -/obj/item/organ/xenos/hivenode - name = "hive node" - icon_state = "xgibmid2" - organ_tag = "hive node" - -/obj/item/organ/xenos/resinspinner - name = "hive node" - icon_state = "xgibmid2" - organ_tag = "resin spinner" - -//VOX ORGANS. -/obj/item/organ/stack - name = "cortical stack" - parent_organ = "head" - robotic = 2 - vital = 1 - var/backup_time = 0 - var/datum/mind/backup - -/obj/item/organ/stack/process() - if(owner && owner.stat != 2 && !is_broken()) - backup_time = world.time - if(owner.mind) backup = owner.mind - -/obj/item/organ/stack/vox - -/obj/item/organ/stack/vox/stack - -/obj/item/organ/stack - name = "cortical stack" - icon_state = "brain-prosthetic" - organ_tag = "stack" - robotic = 2 - -/obj/item/organ/stack/vox - name = "vox cortical stack" - -// Slime limbs. -/obj/item/organ/external/chest/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/groin/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/arm/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/arm/right/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/leg/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/leg/right/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/foot/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/foot/right/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/hand/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/hand/right/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/head/slime - cannot_break = 1 - dislocated = -1 diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm new file mode 100644 index 00000000000..273daa793d2 --- /dev/null +++ b/code/modules/organs/subtypes/machine.dm @@ -0,0 +1,67 @@ +// IPC limbs. +/obj/item/organ/external/chest/ipc + dislocated = -1 +/obj/item/organ/external/chest/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/groin/ipc + dislocated = -1 +/obj/item/organ/external/groin/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/arm/ipc + dislocated = -1 +/obj/item/organ/external/arm/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/arm/right/ipc + dislocated = -1 +/obj/item/organ/external/arm/right/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/leg/ipc + dislocated = -1 +/obj/item/organ/external/leg/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/leg/right/ipc + dislocated = -1 +/obj/item/organ/external/leg/right/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/foot/ipc + dislocated = -1 +/obj/item/organ/external/foot/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/foot/right/ipc + dislocated = -1 +/obj/item/organ/external/foot/right/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/hand/ipc + dislocated = -1 +/obj/item/organ/external/hand/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/hand/right/ipc + dislocated = -1 +/obj/item/organ/external/hand/right/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/head/ipc + dislocated = -1 + can_intake_reagents = 0 +/obj/item/organ/external/head/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm new file mode 100644 index 00000000000..3a7e18a9dc8 --- /dev/null +++ b/code/modules/organs/subtypes/standard.dm @@ -0,0 +1,163 @@ +/**************************************************** + ORGAN DEFINES +****************************************************/ + +/obj/item/organ/external/chest + name = "upper body" + limb_name = "chest" + icon_name = "torso" + health = 100 + min_broken_damage = 35 + body_part = UPPER_TORSO + vital = 1 + amputation_point = "spine" + joint = "neck" + dislocated = -1 + gendered_icon = 1 + cannot_amputate = 1 + parent_organ = null + encased = "ribcage" + +/obj/item/organ/external/groin + name = "lower body" + limb_name = "groin" + icon_name = "groin" + health = 100 + min_broken_damage = 35 + body_part = LOWER_TORSO + vital = 1 + parent_organ = "chest" + amputation_point = "lumbar" + joint = "hip" + dislocated = -1 + gendered_icon = 1 + +/obj/item/organ/external/arm + limb_name = "l_arm" + name = "left arm" + icon_name = "l_arm" + health = 50 + min_broken_damage = 30 + body_part = ARM_LEFT + parent_organ = "chest" + joint = "left elbow" + amputation_point = "left shoulder" + can_grasp = 1 + +/obj/item/organ/external/arm/right + limb_name = "r_arm" + name = "right arm" + icon_name = "r_arm" + body_part = ARM_RIGHT + joint = "right elbow" + amputation_point = "right shoulder" + +/obj/item/organ/external/leg + limb_name = "l_leg" + name = "left leg" + icon_name = "l_leg" + health = 50 + min_broken_damage = 30 + body_part = LEG_LEFT + icon_position = LEFT + parent_organ = "groin" + joint = "left knee" + amputation_point = "left hip" + can_stand = 1 + +/obj/item/organ/external/leg/right + limb_name = "r_leg" + name = "right leg" + icon_name = "r_leg" + body_part = LEG_RIGHT + icon_position = RIGHT + joint = "right knee" + amputation_point = "right hip" + +/obj/item/organ/external/foot + limb_name = "l_foot" + name = "left foot" + icon_name = "l_foot" + health = 30 + min_broken_damage = 15 + body_part = FOOT_LEFT + icon_position = LEFT + parent_organ = "l_leg" + joint = "left ankle" + amputation_point = "left ankle" + can_stand = 1 + +/obj/item/organ/external/foot/removed() + if(owner) owner.u_equip(owner.shoes) + ..() + +/obj/item/organ/external/foot/right + limb_name = "r_foot" + name = "right foot" + icon_name = "r_foot" + body_part = FOOT_RIGHT + icon_position = RIGHT + parent_organ = "r_leg" + joint = "right ankle" + amputation_point = "right ankle" + +/obj/item/organ/external/hand + limb_name = "l_hand" + name = "left hand" + icon_name = "l_hand" + health = 30 + min_broken_damage = 15 + body_part = HAND_LEFT + parent_organ = "l_arm" + joint = "left wrist" + amputation_point = "left wrist" + can_grasp = 1 + +/obj/item/organ/external/hand/removed() + owner.u_equip(owner.gloves) + ..() + +/obj/item/organ/external/hand/right + limb_name = "r_hand" + name = "right hand" + icon_name = "r_hand" + body_part = HAND_RIGHT + parent_organ = "r_arm" + joint = "right wrist" + amputation_point = "right wrist" + +/obj/item/organ/external/head + limb_name = "head" + icon_name = "head" + name = "head" + health = 75 + min_broken_damage = 35 + body_part = HEAD + vital = 1 + parent_organ = "chest" + joint = "jaw" + amputation_point = "neck" + gendered_icon = 1 + encased = "skull" + var/can_intake_reagents = 1 + +/obj/item/organ/external/head/removed() + if(owner) + name = "[owner.real_name]'s head" + owner.u_equip(owner.glasses) + owner.u_equip(owner.head) + owner.u_equip(owner.l_ear) + owner.u_equip(owner.r_ear) + owner.u_equip(owner.wear_mask) + spawn(1) + owner.update_hair() + ..() + +/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) + ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs) + if (!disfigured) + if (brute_dam > 40) + if (prob(50)) + disfigure("brute") + if (burn_dam > 40) + disfigure("burn") diff --git a/code/modules/organs/subtypes/unbreakable.dm b/code/modules/organs/subtypes/unbreakable.dm new file mode 100644 index 00000000000..137249e7473 --- /dev/null +++ b/code/modules/organs/subtypes/unbreakable.dm @@ -0,0 +1,44 @@ +// Slime limbs. +/obj/item/organ/external/chest/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/groin/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/arm/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/arm/right/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/leg/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/leg/right/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/foot/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/foot/right/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/hand/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/hand/right/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/head/unbreakable + cannot_break = 1 + dislocated = -1 diff --git a/code/modules/organs/subtypes/xenos.dm b/code/modules/organs/subtypes/xenos.dm new file mode 100644 index 00000000000..7052237b163 --- /dev/null +++ b/code/modules/organs/subtypes/xenos.dm @@ -0,0 +1,66 @@ +//XENOMORPH ORGANS +/obj/item/organ/xenos/eggsac + name = "egg sac" + parent_organ = "groin" + +/obj/item/organ/xenos/plasmavessel + name = "plasma vessel" + parent_organ = "chest" + var/stored_plasma = 0 + var/max_plasma = 500 + +/obj/item/organ/xenos/plasmavessel/queen + name = "bloated plasma vessel" + stored_plasma = 200 + max_plasma = 500 + +/obj/item/organ/xenos/plasmavessel/sentinel + stored_plasma = 100 + max_plasma = 250 + +/obj/item/organ/xenos/plasmavessel/hunter + name = "tiny plasma vessel" + stored_plasma = 100 + max_plasma = 150 + +/obj/item/organ/xenos/acidgland + name = "acid gland" + parent_organ = "head" + +/obj/item/organ/xenos/hivenode + name = "hive node" + parent_organ = "chest" + +/obj/item/organ/xenos/resinspinner + name = "resin spinner" + parent_organ = "head" + +/obj/item/organ/xenos + name = "xeno organ" + icon = 'icons/effects/blood.dmi' + desc = "It smells like an accident in a chemical factory." + +/obj/item/organ/xenos/eggsac + name = "egg sac" + icon_state = "xgibmid1" + organ_tag = "egg sac" + +/obj/item/organ/xenos/plasmavessel + name = "plasma vessel" + icon_state = "xgibdown1" + organ_tag = "plasma vessel" + +/obj/item/organ/xenos/acidgland + name = "acid gland" + icon_state = "xgibtorso" + organ_tag = "acid gland" + +/obj/item/organ/xenos/hivenode + name = "hive node" + icon_state = "xgibmid2" + organ_tag = "hive node" + +/obj/item/organ/xenos/resinspinner + name = "hive node" + icon_state = "xgibmid2" + organ_tag = "resin spinner" \ No newline at end of file diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index f21db9327d4..8c0144710ec 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -664,34 +664,7 @@ if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user - if(H.species.flags & IS_SYNTHETIC && H.a_intent == I_GRAB) - if(emagged || stat & BROKEN) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - H << "\red The APC power currents surge eratically, damaging your chassis!" - H.adjustFireLoss(10,0) - else if(src.cell && src.cell.charge > 0) - if(H.nutrition < 450) - - if(src.cell.charge >= 500) - H.nutrition += 50 - src.cell.charge -= 500 - else - H.nutrition += src.cell.charge/10 - src.cell.charge = 0 - - user << "\blue You slot your fingers into the APC interface and siphon off some of the stored charge for your own use." - if(src.cell.charge < 0) src.cell.charge = 0 - if(H.nutrition > 500) H.nutrition = 500 - src.charging = 1 - - else - user << "\blue You are already fully charged." - else - user << "There is no charge to draw from that APC." - return - else if(H.species.can_shred(H)) + if(H.species.can_shred(H)) user.visible_message("\red [user.name] slashes at the [src.name]!", "\blue You slash at the [src.name]!") playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index e5be56b9440..6f9176640e4 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -519,11 +519,6 @@ obj/structure/cable/proc/cableColor(var/colorC) if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help") return ..() - if(H.species.flags & IS_SYNTHETIC) - if(M == user) - user << "\red You can't repair damage to your own body - it's against OH&S." - return - 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.name] with \the [src].") diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 97db6ceab5e..ba2ff23ac77 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -226,11 +226,11 @@ M.adjustToxLoss(0.5 * removed) /datum/reagent/capsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) - if(alien == IS_DIONA) + if(alien == IS_DIONA || alien == IS_MACHINE) return if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species && (H.species.flags & (NO_PAIN | IS_SYNTHETIC))) + if(H.species && (H.species.flags & (NO_PAIN))) return if(dose < 5 && (dose == metabolism || prob(5))) M << "Your insides feel uncomfortably hot!" @@ -305,9 +305,11 @@ return /datum/reagent/condensedcapsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA || alien == IS_MACHINE) + return if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species && (H.species.flags & (NO_PAIN | IS_SYNTHETIC))) + if(H.species && (H.species.flags & (NO_PAIN))) return if(dose == metabolism) M << "You feel like your insides are burning!" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 2d0a1469b58..17de69ae346 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -25,9 +25,9 @@ /obj/item/weapon/reagent_containers/attack_self(mob/user as mob) return -/obj/item/weapon/reagent_containers/attack(mob/M as mob, mob/user as mob, def_zone) +/obj/item/weapon/reagent_containers/attack(mob/M as mob, mob/user as mob, def_zone) if(can_operate(M))//Checks if mob is lying down on table for surgery - if(do_surgery(M, user, src)) + if(do_surgery(M, user, src)) return /obj/item/weapon/reagent_containers/afterattack(obj/target, mob/user, flag) @@ -98,10 +98,9 @@ if(target == user) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user - if(H.species.flags & IS_SYNTHETIC) - H << "You have a monitor for a head, where do you think you're going to put that?" - return 1 - + if(!H.check_has_mouth()) + user << "Where do you intend to put \the [src]? You don't have a mouth!" + return var/obj/item/blocked = H.check_mouth_coverage() if(blocked) user << "\The [blocked] is in the way!" @@ -114,10 +113,9 @@ else if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = target - if(H.species.flags & IS_SYNTHETIC) - H << "They have a monitor for a head, where do you think you're going to put that?" + if(!H.check_has_mouth()) + user << "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!" return - var/obj/item/blocked = H.check_mouth_coverage() if(blocked) user << "\The [blocked] is in the way!" @@ -153,4 +151,4 @@ var/trans = reagents.trans_to(target, amount_per_transfer_from_this) user << "You transfer [trans] units of the solution to [target]." - return 1 + return 1 diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index a63fbdd46bc..47240eeb222 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -45,10 +45,9 @@ if(M == user) //If you're eating it yourself if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - H << "You have a monitor for a head, where do you think you're going to put that?" + if(!H.check_has_mouth()) + user << "Where do you intend to put \the [src]? You don't have a mouth!" return - var/obj/item/blocked = H.check_mouth_coverage() if(blocked) user << "\The [blocked] is in the way!" @@ -68,10 +67,9 @@ else if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - user << "They have a monitor for a head, where do you think you're going to put that?" + if(!H.check_has_mouth()) + user << "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!" return - var/obj/item/blocked = H.check_mouth_coverage() if(blocked) user << "\The [blocked] is in the way!" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index bb405828ee3..0891468cd10 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -21,10 +21,9 @@ if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - H << "You have a monitor for a head, where do you think you're going to put that?" + if(!H.check_has_mouth()) + user << "Where do you intend to put \the [src]? You don't have a mouth!" return - var/obj/item/blocked = H.check_mouth_coverage() if(blocked) user << "\The [blocked] is in the way!" @@ -40,12 +39,10 @@ else if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - H << "They have a monitor for a head, where do you think you're going to put that?" + if(!H.check_has_mouth()) + user << "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!" return - var/obj/item/blocked = H.check_mouth_coverage() - if(blocked) user << "\The [blocked] is in the way!" return diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index c1e51d9c4df..20bf10bd002 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -17,8 +17,6 @@ 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 return 1 diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm index 88876da9ed0..62bfaff907f 100644 --- a/code/modules/virus2/admin.dm +++ b/code/modules/virus2/admin.dm @@ -73,10 +73,11 @@ var/f = 1 for(var/k in all_species) var/datum/species/S = all_species[k] - if(!(S.flags & IS_SYNTHETIC)) - if(!f) H += " | " - else f = 0 - H += "[k]" + if(S.virus_immune) + continue + if(!f) H += " | " + else f = 0 + H += "[k]" H += {" Reset
diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index c1852a0cb98..2ded7a5261a 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -45,7 +45,7 @@ var/list/res = list() for (var/specie in all_species) var/datum/species/S = all_species[specie] - if(!(S.flags & IS_SYNTHETIC)) + if(!S.virus_immune) meat += S.name if(meat.len) var/num = rand(1,meat.len) diff --git a/code/setup.dm b/code/setup.dm index cbd079c9a5d..865a6e0a436 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -645,11 +645,10 @@ var/list/be_special_flags = list( #define HAS_UNDERWEAR 512 // Underwear is drawn onto the mob icon. #define IS_PLANT 1024 // Is a treeperson. #define IS_WHITELISTED 2048 // Must be whitelisted to play. -#define IS_SYNTHETIC 4096 // Is a machine race. -#define HAS_EYE_COLOR 8192 // Eye colour selectable in chargen. (RGB) -#define CAN_JOIN 16384 // Species is selectable in chargen. -#define IS_RESTRICTED 32768 // Is not a core/normally playable species. (castes, mutantraces) -#define REGENERATES_LIMBS 65536 // Attempts to regenerate unamputated limbs. +#define HAS_EYE_COLOR 4096 // Eye colour selectable in chargen. (RGB) +#define CAN_JOIN 8192 // Species is selectable in chargen. +#define IS_RESTRICTED 16384 // Is not a core/normally playable species. (castes, mutantraces) +// unused: 32768 - higher than this will overflow // Language flags. #define WHITELISTED 1 // Language is available if the speaker is whitelisted. @@ -719,11 +718,12 @@ var/list/be_special_flags = list( #define NETWORK_FAILURE 32 // Some on_mob_life() procs check for alien races. -#define IS_DIONA 1 -#define IS_VOX 2 -#define IS_SKRELL 3 -#define IS_UNATHI 4 -#define IS_XENOS 5 +#define IS_DIONA 1 +#define IS_VOX 2 +#define IS_SKRELL 3 +#define IS_UNATHI 4 +#define IS_XENOS 5 +#define IS_MACHINE 6 #define MAX_GEAR_COST 5 // Used in chargen for accessory loadout limit. diff --git a/icons/mob/human_races/cyberlimbs/ipc.dmi b/icons/mob/human_races/cyberlimbs/ipc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b0ae6739177811e4de00e811a0fb60adaa15d746 GIT binary patch literal 1716 zcmV;l221&gP)o5}g-Q0(zqLzA2pO6y7=snt zkXRs#=K4w6p;L)AJ^1uMs5Z~G>j%@kdi@3}3A1^a`{}IJl03&P+^$+hNFnk!6m|^T zSdn!!S6cZ*Wna>2Bsar8UwDYDUJFDMf+vJ(VBnM9Et5m`_sVvJPqP(^UZM+U-_ z|Eb!vL-YCS3MZF_MqX2bCIA2hT1iAfRCt{2om*quC=i7;)1abKb(6SFVmtf)|K@_c zeQ3;Ftc!!)^R;~`XqaPUWa$9vIsgCw007WF#N8K1wJ#mB6oHHY`he*%1y@KCkq?gt)+`xclL-nqbm7dffT z^VIpQUX68}-mThvUfhF%e`vC#U0yge5?$mU)-N?Vh^G942F~IWIW2gx@u24Rq5ZMm z8U=MGhr0v$yt@|9@St>otvhgE7nsy@*WJKyKGB5wrM5HC=&n0Ty-l>r06kW|0mT0N zgs2zvpww1e$K0>RzaT#V000000000000000;I_DLgSVg=b$ss4-5y#Oa=L?ACYn#f zp}GkCeu$f%p@zxL(h~kP8RQe#Ws_@8tZ78^?x)qpmJ5v8;ghR%Xf%A<9q)`LJUPr} zc@LVitaj!(x?vCcY<$tcFA-|)`yZG+ST*oh!Z-hCP$p6l1>@*nb`NfM8T0LDGS;V< zOvIFoqhDTLjT-g6Ox8h|9`k1%?TebP0{ZX7SMxgI$zd+hvtvuHBWhqX0>9=zv*Rx$ zNA~O~)GHa3G9|yF?)7a!{AKjLZ_gyHUf*k_Z-v$J00000000000002sN*E4Z;|90w z4)IUJ{Ahcd0oz;S9q-f%W7FFVIC{{suV}nrwf41Pdl@WS1|(6#J;?SFTjpOzjnMEY z!@b#quP-k~jg%DY!{r}3>deL7&_7=!bOTa+SHpDlC;NxCzvr{(q#BF;!>Lq1T1(I4 z@4ZbHofbk4vVwnT=r=xom#?NoRig>i2j_<-!uKg zxp}RJ5KqYEoJ+ME>gjO#xge1qe`{h$`~5xz@iG!(3MtCvRGz7X zAni6W{9nAzI~!&|X`e6CdvT`$N_0pElFI{!A;bH6`JPK@*l@1~1B#QtC<-|6;gJ7{ z<++Q7aU5lVxiAa-v>B&NlR)v2038px{BV@NV@2TmyDaeiy$Jj?e}!rK4vGT#c+5R` zJSsnCT>_V9Iu|}MyL__06bDQ%y$aT(XLC}tF<*A`>9ppPW9x>=JiiP9Tk8wjemzr- zZ4=m-G6pQWpZRyKRJMV$K3eu*xOIhD;IflY7wD3|;UN`yM zUjA1G2v%-3$`IN7Fu4fsZvD3w0000000000000000PvB|odvNy>iWCMKfGo(>qF}L zyU9PiX@#V(zdQMdx2%w&zW%QGhpLC%JhuPYv_lF2004l$i~j(ZFCdWUk(GM@0000< KMNUMnLSTY^*DvJ& literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/r_machine.dmi b/icons/mob/human_races/r_machine.dmi deleted file mode 100644 index 2e3956f84649a617225c73e59b30c5a50e8c4d5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1825 zcmYjQdpOgJ8~<(=k=!~-TFKq$SQKKjxyx+}JDVKGckNua%6IiWX)}E zlbxN)ajGMs+*zk3v?I6BHnX$N?|IIz_j%su^LgJt-rMtjvQA-KcPnTr006Mt?WB_r z0Dz=6{2V7-nXb6YHQ7F`rBS$nfHNjvo6bf~BcSj%)uCA`tHvws7 z7!2m=>1j6+g!7FGs5Ce=gZzUhIv+WA`2d=dM4H@qb*v#At|?pTxlM&(+KYo zN1w|zn~s$GJr3$Tp>5!zk*!~odEF~}a^}_dN3VAl#ngqM>Qzw_XdX|C@!g~qUz`g1 zC8jf-;7u?CfF1YToa}LA+G5#Y(xj!Li!&2fe}3Y2tyh$xXlRrAEI%=+`6poB?@-S> z+5;=ut6DlR(JuM)VTg2nV0lK~Jas;DBSdWw3F)(+UzVIJNNiQ(_T}_AWtdv!;lnw#ESJdjrIqHfDmjK0Z*rbb-M8b*s{a|svgGh+V}0d2xlYsSWW)lG5Y#(1nm{w`PN6MTcq1sLVZihzq28z3xUfl_=VJ6I?=U zH@C=uzyXszMCLZ`SiqCW!^Fg_qI%VWGJW4Q-|N;Wf3B;+T(Vz3>O^JlUj7$3eq}hC zj%L+CZ|45o47?q$gkgRVuP@i}^6C^NevOkLp`@%Xj>y|thc6VrUIHN;Loa+lPW`;6 zVu732*!io)0s1pD57!svpjy$h2O>q9mCQpWQ^&BH`Gg`>?_HVDspS1e9~C3jRW7kd z;JP}2a>dEVZ7Ld21x5Ay91b-=f=?Gnzv-fE&M-DbL~xJC3c-}XFdk6(>c}6yeB=k z8%X1{pi0pyH(D%OS??P4|HgNq+UebCZvx>crEqq-b*lq#s3C}yoSF_M5@ zKk!RqVa`ao9u$0PU(Tb)?6FN{;W4}nIpvkq>7alH$`7X+1}ZeukjO$+GWlqtDGS_* z7l+zoqGzXDwb~nV4xX8`38b!O<5>t3e2)Vc8NkJ!ytuDu0C_2?iNZD6Qyj)*_i>j3 zs3}tYlmVv0L|I2|>s)M#&d{|vzL$+DqMZbkDwY0R775p