From 53895e4ad4cadf45cf4850f26b3a123480822b41 Mon Sep 17 00:00:00 2001 From: Redmoogle Date: Fri, 24 Jun 2022 07:14:58 -0400 Subject: [PATCH 01/52] Switching to another computer --- code/__DEFINES/DNA.dm | 7 ++ code/__DEFINES/is_helpers.dm | 1 + code/__DEFINES/mobs.dm | 8 +++ code/__DEFINES/traits.dm | 3 +- code/__HELPERS/global_lists.dm | 3 + code/__HELPERS/mobs.dm | 18 ++++- code/__HELPERS/names.dm | 3 + code/_globalvars/lists/flavor_misc.dm | 3 + code/datums/emotes.dm | 5 +- code/game/gamemodes/objective.dm | 21 +++++- code/game/machinery/computer/cloning.dm | 4 ++ code/game/mecha/mech_fabricator.dm | 1 + .../antagonists/changeling/changeling.dm | 3 + code/modules/antagonists/cult/cult.dm | 6 ++ code/modules/client/preferences.dm | 70 ++++++++++++++++++- 15 files changed, 150 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index a3ed9e72d5e1..869f0e40744c 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -143,6 +143,13 @@ #define HAS_FLESH 23 /// if we have bones (can suffer bone wounds) #define HAS_BONE 24 +#define NOEYESPRITES 25 +/// Can't be husked. +#define NOHUSK 26 +/// limbs start out as robotic; but also use organic icons. If you want to use the default ones, you'll have to use on_species_gain +#define ROBOTIC_LIMBS 27 +/// have no mouth to ingest/eat with +#define NOMOUTH 28 //organ slots #define ORGAN_SLOT_BRAIN "brain" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 7759f4403d79..44d76436c73b 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -80,6 +80,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isvampire(A) (is_species(A,/datum/species/vampire)) #define ispreternis(A) (is_species(A,/datum/species/preternis)) #define isszlachta(A) (is_species(A, /datum/species/szlachta)) +#define isipc(A) (is_species(A, /datum/species/ipc)) //more carbon mobs #define ismonkey(A) (istype(A, /mob/living/carbon/monkey)) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index a1b4601423a3..7eb2c5923e92 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -93,6 +93,14 @@ #define DEVIL_BODYPART "devil" /*see __DEFINES/inventory.dm for bodypart bitflag defines*/ +//Reagent Metabolization flags, defines the type of reagents that affect this mob +#define PROCESS_ORGANIC 1 //Only processes reagents with "ORGANIC" or "ORGANIC | SYNTHETIC" +#define PROCESS_SYNTHETIC 2 //Only processes reagents with "SYNTHETIC" or "ORGANIC | SYNTHETIC" + +// Reagent type flags, defines the types of mobs this reagent will affect +#define ORGANIC 1 +#define SYNTHETIC 2 + // Health/damage defines for carbon mobs #define HUMAN_MAX_OXYLOSS 3 #define HUMAN_CRIT_MAX_OXYLOSS (SSmobs.wait/30) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index bcfdfb97bfc0..773de6d7c544 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -219,7 +219,8 @@ #define TRAIT_COAGULATING "coagulating" //from coagulant reagents, this doesn't affect the bleeding itself but does affect the bleed warning messages #define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat #define TRAIT_MASQUERADE "masquerade" // Falsifies Health analyzer blood levels -#define TRAIT_COLDBLOODED "coldblooded" // Your body is literal room temperature. Does not make you immune to the temp +#define TRAIT_COLDBLOODED "coldblooded" // Your body is literal room temperature. Does not make you immune to the temp +#define TRAIT_NOCLONE "noclone" // No cloning //non-mob traits /// Used for limb-based paralysis, where replacing the limb will fix it. diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 43c60420ef43..2fc29b9dddec 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -39,6 +39,9 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/ethereal_mark, GLOB.ethereal_mark_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_flower, GLOB.pod_flower_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_screens, GLOB.ipc_screens_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_antennas, GLOB.ipc_antennas_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_chassis, GLOB.ipc_chassis_list) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index a1adb0d3f60b..a6c4ae2f1952 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -84,6 +84,12 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) if(!GLOB.pod_flower_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_flower, GLOB.pod_flower_list) + if(!GLOB.ipc_screens_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_screens, GLOB.ipc_screens_list) + if(!GLOB.ipc_antennas_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_antennas, GLOB.ipc_antennas_list) + if(!GLOB.ipc_chassis_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_chassis, GLOB.ipc_chassis_list) //For now we will always return none for tail_human and ears. this shit was unreadable if you do somethign like this make it at least readable return(list( @@ -108,7 +114,10 @@ "dome" = pick(GLOB.dome_list), "dorsal_tubes" = pick(GLOB.dorsal_tubes_list), "ethereal_mark" = pick(GLOB.ethereal_mark_list), - "pod_hair" = pick(GLOB.pod_hair_list) + "pod_hair" = pick(GLOB.pod_hair_list), + "ipc_screen" = pick(GLOB.ipc_screens_list), + "ipc_antenna" = pick(GLOB.ipc_antennas_list), + "ipc_chassis" = pick(GLOB.ipc_chassis_list )) /proc/random_hair_style(gender) @@ -180,6 +189,13 @@ if(!findname(.)) break +/proc/random_unique_ipc_name(attempts_to_find_unique_name=10) + for(var/i in 1 to attempts_to_find_unique_name) + . = capitalize(ipc_name()) + + if(!findname(.)) + break + /proc/random_skin_tone() return pick(GLOB.skin_tones) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index e7296796cada..5409e6afd071 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -19,6 +19,9 @@ /proc/moth_name() return "[pick(GLOB.moth_first)] [pick(GLOB.moth_last)]" +/proc/ipc_name() + return "[pick(GLOB.posibrain_names)]-[rand(100, 999)]" + GLOBAL_VAR(command_name) /proc/command_name() if (GLOB.command_name) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 21b43fc86081..1d9a18b54672 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -42,6 +42,9 @@ GLOBAL_LIST_EMPTY(r_wings_list) GLOBAL_LIST_EMPTY(moth_wings_list) GLOBAL_LIST_EMPTY(moth_wingsopen_list) GLOBAL_LIST_EMPTY(caps_list) +GLOBAL_LIST_EMPTY(ipc_screens_list) +GLOBAL_LIST_EMPTY(ipc_antennas_list) +GLOBAL_LIST_EMPTY(ipc_chassis_list) GLOBAL_LIST_EMPTY(ethereal_mark_list) //ethereal face marks GLOBAL_LIST_INIT(color_list_ethereal, list("F Class(Green)" = "97ee63", "F2 Class (Light Green)" = "00fa9a", "F3 Class (Dark Green)" = "37835b", "M Class (Red)" = "9c3030", "M1 Class (Purple)" = "ee82ee", "G Class (Yellow)" = "fbdf56", "O Class (Blue)" = "3399ff", "A Class (Cyan)" = "00ffff")) diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index fa3c4fe736f2..07f1d5ad4936 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -11,6 +11,7 @@ var/message_robot = "" //Message displayed if the user is a robot var/message_AI = "" //Message displayed if the user is an AI var/message_monkey = "" //Message displayed if the user is a monkey + var/message_ipc = "" // Message to display if the user is an IPC var/message_simple = "" //Message to display if the user is a simple_animal var/message_param = "" //Message to display if a param was given var/emote_type = EMOTE_VISIBLE //Whether the emote is visible or audible @@ -117,6 +118,8 @@ . = message_AI else if(ismonkey(user) && message_monkey) . = message_monkey + else if(isipc(user) && message_ipc) + . = message_ipc else if(isanimal(user) && message_simple) . = message_simple @@ -193,4 +196,4 @@ if(M.stat == DEAD && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(M in viewers(T, null))) M.show_message("[FOLLOW_LINK(M, src)] [ghost_text]") - visible_message(text, visible_message_flags = EMOTE_MESSAGE) \ No newline at end of file + visible_message(text, visible_message_flags = EMOTE_MESSAGE) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index cc972f04d4ca..52438ba56fc4 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -34,6 +34,9 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective/proc/admin_edit(mob/admin) return +/datum/objective/proc/is_valid_target(possible_target) + return TRUE + //Shared by few objective types /datum/objective/proc/admin_simple_target_pick(mob/admin) var/list/possible_targets = list("Free objective","Random") @@ -124,7 +127,7 @@ GLOBAL_LIST_EMPTY(objectives) if(O.late_joiner) try_target_late_joiners = TRUE for(var/datum/mind/possible_target in get_crewmember_minds()) - if(!(possible_target in owners) && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && is_unique_objective(possible_target,dupe_search_range)) + if(is_valid_target(possible_target) && !(possible_target in owners) && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && is_unique_objective(possible_target,dupe_search_range)) //yogs start -- Quiet Rounds var/mob/living/carbon/human/guy = possible_target.current if(possible_target.antag_datums || !(guy.client && (guy.client.prefs.yogtoggles & QUIET_ROUND))) @@ -514,6 +517,18 @@ GLOBAL_LIST_EMPTY(objectives) return FALSE return TRUE +/datum/objective/escape/escape_with_identity/is_valid_target(possible_target) + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!M) + continue + if(!M.has_antag_datum(/datum/antagonist/changeling)) + continue + var/datum/mind/T = possible_target + if(!istype(T) || isipc(T.current)) + return FALSE + return TRUE + /datum/objective/escape/escape_with_identity name = "escape with identity" var/target_real_name // Has to be stored because the target's real_name can change over the course of the round @@ -1092,6 +1107,8 @@ GLOBAL_LIST_EMPTY(possible_items_special) for(var/datum/mind/M in SSticker.minds) if(M in lings) continue + if(isipc(M.current)) + continue if(department_head in get_department_heads(M.assigned_role)) if(ling_count) ling_count-- @@ -1121,6 +1138,8 @@ GLOBAL_LIST_EMPTY(possible_items_special) for(var/datum/mind/head in heads) if(head in lings) //Looking at you HoP. continue + if(isipc(head.current)) + continue if(needed_heads) department_minds += head department_real_names += head.current.real_name diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index a7ad64fb772e..fc214767e6a1 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -541,6 +541,10 @@ if(isbrain(mob_occupant)) dna = B.stored_dna + if(HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) + scantemp = "Unable to locate valid genetic data." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return if(!istype(dna)) scantemp = "Unable to locate valid genetic data." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index cddd27e003be..fe88ff263b97 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -57,6 +57,7 @@ "Cybernetics", "Implants", "Control Interfaces", + "IPC Components", "Misc" ) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index db5c4a6e474b..c91a59af1697 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -246,6 +246,9 @@ var/mob/living/carbon/user = owner.current if(!istype(user)) return + if(isipc(target)) + to_chat(user, "We cannot absorb mechanical entities!") + return if(stored_profiles.len) var/datum/changelingprofile/prof = stored_profiles[1] if(prof.dna == user.dna && stored_profiles.len >= dna_max)//If our current DNA is the stalest, we gotta ditch it. diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 69cee76d3221..2bec2596d925 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -433,6 +433,12 @@ var/sacced = FALSE var/sac_image +/datum/objective/sacrifice/is_valid_target(possible_target) + . = ..() + var/datum/mind/M = possible_target + if(istype(M) && isipc(M.current)) + return FALSE + /datum/objective/sacrifice/check_completion() return sacced || completed diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1ccbe664239b..c58b3a1b4808 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -72,7 +72,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/skin_tone = "caucasian1" //Skin color var/eye_color = "000" //Eye color var/datum/species/pref_species = new /datum/species/human() //Mutant race - var/list/features = list("mcolor" = "FFF", "gradientstyle" = "None", "gradientcolor" = "000", "ethcolor" = "9c3030", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain", "tail_polysmorph" = "Polys", "teeth" = "None", "dome" = "None", "dorsal_tubes" = "No", "ethereal_mark" = "None", "pod_hair" = "Cabbage", "pod_flower" = "Cabbage") + var/list/features = list("mcolor" = "FFF", "gradientstyle" = "None", "gradientcolor" = "000", "ethcolor" = "9c3030", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain", "tail_polysmorph" = "Polys", "teeth" = "None", "dome" = "None", "dorsal_tubes" = "No", "ethereal_mark" = "None", "pod_hair" = "Cabbage", "pod_flower" = "Cabbage", "ipc_screen" = "Blue", "ipc_antenna" = "None", "ipc_chassis" = "Morpheus Cyberkinetics(Greyscale)") var/list/genders = list(MALE, FEMALE, PLURAL) var/list/friendlyGenders = list("Male" = "male", "Female" = "female", "Other" = "plural") @@ -609,6 +609,49 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 + if("ipc_screen" in pref_species.mutant_bodyparts) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN + + dat += "

Screen Style

" + + dat += "[features["ipc_screen"]]
" + + dat += "    Change
" + + mutant_category++ + if(mutant_category >= MAX_MUTANT_ROWS) + dat += "" + mutant_category = 0 + + if("ipc_antenna" in pref_species.mutant_bodyparts) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN + + dat += "

Antenna Style

" + + dat += "[features["ipc_antenna"]]
" + + dat += "    Change
" + + mutant_category++ + if(mutant_category >= MAX_MUTANT_ROWS) + dat += "" + mutant_category = 0 + + if("ipc_chassis" in pref_species.mutant_bodyparts) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN + + dat += "

Chassis Style

" + + dat += "[features["ipc_chassis"]]
" + + mutant_category++ + if(mutant_category >= MAX_MUTANT_ROWS) + dat += "" + mutant_category = 0 + if("ears" in pref_species.default_features) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -1483,7 +1526,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("name") var/new_name = input(user, "Choose your character's name:", "Character Preference") as text|null if(new_name) - new_name = reject_bad_name(new_name) + new_name = reject_bad_name(new_name, pref_species.allow_numbers_in_name) if(new_name) real_name = new_name else @@ -1760,6 +1803,29 @@ GLOBAL_LIST_EMPTY(preferences_datums) facial_hair_color = sanitize_hexcolor(new_facial) else to_chat(user, span_danger("Invalid head flower color. Your color is not bright enough.")) + if("ipc_screen") + var/new_ipc_screen + + new_ipc_screen = input(user, "Choose your character's screen:", "Character Preference") as null|anything in GLOB.ipc_screens_list + + if(new_ipc_screen) + features["ipc_screen"] = new_ipc_screen + + if("ipc_antenna") + var/new_ipc_antenna + + new_ipc_antenna = input(user, "Choose your character's antenna:", "Character Preference") as null|anything in GLOB.ipc_antennas_list + + if(new_ipc_antenna) + features["ipc_antenna"] = new_ipc_antenna + + if("ipc_chassis") + var/new_ipc_chassis + + new_ipc_chassis = input(user, "Choose your character's chassis:", "Character Preference") as null|anything in GLOB.ipc_chassis_list + + if(new_ipc_chassis) + features["ipc_chassis"] = new_ipc_chassis if("s_tone") var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in GLOB.skin_tones if(new_s_tone) From f7584ea9e33f432d4696b7e59b3d0a9df136abf7 Mon Sep 17 00:00:00 2001 From: Redmoogle Date: Fri, 24 Jun 2022 09:07:20 -0400 Subject: [PATCH 02/52] half way there --- code/modules/client/preferences_savefile.dm | 13 +- .../mob/dead/new_player/sprite_accessories.dm | 230 ++++++++++++++++++ code/modules/mob/living/brain/brain_item.dm | 18 ++ code/modules/mob/living/carbon/carbon.dm | 8 + .../mob/living/carbon/human/damage_procs.dm | 5 + code/modules/mob/living/carbon/human/death.dm | 30 ++- code/modules/mob/living/carbon/human/emote.dm | 82 +++++++ code/modules/mob/living/carbon/human/human.dm | 3 + .../mob/living/carbon/human/human_defense.dm | 10 + .../mob/living/carbon/human/species.dm | 65 ++++- .../living/carbon/human/species_types/IPC.dm | 191 +++++++++++++++ .../carbon/human/species_types/skeletons.dm | 2 +- .../mob/living/carbon/human/status_procs.dm | 2 +- code/modules/mob/living/emote.dm | 1 + .../mob/living/simple_animal/bot/medbot.dm | 11 + .../mob/living/simple_animal/slime/powers.dm | 6 + code/modules/mob/living/taste.dm | 5 +- code/modules/mob/mob_helpers.dm | 3 + code/modules/power/apc.dm | 2 + code/modules/projectiles/projectile.dm | 5 + code/modules/reagents/chemistry/holder.dm | 44 ++++ code/modules/reagents/chemistry/reagents.dm | 2 + .../chemistry/reagents/medicine_reagents.dm | 34 +++ .../chemistry/reagents/other_reagents.dm | 8 + .../reagents/pyrotechnic_reagents.dm | 5 + .../chemistry/reagents/toxin_reagents.dm | 4 + .../reagents/chemistry/recipes/medicine.dm | 14 ++ code/modules/reagents/reagent_containers.dm | 10 +- 28 files changed, 796 insertions(+), 17 deletions(-) create mode 100644 code/modules/mob/living/carbon/human/species_types/IPC.dm diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 05fc4a1d845b..87bbf023111f 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 37 +#define SAVEFILE_VERSION_MAX 38 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -450,6 +450,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car READ_FILE(S["feature_ethereal_mark"], features["ethereal_mark"]) READ_FILE(S["feature_pod_hair"], features["pod_hair"]) READ_FILE(S["feature_pod_flower"], features["pod_flower"]) + READ_FILE(S["feature_ipc_screen"], features["ipc_screen"]) + READ_FILE(S["feature_ipc_antenna"], features["ipc_antenna"]) + READ_FILE(S["feature_ipc_chassis"], features["ipc_chassis"]) READ_FILE(S["persistent_scars"], persistent_scars) if(!CONFIG_GET(flag/join_with_mutant_humans)) @@ -486,7 +489,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Sanitize - real_name = reject_bad_name(real_name) + real_name = reject_bad_name(real_name, pref_species.allow_numbers_in_name) gender = sanitize_gender(gender) if(!real_name) real_name = random_unique_name(gender) @@ -553,6 +556,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["ethereal_mark"] = sanitize_inlist(features["ethereal_mark"], GLOB.ethereal_mark_list) features["pod_hair"] = sanitize_inlist(features["pod_hair"], GLOB.pod_hair_list) features["pod_flower"] = sanitize_inlist(features["pod_flower"], GLOB.pod_flower_list) + features["ipc_screen"] = sanitize_inlist(features["ipc_screen"], GLOB.ipc_screens_list) + features["ipc_antenna"] = sanitize_inlist(features["ipc_antenna"], GLOB.ipc_antennas_list) + features["ipc_chassis"] = sanitize_inlist(features["ipc_chassis"], GLOB.ipc_chassis_list) persistent_scars = sanitize_integer(persistent_scars) @@ -617,6 +623,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_pod_hair"] , features["pod_hair"]) WRITE_FILE(S["feature_pod_flower"] , features["pod_flower"]) WRITE_FILE(S["persistent_scars"] , persistent_scars) + WRITE_FILE(S["feature_ipc_screen"] , features["ipc_screen"]) + WRITE_FILE(S["feature_ipc_antenna"] , features["ipc_antenna"]) + WRITE_FILE(S["feature_ipc_chassis"] , features["ipc_chassis"]) //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index ba48f2d4d4cc..fe030a8d2a4d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -59,6 +59,7 @@ var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects var/dimension_x = 32 var/dimension_y = 32 + var/limbs_id // The limbs id supplied for full-body replacing features. var/center = FALSE //Should we center the sprite? ////////////////////// @@ -851,6 +852,235 @@ name = "Spiked Wavy" icon_state = "wavy_spiked" +// IPC accessories. + +/datum/sprite_accessory/ipc_screens + icon = 'icons/mob/ipc_accessories.dmi' + color_src = EYECOLOR + +/datum/sprite_accessory/ipc_screens/blue + name = "Blue" + icon_state = "blue" + color_src = 0 + +/datum/sprite_accessory/ipc_screens/bsod + name = "BSOD" + icon_state = "bsod" + color_src = 0 + +/datum/sprite_accessory/ipc_screens/breakout + name = "Breakout" + icon_state = "breakout" + +/datum/sprite_accessory/ipc_screens/console + name = "Console" + icon_state = "console" + +/datum/sprite_accessory/ipc_screens/ecgwave + name = "ECG Wave" + icon_state = "ecgwave" + +/datum/sprite_accessory/ipc_screens/eight + name = "Eight" + icon_state = "eight" + +/datum/sprite_accessory/ipc_screens/eyes + name = "Eyes" + icon_state = "eyes" + +/datum/sprite_accessory/ipc_screens/glider + name = "Glider" + icon_state = "glider" + +/datum/sprite_accessory/ipc_screens/goggles + name = "Goggles" + icon_state = "goggles" + +/datum/sprite_accessory/ipc_screens/green + name = "Green" + icon_state = "green" + +/datum/sprite_accessory/ipc_screens/heart + name = "Heart" + icon_state = "heart" + color_src = 0 + +/datum/sprite_accessory/ipc_screens/monoeye + name = "Mono-eye" + icon_state = "monoeye" + +/datum/sprite_accessory/ipc_screens/nature + name = "Nature" + icon_state = "nature" + +/datum/sprite_accessory/ipc_screens/orange + name = "Orange" + icon_state = "orange" + +/datum/sprite_accessory/ipc_screens/pink + name = "Pink" + icon_state = "pink" + +/datum/sprite_accessory/ipc_screens/purple + name = "Purple" + icon_state = "purple" + +/datum/sprite_accessory/ipc_screens/rainbow + name = "Rainbow" + icon_state = "rainbow" + color_src = 0 + +/datum/sprite_accessory/ipc_screens/red + name = "Red" + icon_state = "red" + +/datum/sprite_accessory/ipc_screens/redtext + name = "Red Text" + icon_state = "redtext" + color_src = 0 + +/datum/sprite_accessory/ipc_screens/rgb + name = "RGB" + icon_state = "rgb" + +/datum/sprite_accessory/ipc_screens/scroll + name = "Scanline" + icon_state = "scroll" + +/datum/sprite_accessory/ipc_screens/shower + name = "Shower" + icon_state = "shower" + +/datum/sprite_accessory/ipc_screens/sinewave + name = "Sinewave" + icon_state = "sinewave" + +/datum/sprite_accessory/ipc_screens/squarewave + name = "Square wave" + icon_state = "squarewave" + +/datum/sprite_accessory/ipc_screens/static_screen + name = "Static" + icon_state = "static" + +/datum/sprite_accessory/ipc_screens/yellow + name = "Yellow" + icon_state = "yellow" + +/datum/sprite_accessory/ipc_screens/textdrop + name = "Text drop" + icon_state = "textdrop" + +/datum/sprite_accessory/ipc_screens/stars + name = "Stars" + icon_state = "stars" + +/datum/sprite_accessory/ipc_screens/loading + name = "Loading" + icon_state = "loading" + +/datum/sprite_accessory/ipc_screens/windowsxp + name = "Windows XP" + icon_state = "windowsxp" + +/datum/sprite_accessory/ipc_screens/tetris + name = "Tetris" + icon_state = "tetris" + +/datum/sprite_accessory/ipc_screens/tv + name = "Color Test" + icon_state = "tv" + +/datum/sprite_accessory/ipc_antennas + icon = 'icons/mob/ipc_accessories.dmi' + color_src = HAIR + +/datum/sprite_accessory/ipc_antennas/none + name = "None" + icon_state = "None" + +/datum/sprite_accessory/ipc_antennas/angled + name = "Angled" + icon_state = "antennae" + +/datum/sprite_accessory/ipc_antennas/antlers + name = "Antlers" + icon_state = "antlers" + +/datum/sprite_accessory/ipc_antennas/crowned + name = "Crowned" + icon_state = "crowned" + +/datum/sprite_accessory/ipc_antennas/cyberhead + name = "Cyberhead" + icon_state = "cyberhead" + +/datum/sprite_accessory/ipc_antennas/droneeyes + name = "Drone Eyes" + icon_state = "droneeyes" + +/datum/sprite_accessory/ipc_antennas/light + name = "Light" + icon_state = "light" + +/datum/sprite_accessory/ipc_antennas/sidelights + name = "Sidelights" + icon_state = "sidelights" + +/datum/sprite_accessory/ipc_antennas/tesla + name = "Tesla" + icon_state = "tesla" + +/datum/sprite_accessory/ipc_antennas/tv + name = "TV Antenna" + icon_state = "tvantennae" + +/datum/sprite_accessory/ipc_chassis // Used for changing limb icons, doesn't need to hold the actual icon. That's handled in ipc.dm + icon = null + icon_state = "who cares fuck you" // In order to pull the chassis correctly, we need AN icon_state(see line 36-39). It doesn't have to be useful, because it isn't used. + color_src = 0 + +/datum/sprite_accessory/ipc_chassis/mcgreyscale + name = "Morpheus Cyberkinetics(Greyscale)" + limbs_id = "mcgipc" + color_src = MUTCOLORS + +/datum/sprite_accessory/ipc_chassis/bishopcyberkinetics + name = "Bishop Cyberkinetics" + limbs_id = "bshipc" + +/datum/sprite_accessory/ipc_chassis/bishopcyberkinetics2 + name = "Bishop Cyberkinetics 2.0" + limbs_id = "bs2ipc" + +/datum/sprite_accessory/ipc_chassis/hephaestussindustries + name = "Hephaestus Industries" + limbs_id = "hsiipc" + +/datum/sprite_accessory/ipc_chassis/hephaestussindustries2 + name = "Hephaestus Industries 2.0" + limbs_id = "hi2ipc" + +/datum/sprite_accessory/ipc_chassis/shellguardmunitions + name = "Shellguard Munitions Standard Series" + limbs_id = "sgmipc" + +/datum/sprite_accessory/ipc_chassis/wardtakahashimanufacturing + name = "Ward-Takahashi Manufacturing" + limbs_id = "wtmipc" + +/datum/sprite_accessory/ipc_chassis/xionmanufacturinggroup + name = "Xion Manufacturing Group" + limbs_id = "xmgipc" + +/datum/sprite_accessory/ipc_chassis/xionmanufacturinggroup2 + name = "Xion Manufacturing Group 2.0" + limbs_id = "xm2ipc" + +/datum/sprite_accessory/ipc_chassis/zenghupharmaceuticals + name = "Zeng-Hu Pharmaceuticals" + limbs_id = "zhpipc" + ///////////////////////////// // Facial Hair Definitions // ///////////////////////////// diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 351a3eb503c2..9487eaf5caa0 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -247,6 +247,24 @@ desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?" icon_state = "brain-x" +/obj/item/organ/brain/positron + name = "positronic brain" + slot = "brain" + zone = "chest" + status = ORGAN_ROBOTIC + desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. It has an IPC serial number engraved on the top. In order for this Posibrain to be used as a newly built Positronic Brain, it must be coupled with an MMI." + icon = 'icons/obj/assemblies.dmi' + icon_state = "posibrain-occupied" + +/obj/item/organ/brain/positron/emp_act(severity) + switch(severity) + if(1) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 75) + to_chat(owner, "Alert: Posibrain heavily damaged.") + if(2) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 25) + to_chat(owner, "Alert: Posibrain damaged.") + ////////////////////////////////////TRAUMAS//////////////////////////////////////// diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 94b3d3eba86a..4e848bfbc639 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -505,6 +505,9 @@ if(istype(src.loc, /obj/effect/dummy)) //cannot vomit while phasing/vomitcrawling return TRUE + if(!has_mouth()) + return TRUE + if(nutrition < 100 && !blood) if(message) visible_message(span_warning("[src] dry heaves!"), \ @@ -547,6 +550,11 @@ break return TRUE +/mob/living/carbon/has_mouth() + for(var/obj/item/bodypart/head/head in bodyparts) + if(head.mouth) + return TRUE + /mob/living/carbon/proc/spew_organ(power = 5, amt = 1) for(var/i in 1 to amt) if(!internal_organs.len) diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm index 9e00ed48f476..b47ee0c00918 100644 --- a/code/modules/mob/living/carbon/human/damage_procs.dm +++ b/code/modules/mob/living/carbon/human/damage_procs.dm @@ -2,3 +2,8 @@ /mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, wound_bonus, bare_wound_bonus, sharpness) + +/mob/living/carbon/human/revive(full_heal = 0, admin_revive = 0) + if(..()) + if(dna && dna.species) + dna.species.spec_revival(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 2d486b5b20e5..906258d53dcd 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -1,20 +1,40 @@ /mob/living/carbon/human/gib_animation() - new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h") + switch(dna.species.species_gibs) + if("human") + new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h") + if("robotic") + new /obj/effect/temp_visual/gib_animation(loc, "gibbed-r") /mob/living/carbon/human/dust_animation() - new /obj/effect/temp_visual/dust_animation(loc, "dust-h") + switch(dna.species.species_gibs) + if("human") + new /obj/effect/temp_visual/dust_animation(loc, "dust-h") + if("robotic") + new /obj/effect/temp_visual/dust_animation(loc, "dust-r") /mob/living/carbon/human/spawn_gibs(with_bodyparts) if(with_bodyparts) - new /obj/effect/gibspawner/human(drop_location(), src, get_static_viruses()) + switch(dna.species.species_gibs) + if("human") + new /obj/effect/gibspawner/human(get_turf(src), dna, get_static_viruses()) + if("robotic") + new /obj/effect/gibspawner/robot(get_turf(src)) else - new /obj/effect/gibspawner/human/bodypartless(drop_location(), src, get_static_viruses()) + switch(dna.species.species_gibs) + if("human") + new /obj/effect/gibspawner/human(get_turf(src), dna, get_static_viruses()) + if("robotic") + new /obj/effect/gibspawner/robot(get_turf(src)) /mob/living/carbon/human/spawn_dust(just_ash = FALSE) if(just_ash) new /obj/effect/decal/cleanable/ash(loc) else - new /obj/effect/decal/remains/human(loc) + switch(dna.species.species_gibs) + if("human") + new /obj/effect/decal/remains/human(loc) + if("robotic") + new /obj/effect/decal/remains/robot(loc) /mob/living/carbon/human/death(gibbed) if(stat == DEAD) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 5c5bd7d0e0f0..df2415ecbaef 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -235,3 +235,85 @@ return islizard(user) //Ayy lmao + +// Robotic Tongue emotes. Beep! + +/datum/emote/living/carbon/human/robot_tongue/can_run_emote(mob/user, status_check = TRUE , intentional) + if(!..()) + return FALSE + var/obj/item/organ/tongue/T = user.getorganslot("tongue") + if(T.status == ORGAN_ROBOTIC) + return TRUE + +/datum/emote/living/carbon/human/robot_tongue/beep + key = "beep" + key_third_person = "beeps" + message = "beeps." + message_param = "beeps at %t." + +/datum/emote/living/carbon/human/robot_tongue/beep/run_emote(mob/user, params) + if(..()) + playsound(user.loc, 'sound/machines/twobeep.ogg', 50) + +/datum/emote/living/carbon/human/robot_tongue/buzz + key = "buzz" + key_third_person = "buzzes" + message = "buzzes." + message_param = "buzzes at %t." + +/datum/emote/living/carbon/human/robot_tongue/buzz/run_emote(mob/user, params) + if(..()) + playsound(user.loc, 'sound/machines/buzz-sigh.ogg', 50) + +/datum/emote/living/carbon/human/robot_tongue/buzz2 + key = "buzz2" + message = "buzzes twice." + +/datum/emote/living/carbon/human/robot_tongue/buzz2/run_emote(mob/user, params) + if(..()) + playsound(user.loc, 'sound/machines/buzz-two.ogg', 50) + +/datum/emote/living/carbon/human/robot_tongue/chime + key = "chime" + key_third_person = "chimes" + message = "chimes." + +/datum/emote/living/carbon/human/robot_tongue/chime/run_emote(mob/user, params) + if(..()) + playsound(user.loc, 'sound/machines/chime.ogg', 50) + +/datum/emote/living/carbon/human/robot_tongue/ping + key = "ping" + key_third_person = "pings" + message = "pings." + message_param = "pings at %t." + +/datum/emote/living/carbon/human/robot_tongue/ping/run_emote(mob/user, params) + if(..()) + playsound(user.loc, 'sound/machines/ping.ogg', 50) + + // Clown Robotic Tongue ONLY. Henk. + +/datum/emote/living/carbon/human/robot_tongue/clown/can_run_emote(mob/user, status_check = TRUE , intentional) + if(!..()) + return FALSE + if(user.mind.assigned_role == "Clown") + return TRUE + +/datum/emote/living/carbon/human/robot_tongue/clown/honk + key = "honk" + key_third_person = "honks" + message = "honks." + +/datum/emote/living/carbon/human/robot_tongue/clown/honk/run_emote(mob/user, params) + if(..()) + playsound(user.loc, 'sound/items/bikehorn.ogg', 50) + +/datum/emote/living/carbon/human/robot_tongue/clown/sad + key = "sad" + key_third_person = "plays a sad trombone..." + message = "plays a sad trombone..." + +/datum/emote/living/carbon/human/robot_tongue/clown/sad/run_emote(mob/user, params) + if(..()) + playsound(user.loc, 'sound/misc/sadtrombone.ogg', 50) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 85fc9056735c..3f5cbee2575f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1244,6 +1244,9 @@ /mob/living/carbon/human/species/mush race = /datum/species/mush +/mob/living/carbon/human/species/ipc + race = /datum/species/ipc + /mob/living/carbon/human/species/plasma race = /datum/species/plasmaman diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 5ee02f4c890b..0444a3ca235d 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -190,6 +190,12 @@ zone_hit_chance += 10 affecting = get_bodypart(ran_zone(user.zone_selected, zone_hit_chance)) var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target + if(affecting) + if(I.force && I.damtype != STAMINA && affecting.status == BODYPART_ROBOTIC) // Bodpart_robotic sparks when hit, but only when it does real damage + if(I.force >= 5) + do_sparks(1, FALSE, loc) + if(prob(25)) + new /obj/effect/decal/cleanable/oil(loc) SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) @@ -548,6 +554,10 @@ L.receive_damage(0,5) Paralyze(100) + if((TRAIT_EASYDISMEMBER in L.owner.dna.species.species_traits) && L.body_zone != "chest") + if(prob(20)) + L.dismember(BRUTE) + /mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) //todo: update this to utilize check_obscured_slots() //and make sure it's check_obscured_slots(TRUE) to stop aciding through visors etc var/list/damaged = list() var/list/inventory_items_to_kill = list() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index f7a3b4865315..06a9618c37d3 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -79,6 +79,14 @@ GLOBAL_LIST_EMPTY(mentor_races) var/acidmod = 1 /// multiplier for stun duration var/stunmod = 1 + /// multiplier for oxyloss + var/oxymod = 1 + /// multiplier for cloneloss + var/clonemod = 1 + /// multiplier for toxloss + var/toxmod = 1 + /// multiplier for stun duration + var/staminamod = 1 /// multiplier for money paid at payday, species dependent var/payday_modifier = 1 ///Type of damage attack does @@ -111,6 +119,12 @@ GLOBAL_LIST_EMPTY(mentor_races) var/datum/action/innate/flight/fly ///the icon used for the wings var/wings_icon = "Angel" + /// Used for metabolizing reagents. We're going to assume you're a meatbag unless you say otherwise. + var/reagent_tag = PROCESS_ORGANIC + /// What kind of gibs to spawn + var/species_gibs = "human" + /// Can this species use numbers in its name? + var/allow_numbers_in_name = FALSE /// species-only traits. Can be found in DNA.dm var/list/species_traits = list() @@ -403,6 +417,15 @@ GLOBAL_LIST_EMPTY(mentor_races) else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand C.put_in_hands(new mutanthands()) + if(ROBOTIC_LIMBS in species_traits) + for(var/obj/item/bodypart/B in C.bodyparts) + B.change_bodypart_status(BODYPART_ROBOTIC) // Makes all Bodyparts robotic. + B.render_like_organic = TRUE + + if(NOMOUTH in species_traits) + for(var/obj/item/bodypart/head/head in C.bodyparts) + head.mouth = FALSE + for(var/X in inherent_traits) ADD_TRAIT(C, X, SPECIES_TRAIT) @@ -424,6 +447,13 @@ GLOBAL_LIST_EMPTY(mentor_races) C.dna.blood_type = random_blood_type() if(DIGITIGRADE in species_traits) C.Digitigrade_Leg_Swap(TRUE) + if(ROBOTIC_LIMBS in species_traits) + for(var/obj/item/bodypart/B in C.bodyparts) + B.change_bodypart_status(BODYPART_ORGANIC, FALSE, TRUE) + B.render_like_organic = FALSE + if(NOMOUTH in species_traits) + for(var/obj/item/bodypart/head/head in C.bodyparts) + head.mouth = TRUE for(var/X in inherent_traits) REMOVE_TRAIT(C, X, SPECIES_TRAIT) @@ -795,6 +825,14 @@ GLOBAL_LIST_EMPTY(mentor_races) bodyparts_to_add -= "wings_open" else if ("wings" in mutant_bodyparts) bodyparts_to_add -= "wings_open" + + if("ipc_screen" in mutant_bodyparts) + if(!H.dna.features["ipc_screen"] || H.dna.features["ipc_screen"] == "None" || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEYES)) || !HD) + bodyparts_to_add -= "ipc_screen" + + if("ipc_antenna" in mutant_bodyparts) + if(!H.dna.features["ipc_antenna"] || H.dna.features["ipc_antenna"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD) + bodyparts_to_add -= "ipc_antenna" if("teeth" in mutant_bodyparts) if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE)) || !HD || HD.status == BODYPART_ROBOTIC) @@ -912,6 +950,12 @@ GLOBAL_LIST_EMPTY(mentor_races) S = GLOB.dorsal_tubes_list[H.dna.features["dorsal_tubes"]] if("ethereal_mark") S = GLOB.ethereal_mark_list[H.dna.features["ethereal_mark"]] + if("ipc_screen") + S = GLOB.ipc_screens_list[H.dna.features["ipc_screen"]] + if("ipc_antenna") + S = GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]] + if("ipc_chassis") + S = GLOB.ipc_chassis_list[H.dna.features["ipc_chassis"]] if(!S || S.icon_state == "none") continue @@ -1209,6 +1253,17 @@ GLOBAL_LIST_EMPTY(mentor_races) /datum/species/proc/after_equip_job(datum/job/J, mob/living/carbon/human/H) H.update_mutant_bodyparts() +// Do species-specific reagent handling here +// Return 1 if it should do normal processing too +// Return 0 if it shouldn't deplete and do its normal effect +// Other return values will cause weird badness +/datum/species/proc/handle_reagents(mob/living/carbon/human/H, datum/reagent/R) + if(R.type == exotic_blood) + H.blood_volume = min(H.blood_volume + round(R.volume, 0.1), BLOOD_VOLUME_NORMAL(H)) + H.reagents.del_reagent(R.type) + return FALSE + return TRUE + /datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.type == exotic_blood) H.blood_volume = min(H.blood_volume + round(chem.volume, 0.1), BLOOD_VOLUME_MAXIMUM(H)) @@ -1791,14 +1846,14 @@ GLOBAL_LIST_EMPTY(mentor_races) else H.adjustFireLoss(damage * hit_percent * burnmod * H.physiology.burn_mod) if(TOX) - H.adjustToxLoss(damage * hit_percent * H.physiology.tox_mod) + H.adjustToxLoss(damage * hit_percent * toxmod * H.physiology.tox_mod) if(OXY) - H.adjustOxyLoss(damage * hit_percent * H.physiology.oxy_mod) + H.adjustOxyLoss(damage * hit_percent * oxymod * H.physiology.oxy_mod) if(CLONE) - H.adjustCloneLoss(damage * hit_percent * H.physiology.clone_mod) + H.adjustCloneLoss(damage * hit_percent * clonemod * H.physiology.clone_mod) if(STAMINA) if(BP) - if(BP.receive_damage(0, 0, damage * hit_percent * H.physiology.stamina_mod)) + if(BP.receive_damage(0, 0, damage * staminamod * hit_percent * H.physiology.stamina_mod)) H.update_stamina() else H.adjustStaminaLoss(damage * hit_percent * H.physiology.stamina_mod) @@ -2015,6 +2070,8 @@ GLOBAL_LIST_EMPTY(mentor_races) /datum/species/proc/ExtinguishMob(mob/living/carbon/human/H) return +/datum/species/proc/spec_revival(mob/living/carbon/human/H) + return //////////// // Stun // diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm new file mode 100644 index 000000000000..e3c73db0c10a --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -0,0 +1,191 @@ +/datum/species/ipc // im fucking lazy mk2 and cant get sprites to normally work + name = "IPC" //inherited from the real species, for health scanners and things + id = "ipc" + say_mod = "states" //inherited from a user's real species + sexes = 0 + species_traits = list(NOTRANSSTING,NOEYESPRITES,NO_DNA_COPY,NOBLOOD,TRAIT_EASYDISMEMBER,ROBOTIC_LIMBS,NOZOMBIE,MUTCOLORS,NOHUSK,NOMOUTH, AGENDER) //all of these + whatever we inherit from the real species + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_LIMBATTACHMENT,TRAIT_NOCRITDAMAGE,TRAIT_GENELESS,TRAIT_MEDICALIGNORE,TRAIT_NOCLONE) + inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) + mutant_brain = /obj/item/organ/brain/positron + mutanteyes = /obj/item/organ/eyes/robotic + mutanttongue = /obj/item/organ/tongue/robot + mutantliver = /obj/item/organ/liver/cybernetic/upgraded/ipc + mutantstomach = /obj/item/organ/stomach/cell + mutantears = /obj/item/organ/ears/robot + mutant_organs = list(/obj/item/organ/cyberimp/arm/power_cord) + mutant_bodyparts = list("ipc_screen", "ipc_antenna", "ipc_chassis") + default_features = list("mcolor" = "#7D7D7D", "ipc_screen" = "Static", "ipc_antenna" = "None", "ipc_chassis" = "Morpheus Cyberkinetics(Greyscale)") + meat = /obj/item/stack/sheet/plasteel{amount = 5} + skinned_type = /obj/item/stack/sheet/metal{amount = 10} + exotic_blood = "oil" + damage_overlay_type = "synth" + limbs_id = "synth" + burnmod = 2 + heatmod = 1.5 + brutemod = 1 + toxmod = 0 + clonemod = 0 + staminamod = 0.8 + siemens_coeff = 1.5 + reagent_tag = PROCESS_SYNTHETIC + species_gibs = "robotic" + attack_sound = 'sound/items/trayhit1.ogg' + allow_numbers_in_name = TRUE + deathsound = "sound/voice/borg_deathsound.ogg" + var/saved_screen //for saving the screen when they die + var/list/initial_species_traits //for getting these values back for assume_disguise() + var/list/initial_inherent_traits + changesource_flags = MIRROR_BADMIN | WABBAJACK + + var/datum/action/innate/change_screen/change_screen + +/datum/species/ipc/random_name(unique) + var/ipc_name = "[pick(GLOB.posibrain_names)]-[rand(100, 999)]" + return ipc_name + +/datum/species/ipc/on_species_gain(mob/living/carbon/C) // Let's make that IPC actually robotic. + . = ..() + var/obj/item/organ/appendix/appendix = C.getorganslot("appendix") // Easiest way to remove it. + appendix.Remove(C) + QDEL_NULL(appendix) + if(ishuman(C) && !change_screen) + change_screen = new + change_screen.Grant(C) + for(var/obj/item/bodypart/O in C.bodyparts) + O.render_like_organic = TRUE // Makes limbs render like organic limbs instead of augmented limbs, check bodyparts.dm + var/chassis = C.dna.features["ipc_chassis"] + var/datum/sprite_accessory/ipc_chassis/chassis_of_choice = GLOB.ipc_chassis_list[chassis] + C.dna.species.limbs_id = chassis_of_choice.limbs_id + if(chassis_of_choice.color_src == MUTCOLORS && !(MUTCOLORS in C.dna.species.species_traits)) // If it's a colorable(Greyscale) chassis, we use MUTCOLORS. + C.dna.species.species_traits += MUTCOLORS + else if(MUTCOLORS in C.dna.species.species_traits) + C.dna.species.species_traits -= MUTCOLORS + +datum/species/ipc/on_species_loss(mob/living/carbon/C) + . = ..() + if(change_screen) + change_screen.Remove(C) + +/datum/species/ipc/proc/handle_speech(datum/source, list/speech_args) + speech_args[SPEECH_SPANS] |= SPAN_ROBOT + +/datum/species/ipc/after_equip_job(datum/job/J, mob/living/carbon/human/H) + H.grant_language(/datum/language/machine) + +/datum/species/ipc/spec_death(gibbed, mob/living/carbon/C) + saved_screen = C.dna.features["ipc_screen"] + C.dna.features["ipc_screen"] = "BSOD" + C.update_body() + sleep(3 SECONDS) + C.dna.features["ipc_screen"] = null // Turns off their monitor on death. + C.update_body() + +/datum/action/innate/change_screen + name = "Change Display" + check_flags = AB_CHECK_CONSCIOUS + icon_icon = 'icons/mob/actions/actions_silicon.dmi' + button_icon_state = "drone_vision" + +/datum/action/innate/change_screen/Activate() + var/screen_choice = input(usr, "Which screen do you want to use?", "Screen Change") as null | anything in GLOB.ipc_screens_list + var/color_choice = input(usr, "Which color do you want your screen to be?", "Color Change") as null | color + if(!screen_choice) + return + if(!color_choice) + return + if(!ishuman(owner)) + return + var/mob/living/carbon/human/H = owner + H.dna.features["ipc_screen"] = screen_choice + H.eye_color = sanitize_hexcolor(color_choice) + H.update_body() + +/obj/item/apc_powercord + name = "power cord" + desc = "An internal power cord hooked up to a battery. Useful if you run on electricity. Not so much otherwise." + icon = 'icons/obj/power.dmi' + icon_state = "wire1" + +/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) + return ..() + user.changeNext_move(CLICK_CD_MELEE) + var/obj/machinery/power/apc/A = target + var/mob/living/carbon/human/H = user + var/obj/item/organ/stomach/cell/cell = locate(/obj/item/organ/stomach/cell) in H.internal_organs + if(!cell) + to_chat(H, "You try to siphon energy from the [A], but your power cell is gone!") + return + + if(A.cell && A.cell.charge > 0) + if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) + to_chat(user, "You are already fully charged!") + return + else + powerdraw_loop(A, H) + return + + to_chat(user, "There is no charge to draw from that APC.") + +/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) + H.visible_message("[H] inserts a power connector into the [A].", "You begin to draw power from the [A].") + while(do_after(H, 10, target = A)) + if(loc != H) + to_chat(H, "You must keep your connector out while charging!") + break + if(A.cell.charge == 0) + to_chat(H, "The [A] doesn't have enough charge to spare.") + break + A.charging = 1 + if(A.cell.charge >= 500) + H.nutrition += 50 + A.cell.charge -= 250 + to_chat(H, "You siphon off some of the stored charge for your own use.") + else + H.nutrition += A.cell.charge/10 + A.cell.charge = 0 + to_chat(H, "You siphon off as much as the [A] can spare.") + break + if(H.nutrition > NUTRITION_LEVEL_WELL_FED) + to_chat(H, "You are now fully charged.") + break + H.visible_message("[H] unplugs from the [A].", "You unplug from the [A].") + +/datum/species/ipc/spec_life(mob/living/carbon/human/H) + . = ..() + if(H.health <= UNCONSCIOUS && H.stat != DEAD) // So they die eventually instead of being stuck in crit limbo. + H.adjustFireLoss(6) // After bodypart_robotic resistance this is ~2/second + if(prob(5)) + to_chat(H, "Alert: Internal temperature regulation systems offline; thermal damage sustained. Shutdown imminent.") + H.visible_message("[H]'s cooling system fans stutter and stall. There is a faint, yet rapid beeping coming from inside their chassis.") + +/datum/species/ipc/spec_revival(mob/living/carbon/human/H) + H.dna.features["ipc_screen"] = "BSOD" + H.update_body() + H.say("Reactivating [pick("core systems", "central subroutines", "key functions")]...") + sleep(3 SECONDS) + H.say("Reinitializing [pick("personality matrix", "behavior logic", "morality subsystems")]...") + sleep(3 SECONDS) + H.say("Finalizing setup...") + sleep(3 SECONDS) + H.say("Unit [H.real_name] is fully functional. Have a nice day.") + H.dna.features["ipc_screen"] = saved_screen + H.update_body() + to_chat(H, "You do not remember your death, how you died, or who killed you. See rule 1.7.") + return + +/datum/species/ipc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H) + . = ..() + if(istype(I, /obj/item/borg/upgrade/restart)) + if(H.stat != DEAD) + to_chat(user, "This unit is not dead!") + return FALSE + if(H.health < 0) + to_chat(user, "You have to repair the IPC before using this module!") + return FALSE + if(H.mind) + H.mind.grab_ghost() + qdel(I) // One use only >:( + H.revive() + to_chat(user, "You reset the IPC's internal circuitry - reviving them!") + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index c69328592f05..00aea5c35357 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -5,7 +5,7 @@ say_mod = "rattles" sexes = 0 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton - species_traits = list(NOBLOOD,HAS_BONE, NO_DNA_COPY, NOTRANSSTING) + species_traits = list(NOBLOOD,HAS_BONE, NO_DNA_COPY, NOTRANSSTING, NOHUSK) inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER) inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID) mutanttongue = /obj/item/organ/tongue/bone diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 96c48b4695e9..4d98469e2e5f 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -32,7 +32,7 @@ update_hair() /mob/living/carbon/human/become_husk(source) - if(istype(dna.species, /datum/species/skeleton)) //skeletons shouldn't be husks. + if(NOHUSK in dna.species.species_traits) cure_husk() return . = ..() diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 705c3b3ace1d..4b257165b7bb 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -78,6 +78,7 @@ message_alien = "lets out a waning guttural screech, green blood bubbling from its maw..." message_larva = "lets out a sickly hiss of air and falls limply to the floor..." message_monkey = "lets out a faint chimper as it collapses and stops moving..." + message_ipc = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." message_simple = "stops moving..." stat_allowed = UNCONSCIOUS cooldown = 3.4 SECONDS diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 9275b22e9da2..bbfce8b02cc1 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -454,12 +454,23 @@ if(C.suiciding) return FALSE //Kevorkian school of robotic medical assistants. + if(istype(C.dna.species, /datum/species/ipc)) + return FALSE + if(emagged == 2) //Everyone needs our medicine. (Our medicine is toxins) return TRUE if(HAS_TRAIT(C,TRAIT_MEDICALIGNORE)) return FALSE + var/can_inject = FALSE + for(var/X in C.bodyparts) + var/obj/item/bodypart/part = X + if(part.status == BODYPART_ORGANIC) + can_inject = TRUE + if(!can_inject) + return FALSE + if(ishuman(C)) var/mob/living/carbon/human/H = C if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing)) diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 288bfcad28d8..fb8dd65339bf 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -82,6 +82,12 @@ to_chat(src, span_warning("I can't latch onto another slime...")) return FALSE + if(isipc(M)) + if(silent) + return FALSE + to_chat(src, "This subject does not have life energy...") + return FALSE + if(docile) if(silent) return FALSE diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 16140749c7b9..d248bfff6c1e 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -1,4 +1,5 @@ #define DEFAULT_TASTE_SENSITIVITY 15 +#define NO_TASTE_SENSITIVITY -1 /mob/living var/last_taste_time @@ -12,7 +13,7 @@ if(istype(tongue) && !HAS_TRAIT(src, TRAIT_AGEUSIA)) . = tongue.taste_sensitivity else - . = 101 // can't taste anything without a tongue + . = NO_TASTE_SENSITIVITY // can't taste anything without a tongue // non destructively tastes a reagent container /mob/living/proc/taste(datum/reagents/from) @@ -25,7 +26,7 @@ text_output = pick("spiders","dreams","nightmares","the future","the past","victory",\ "defeat","pain","bliss","revenge","poison","time","space","death","life","truth","lies","justice","memory",\ "regrets","your soul","suffering","music","noise","blood","hunger","the american way") - if(text_output != last_taste_text || last_taste_time + 100 < world.time) + if(!NO_TASTE_SENSITIVITY && (text_output != last_taste_text || last_taste_time + 100 < world.time)) to_chat(src, span_notice("You can taste [text_output].")) // "something indescribable" -> too many tastes, not enough flavor. diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index e8d378d62144..3a90254d0850 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -563,6 +563,9 @@ /mob/proc/can_hear() . = TRUE +/mob/proc/has_mouth() + return FALSE + /** * Examine text for traits shared by multiple types. * diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index bb7b0efc8cd7..b0a2ca6165f0 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -749,6 +749,8 @@ locked = FALSE update_icon() return + else if(istype(W, /obj/item/apc_powercord)) + return //because we put our fancy code in the right places, and this is all in the powercord's afterattack() else if(panel_open && !opened && is_wire_tool(W)) wires.interact(user) else diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index ca2cd87abf4c..3f1dcf0b6ec6 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -183,6 +183,11 @@ new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) else new /obj/effect/temp_visual/dir_setting/bloodsplatter/genericsplatter(target_loca, splatter_dir) + var/obj/item/bodypart/B = L.get_bodypart(def_zone) + if(B.status == BODYPART_ROBOTIC) // So if you hit a robotic, it sparks instead of bloodspatters + do_sparks(2, FALSE, target.loc) + if(prob(25)) + new /obj/effect/decal/cleanable/oil(target_loca) if(prob(33)) L.add_splatter_floor(target_loca) else if(impact_effect_type && !hitscan) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6b2e1639fde4..36dffef175e3 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -324,6 +324,31 @@ continue if(!C) C = R.holder.my_atom + if(ishuman(C)) + var/mob/living/carbon/human/H = C + //Check if this mob's species is set and can process this type of reagent + var/can_process = FALSE + //If we somehow avoided getting a species or reagent_tag set, we'll assume we aren't meant to process ANY reagents (CODERS: SET YOUR SPECIES AND TAG!) + if(H.dna && H.dna.species.reagent_tag) + if((R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_SYNTHETIC)) //SYNTHETIC-oriented reagents require PROCESS_SYNTHETIC + can_process = TRUE + if((R.process_flags & ORGANIC) && (H.dna.species.reagent_tag & PROCESS_ORGANIC)) //ORGANIC-oriented reagents require PROCESS_ORGANIC + can_process = TRUE + + //If handle_reagents returns 0, it's doing the reagent removal on its own + var/species_handled = !(H.dna.species.handle_reagents(H, R)) + can_process = can_process && !species_handled + //If the mob can't process it, remove the reagent at it's normal rate without doing any addictions, overdoses, or on_mob_life() for the reagent + if(!can_process) + if(!species_handled) + R.holder.remove_reagent(R.type, R.metabolization_rate) + continue + //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption) + else + if(R.process_flags == SYNTHETIC) + R.holder.remove_reagent(R.type, R.metabolization_rate) + continue + //If you got this far, that means we can process whatever reagent this iteration is for. Handle things normally from here. if(!R.metabolizing) R.metabolizing = TRUE R.on_mob_metabolize(C) @@ -590,6 +615,22 @@ del_reagent(R.type) return 0 +/datum/reagents/proc/reaction_check(mob/living/M, datum/reagent/R) + var/can_process = FALSE + if(ishuman(M)) + var/mob/living/carbon/human/H = M + //Check if this mob's species is set and can process this type of reagent + if(H.dna && H.dna.species.reagent_tag) + if((R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_SYNTHETIC)) //SYNTHETIC-oriented reagents require PROCESS_SYNTHETIC + can_process = TRUE + if((R.process_flags & ORGANIC) && (H.dna.species.reagent_tag & PROCESS_ORGANIC)) //ORGANIC-oriented reagents require PROCESS_ORGANIC + can_process = TRUE + //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption) + else + if(R.process_flags != SYNTHETIC) + can_process = TRUE + return can_process + /** * Applies the relevant reaction_ proc for every reagent in this holder * * [/datum/reagent/proc/reaction_mob] @@ -614,6 +655,9 @@ var/datum/reagent/R = reagent switch(react_type) if("LIVING") + var/check = reaction_check(A, R) + if(!check) + continue var/touch_protection = 0 if(method == VAPOR) var/mob/living/L = A diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index e706943e53f4..9dacc3cef808 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -58,6 +58,8 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/addiction_threshold = 0 /// increases as addiction gets worse var/addiction_stage = 0 + /// What can process this? ORGANIC, SYNTHETIC, or ORGANIC | SYNTHETIC?. We'll assume by default that it affects organics. + var/process_flags = ORGANIC /// You fucked up and this is now triggering its overdose effects, purge that shit quick. var/overdosed = 0 ///if false stops metab in liverless mobs diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 9e617353f321..90125a3282d8 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -433,6 +433,39 @@ M.reagents.remove_reagent(R.type,1) ..() +/datum/reagent/medicine/system_cleaner + name = "System Cleaner" + description = "Neutralizes harmful chemical compounds inside synthetic systems." + reagent_state = LIQUID + color = "#F1C40F" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + process_flags = SYNTHETIC + +/datum/reagent/medicine/system_cleaner/on_mob_life(mob/living/M) + M.adjustToxLoss(-2*REM, 0) + . = 1 + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.type,1) + ..() + +/datum/reagent/medicine/liquid_solder + name = "Liquid Solder" + description = "Repairs brain damage in synthetics." + color = "#727272" + taste_description = "metallic" + process_flags = SYNTHETIC + +/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3*REM) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL)) + C.cure_trauma_type(BRAIN_TRAUMA_SPECIAL) + if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD)) + C.cure_trauma_type(BRAIN_TRAUMA_MILD) + ..() + /datum/reagent/medicine/omnizine name = "Omnizine" description = "Slowly heals all damage types. Overdose will cause damage in all types instead." @@ -441,6 +474,7 @@ metabolization_rate = 0.25 * REAGENTS_METABOLISM var/healing = 0.5 overdose_threshold = 30 + process_flags = ORGANIC | SYNTHETIC /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-healing*REM, 0) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index d2479cc39c72..a41f9d6d4071 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -122,6 +122,7 @@ glass_name = "glass of water" glass_desc = "The father of all refreshments." shot_glass_icon_state = "shotglassclear" + process_flags = ORGANIC | SYNTHETIC /* * Water reaction to turf @@ -331,6 +332,7 @@ name = "Hell Water" description = "YOUR FLESH! IT BURNS!" taste_description = "burning" + process_flags = ORGANIC | SYNTHETIC /datum/reagent/hellwater/on_mob_life(mob/living/carbon/M) M.fire_stacks = min(5,M.fire_stacks + 3) @@ -503,6 +505,7 @@ taste_description = "slime" var/datum/species/race = /datum/species/human var/mutationtext = span_danger("The pain subsides. You feel... human.") + process_flags = ORGANIC | SYNTHETIC /datum/reagent/mutationtoxin/on_mob_life(mob/living/carbon/human/H) ..() @@ -964,6 +967,7 @@ color = "#B8B8C0" // rgb: 184, 184, 192 taste_description = "the inside of a reactor" var/irradiation_level = 1 + process_flags = ORGANIC | SYNTHETIC /datum/reagent/uranium/on_mob_life(mob/living/carbon/M) M.apply_effect(irradiation_level/M.metabolism_efficiency,EFFECT_IRRADIATE,0) @@ -984,6 +988,7 @@ color = "#C7C7C7" // rgb: 199,199,199 taste_description = "the colour blue and regret" irradiation_level = 2*REM + process_flags = ORGANIC | SYNTHETIC /datum/reagent/bluespace name = "Bluespace Dust" @@ -991,6 +996,7 @@ reagent_state = SOLID color = "#0000CC" taste_description = "fizzling blue" + process_flags = ORGANIC | SYNTHETIC /datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -1030,6 +1036,7 @@ glass_icon_state = "dr_gibb_glass" glass_name = "glass of welder fuel" glass_desc = "Unless you're an industrial tool, this is probably not safe for consumption." + process_flags = ORGANIC | SYNTHETIC /datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with welding fuel to make them easy to ignite! if(method == TOUCH || method == VAPOR) @@ -1529,6 +1536,7 @@ color = "#C8A5DC" taste_description = "bitterness" taste_mult = 1.5 + process_flags = ORGANIC | SYNTHETIC /datum/reagent/stable_plasma/on_mob_life(mob/living/carbon/C) C.adjustPlasma(10) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 0d7677513e63..48258ac5f3ee 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -5,6 +5,7 @@ reagent_state = SOLID color = "#550000" taste_description = "sweet tasting metal" + process_flags = ORGANIC | SYNTHETIC /datum/reagent/thermite/reaction_turf(turf/T, reac_volume) if(reac_volume >= 1) @@ -35,6 +36,7 @@ color = "#FFC8C8" metabolization_rate = 4 taste_description = "burning" + process_flags = ORGANIC | SYNTHETIC /datum/reagent/clf3/on_mob_life(mob/living/carbon/M) M.adjust_fire_stacks(2) @@ -135,6 +137,7 @@ color = "#FA00AF" taste_description = "burning" self_consuming = TRUE + process_flags = ORGANIC | SYNTHETIC /datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, reac_volume) M.adjust_fire_stacks(1) @@ -157,6 +160,7 @@ color = "#FA00AF" taste_description = "burning" self_consuming = TRUE + process_flags = ORGANIC | SYNTHETIC /datum/reagent/napalm/on_mob_life(mob/living/carbon/M) M.adjust_fire_stacks(1) @@ -174,6 +178,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "bitterness" self_consuming = TRUE + process_flags = ORGANIC | SYNTHETIC /datum/reagent/cryostylane/on_mob_life(mob/living/carbon/M) //TODO: code freezing into an ice cube diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index d3807053a69a..73fca550a592 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -58,6 +58,7 @@ taste_mult = 1.5 color = "#8228A0" toxpwr = 3 + process_flags = ORGANIC | SYNTHETIC /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) @@ -393,6 +394,7 @@ color = "#787878" metabolization_rate = 0.125 * REAGENTS_METABOLISM toxpwr = 0 + process_flags = ORGANIC | SYNTHETIC /datum/reagent/toxin/polonium/on_mob_life(mob/living/carbon/M) M.radiation += 40 @@ -742,6 +744,7 @@ metabolization_rate = 1.2 * REAGENTS_METABOLISM toxpwr = 0.5 taste_description = "spinning" + process_flags = ORGANIC | SYNTHETIC /datum/reagent/toxin/rotatium/on_mob_life(mob/living/carbon/M) if(M.hud_used) @@ -790,6 +793,7 @@ var/acidpwr = 10 //the amount of protection removed from the armour taste_description = "acid" self_consuming = TRUE + process_flags = ORGANIC | SYNTHETIC /datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume) if(!istype(C)) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index f52bab751cac..dd35f9412180 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -276,6 +276,20 @@ results = list(/datum/reagent/medicine/psicodine = 5) required_reagents = list( /datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 2, /datum/reagent/impedrezene = 1) +/datum/chemical_reaction/system_cleaner + name = "System Cleaner" + id = /datum/reagent/medicine/system_cleaner + results = list(/datum/reagent/medicine/system_cleaner = 4) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 1, /datum/reagent/phenol = 2, /datum/reagent/potassium = 1) + +/datum/chemical_reaction/liquid_solder + name = "Liquid Solder" + id = /datum/reagent/medicine/liquid_solder + results = list(/datum/reagent/medicine/liquid_solder = 3) + required_reagents = list( /datum/reagent/consumable/ethanol = 1, /datum/reagent/copper = 1, /datum/reagent/silver = 1) + required_temp = 370 + mix_message = "The mixture becomes a metallic slurry." + /datum/chemical_reaction/burnmix // Chemistry recipe name = "BurnMix" required_temp = 700 diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index b996701eaf17..3e22aeaaf950 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -58,8 +58,14 @@ if(covered) var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]" to_chat(user, span_warning("You have to remove [who] [covered] first!")) - return 0 - return 1 + return FALSE + if(!eater.has_mouth()) + if(eater == user) + to_chat(eater, "You have no mouth, and cannot eat.") + else + to_chat(user, "You can't feed [eater], because they have no mouth!") + return FALSE + return TRUE /obj/item/reagent_containers/ex_act() if(reagents) From 4bfc43a084a088385d5a8ce44a3675718f84f6c0 Mon Sep 17 00:00:00 2001 From: Redmoogle Date: Fri, 24 Jun 2022 09:25:55 -0400 Subject: [PATCH 03/52] Should compile now but will be missing icons --- .../designs/mechfabricator_designs.dm | 56 +++++++++++++++++++ code/modules/research/techweb/all_nodes.dm | 9 +++ code/modules/research/techweb/layout.dm | 4 ++ code/modules/surgery/advanced/brainwashing.dm | 1 + code/modules/surgery/bodyparts/_bodyparts.dm | 11 +++- .../surgery/bodyparts/dismemberment.dm | 12 ++++ code/modules/surgery/bodyparts/head.dm | 1 + code/modules/surgery/organ_manipulation.dm | 15 +++++ code/modules/surgery/organs/augments_arms.dm | 6 ++ code/modules/surgery/organs/ears.dm | 23 ++++++++ code/modules/surgery/organs/liver.dm | 18 ++++++ code/modules/surgery/organs/stomach.dm | 30 ++++++++++ code/modules/surgery/organs/tongue.dm | 11 +++- .../modules/surgery/prosthetic_replacement.dm | 6 ++ config/game_options.txt | 1 + yogstation.dme | 1 + 16 files changed, 201 insertions(+), 4 deletions(-) diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 342fdfc75ce3..8df93e9a5cd1 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -835,3 +835,59 @@ construction_time = 100 build_path = /obj/item/assembly/flash/handheld category = list("Misc") + +// IPC Replacement Parts + +/datum/design/robotic_liver + name = "Substance Processor" + id = "robotic_liver" + build_type = MECHFAB + build_path = /obj/item/organ/liver/cybernetic/upgraded/ipc + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) + construction_time = 100 + category = list("IPC Components") + +/datum/design/robotic_eyes + name = "Basic Robotic Eyes" + id = "robotic_eyes" + build_type = MECHFAB + build_path = /obj/item/organ/eyes/robotic + materials = list(/datum/material/iron = 1000, /datum/material/glass = 2000) + construction_time = 100 + category = list("IPC Components") + +/datum/design/robotic_tongue + name = "Robotic Voicebox" + id = "robotic_tongue" + build_type = MECHFAB + build_path = /obj/item/organ/tongue/robot + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) + construction_time = 100 + category = list("IPC Components") + +/datum/design/robotic_stomach + name = "Micro-cell" + id = "robotic_stomach" + build_type = MECHFAB + build_path = /obj/item/organ/stomach/cell + materials = list(/datum/material/iron = 2000, /datum/material/glass = 2000, /datum/material/plasma = 200) + construction_time = 100 + category = list("IPC Components") + +/datum/design/robotic_ears + name = "Auditory Sensors" + id = "robotic_ears" + build_type = MECHFAB + build_path = /obj/item/organ/ears/robot + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) + construction_time = 100 + category = list("IPC Components") + +/datum/design/power_cord + name = "Recharging Electronics" + id = "power_cord" + build_type = MECHFAB + build_path = /obj/item/organ/cyberimp/arm/power_cord + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) + construction_time = 100 + category = list("IPC Components") \ No newline at end of file diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index b3a10a569a3b..86de1fe3eeff 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -542,6 +542,15 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) export_price = 5000 +/datum/techweb_node/ipc_organs + id = "ipc_organs" + display_name = "IPC Parts" + description = "We have the technology to replace him." + prereq_ids = list("cyber_organs","robotics") + design_ids = list("robotic_liver", "robotic_eyes", "robotic_tongue", "robotic_stomach", "robotic_ears", "power_cord") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) + export_price = 5000 + /datum/techweb_node/cyber_implants id = "cyber_implants" display_name = "Cybernetic Implants" diff --git a/code/modules/research/techweb/layout.dm b/code/modules/research/techweb/layout.dm index 3f2a0c33c30a..68a99f15b48a 100644 --- a/code/modules/research/techweb/layout.dm +++ b/code/modules/research/techweb/layout.dm @@ -119,6 +119,10 @@ ui_x = 192 ui_y = -320 +/datum/techweb_node/ipc_organs + ui_x = -160 + ui_y = 32 + /datum/techweb_node/cyber_implants ui_x = 352 ui_y = -32 diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm index e426ad0bb28a..cd613185fd38 100644 --- a/code/modules/surgery/advanced/brainwashing.dm +++ b/code/modules/surgery/advanced/brainwashing.dm @@ -16,6 +16,7 @@ target_mobtypes = list(/mob/living/carbon/human) possible_locs = list(BODY_ZONE_HEAD) + requires_bodypart_type = FALSE /datum/surgery/advanced/brainwashing/can_start(mob/user, mob/living/carbon/target) if(!..()) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 42eb7df14eae..bb3a11b9b441 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -20,6 +20,7 @@ var/use_digitigrade = NOT_DIGITIGRADE //Used for alternate legs, useless elsewhere var/list/embedded_objects = list() var/held_index = 0 //are we a hand? if so, which one! + var/render_like_organic = FALSE // TRUE is for when you want a BODYPART_ROBOTIC to pretend to be a BODYPART_ORGANIC. var/is_pseudopart = FALSE //For limbs that don't really exist, eg chainsaws ///If disabled, limb is as good as missing. @@ -131,6 +132,14 @@ var/mob/living/carbon/human/H = C if(HAS_TRAIT(C, TRAIT_LIMBATTACHMENT)) if(!H.get_bodypart(body_zone) && !animal_origin) + if(iscarbon(user)) + var/mob/living/carbon/target = user + if(target.dna && target.dna.species && (ROBOTIC_LIMBS in target.dna.species.species_traits) && src.status != BODYPART_ROBOTIC) + if(H == user) + to_chat(H, "You try to force [src] into your empty socket, but it doesn't fit") + else + to_chat(user, "You try to force [src] into [H.p_their()] empty socket, but it doesn't fit") + return user.temporarilyRemoveItemFromInventory(src, TRUE) if(!attach_limb(C)) to_chat(user, span_warning("[H]'s body rejects [src]!")) @@ -818,7 +827,7 @@ if((body_zone != BODY_ZONE_HEAD && body_zone != BODY_ZONE_CHEST)) should_draw_gender = FALSE - if(is_organic_limb()) + if(status == BODYPART_ORGANIC || (status == BODYPART_ROBOTIC && render_like_organic == TRUE)) // So IPC augments can be colorful without disrupting normal BODYPART_ROBOTIC render code. if(should_draw_greyscale) limb.icon = 'icons/mob/human_parts_greyscale.dmi' if(should_draw_gender) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 9e5d282cc961..e49767a6fdb8 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -361,6 +361,8 @@ LAZYADD(C.all_scars, thing) update_bodypart_damage_state() + if(C.dna && C.dna.species && (ROBOTIC_LIMBS in C.dna.species.species_traits) && src.status == BODYPART_ROBOTIC) + src.render_like_organic = TRUE C.updatehealth() C.update_body() @@ -438,6 +440,16 @@ L.brutestate = 0 L.burnstate = 0 + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.dna && H.dna.species && (ROBOTIC_LIMBS in H.dna.species.species_traits)) + L.change_bodypart_status(BODYPART_ROBOTIC) + L.render_like_organic = TRUE + if(limb_zone == "head" && H.dna && H.dna.species && (NOMOUTH in H.dna.species.species_traits)) + var/obj/item/bodypart/head/head = L + if(head) + head.mouth = FALSE + L.attach_limb(src, 1) var/datum/scar/scaries = new var/datum/wound/loss/phantom_loss = new // stolen valor, really diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 3a2defe86c9d..27e123c58e8a 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -36,6 +36,7 @@ var/lip_style = null var/lip_color = "white" + var/mouth = TRUE /obj/item/bodypart/head/Destroy() diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index da0a825d689b..8efe235384ee 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -104,6 +104,21 @@ display_results(user, target, span_notice("You begin to insert [tool] into [target]'s [parse_zone(target_zone)]..."), "[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].", "[user] begins to insert something into [target]'s [parse_zone(target_zone)].") + if(istype(tool, /obj/item/organ/brain/positron)) + var/obj/item/bodypart/affected = target.get_bodypart(check_zone(target_zone)) + if(!affected) + return -1 + if(affected.status != ORGAN_ROBOTIC) + to_chat(user, "You can't put [tool] into a meat enclosure!") + return -1 + if(!isipc(target)) + to_chat(user, "[target] does not have the proper connectors to interface with [tool].") + return -1 + if(target_zone != "chest") + to_chat(user, "You have to install [tool] in [target]'s chest!") + if(target.internal_organs_slot["brain"]) + to_chat(user, "[target] already has a brain! You'd rather not find out what would happen with two in there.") + return -1 else if(implement_type in implements_extract) current_type = "extract" diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 10833bf57762..bc1dfd737e93 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -387,3 +387,9 @@ /obj/item/organ/cyberimp/arm/syndie_mantis/l zone = BODY_ZONE_L_ARM syndicate_implant = TRUE + +/obj/item/organ/cyberimp/arm/power_cord + name = "power cord implant" + desc = "An internal power cord hooked up to a battery. Useful if you run on volts." + contents = newlist(/obj/item/apc_powercord) + zone = "l_arm" diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 07e041f1bbf6..1a61c9ec6c52 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -140,3 +140,26 @@ desc = "The robust ears of a bronze golem. " damage_multiplier = 0.1 //STRONK bang_protect = 1 //Fear me weaklings. + +/obj/item/organ/ears/robot + name = "auditory sensors" + icon_state = "robotic_ears" + desc = "A pair of microphones intended to be installed in an IPC head, that grant the ability to hear." + zone = "head" + slot = "ears" + gender = PLURAL + status = ORGAN_ROBOTIC + +/obj/item/organ/ears/robot/emp_act(severity) + switch(severity) + if(1) + owner.Jitter(30) + owner.Dizzy(30) + owner.Knockdown(200) + deaf = 30 + to_chat(owner, "Your robotic ears are ringing, uselessly.") + if(2) + owner.Jitter(15) + owner.Dizzy(15) + owner.Knockdown(100) + to_chat(owner, "Your robotic ears buzz.") \ No newline at end of file diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 592c5a5bc5ef..87086810bab7 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -117,3 +117,21 @@ damage+=100 if(2) damage+=50 + +/obj/item/organ/liver/cybernetic/upgraded/ipc + name = "substance processor" + icon_state = "substance_processor" + attack_verb = list("processed") + desc = "A machine component, installed in the chest. This grants the Machine the ability to process chemicals that enter its systems." + alcohol_tolerance = 0 + toxTolerance = -1 + toxLethality = 0 + status = ORGAN_ROBOTIC + +/obj/item/organ/liver/cybernetic/upgraded/ipc/emp_act(severity) + to_chat(owner, "Alert: Your Substance Processor has been damaged. An internal chemical leak is affecting performance.") + switch(severity) + if(1) + owner.toxloss += 15 + if(2) + owner.toxloss += 5 \ No newline at end of file diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 8e86dc0789b6..ff86b87a3285 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -124,6 +124,36 @@ icon_state = "stomach-p" desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen." +/obj/item/organ/stomach/cell + name = "micro-cell" + icon_state = "microcell" + w_class = WEIGHT_CLASS_NORMAL + zone = "chest" + slot = "stomach" + attack_verb = list("assault and battery'd") + desc = "A micro-cell, for IPC use only. Do not swallow." + status = ORGAN_ROBOTIC + +/obj/item/organ/stomach/cell/emp_act(severity) + switch(severity) + if(1) + owner.nutrition = 50 + to_chat(owner, "Alert: Heavy EMP Detected. Rebooting power cell to prevent damage.") + if(2) + owner.nutrition = 250 + to_chat(owner, "Alert: EMP Detected. Cycling battery.") + +/obj/item/organ/stomach/cell/Insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) + +/obj/item/organ/stomach/cell/Remove(mob/living/carbon/M, special) + . = ..() + UnregisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) + +/obj/item/organ/stomach/cell/proc/charge(datum/source, amount, repairs) + owner.nutrition = clamp(owner.nutrition + (amount/100), 0, NUTRITION_LEVEL_FULL) // no fat ipcs + /obj/item/organ/stomach/ethereal name = "biological battery" icon_state = "stomach-p" //Welp. At least it's more unique in functionaliy. diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 00052362c8a1..14d875fbda1f 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -121,7 +121,7 @@ desc = "A mysterious structure that allows for instant communication between users. Pretty impressive until you need to eat something." icon_state = "tongueayylmao" say_mod = "gibbers" - taste_sensitivity = 101 // ayys cannot taste anything. + taste_sensitivity = NO_TASTE_SENSITIVITY // ayys cannot taste anything. modifies_speech = TRUE var/mothership @@ -222,7 +222,7 @@ icon_state = "tonguebone" say_mod = "rattles" attack_verb = list("bitten", "chattered", "chomped", "enamelled", "boned") - taste_sensitivity = 101 // skeletons cannot taste anything + taste_sensitivity = NO_TASTE_SENSITIVITY // skeletons cannot taste anything modifies_speech = TRUE var/chattering = FALSE var/phomeme_type = "sans" @@ -256,7 +256,12 @@ say_mod = "states" attack_verb = list("beeped", "booped") modifies_speech = TRUE - taste_sensitivity = 25 // not as good as an organic tongue + taste_sensitivity = NO_TASTE_SENSITIVITY // not as good as an organic tongue + +/obj/item/organ/tongue/robot/emp_act(severity) + owner.apply_effect(EFFECT_STUTTER, 120) + owner.emote("scream") + to_chat(owner, "Alert: Vocal cords are malfunctioning.") /obj/item/organ/tongue/robot/can_speak_language(language) return TRUE // THE MAGIC OF ELECTRONICS diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index e158067b4ba6..d2952e3db341 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -49,6 +49,9 @@ tool = I if(istype(tool, /obj/item/bodypart)) var/obj/item/bodypart/BP = tool + if(target.dna && target.dna.species && (ROBOTIC_LIMBS in target.dna.species.species_traits) && BP.status != BODYPART_ROBOTIC) + to_chat(user, "[BP] doesn't match the patient's morphology.") + return -1 if(ismonkey(target))// monkey patient only accept organic monkey limbs if(BP.status == BODYPART_ROBOTIC || BP.animal_origin != MONKEY_BODYPART) to_chat(user, span_warning("[BP] doesn't match the patient's morphology.")) @@ -87,6 +90,9 @@ if(istype(tool, /obj/item/bodypart) && user.temporarilyRemoveItemFromInventory(tool)) var/obj/item/bodypart/L = tool L.attach_limb(target) + if(target.dna && target.dna.species && (ROBOTIC_LIMBS in target.dna.species.species_traits)) + if(L.status == BODYPART_ROBOTIC) + L.render_like_organic = TRUE if(organ_rejection_dam) target.adjustToxLoss(organ_rejection_dam) display_results(user, target, span_notice("You succeed in replacing [target]'s [parse_zone(target_zone)]."), diff --git a/config/game_options.txt b/config/game_options.txt index 17241a984872..c841507b4720 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -536,6 +536,7 @@ ROUNDSTART_RACES plasmaman ROUNDSTART_RACES preternis ROUNDSTART_RACES polysmorph #ROUNDSTART_RACES snail +ROUNDSTART_RACES ipc ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES ethereal diff --git a/yogstation.dme b/yogstation.dme index 7365454bafb8..3196cb46632e 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -2379,6 +2379,7 @@ #include "code\modules\mob\living\carbon\human\species_types\flypeople.dm" #include "code\modules\mob\living\carbon\human\species_types\golems.dm" #include "code\modules\mob\living\carbon\human\species_types\humans.dm" +#include "code\modules\mob\living\carbon\human\species_types\IPC.dm" #include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm" #include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\mothmen.dm" From 2f738f97d0c7e50b831ac9955d199d7c2e27b27b Mon Sep 17 00:00:00 2001 From: Redmoogle Date: Fri, 24 Jun 2022 09:29:43 -0400 Subject: [PATCH 04/52] ) --- code/__HELPERS/mobs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index a6c4ae2f1952..f45f0a743684 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -117,7 +117,7 @@ "pod_hair" = pick(GLOB.pod_hair_list), "ipc_screen" = pick(GLOB.ipc_screens_list), "ipc_antenna" = pick(GLOB.ipc_antennas_list), - "ipc_chassis" = pick(GLOB.ipc_chassis_list + "ipc_chassis" = pick(GLOB.ipc_chassis_list) )) /proc/random_hair_style(gender) From b1bf3a56862e28648e59a81b8ae22905d9881dd1 Mon Sep 17 00:00:00 2001 From: Redmoogle Date: Fri, 24 Jun 2022 09:33:12 -0400 Subject: [PATCH 05/52] ident --- code/__DEFINES/DNA.dm | 7 +++---- code/modules/mob/living/carbon/human/status_procs.dm | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 869f0e40744c..6baa3d216a6e 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -143,13 +143,12 @@ #define HAS_FLESH 23 /// if we have bones (can suffer bone wounds) #define HAS_BONE 24 -#define NOEYESPRITES 25 /// Can't be husked. -#define NOHUSK 26 +#define NOHUSK 25 /// limbs start out as robotic; but also use organic icons. If you want to use the default ones, you'll have to use on_species_gain -#define ROBOTIC_LIMBS 27 +#define ROBOTIC_LIMBS 26 /// have no mouth to ingest/eat with -#define NOMOUTH 28 +#define NOMOUTH 27 //organ slots #define ORGAN_SLOT_BRAIN "brain" diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 4d98469e2e5f..bba496986004 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -32,7 +32,7 @@ update_hair() /mob/living/carbon/human/become_husk(source) - if(NOHUSK in dna.species.species_traits) + if(NOHUSK in dna.species.species_traits) cure_husk() return . = ..() From 9e25fd85dd0916e5048e2398080107b595ed168b Mon Sep 17 00:00:00 2001 From: Redmoogle Date: Fri, 24 Jun 2022 09:38:59 -0400 Subject: [PATCH 06/52] Add 1/3 DMIs --- icons/mob/ipc_accessories.dmi | Bin 0 -> 20461 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/mob/ipc_accessories.dmi diff --git a/icons/mob/ipc_accessories.dmi b/icons/mob/ipc_accessories.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7b23a190c44344e6128a9ed697aca1c090c13a5d GIT binary patch literal 20461 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 literal 0 HcmV?d00001 From 81f1cefd107336d2de738b7be20b1c881194aa15 Mon Sep 17 00:00:00 2001 From: Redmoogle Date: Fri, 24 Jun 2022 09:44:48 -0400 Subject: [PATCH 07/52] Fix taste --- code/modules/mob/living/taste.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index d248bfff6c1e..e8e8ce1fd808 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -26,7 +26,7 @@ text_output = pick("spiders","dreams","nightmares","the future","the past","victory",\ "defeat","pain","bliss","revenge","poison","time","space","death","life","truth","lies","justice","memory",\ "regrets","your soul","suffering","music","noise","blood","hunger","the american way") - if(!NO_TASTE_SENSITIVITY && (text_output != last_taste_text || last_taste_time + 100 < world.time)) + if((text_output != last_taste_text || last_taste_time + 100 < world.time) && (taste_sensitivity != NO_TASTE_SENSITIVITY)) to_chat(src, span_notice("You can taste [text_output].")) // "something indescribable" -> too many tastes, not enough flavor. From c23a87da6af73cff09aed3accaa236992a793df2 Mon Sep 17 00:00:00 2001 From: Redmoogle Date: Fri, 24 Jun 2022 10:49:30 -0400 Subject: [PATCH 08/52] Apply changes --- code/modules/mob/living/carbon/human/species_types/IPC.dm | 2 +- code/modules/reagents/chemistry/reagents/medicine_reagents.dm | 4 ++-- code/modules/reagents/chemistry/recipes/medicine.dm | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index e3c73db0c10a..b593c8d4242b 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -26,7 +26,7 @@ toxmod = 0 clonemod = 0 staminamod = 0.8 - siemens_coeff = 1.5 + siemens_coeff = 1.75 reagent_tag = PROCESS_SYNTHETIC species_gibs = "robotic" attack_sound = 'sound/items/trayhit1.ogg' diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 90125a3282d8..b628887becc7 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -460,9 +460,9 @@ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3*REM) if(iscarbon(M)) var/mob/living/carbon/C = M - if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL)) + if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL)) C.cure_trauma_type(BRAIN_TRAUMA_SPECIAL) - if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD)) + else if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD)) C.cure_trauma_type(BRAIN_TRAUMA_MILD) ..() diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index dd35f9412180..cb3c405c09ef 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -279,7 +279,7 @@ /datum/chemical_reaction/system_cleaner name = "System Cleaner" id = /datum/reagent/medicine/system_cleaner - results = list(/datum/reagent/medicine/system_cleaner = 4) + results = list(/datum/reagent/medicine/system_cleaner = 5) required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 1, /datum/reagent/phenol = 2, /datum/reagent/potassium = 1) /datum/chemical_reaction/liquid_solder From 10604ead14e6998567e2dcabd3c440025ec331bf Mon Sep 17 00:00:00 2001 From: Redmoogle Date: Fri, 24 Jun 2022 13:13:48 -0400 Subject: [PATCH 09/52] Sprites n stuff and revive delay --- .../living/carbon/human/species_types/IPC.dm | 13 +++++++------ icons/mob/human_parts.dmi | Bin 69316 -> 96719 bytes icons/mob/human_parts_greyscale.dmi | Bin 60594 -> 61368 bytes yogstation/icons/mob/human_parts.dmi | Bin 84643 -> 111247 bytes 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index b593c8d4242b..e4feeeecfb8b 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -183,9 +183,10 @@ datum/species/ipc/on_species_loss(mob/living/carbon/C) if(H.health < 0) to_chat(user, "You have to repair the IPC before using this module!") return FALSE - if(H.mind) - H.mind.grab_ghost() - qdel(I) // One use only >:( - H.revive() - to_chat(user, "You reset the IPC's internal circuitry - reviving them!") - return \ No newline at end of file + if(do_after(user, 5 SECONDS, H)) + if(H.mind) + H.mind.grab_ghost() + qdel(I) // One use only >:( + H.revive() + to_chat(user, "You reset the IPC's internal circuitry - reviving them!") + return diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index b0beb21017c9c277d10c06a24872ee295955b9a4..dfee730e05b939175549a39c424a6b79675fcaf4 100644 GIT binary patch literal 96719 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