From bc925a1a1bde2c37b1c76a3e7b573eb66d50121e Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Thu, 3 Oct 2024 18:21:40 +0200 Subject: [PATCH 01/52] initial --- config/game_options.txt | 2 +- .../preferences/cyber_limbs.dm | 59 +++++++++++++++++++ modular_doppler/modular_species/_species.dm | 10 ++++ .../species_types/android/android.dm | 42 +++++++++++++ .../species_types/android/android_parts.dm | 2 + tgstation.dme | 3 + .../dopplershift_preferences/mutant_limbs.tsx | 15 +++++ 7 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 modular_doppler/modular_customization/preferences/cyber_limbs.dm create mode 100644 modular_doppler/modular_species/species_types/android/android.dm create mode 100644 modular_doppler/modular_species/species_types/android/android_parts.dm create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_limbs.tsx diff --git a/config/game_options.txt b/config/game_options.txt index 6bb1f54c92783..8a2c89ec392c8 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -384,7 +384,7 @@ ROUNDSTART_RACES snail #ROUNDSTART_RACES pod ## Races that are radical departures to what a species is, so while they technically can be roundstart - it's probably not wise -#ROUNDSTART_RACES android +ROUNDSTART_RACES android ROUNDSTART_RACES golem ##------------------------------------------------------------------------------------------- diff --git a/modular_doppler/modular_customization/preferences/cyber_limbs.dm b/modular_doppler/modular_customization/preferences/cyber_limbs.dm new file mode 100644 index 0000000000000..48016284e284f --- /dev/null +++ b/modular_doppler/modular_customization/preferences/cyber_limbs.dm @@ -0,0 +1,59 @@ +// What will be supplied to proc/init_possible_values and proc/apply_to_human +GLOBAL_LIST_INIT(frame_types, list( + "none", + "classic", + "mariinsky", + )) + +// What will be showed in the drop-down +GLOBAL_LIST_INIT(frame_type_names, list( + "none" = "Default", + "classic" = "Android", + "mariinsky" = "Mariinsky Ballet Company", + )) + +/datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) + . = ..() + if(target.dna.features["frame_list"]) + + if(target.dna.features["frame_list"][BODY_ZONE_HEAD]) + var/obj/item/bodypart/head/old_limb = target.get_bodypart(BODY_ZONE_HEAD) + old_limb.drop_limb(TRUE, FALSE, FALSE) + old_limb.moveToNullspace() + var/obj/item/bodypart/head/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_HEAD]) + replacement.try_attach_limb(target, TRUE) + return . + + +// Head +/datum/preference/choiced/head_type + main_feature_name = "Head Type" + savefile_key = "head_type" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + should_generate_icons = FALSE + +/datum/preference/choiced/head_type/compile_constant_data() + var/list/data = ..() + data[CHOICED_PREFERENCE_DISPLAY_NAMES] = GLOB.frame_type_names + return data + +/datum/preference/choiced/head_type/init_possible_values() + return GLOB.frame_types + +/datum/preference/choiced/head_type/apply_to_human(mob/living/carbon/human/target, value) + if(value == "none") + return + LAZYADDASSOC(target.dna.features["frame_list"], BODY_ZONE_HEAD, text2path("/obj/item/bodypart/head/robot/android/[value]")) + +/datum/preference/choiced/head_type/create_default_value() + return "none" + +/* +/datum/preference/choiced/head_type/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species == /datum/species/android) + return TRUE + return FALSE +*/ diff --git a/modular_doppler/modular_species/_species.dm b/modular_doppler/modular_species/_species.dm index 422499d5faacd..9b4ed51b87320 100644 --- a/modular_doppler/modular_species/_species.dm +++ b/modular_doppler/modular_species/_species.dm @@ -1,3 +1,13 @@ +/// Cybernetic limbs logic here! +// Used for most races +/datum/species/on_species_gain(mob/living/carbon/human/target, datum/species/old_species, pref_load) + var/list/frame_bodyparts = target.dna.features["frame_list"] + + if(frame_bodyparts && frame_bodyparts[BODY_ZONE_HEAD]) + bodypart_overrides[BODY_ZONE_HEAD] = frame_bodyparts[BODY_ZONE_HEAD] + + return ..() + /// Animal trait logic goes here! // Used for the genemod and anthro species diff --git a/modular_doppler/modular_species/species_types/android/android.dm b/modular_doppler/modular_species/species_types/android/android.dm new file mode 100644 index 0000000000000..1394a23bb7e4e --- /dev/null +++ b/modular_doppler/modular_species/species_types/android/android.dm @@ -0,0 +1,42 @@ +/datum/species/android + name = "Android" + id = SPECIES_ANDROID + examine_limb_id = SPECIES_HUMAN + inherent_traits = list( + TRAIT_GENELESS, + TRAIT_LIMBATTACHMENT, + TRAIT_LIVERLESS_METABOLISM, + TRAIT_NOBREATH, + TRAIT_NOHUNGER, + TRAIT_NO_DNA_COPY, + TRAIT_NO_PLASMA_TRANSFORM, + TRAIT_OVERDOSEIMMUNE, + TRAIT_RADIMMUNE, + TRAIT_RESISTCOLD, + TRAIT_RESISTLOWPRESSURE, + TRAIT_TOXIMMUNE, + /*TG traits we remove + TRAIT_NOCRITDAMAGE, + TRAIT_PIERCEIMMUNE, + TRAIT_NOFIRE, + TRAIT_NOBLOOD, + TRAIT_NO_UNDERWEAR, + TRAIT_RESISTHEAT, + TRAIT_RESISTHIGHPRESSURE, + */ + ) + + mutantheart = /obj/item/organ/internal/heart/cybernetic + +/datum/species/android/get_physical_attributes() + return "Androids are almost, but not quite, identical to fully augmented humans. \ + Unlike those, though, they're completely immune to toxin damage, don't have blood or organs (besides their head), don't get hungry, and can reattach their limbs! \ + That said, an EMP will devastate them and they cannot process any chemicals." + +/datum/species/android/get_species_description() + return "Androids are an entirely synthetic species." + +/datum/species/android/get_species_lore() + return list( + "Androids are a synthetic species created by Nanotrasen as an intermediary between humans and cyborgs." + ) diff --git a/modular_doppler/modular_species/species_types/android/android_parts.dm b/modular_doppler/modular_species/species_types/android/android_parts.dm new file mode 100644 index 0000000000000..54585778fe281 --- /dev/null +++ b/modular_doppler/modular_species/species_types/android/android_parts.dm @@ -0,0 +1,2 @@ +/obj/item/bodypart/head/robot/android/classic + diff --git a/tgstation.dme b/tgstation.dme index 569b561220457..b28ecf7677e9a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6768,6 +6768,7 @@ #include "modular_doppler\modular_customization\preferences\antennae.dm" #include "modular_doppler\modular_customization\preferences\body_marking_lizard.dm" #include "modular_doppler\modular_customization\preferences\body_marking_moth.dm" +#include "modular_doppler\modular_customization\preferences\cyber_limbs.dm" #include "modular_doppler\modular_customization\preferences\ears.dm" #include "modular_doppler\modular_customization\preferences\fluff.dm" #include "modular_doppler\modular_customization\preferences\frills.dm" @@ -6843,6 +6844,8 @@ #include "modular_doppler\modular_species\_species.dm" #include "modular_doppler\modular_species\code\bloodsplatter.dm" #include "modular_doppler\modular_species\overwrites\code\species.dm" +#include "modular_doppler\modular_species\species_types\android\android.dm" +#include "modular_doppler\modular_species\species_types\android\android_parts.dm" #include "modular_doppler\modular_species\species_types\anthromorph\anthromorph.dm" #include "modular_doppler\modular_species\species_types\anthromorph\anthromorph_bodyparts.dm" #include "modular_doppler\modular_species\species_types\aquatic\aquatic.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_limbs.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_limbs.tsx new file mode 100644 index 0000000000000..abc74c572ed70 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_limbs.tsx @@ -0,0 +1,15 @@ +import { + FeatureChoiced, + FeatureChoicedServerData, + FeatureValueProps, +} from '../base'; +import { FeatureDropdownInput } from '../dropdowns'; + +export const head_type: FeatureChoiced = { + name: 'Head Type', + component: ( + props: FeatureValueProps, + ) => { + return ; + }, +}; From d0d7282c65a7f6995fefb877b6df05e4eae66019 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Sun, 6 Oct 2024 16:32:34 +0200 Subject: [PATCH 02/52] checkpoint --- .../~doppler_defines/mutant_blacklists.dm | 7 +++ .../preferences/antennae.dm | 7 +++ .../preferences/body_marking_lizard.dm | 7 +++ .../preferences/cyber_limbs.dm | 56 ++++++++++++++++-- .../modular_customization/preferences/ears.dm | 6 ++ .../preferences/fluff.dm | 7 +++ .../preferences/frills.dm | 7 +++ .../preferences/horns.dm | 7 +++ .../preferences/snout.dm | 7 +++ .../modular_customization/preferences/tail.dm | 7 +++ .../preferences/wings.dm | 7 +++ modular_doppler/modular_species/_species.dm | 3 + .../species_types/android/android.dm | 6 +- .../species_types/android/android_parts.dm | 25 ++++++++ .../android/icons/android_parts.dmi | Bin 0 -> 36072 bytes tgstation.dme | 1 + .../dopplershift_preferences/mutant_limbs.tsx | 9 +++ 17 files changed, 161 insertions(+), 8 deletions(-) create mode 100644 code/__DEFINES/~doppler_defines/mutant_blacklists.dm create mode 100644 modular_doppler/modular_species/species_types/android/icons/android_parts.dmi diff --git a/code/__DEFINES/~doppler_defines/mutant_blacklists.dm b/code/__DEFINES/~doppler_defines/mutant_blacklists.dm new file mode 100644 index 0000000000000..f695d0626c73d --- /dev/null +++ b/code/__DEFINES/~doppler_defines/mutant_blacklists.dm @@ -0,0 +1,7 @@ +GLOBAL_LIST_INIT(species_blacklist_no_mutant, list( + /datum/species/human, + )) + +GLOBAL_LIST_INIT(species_blacklist_no_humanoid, list( + /datum/species/golem, + )) diff --git a/modular_doppler/modular_customization/preferences/antennae.dm b/modular_doppler/modular_customization/preferences/antennae.dm index 801dcff44a552..b44f1c156a80d 100644 --- a/modular_doppler/modular_customization/preferences/antennae.dm +++ b/modular_doppler/modular_customization/preferences/antennae.dm @@ -24,6 +24,13 @@ /datum/preference/toggle/antennae/create_default_value() return FALSE +/datum/preference/toggle/antennae/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE + //sprite selection /datum/preference/choiced/moth_antennae category = PREFERENCE_CATEGORY_CLOTHING diff --git a/modular_doppler/modular_customization/preferences/body_marking_lizard.dm b/modular_doppler/modular_customization/preferences/body_marking_lizard.dm index bcadc48e0fde7..f01bbd0f83ab7 100644 --- a/modular_doppler/modular_customization/preferences/body_marking_lizard.dm +++ b/modular_doppler/modular_customization/preferences/body_marking_lizard.dm @@ -48,6 +48,13 @@ /datum/preference/toggle/markings/create_default_value() return FALSE +/datum/preference/toggle/markings/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE + //toggle pref integration /datum/preference/choiced/lizard_body_markings category = PREFERENCE_CATEGORY_CLOTHING diff --git a/modular_doppler/modular_customization/preferences/cyber_limbs.dm b/modular_doppler/modular_customization/preferences/cyber_limbs.dm index 48016284e284f..5d8602d4e4517 100644 --- a/modular_doppler/modular_customization/preferences/cyber_limbs.dm +++ b/modular_doppler/modular_customization/preferences/cyber_limbs.dm @@ -3,6 +3,8 @@ GLOBAL_LIST_INIT(frame_types, list( "none", "classic", "mariinsky", + "e_three_n", + "bare", )) // What will be showed in the drop-down @@ -10,12 +12,14 @@ GLOBAL_LIST_INIT(frame_type_names, list( "none" = "Default", "classic" = "Android", "mariinsky" = "Mariinsky Ballet Company", + "e_three_n" = "E3N", + "bare" = "Bare", )) /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() if(target.dna.features["frame_list"]) - + //head if(target.dna.features["frame_list"][BODY_ZONE_HEAD]) var/obj/item/bodypart/head/old_limb = target.get_bodypart(BODY_ZONE_HEAD) old_limb.drop_limb(TRUE, FALSE, FALSE) @@ -23,6 +27,16 @@ GLOBAL_LIST_INIT(frame_type_names, list( var/obj/item/bodypart/head/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_HEAD]) replacement.try_attach_limb(target, TRUE) return . + //right arm + if(target.dna.features["frame_list"][BODY_ZONE_R_ARM]) + var/obj/item/bodypart/arm/right/old_limb = target.get_bodypart(BODY_ZONE_R_ARM) + old_limb.drop_limb(TRUE, FALSE, FALSE) + old_limb.moveToNullspace() + var/obj/item/bodypart/arm/right/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_R_ARM]) + replacement.try_attach_limb(target, TRUE) + return . + + // Head @@ -49,11 +63,41 @@ GLOBAL_LIST_INIT(frame_type_names, list( /datum/preference/choiced/head_type/create_default_value() return "none" -/* /datum/preference/choiced/head_type/is_accessible(datum/preferences/preferences) . = ..() var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species == /datum/species/android) - return TRUE - return FALSE -*/ + if(species in GLOB.species_blacklist_no_humanoid) + return FALSE + return TRUE + +// Right arm +/datum/preference/choiced/arm_r_type + main_feature_name = "Arm Right Type" + savefile_key = "arm_r_type" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + should_generate_icons = FALSE + +/datum/preference/choiced/arm_r_type/compile_constant_data() + var/list/data = ..() + data[CHOICED_PREFERENCE_DISPLAY_NAMES] = GLOB.frame_type_names + return data + +/datum/preference/choiced/arm_r_type/init_possible_values() + return GLOB.frame_types + +/datum/preference/choiced/arm_r_type/apply_to_human(mob/living/carbon/human/target, value) + if(value == "none") + return + LAZYADDASSOC(target.dna.features["frame_list"], BODY_ZONE_R_ARM, text2path("/obj/item/bodypart/arm/right/robot/android/[value]")) + +/datum/preference/choiced/arm_r_type/create_default_value() + return "none" + +/datum/preference/choiced/arm_r_type/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_humanoid) + return FALSE + return TRUE + diff --git a/modular_doppler/modular_customization/preferences/ears.dm b/modular_doppler/modular_customization/preferences/ears.dm index ae19d4a998c4f..083e7bcbf00e6 100644 --- a/modular_doppler/modular_customization/preferences/ears.dm +++ b/modular_doppler/modular_customization/preferences/ears.dm @@ -66,6 +66,12 @@ if(chosen_variation == NO_VARIATION) target.dna.features["ears"] = /datum/sprite_accessory/ears/none::name +/datum/preference/choiced/ear_variation/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE /// All current ear types to choose from // Cat diff --git a/modular_doppler/modular_customization/preferences/fluff.dm b/modular_doppler/modular_customization/preferences/fluff.dm index 1e2bb08024b63..36f98118ae14d 100644 --- a/modular_doppler/modular_customization/preferences/fluff.dm +++ b/modular_doppler/modular_customization/preferences/fluff.dm @@ -31,6 +31,13 @@ /datum/preference/toggle/fluff/create_default_value() return FALSE +/datum/preference/toggle/fluff/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE + /datum/preference/choiced/fluff savefile_key = "fluff" savefile_identifier = PREFERENCE_CHARACTER diff --git a/modular_doppler/modular_customization/preferences/frills.dm b/modular_doppler/modular_customization/preferences/frills.dm index 1955ad840eb65..ec4c3bc6b5f45 100644 --- a/modular_doppler/modular_customization/preferences/frills.dm +++ b/modular_doppler/modular_customization/preferences/frills.dm @@ -35,6 +35,13 @@ /datum/preference/toggle/frills/create_default_value() return FALSE +/datum/preference/toggle/frills/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE + /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() if(target.dna.features["frills"]) diff --git a/modular_doppler/modular_customization/preferences/horns.dm b/modular_doppler/modular_customization/preferences/horns.dm index 9aa9251c09885..d2694dac26a97 100644 --- a/modular_doppler/modular_customization/preferences/horns.dm +++ b/modular_doppler/modular_customization/preferences/horns.dm @@ -53,6 +53,13 @@ /datum/preference/toggle/horns/create_default_value() return FALSE +/datum/preference/toggle/horns/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE + /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() if(target.dna.features["horns"]) diff --git a/modular_doppler/modular_customization/preferences/snout.dm b/modular_doppler/modular_customization/preferences/snout.dm index b5c1809acc639..793ca9e26e26c 100644 --- a/modular_doppler/modular_customization/preferences/snout.dm +++ b/modular_doppler/modular_customization/preferences/snout.dm @@ -24,6 +24,13 @@ /datum/preference/toggle/snout/create_default_value() return FALSE +/datum/preference/toggle/snout/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE + /datum/preference/choiced/lizard_snout category = PREFERENCE_CATEGORY_CLOTHING diff --git a/modular_doppler/modular_customization/preferences/tail.dm b/modular_doppler/modular_customization/preferences/tail.dm index aead2b774c7b5..a9709a7525043 100644 --- a/modular_doppler/modular_customization/preferences/tail.dm +++ b/modular_doppler/modular_customization/preferences/tail.dm @@ -73,6 +73,13 @@ /datum/preference/choiced/tail_variation/init_possible_values() return list(NO_VARIATION) + (GLOB.mutant_variations) +/datum/preference/choiced/tail_variation/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE + /datum/preference/choiced/tail_variation/apply_to_human(mob/living/carbon/human/target, chosen_variation) // Read by the regenerate_organs() proc to know what organ subtype to grant target.dna.tail_type = chosen_variation diff --git a/modular_doppler/modular_customization/preferences/wings.dm b/modular_doppler/modular_customization/preferences/wings.dm index 1b38e70719a88..438860f888c1b 100644 --- a/modular_doppler/modular_customization/preferences/wings.dm +++ b/modular_doppler/modular_customization/preferences/wings.dm @@ -60,6 +60,13 @@ if("Moth Wings") target.dna.features["wings"] = /datum/sprite_accessory/wings_more/none::name +/datum/preference/choiced/wing_variation/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE + // Wings /datum/preference/choiced/wings savefile_key = "feature_wings" diff --git a/modular_doppler/modular_species/_species.dm b/modular_doppler/modular_species/_species.dm index 9b4ed51b87320..b9177d9ddffca 100644 --- a/modular_doppler/modular_species/_species.dm +++ b/modular_doppler/modular_species/_species.dm @@ -6,6 +6,9 @@ if(frame_bodyparts && frame_bodyparts[BODY_ZONE_HEAD]) bodypart_overrides[BODY_ZONE_HEAD] = frame_bodyparts[BODY_ZONE_HEAD] + if(frame_bodyparts && frame_bodyparts[BODY_ZONE_R_ARM]) + bodypart_overrides[BODY_ZONE_R_ARM] = frame_bodyparts[BODY_ZONE_R_ARM] + return ..() /// Animal trait logic goes here! diff --git a/modular_doppler/modular_species/species_types/android/android.dm b/modular_doppler/modular_species/species_types/android/android.dm index 1394a23bb7e4e..8f3b751ab5d53 100644 --- a/modular_doppler/modular_species/species_types/android/android.dm +++ b/modular_doppler/modular_species/species_types/android/android.dm @@ -12,7 +12,6 @@ TRAIT_NO_PLASMA_TRANSFORM, TRAIT_OVERDOSEIMMUNE, TRAIT_RADIMMUNE, - TRAIT_RESISTCOLD, TRAIT_RESISTLOWPRESSURE, TRAIT_TOXIMMUNE, /*TG traits we remove @@ -22,12 +21,15 @@ TRAIT_NOBLOOD, TRAIT_NO_UNDERWEAR, TRAIT_RESISTHEAT, + TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, */ ) - mutantheart = /obj/item/organ/internal/heart/cybernetic +// bodytemp_heat_damage_limit = +// bodytemp_cold_damage_limit = + /datum/species/android/get_physical_attributes() return "Androids are almost, but not quite, identical to fully augmented humans. \ Unlike those, though, they're completely immune to toxin damage, don't have blood or organs (besides their head), don't get hungry, and can reattach their limbs! \ diff --git a/modular_doppler/modular_species/species_types/android/android_parts.dm b/modular_doppler/modular_species/species_types/android/android_parts.dm index 54585778fe281..6f18f296550f5 100644 --- a/modular_doppler/modular_species/species_types/android/android_parts.dm +++ b/modular_doppler/modular_species/species_types/android/android_parts.dm @@ -1,2 +1,27 @@ +#define ANDROID_BODYPARTS_DMI 'modular_doppler/modular_species/species_types/android/icons/android_parts.dmi' + +// Classic /obj/item/bodypart/head/robot/android/classic +// Mariinsky +/obj/item/bodypart/head/robot/android/mariinsky + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mariinsky_head" + limb_id = "mariinsky" + +// E3N +/obj/item/bodypart/head/robot/android/e_three_n + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "e3n_head" + limb_id = "e3n" + +// Bare +/obj/item/bodypart/arm/right/robot/android/bare + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "synth_r_arm" + limb_id = "synth" + +#undef ANDROID_BODYPARTS_DMI diff --git a/modular_doppler/modular_species/species_types/android/icons/android_parts.dmi b/modular_doppler/modular_species/species_types/android/icons/android_parts.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6b49a5005569984837c31cfe7c7bdf181783262d GIT binary patch literal 36072 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 }, }; + +export const arm_r_type: FeatureChoiced = { + name: 'Arm Right Type', + component: ( + props: FeatureValueProps, + ) => { + return ; + }, +}; From e51436fda0443b17e67a77800956432828f0934f Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Sun, 6 Oct 2024 18:06:38 +0200 Subject: [PATCH 03/52] checkpoint --- .../preferences/cyber_limbs.dm | 183 ++++++- modular_doppler/modular_species/_species.dm | 31 +- .../overwrites/code/species.dm | 20 - .../species_types/android/android_parts.dm | 509 +++++++++++++++++- .../android/icons/android_parts.dmi | Bin 36072 -> 44420 bytes tgstation.dme | 1 - .../dopplershift_preferences/mutant_limbs.tsx | 36 ++ 7 files changed, 746 insertions(+), 34 deletions(-) delete mode 100644 modular_doppler/modular_species/overwrites/code/species.dm diff --git a/modular_doppler/modular_customization/preferences/cyber_limbs.dm b/modular_doppler/modular_customization/preferences/cyber_limbs.dm index 5d8602d4e4517..187fac964e34a 100644 --- a/modular_doppler/modular_customization/preferences/cyber_limbs.dm +++ b/modular_doppler/modular_customization/preferences/cyber_limbs.dm @@ -1,19 +1,39 @@ // What will be supplied to proc/init_possible_values and proc/apply_to_human GLOBAL_LIST_INIT(frame_types, list( "none", + "bare", "classic", "mariinsky", "e_three_n", - "bare", + "mc", + "bs_one", + "bs_two", + "hi_one", + "hi_two", + "sgm", + "wtm", + "xmg_one", + "xmg_two", + "zhp", )) // What will be showed in the drop-down GLOBAL_LIST_INIT(frame_type_names, list( - "none" = "Default", + "none" = "Species Default", + "bare" = "Bare", "classic" = "Android", "mariinsky" = "Mariinsky Ballet Company", "e_three_n" = "E3N", - "bare" = "Bare", + "mc" = "Morpheus Cyberkinetics", + "bs_one" = "Bishop Cyberkinetics", + "bs_two" = "Bishop Cyberkinetics 2.0", + "hi_one" = "Hephaestus Industries", + "hi_two" = "Hephaestus Industries 2.0", + "sgm" = "Shellguard Munitions S-Series", + "wtm" = "Ward Takahashi Manufacturing", + "xmg_one" = "Xion Manufacturing Group", + "xmg_two" = "Xion Manufacturing Group 2.0", + "zhp" = "Zeng-Hu Pharmaceuticals", )) /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) @@ -27,6 +47,14 @@ GLOBAL_LIST_INIT(frame_type_names, list( var/obj/item/bodypart/head/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_HEAD]) replacement.try_attach_limb(target, TRUE) return . + //chest + if(target.dna.features["frame_list"][BODY_ZONE_CHEST]) + var/obj/item/bodypart/chest/old_limb = target.get_bodypart(BODY_ZONE_CHEST) + old_limb.drop_limb(TRUE, FALSE, FALSE) + old_limb.moveToNullspace() + var/obj/item/bodypart/chest/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_CHEST]) + replacement.try_attach_limb(target, TRUE) + return . //right arm if(target.dna.features["frame_list"][BODY_ZONE_R_ARM]) var/obj/item/bodypart/arm/right/old_limb = target.get_bodypart(BODY_ZONE_R_ARM) @@ -35,8 +63,30 @@ GLOBAL_LIST_INIT(frame_type_names, list( var/obj/item/bodypart/arm/right/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_R_ARM]) replacement.try_attach_limb(target, TRUE) return . - - + //left arm + if(target.dna.features["frame_list"][BODY_ZONE_L_ARM]) + var/obj/item/bodypart/arm/left/old_limb = target.get_bodypart(BODY_ZONE_L_ARM) + old_limb.drop_limb(TRUE, FALSE, FALSE) + old_limb.moveToNullspace() + var/obj/item/bodypart/arm/left/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_L_ARM]) + replacement.try_attach_limb(target, TRUE) + return . + //right leg + if(target.dna.features["frame_list"][BODY_ZONE_R_LEG]) + var/obj/item/bodypart/leg/right/old_limb = target.get_bodypart(BODY_ZONE_R_LEG) + old_limb.drop_limb(TRUE, FALSE, FALSE) + old_limb.moveToNullspace() + var/obj/item/bodypart/leg/right/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_R_LEG]) + replacement.try_attach_limb(target, TRUE) + return . + //left leg + if(target.dna.features["frame_list"][BODY_ZONE_L_LEG]) + var/obj/item/bodypart/leg/left/old_limb = target.get_bodypart(BODY_ZONE_L_LEG) + old_limb.drop_limb(TRUE, FALSE, FALSE) + old_limb.moveToNullspace() + var/obj/item/bodypart/leg/left/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_L_LEG]) + replacement.try_attach_limb(target, TRUE) + return . // Head @@ -64,6 +114,37 @@ GLOBAL_LIST_INIT(frame_type_names, list( return "none" /datum/preference/choiced/head_type/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species == /datum/species/android) // lifting this restriction would require code for the head's internal organs to become cybernetic too + return TRUE + return FALSE + +// Chest +/datum/preference/choiced/chest_type + main_feature_name = "Chest Type" + savefile_key = "chest_type" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + should_generate_icons = FALSE + +/datum/preference/choiced/chest_type/compile_constant_data() + var/list/data = ..() + data[CHOICED_PREFERENCE_DISPLAY_NAMES] = GLOB.frame_type_names + return data + +/datum/preference/choiced/chest_type/init_possible_values() + return GLOB.frame_types + +/datum/preference/choiced/chest_type/apply_to_human(mob/living/carbon/human/target, value) + if(value == "none") + return + LAZYADDASSOC(target.dna.features["frame_list"], BODY_ZONE_CHEST, text2path("/obj/item/bodypart/chest/robot/android/[value]")) + +/datum/preference/choiced/chest_type/create_default_value() + return "none" + +/datum/preference/choiced/chest_type/is_accessible(datum/preferences/preferences) . = ..() var/species = preferences.read_preference(/datum/preference/choiced/species) if(species in GLOB.species_blacklist_no_humanoid) @@ -101,3 +182,95 @@ GLOBAL_LIST_INIT(frame_type_names, list( return FALSE return TRUE +// Left arm +/datum/preference/choiced/arm_l_type + main_feature_name = "Arm Left Type" + savefile_key = "arm_l_type" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + should_generate_icons = FALSE + +/datum/preference/choiced/arm_l_type/compile_constant_data() + var/list/data = ..() + data[CHOICED_PREFERENCE_DISPLAY_NAMES] = GLOB.frame_type_names + return data + +/datum/preference/choiced/arm_l_type/init_possible_values() + return GLOB.frame_types + +/datum/preference/choiced/arm_l_type/apply_to_human(mob/living/carbon/human/target, value) + if(value == "none") + return + LAZYADDASSOC(target.dna.features["frame_list"], BODY_ZONE_L_ARM, text2path("/obj/item/bodypart/arm/left/robot/android/[value]")) + +/datum/preference/choiced/arm_l_type/create_default_value() + return "none" + +/datum/preference/choiced/arm_l_type/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_humanoid) + return FALSE + return TRUE + +// Right leg +/datum/preference/choiced/leg_r_type + main_feature_name = "Leg Right Type" + savefile_key = "leg_r_type" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + should_generate_icons = FALSE + +/datum/preference/choiced/leg_r_type/compile_constant_data() + var/list/data = ..() + data[CHOICED_PREFERENCE_DISPLAY_NAMES] = GLOB.frame_type_names + return data + +/datum/preference/choiced/leg_r_type/init_possible_values() + return GLOB.frame_types + +/datum/preference/choiced/leg_r_type/apply_to_human(mob/living/carbon/human/target, value) + if(value == "none") + return + LAZYADDASSOC(target.dna.features["frame_list"], BODY_ZONE_R_LEG, text2path("/obj/item/bodypart/leg/right/robot/android/[value]")) + +/datum/preference/choiced/leg_r_type/create_default_value() + return "none" + +/datum/preference/choiced/leg_r_type/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_humanoid) + return FALSE + return TRUE + +// Left leg +/datum/preference/choiced/leg_l_type + main_feature_name = "Leg Left Type" + savefile_key = "leg_l_type" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + should_generate_icons = FALSE + +/datum/preference/choiced/leg_l_type/compile_constant_data() + var/list/data = ..() + data[CHOICED_PREFERENCE_DISPLAY_NAMES] = GLOB.frame_type_names + return data + +/datum/preference/choiced/leg_l_type/init_possible_values() + return GLOB.frame_types + +/datum/preference/choiced/leg_l_type/apply_to_human(mob/living/carbon/human/target, value) + if(value == "none") + return + LAZYADDASSOC(target.dna.features["frame_list"], BODY_ZONE_L_LEG, text2path("/obj/item/bodypart/leg/left/robot/android/[value]")) + +/datum/preference/choiced/leg_l_type/create_default_value() + return "none" + +/datum/preference/choiced/leg_l_type/is_accessible(datum/preferences/preferences) + . = ..() + var/species = preferences.read_preference(/datum/preference/choiced/species) + if(species in GLOB.species_blacklist_no_humanoid) + return FALSE + return TRUE diff --git a/modular_doppler/modular_species/_species.dm b/modular_doppler/modular_species/_species.dm index b9177d9ddffca..c402d45ee48e9 100644 --- a/modular_doppler/modular_species/_species.dm +++ b/modular_doppler/modular_species/_species.dm @@ -1,16 +1,41 @@ +/** + * # species datum + * + * Datum that handles different species in the game. + * + * This datum handles species in the game, such as lizardpeople, mothmen, zombies, skeletons, etc. + * It is used in [carbon humans][mob/living/carbon/human] to determine various things about them, like their food preferences, if they have biological genders, their damage resistances, and more. + * + */ +/datum/species + /// Adding a language type to this in the form of /datum/language will allow the language to be displayed in preferences for that species, even if it is a secret language. + /// Currently used for Ættmál in hearthkin. + var/list/language_prefs_whitelist + ///If a species can always be picked in prefs for the purposes of customizing it for ghost roles or events + var/always_customizable = FALSE + ///This is the outfit which will be used by the species its preview portrait + var/datum/outfit/preview_outfit = /datum/outfit/job/assistant/consistent + + /// Cybernetic limbs logic here! // Used for most races /datum/species/on_species_gain(mob/living/carbon/human/target, datum/species/old_species, pref_load) var/list/frame_bodyparts = target.dna.features["frame_list"] - if(frame_bodyparts && frame_bodyparts[BODY_ZONE_HEAD]) bodypart_overrides[BODY_ZONE_HEAD] = frame_bodyparts[BODY_ZONE_HEAD] - + if(frame_bodyparts && frame_bodyparts[BODY_ZONE_CHEST]) + bodypart_overrides[BODY_ZONE_CHEST] = frame_bodyparts[BODY_ZONE_CHEST] if(frame_bodyparts && frame_bodyparts[BODY_ZONE_R_ARM]) bodypart_overrides[BODY_ZONE_R_ARM] = frame_bodyparts[BODY_ZONE_R_ARM] - + if(frame_bodyparts && frame_bodyparts[BODY_ZONE_L_ARM]) + bodypart_overrides[BODY_ZONE_L_ARM] = frame_bodyparts[BODY_ZONE_L_ARM] + if(frame_bodyparts && frame_bodyparts[BODY_ZONE_R_LEG]) + bodypart_overrides[BODY_ZONE_R_LEG] = frame_bodyparts[BODY_ZONE_R_LEG] + if(frame_bodyparts && frame_bodyparts[BODY_ZONE_L_LEG]) + bodypart_overrides[BODY_ZONE_L_LEG] = frame_bodyparts[BODY_ZONE_L_LEG] return ..() + /// Animal trait logic goes here! // Used for the genemod and anthro species diff --git a/modular_doppler/modular_species/overwrites/code/species.dm b/modular_doppler/modular_species/overwrites/code/species.dm deleted file mode 100644 index dec467a8fae0e..0000000000000 --- a/modular_doppler/modular_species/overwrites/code/species.dm +++ /dev/null @@ -1,20 +0,0 @@ -// Code which allows us to set custom outfits for species portraits -/datum/species - ///This is the outfit which will be used by the species its preview portrait - var/datum/outfit/preview_outfit = /datum/outfit/job/assistant/consistent - -/** - * # species datum - * - * Datum that handles different species in the game. - * - * This datum handles species in the game, such as lizardpeople, mothmen, zombies, skeletons, etc. - * It is used in [carbon humans][mob/living/carbon/human] to determine various things about them, like their food preferences, if they have biological genders, their damage resistances, and more. - * - */ -/datum/species - /// Adding a language type to this in the form of /datum/language will allow the language to be displayed in preferences for that species, even if it is a secret language. - /// Currently used for Ættmál in hearthkin. - var/list/language_prefs_whitelist - ///If a species can always be picked in prefs for the purposes of customizing it for ghost roles or events - var/always_customizable = FALSE diff --git a/modular_doppler/modular_species/species_types/android/android_parts.dm b/modular_doppler/modular_species/species_types/android/android_parts.dm index 6f18f296550f5..9ce89b3e4fa15 100644 --- a/modular_doppler/modular_species/species_types/android/android_parts.dm +++ b/modular_doppler/modular_species/species_types/android/android_parts.dm @@ -1,27 +1,526 @@ #define ANDROID_BODYPARTS_DMI 'modular_doppler/modular_species/species_types/android/icons/android_parts.dmi' -// Classic +/// +// Classic (this may look empty, but its a load-bearing definition) +/// /obj/item/bodypart/head/robot/android/classic +/obj/item/bodypart/chest/robot/android/classic + +/obj/item/bodypart/arm/right/robot/android/classic + +/obj/item/bodypart/arm/left/robot/android/classic + +/obj/item/bodypart/leg/right/robot/android/classic + +/obj/item/bodypart/leg/left/robot/android/classic + +/// +// Bare +/// +/obj/item/bodypart/head/robot/android/bare + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "synth_head" + limb_id = "synth" + +/obj/item/bodypart/chest/robot/android/bare + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "synth_chest" + limb_id = "synth" + +/obj/item/bodypart/arm/right/robot/android/bare + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "synth_r_arm" + limb_id = "synth" + +/obj/item/bodypart/arm/left/robot/android/bare + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "synth_l_arm" + limb_id = "synth" + +/obj/item/bodypart/leg/right/robot/android/bare + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "synth_r_leg" + limb_id = "synth" + +/obj/item/bodypart/leg/left/robot/android/bare + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "synth_r_leg" + limb_id = "synth" + +/// // Mariinsky +/// /obj/item/bodypart/head/robot/android/mariinsky icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI icon_state = "mariinsky_head" limb_id = "mariinsky" +/obj/item/bodypart/chest/robot/android/mariinsky + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mariinsky_chest" + limb_id = "mariinsky" + +/obj/item/bodypart/arm/right/robot/android/mariinsky + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mariinsky_r_arm" + limb_id = "mariinsky" + +/obj/item/bodypart/arm/left/robot/android/mariinsky + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mariinsky_l_arm" + limb_id = "mariinsky" + +/obj/item/bodypart/leg/right/robot/android/mariinsky + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mariinsky_r_leg" + limb_id = "mariinsky" + +/obj/item/bodypart/leg/left/robot/android/mariinsky + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mariinsky_r_leg" + limb_id = "mariinsky" + +/// // E3N +/// /obj/item/bodypart/head/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI icon_state = "e3n_head" limb_id = "e3n" -// Bare -/obj/item/bodypart/arm/right/robot/android/bare +/obj/item/bodypart/chest/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "synth_r_arm" - limb_id = "synth" + icon_state = "e3n_chest" + limb_id = "e3n" + +/obj/item/bodypart/arm/right/robot/android/e_three_n + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "e3n_r_arm" + limb_id = "e3n" + +/obj/item/bodypart/arm/left/robot/android/e_three_n + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "e3n_l_arm" + limb_id = "e3n" + +/obj/item/bodypart/leg/right/robot/android/e_three_n + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "e3n_r_leg" + limb_id = "e3n" + +/obj/item/bodypart/leg/left/robot/android/e_three_n + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "e3n_r_leg" + limb_id = "e3n" + +/// +// Morpheus +/// +/obj/item/bodypart/head/robot/android/mc //morb + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mc_head" + limb_id = "mc" + +/obj/item/bodypart/chest/robot/android/mc + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mc_chest" + limb_id = "mc" + +/obj/item/bodypart/arm/right/robot/android/mc + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mc_r_arm" + limb_id = "mc" + +/obj/item/bodypart/arm/left/robot/android/mc + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mc_l_arm" + limb_id = "mc" + +/obj/item/bodypart/leg/right/robot/android/mc + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mc_r_leg" + limb_id = "mc" + +/obj/item/bodypart/leg/left/robot/android/mc + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "mc_r_leg" + limb_id = "mc" + +/// +// Bishop Cyberkinetics +/// +/obj/item/bodypart/head/robot/android/bs_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs_head" + limb_id = "bs" + +/obj/item/bodypart/chest/robot/android/bs_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs_chest" + limb_id = "bs" + +/obj/item/bodypart/arm/right/robot/android/bs_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs_r_arm" + limb_id = "bs" + +/obj/item/bodypart/arm/left/robot/android/bs_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs_l_arm" + limb_id = "bs" + +/obj/item/bodypart/leg/right/robot/android/bs_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs_r_leg" + limb_id = "bs" + +/obj/item/bodypart/leg/left/robot/android/bs_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs_r_leg" + limb_id = "bs" + +/// +// Bishop Cyberkinetics 2.0 +/// +/obj/item/bodypart/head/robot/android/bs_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs2_head" + limb_id = "bs2" + +/obj/item/bodypart/chest/robot/android/bs_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs2_chest" + limb_id = "bs2" + +/obj/item/bodypart/arm/right/robot/android/bs_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs2_r_arm" + limb_id = "bs2" + +/obj/item/bodypart/arm/left/robot/android/bs_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs2_l_arm" + limb_id = "bs2" + +/obj/item/bodypart/leg/right/robot/android/bs_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs2_r_leg" + limb_id = "bs2" + +/obj/item/bodypart/leg/left/robot/android/bs_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "bs2_r_leg" + limb_id = "bs2" + +/// +// Hephaestus Industries +/// +/obj/item/bodypart/head/robot/android/hi_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi_head" + limb_id = "hi" + +/obj/item/bodypart/chest/robot/android/hi_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi_chest" + limb_id = "hi" + +/obj/item/bodypart/arm/right/robot/android/hi_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi_r_arm" + limb_id = "hi" + +/obj/item/bodypart/arm/left/robot/android/hi_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi_l_arm" + limb_id = "hi" + +/obj/item/bodypart/leg/right/robot/android/hi_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi_r_leg" + limb_id = "hi" + +/obj/item/bodypart/leg/left/robot/android/hi_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi_r_leg" + limb_id = "hi" + +/// +// Hephaestus Industries 2.0 +/// +/obj/item/bodypart/head/robot/android/hi_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi2_head" + limb_id = "hi2" + +/obj/item/bodypart/chest/robot/android/hi_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi2_chest" + limb_id = "hi2" + +/obj/item/bodypart/arm/right/robot/android/hi_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi2_r_arm" + limb_id = "hi2" + +/obj/item/bodypart/arm/left/robot/android/hi_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi2_l_arm" + limb_id = "hi2" + +/obj/item/bodypart/leg/right/robot/android/hi_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi2_r_leg" + limb_id = "hi2" + +/obj/item/bodypart/leg/left/robot/android/hi_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "hi2_r_leg" + limb_id = "hi2" + +/// +// Shellguard Munitions Standard Series 😎 +/// +/obj/item/bodypart/head/robot/android/sgm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "sgm_head" + limb_id = "sgm" + +/obj/item/bodypart/chest/robot/android/sgm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "sgm_chest" + limb_id = "sgm" + +/obj/item/bodypart/arm/right/robot/android/sgm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "sgm_r_arm" + limb_id = "sgm" + +/obj/item/bodypart/arm/left/robot/android/sgm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "sgm_l_arm" + limb_id = "sgm" + +/obj/item/bodypart/leg/right/robot/android/sgm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "sgm_r_leg" + limb_id = "sgm" + +/obj/item/bodypart/leg/left/robot/android/sgm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "sgm_r_leg" + limb_id = "sgm" + +/// +// Ward Takahashi Manufacturing +/// +/obj/item/bodypart/head/robot/android/wtm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "wtm_head" + limb_id = "wtm" + +/obj/item/bodypart/chest/robot/android/wtm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "wtm_chest" + limb_id = "wtm" + +/obj/item/bodypart/arm/right/robot/android/wtm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "wtm_r_arm" + limb_id = "wtm" + +/obj/item/bodypart/arm/left/robot/android/wtm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "wtm_l_arm" + limb_id = "wtm" + +/obj/item/bodypart/leg/right/robot/android/wtm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "wtm_r_leg" + limb_id = "wtm" + +/obj/item/bodypart/leg/left/robot/android/wtm + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "wtm_r_leg" + limb_id = "wtm" + +/// +// Xion Manufacturing Group +/// +/obj/item/bodypart/head/robot/android/xmg_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg_head" + limb_id = "xmg" + +/obj/item/bodypart/chest/robot/android/xmg_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg_chest" + limb_id = "xmg" + +/obj/item/bodypart/arm/right/robot/android/xmg_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg_r_arm" + limb_id = "xmg" + +/obj/item/bodypart/arm/left/robot/android/xmg_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg_l_arm" + limb_id = "xmg" + +/obj/item/bodypart/leg/right/robot/android/xmg_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg_r_leg" + limb_id = "xmg" + +/obj/item/bodypart/leg/left/robot/android/xmg_one + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg_r_leg" + limb_id = "xmg" + +/// +// Xion Manufacturing Group 2.0 +/// +/obj/item/bodypart/head/robot/android/xmg_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg2_head" + limb_id = "xmg2" + +/obj/item/bodypart/chest/robot/android/xmg_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg2_chest" + limb_id = "xmg2" + +/obj/item/bodypart/arm/right/robot/android/xmg_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg2_r_arm" + limb_id = "xmg2" + +/obj/item/bodypart/arm/left/robot/android/xmg_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg2_l_arm" + limb_id = "xmg2" + +/obj/item/bodypart/leg/right/robot/android/xmg_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg2_r_leg" + limb_id = "xmg2" + +/obj/item/bodypart/leg/left/robot/android/xmg_two + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "xmg2_r_leg" + limb_id = "xmg2" + + +/// +// Zeng-Hu Pharmaceuticals +/// +/obj/item/bodypart/head/robot/android/zhp + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "zhp_head" + limb_id = "zhp" + +/obj/item/bodypart/chest/robot/android/zhp + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "zhp_chest" + limb_id = "zhp" + +/obj/item/bodypart/arm/right/robot/android/zhp + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "zhp_r_arm" + limb_id = "zhp" + +/obj/item/bodypart/arm/left/robot/android/zhp + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "zhp_l_arm" + limb_id = "zhp" + +/obj/item/bodypart/leg/right/robot/android/zhp + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "zhp_r_leg" + limb_id = "zhp" + +/obj/item/bodypart/leg/left/robot/android/zhp + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "zhp_r_leg" + limb_id = "zhp" #undef ANDROID_BODYPARTS_DMI diff --git a/modular_doppler/modular_species/species_types/android/icons/android_parts.dmi b/modular_doppler/modular_species/species_types/android/icons/android_parts.dmi index 6b49a5005569984837c31cfe7c7bdf181783262d..793b578ed51dfbcf041f78b4c47c3123705a10a0 100644 GIT binary patch literal 44420 zcmbTe2UJsCw=Nt&ih?4F^rE03(ggt(2uc%C5KusRk={j+9uTDph#;Ue=^|aabm;=p zdk3Yr&|8u_!9WKCyjhBuUMk2PP&m^d0gx3GUqdVvj!Bzd`Wd&iJ&|&N-gMkD9mtDas`pz! zg{9xfvQzFi+N`*oe&eAoZ-W~r7cL-EaiD1K5=--C?Sk>OB&`*X065JO&HchM#iC=& z>BU*b^X+~%wA7}1FQ3(`e-Fn_Ve+)JmG*A9^7Ej-)ks8>&lhlV|0 z3g=ivb$oj&f|6)`y-hW;!2YCLekm#J(OuSH#xI$#4x@b6abjh=kBq5qh^RPTxbafO znBK{dapofh+WtzQe_x~Y!VH%qn!4QOo{opZl>KqzBoi*{vWXI>#LK%;E@jYA1ku3Td+uOGq{Rg=uE0h+yowVqVBQNfAscfhvPi4r|%`3?WMbBI%N>o&Q zmDn%1QFx2YOP#c?bLry#SfKfwDwD~SqlMvyeQW2^LR4aZ_YGuLiaR#z16yM(Hj8$X zziL_exxumWbMJllzYYI4964t`Dmp}lccxvbTdplzMieX~GM5oa%TgbgrNWmHfy
Bt_c_h@#6)js~V#PP1o;&RCFh+UTdhKW$z%FAIsxxt4N9R+5N zF9t`3A8hug7pZ6$k7S#Y6V!jrdZR_0~+&AuH1vf4bH3rluyrymh%5Q4x_J)Alk= zZ|bKXozu6f-!PGokU$_3J2{I_i^M)eNNH(}TCrY@Bynp|GV=*J~KJSmB{Y0-rE_nYgGV=AKtMKoHP5H_`w7GHMp;_&5aG|pX zd$_Dw=^|KSJAN(gbTBPHjdrOm^No@YQ)w+N2696-Hn!xfGAABfSw;q_f`WqBi-mVy z4d)SXwb#RiW|U7kd}(UnBbs1hggy57;8L4OGd~Z{>&|&1ga^8jR^vF9i1f_8;Jh4n zm$6a18fL^JP0aw$qg{nyWf+4n%L9gG6xo}*##**TTl1aE#0v*o^8^UVMCBU((Ty1) zrZdZ;PvnAcs@_q;k6Aiokt|=`B~*ry;o>N*zK72na$2L#1c}3M@W(YSEMLfamCNEF{WaUs!$fm7h$k~6Q z;vJ@bLY|1G27j4BXLjP={vhN9;+SDHflfk*q1cl`sV||5_z#7<1ABT@2_i!MMy*AX z#@hq(ij#_p`XWVQ=wkx{t`3ZMohAD;q@)x?yGTpAE!YwohYV=i)qc$4L*we|dPoGT z`FUXh^{g)QbUFIKBY)WXZokUDVu4>nsCh)Bh)l!VIemsAuXh7-IeC*uMdZ**ayftd zMQf4RNE-pU5~NyO95sKn!=5nW_{uwT9!*4V%#gJR`ZOYVy@nN*uW_a^xVz_l&Nl?L zvgE;KSpRKe{2yKiZTk25U)hMnUghCwz|S6jK`bmRV#HmqpCTtOc8y8f^HC?`(XVFG z_dpZ(^z_*8jlW#BAvADdEE@D&&MEz|yu(m#DLuUE{2>0;g^-XC)si*|jA=l*vTu!FzgnkXA;t}zwS(CZX+3-DP4f4B zVnp6xa8r|9rXbr2 z>wSLxQrh>Z=1zYW!S!vw-}dY4dc*C#z1fxF!h84bNuf|Ro0P0MWXtR8@^|kN{z{O@ zDy=uiZwJXlevY6pSa2S_O1fHu3X=vh|N5a~D_U5NxBbnPu%{9`%`|aV%YkoJJ9$K6 zPggjv&d>_6v9&g&QC=}D9hLoU`~=N>#@}VLm2)Td@6HaMwHJF0TNi(UGye5&BM4+I zEEeC1$dq&}Xa;S$7p4|#EYH#{Q}(}IW8K{=Ui7?dh~s2qLktNmDoO_-R@WmHcJ5EO z@HbMmMe`5ZAsVzJY@bl+^WUQ7*WYjHt@8!J%b6GoS(gX{Kt=V{aA0p{jdra~_DEZFWiwU@HK8urZSHF!`7^Z#()(Gq2 z-Dp&|S~?jDe&W*Y+l(-ys@-Q)w6ucQ`A6E$X8)a9P2Go5F z)I!i9d3By8>LhQ^Xm=+N*+j9eG6lw33?!Kb?)#JXI*!Ux!Ro@A|hb*X$fPkgfUIf z*d6Y>U<8{&MV!hB6cyv4V8O6s9wdlAwea}Ro2#2=ZhfArQDn7BH&*w`2rpP04EqOX zq6ZtV-%_UNjjzag+t(%WbWhHEfFXeeMi;Gy(f;@>7##Cfa;-;}G*XHD!WsYKn-;T` zdU-8Bf2z_P^(fyWq&t@LvKaE&EecA^nDLNI#0o_WkeoqXWMj8jcM^%^HBHy-9m({R zq^rWV?4jtFYd+;@m&##|+{KvuAPQ(}k3K}P9C%cVtwx(X9c2vzZ!?C%VMfNwT571; z(t4_=<(r}pPCHzNr7MFGcU<-IZ`eHWSXf-F!|YA6o=1jJsaS)fbAbJRf8Mo*9%4mW zTAFvmo^fI)ZL{xb_CigbmS4X_Rt(;D&Ifbz@`ij|4Qr~I-kSKDKsvax4<6F39d@9g zi{V>;$x z(Y)H}&&2#kS6Q5ff>!=UfVYi=F#%Ue%EoO~jB1GTqc8IFE9*}T4EUWxkdN73DkO8P z7*9@3JwZf^rMt3w?)UsW`;8k8y;5;AMV($~uEbHL^7I*D7CTlln*@ylPnCd7XJ# z<=o&b`XUm^ia1Ml0{-Qra9$?}2{4l{UcOWeW-VW98PYmFKK5`CXR$yBwrJw#z{tCK zmR@y5_S6Z&p5VM`w2+X{ho(KZs*NLzbkq$|QSM+$id7=slBV^&`sJPbc0^S4zS0*1 z0*o3q2sgCaOd9k*ehmCd`F-1DnI$IuvX`f)CllX8?fJcOeF=l9EGyG|F|HlZB4Qr)gvPtEv5|f5p)+H95F-~IMUX#>8`-oy9T?})-nxIk zv2- zXh_NEs&gxOLn-VPHvFV%Ozqn^30Op)<}0(U=PWM zf?`VdjNVLIiP2KK!Qe~qc`;e<4DQQOTuW;!)e}3Wv&b=b9sKov|Nb4o>XaCvcS0TB zrDkN{dy4PDHE!-5qX&Oz@8s~ajdsC-p59*Ben!&NU6k-2++*Cwm`aI$IVx+T*=qufmnK#n_K$f!;tNd0ts7Qp{%1m z8b^m+_CvlDj9sf+pY!r4l_z%fU49+iq`4P-=D0O6)yTjA!Roc2RJ~G9iInm3sumF~ z>~sC%)8=SMN=Q(}JTmFyLx4Z=ejuaG0jc+Q%sfKsDHiAKKr^9dXpMb}06%+CC|F;$ zbA2ymdYc)xTwQB3_lEswg$vS7(sJeHRL*3){G6++kVCe_bCNs`*Nr&QmkslY&_T1i zEFQQPdJ7x#O$sIC;K;}+#MNup?y9MsmsF1RcO_eBGqJR>k@fPDWKf#)IiHi`#^_h7 z;%EL7^_%vh)I)6XtI?L@LIn7(AfxE&m4H`-Q@8CNHYV~{Q!0gsP zu&fhK3{OblE5bhNC#|2gu<1IS!hfPVT6@eGi((T!}XW@J4+5W^8>A|Wu z_MYD;;o$w5moHu{II{BJJ9toY*;!uRe|t!uye2F;nN6Y^qJMXa{Pgp3#25MqW>>+e z6#1|pMg<5uri4e2ADNiz&ZZ4lE%NPW5uo#oAI;|Xa zI6JSoM3W~*#O4#Wvi+`38*USIcsfda+oW$5=|7l=dVNq+cg#3p5Zl24(e$UNlLHqY zLdwCKEy$3^n=49&MxWsW@n?1KH}!^|9~+HSw7joyaGc@t;-MiwJUon~sWmP3IS?&b zKg~)Q9u-9b;BnhBZ>g0tQASnu-0tdVhAsr zzJA@93Fc=L6jae47#z&tsdnx!zQzdq3r=d7TN zK^bq^xe$m0$V$<0eFzK=$kxx^K0hkg zts{);k@tb9ByQG-hK!~fIMzhf!CdUZ!a{BPMSya&@X$@&c?B6y7QjjvwE}0q;P+VQXnGa!`)c*RJ zhY$S12v|Cyb#Uc(EG#mIAJQim6;T6ABc}HH92FHc(-O}9^+(7Oyrj>kz(>5iypJBe z4h9hR3F}5Mmk6BnX#Yo7pIM^J z(Oa9F@1mkiwQd)ce6c^=Uc40XF4pG&7{@1<*WuH31@k5f6-Ph+otbs4^_<<;7A{6>ew69oG%M(w&)lAmXXEDw^@yhqTCz`+~QZ=S)+sz@hbJPhCuptQ$JlZ7>TAzfxs{8D+ zkmP^%j6W;~9#(1QsGDd!?m3nC{{6YBo)4*ytAKX#SMReSF49qadVYgzF7bf0Zypx2 zg<3u93B-8Vt~)g&o*y0Jl`|RY6%wOb( z4@v3iB=A+1F!}o)2z=~Ms9de-8XOdT=BlsHihr{ax94b4Krm%TYi4L*Ahm91kiSmk zgU85`l?np5=q>$H91~(r-x=%p{CPv#G>1wabO#326O<3vFewj}y?%&{DnSahOz;_J z;>vNcR@oTj9AVi%PV98Xx|Ed_cTi9exSpVa0d+)lFd_Z17joio+!gvf^K`MY?y&}ELv+3~DjybVBno2ez# zv-r4;`r(0{*vg#oG(#81T$GS9u$${PGiDXHf+&a#uW}h2TD_V2#(0VApuFI)yqr=YYd~KRD+IwS_6W|(3sRk?<~W&3x?1u~bh_6q zx9zKdBE0JoGlGMHywf?3owK=_eM?G2%5?bf#AZo(H)(m|Zkgn;KO78H;a^@@=t5cY zSFWBvL8$LLxvrt=@hriGQC3#g%_F!mnf8u%0%K-wJgzjYDJ=aMuo#7p6hP$~8ZRWt zrrj8}#<1S6EIpk=wxM#50-&C_LE$_O!S0vf!)p&X8C@J|a5O1_5 zdbYJZ31gJoMe*38OotrXs2eo+2oc$$_OW4&*m`wncJ;J+K^`Vnib!8yPZ;3p5?)m)onE7r5GeFl1O)M`}yu;+F;T>nRM_yF!Hf93OD z4ASE}GG*jyFnzhht@xgjmuonU87#`lcpPW9aJlTi;Ab{M2Lht9H1a+v1hWoSf`*6!*g@1#s;(pN;`u zvE5i_{OK1%mz0@#vSz=Le`Bp;{eJ8RX-4PXuC9wFn1Tn4$&qeh%sDyh<9*+?w6((% z6T^T`v){Zq{Fx?{|Mcn8SFc`u_sw<<$3BZielJ+Vi9SYXJb6OU#ZR0?eu5Cf)!l(B zD#flF2nw!O(8Cn{DD}BNn*PmUVPS*8{7=wZTU+6uKHZwxx^_yy`(SWJ2={!8bw9Y~ z$5ztNt+k)#P`LOYF!FFJKaoG%{6K%UyrN1SLl;~~k2ohJ=GCk7Q*08j+ zd|-_-{mnr~(NwO(2UzBG;v4@X+=nup{ue2&(>;NxUz^fiVw%I29G9M!rVE03q93jgmc7+4r(6a{BA!_t?RlbIsgId$Xc>Yq)#Ww3M&hmS1?pg@4@-)K}8-WU3VAFY; zS{a!a4`DM!Mn)P;K{#Sfz>s<#Ofs)X1y-Fvyl!XXx$Xsj9UL6od-$-QwJo&fOQy8> zn|V>wR0}}@1YSwor-m$6!O(Z7tVj`1>NRyhV`5sr`lvgwEF*7=C5*np*ha0697Dx>uUc z9tQc8MXxl1b9gBsb~Bj}Ja|zhcH$K@5Inig+WVXyJt*<+ziMW9ANv(K%(>!xWI%7=YQD`9Nns3pxZbIWr7mDs3KbUi+#ImSt`-HIiAYMwsrWGQAHURl z>tcEi1mpn`w(m;#MP2w*G{bLicj;SU;m#jj`6?jr%5DVdw22xhz3;$i%d*|c-z-OX z9)7E>dJ{u(k@}Q^RehRMaBUhk^lb-wjf`<~yk9`e4>8n&JUG4W^kbiY8PJwy?R9`EGlXYVCDX(f!xaW_KO0`{;yOS+8~_Hq($rf zXpP`Z`$b4-(6^r=!I{NepBd-Z`F4L+5I5*~0wi_Ccq5L1%rSz%fcC!bZi1T0FxYTv zGj>DymvU25q+<>WacMu)zVLZ<1la(YLc2^kS2TWiTJ9Ph4F+!vuC{I#U29ZuFJv9< z@<>gM2!Y>^AcRO88eY0}`?iXz>Z_3vtxU8}n;M!x%El&VfaOZT4JwR4>gjjlr>9)n zaZVkCfTvS9<8xD2sljeiyl%6zG4L-fFVE`mMQ6?`r5Ltn(KqHjEvTOsc<$&pjdp?T zLjYVIP~Q^mWk^`{Ko;#sczk@we1iKKP|h{t;~Vac%vaV=OM$ioUI(vBu1r)hmY0{` zmplTN(9+S-KReLZhgW>h_)EKC1TSsrKYhvtWCf%}o)x)i=L%Ux#b7+SfQ4OfJ1G_8 zDs;4?wgP((nMdse%)?XjOJ^c>xd19tTue#WJ?Mpi+T{GXVC_WJ!yxIFeRF$w())Yv%EMB zUT^lZXSe@T3&73IEvwSvo8kQM?nOzH72X6Xuc*l2&RbPwohyE4si+jrx}rl`W;mah z^Hfz;wY0U>j}%*}Xls+_4U$9Brr2sQ`TKVUJPyITvX!9%Y5fwDHX2NIki|Y|)8I`$ z#m4Rog|9BIu6|%ZRsO+!CEoBm%{T+@Uq(fRYC?4J!Kh~bd=ytep3Vt`=H$dLFG#UF zG=frZ<8?uNJ=eGGPfs+6$f+H9cRMSdhe>j9a;9Wuk;jVKg^Huei;IgFmX_{5e|{a- zwQnExeqdlAf+V>6+qdiRl~>Eff9^M>TB#98ZvI%lTG8j%vfHvk1bBKq@2QW5zQ-S6 z8Eq!-!}060u)2C<^}(cOHvoRI&~OgWaI)veofaOrpOSwWS!Yymk?G8=VpulGW!f5q zfZc>Rxb7vhV=H-tm8Io&MB&KjXc|5_u&}&LgaARns4a^3D$z!oym|`VJ4tQ@2Zw_F z9`>y6t+iW#Y=}X8lO7R*W->iDmV)!}<8@xS+O>siAZp zLuz8C235!a7<7MqGP|iKP4PpAZ`MQKv~kkU)(pZ18{bB)26G$190({v2_`CCg?_fR zePHtD=HsLJ^XJb{rE8%iiKbOp(E08rZEW7H6L(`*#Q(uCs+2j5hI8#7zvSg2_kbND1}(8$ilrt#+o?j4hgm+MiI zq_gHlSUB{7h5Ia7Of^OjC$n@zSa_kvB`P{PrM#RT!rNgdy0x{nXB5vjLAC`*78xB4 zWRB}2k)|4m0%njzftPdV&+lL#IX#hCCClFx1ECaoQpx!k9fPx?sioE}lEwhcSaPb# zgB?aQqT_w-RQ_(A#oYF*+aPLLpotJ*!NI+uC2};_RgMQfw8OY>#U&+6v>t+1N5=`HT>uw|;~t5Fo(%gIX?p;|AAl!T}H|;%~p4 zX$U-zXur9cu6vmTvG#qLPc8VOjUUZ0=Cch7NMAa3tP@nN?vC%UC#XH$+}%|Q_V77P zpW%lD_O3J(!_fvzw!P^O%a(I1BAY|{AR<<*eJ76H@q^3K$v!XdIPL+Z0j3&@TXgmaZj*zXf81Ep(2a( z@L3vt6VK z)nK^lQ}^E#2{l`65GPXReq3ht+@^XTZZTK%OS&F0PWg*ieXPMo%ihJus`9S)c<7vsm z1@_E>TtAROlVckR#qa`5kVWDOIOw||8-O&_ZhH=K5&dz#Am_yyNb3RApu7;>ZVR@J z=P}W!KXL=zMCtJ-J~(Y7s*kxvp~J~sHVAK6HrV$d&lp06GIa-KVv+{Zf@Xmcamj~Y zcV>h-+sGVs!4TNKKNUa8M`FH}VA-p?I$6WY%*<>mN{-ktBg(+5j+L7~xe?nInW@U* zJ9DviOM(Pf12bVg*pNtlR3+paL3v#Q4ISXDik@C5m>Cy_wH!l$KY)fdx-1@hGuHmK z2m=BpBA|i=Hlreiv4Y8=p`qMC=#N5X_rp#i`uqET8p$zmv6^~a>YkJCqZ_B~F2Qfo z|G$r~jpHq-=Rgor|G<8$NZM( z+&AM``osfP1}ibpQ=^$j+xNk~8bXsl-q)KA3E170P0?;XWQ9EaRW2?9MBl(ba(cR4 zOw9jc&P)fCoodf|zoP`oj0ffK|J0LtR?(NsF*8stT9`Q7ZfWmeB|AKqTmq|ff z?Su{>;8{8D7OkGARLj1$qxE=ezj$(+B{~oSR!)Y0ah}%EFA8VL##mBXM~cjFpl0B9nxv z@TmGN(lE@t)l4aFA=A-M?bcX9HrMvm4SP)sqS&bqqe8+M;HORPT@;c*9;g=U2_FPuER;|9F9;Gf8( z7@TGJU%K-im9sEd?IKeM&s*Ht0BGZNfRwOwX1QMY+OY;R}BFV52W zF43*TdN_GfqreA(IVixuT$T&iM|(#{xo>z~rS4gmuRf6Fi%u&orN!qSnF#Px22QJc zV1PqH@~=(#LRY}3YYxK154Cl5Lm-TP;oHY^g&;^eK_axfzyFHKy`bGj#Xm82ADbQ{ zAf!X_1*8F~YNwhs)z$s**sexr`|bPFzf~#F1EGnFHUZYk|6s((A(k-GcnjrAZH1@# zq80UROGing_pBq%X+(hOLnyTdEYs3y`wy^ue>hUS&;ADq*i0vnSK|{-UeATu!~jdM zwKe&1m%1{y|Na&Z5Ad?z9+0+o;$%i}H8rNhdY38Ho^0GMI0;Px{!4@>j$SE_w}$z7TY5LH;^#w}>{ z!hge!MWv;R!HNBar!BU!@{Q#QU@!le-k7pNX{;&R)f(WejC0w-5WpuEIL%r-R#X1e zP%Ldt0{ZOT#CJY)?P~Ae&I8!=zWNJA|4zhbvlD~+iNWPCBkT3~+~gFnlOt%M-U*yO z42Wurzha*_`8IAAjR8ZM`aOFge{>Zh zZNevL@aoI>%Ukh>*ZWrk-ZBr1JjEw_pm5^{uv|5a89pl`){l~t;fua-`#Qdm17FEw z0Z7&i%RhhM?;aKmUJ+ei)%+26G6ux&^S5#2D3`y*7;li`wZ~z-$EekH{qyiOaqvij zBV+a5O{>n7ts!rB_$`+N(vTSnbU0I8tAC{sN0ImoMeF|hL- zlI>HXdAw#=K{QMxs!OH=<>YjOgoI>cvgT<>T05?+9S7UT2UK*MG{^jBt>>f%dD}{C zMh!|wRdjWE|Hz2FR7PU2;KWrG=cfunkU}094I!Hm;d=jMu#thLNdS2%$;pI>N9yY7 zHJ83H5vAH}{|EJ|9BMLyZ1Mg3EuN>}@Tn$XLWc-fn{w+BB^I(1e#cMHb9kqXPg%hZ zOGF%Wc67X%TptW>)ubZFms z0J27G5)!(Qp8FRc=l(W(*P;n|JbYOUsKZsv*Ntz-|GI>%Fc&ONWPFA@VFG9r=6zxk zvbk>h&rD2CLTOVf?mu4oAKwE~MQ2twQ0~6zlOylWKV8;X^t)z})qibfb{72a7v&B@ zso{_BwdPBUi!T9_fLba#Iyxxc7?40>tw00}e# zB>^CfdxO571gi`?KauELX{m-AtNH4`6Y@7)yhkyh%Ie;#{EnTPqTevNKXEKPQtGk# zkknfe$3BVpZH(mc|WW zhvjVYI_HH-6LcX9TP$Rfmzc{pa)cZi6`gQ^n%p2}!n39mwngJmB-^g{jx$&NtUjf5 zGlCyb0cB0K+E4#JKm^p}k~UEVOEG&J%eUV+N6@p69O=*PW~g)z76cvD+$?)|u3IKT zTw*$X&~RVDe)Rr4I5pg-B)bOvqocuwlAfD#xzES`jo!D5V&78MX)dAYM-$~_^_y?4 z;Vd0uFDC~!&2KeU!PGsZbQjpZEC!q(>L8B4&(NK63f=QwyfEV(U-7|kP*H!zC9nDB=24ISK@&B zA|uU$-w=>tN8?4?ks=GfY)A2fRb=Ja(#yHD=$fH`eSPZ&*!vEvIAIbk+!4kL0;Key zO%dK8Q&StdR{4A2KF#7Oqd|8^h`oKdwRDJ8xJo@!fjoTPs z;DTJkl7hXQpa+FLY$qM?R-i)JwH)es?mU6=0SWN#^W7yXP!>)K0TDQhU!FS-iviI! z^dmMeFE6YD^tg?sti1bAQ5VmG_{R&Jj2)6Hq0s*IJt(|G-~ahxYQ_0B=t}OrNMAQ` z7JOAa1P+p7YY#2Z;jvqV;q}yjYv2qk zz`?~>$y zVrN4uHjIy$_r)>%~LS76- zHlz8#V+eh`FL6Etg`wWI)EJ-gopUve%B`Dk7UA%W=ST>2Ag=)&Ht}SurkNc)$R7DlPsB zYcR&{_pa!uy=zS@OhzC8-))jIzvEko2I6sX8ZJ9a>86 z88@^4&D;3Odsl26-Cp~#8W2i21TrQU*GYWm_V<1Ht_V&dS^aVQPtKG4YM!3$|;-XvegUw7*#$eRz)RAJs;H4_DpbqO?Xo%+%^E|2fQW0 zHK|Hj$H@B&b>Eu8{XUS4FT+gf;k$Z8uygfD18)c%FN{vuP4?4`5wr?KR^HmUi!IXv}Q9>`HU=Lo*iP5&RJkWyW(r?6t4qPuSb-WabS z_IUxql6~^zgV)ESo%1e3f#bIFckU2e7ZL)|u`$#SBRF6`MFz>N4?xwxeWcr}lpo$FWDK2iq215FX|JK=J_Uj{wi$YeJI& z;%ep$d=Xp47gbwNR_o#cFH{IaS<@SJp4Q}@x{b2)XtvYpSx)!#TNeE7P)DPOyR_w} z8R*&7W!8ejJ)y{SmvJd9(CZS#8J~-6$ttemESPL}o5RA&%E~VX!^r2ynaJULnHxce26D z$B0BJ+;ky3O}d<0kx?$(lQ0t>Lb~yiSnXZZdmnvVoYF#Ejc~ek)Rl#31e5~48z;rXo)?Zl<@Q+C<#%Tb1?Jamx8s)N;Lk3{uZ)gs zER}i8Z$2~*+S7!ZnGqnoMl9-U+X4dT@YH#B<*L!BHmIr1ec2T6G8@)>8 zh+6at&pyMi`+sk(lM%IR@BO?3jdr~!`K-Zz%Qs3GQ*Esk$I8DkT@XUU^GotGaxe5f zjlsS4b(^?g{19}wld>uCXlS7+q#Us(F%hMI(tA4rjsp56_`Ecs!jb0v8x+ZcAywR zM^{tGfQ%Mt;;m+sU0zu#Q)E$M2z^7tg3Y6?_Ju%i4d1tuMQ*e)OGi z{j1-LCl{bIT?P4@`z5XsJI&X^Jod_2Vj^)Pw5R|b(*fGB>Cqql{9|5Z! z2z6^>xtJR23$0xM$adt;`wd%*guh3`EotbV_(-MAT_#c$>ARk7IT$T388uA9>(xU+ zez*C@;bu$owZpqs^7jet4SyP}q|(zYs!ds#^0%DVY9Iae+F_|@Au({59P-}XGA4(Q zUU!GKgq98g{9_v0d@Z)hbz$U%)kueFVPJ29s)Iq>`Mc_|e$9hxR)QwYVb;wS%9+^j z?4y^3*6!JK>8+<+a7-($YhU%?c?`Mz!ygn79O;*t`JdTE7xdu9a2<^ply#Hv=@GIA z$QhG47192Jn!>NllcPiAqm`|`^=J6Tt+zO4-5K5enJz?Kz{QxIdvB__;X5aU@MaZG zyaQtjb>&b9vnw2y*$TC0+IrB_9FN;k4xNUt6fCAOUAdhJw{*qo{jA#)*`3KlJ*TLh zqT4r4P%xhe=S{=kbxKW5O;@GGb?Vfq)asL*9r@tkEyk)ZP4duVSQSST>A|A!-M@bq zuCxanHGKw)6cN=%MBLSy&Ke)IMQq>IOpiQ4!Sy`MmCsIc@@ao)BsYJkSs7ene>ss! zdO?$p>twBs*$-IZJlfyajz1qzxP|S_mI(RUkTH|bLYJ)Xq3BFtx5DayPFFw3>kF>$ z{*OQ091IGK&!0~wD$Dm!1b1h#(!O28X^vvs@iudW^|)nw`@D!p#oJ*|LLRz=x3Yp#(_8(>eUr;CczFJh zxomEqc=jxno%$4gwJkj)_pe{?k*|Eb-|>C*0UbU4qS#)AP}%B({SllY;q~u0W1AzP zdKeY{a7)WQ(f^|xkQCSm=;VqCyuMnJqQfJKI&+}hBZRL z9BsPh_UgA?ySMI?0e@?+{xg0Hc~o)DR}0zvw|0jbDHq0Tr-rm`NKWb3KlRxEv0B;^ zikl`cot&`}%jy)T8m39{Hx!S(fOkyxhC$!y`D_Q0s%#vf^>>(k9`RU{6_ro)<+MB4 z&*Aj{RI$k}Z_$@Gb-becr?zSg*X##+eYX-}fcR!6^P5N~!lrv@_prTXV}s(OYcoW2 z&l~UL><{SSHV%ADT2QOONb{Qk*7X}D^oDY4vfvb1uK&^D0ZT}ke_Wc>=$$_QSoD1c zXM;}SmuHW0%}cu(TCiR)d*C=nyLOr^@l`Oid${FhSZo;P%K1sT_u>)+a0ZM(wkGe# zuQzDvTph7WI(4*Ah%>?a@DYU0a8vAusP}>{-;CeJ?PTj-zQTK@e#1$*WBkINoa{FX z&vWEA1z=Gfj?|cym)AwFy%)UkG8&+^Q31Ym6zYA3Ml2TmZ?tB3GBWDD&OD4VH9h9s zr8rjpEh}0i5+g{>e%*9IQ_=i}2$?n8+uHlOiFLk9LZc^Kl1nVw1HbPXpRz(YRaJss>b0Uxry7x_$?EOz;VF} zVPE^cXD+F22P`!%lt;3dy+)2U0W5K*wkzpkbkGL>l_=B(^4iE9h>@aTJ8!=YTmJxR zYk}gt@3Bg@vhnBZkwI$R?zK=Uyu|ST@Q@YKyWt_(`kz_=GT(p)?2x~`nykt+Nfa2s zk*Z)S>WvS7_pab8Yam6NG-l~c1Qqy=;HMk&L|JN$FF5X)jLg0iVRcIPj#*aK<>g^W*Zy3>d7e!LwF$lc06Lz8YR|4K-cBA3WZ5Ojyg6s(w z1SlYflSgyEr@AIYB5RI|ivB)}6_uXe>u9Av=f2ZKgg+JT3%^uB8DM^FK=4531v41X z!p;7Wu$PHa%F1D0M{s#O>Hx#EJO*IY;^jeON`OCOrP(YA_L(UG9E$RyR;K|g6-$UG zM!3xW$w1G3urqdQ)WLtXGt>6JVv(HOm|)gC4@SGnW8wb_M`p?WrOs06W^@NV7;emv z;}*_y)|WkA&+%Xkd(z%$%t*P=S(TDXOm}VzW<|4V)28fmE_B=DZ@1&+ZvW&yTF6V^ zb3w9X#RTh9auYtGo`O5Gp(-}V9eU)WNIaiT?COg%u#4Rmk!d>mmF9x)LjI-=;2}$! z%Yg3jD{B1C*{)e=3)h9dyt~cEajwdK#OpJI>HJc`92xmS3GRZ}ZzjZW3@* zg~9Iv{0lU^KV3K)=B$PSc>5y-b2Mwa0x9D7#k_mZC>s3ISscH~#-Jaz-Yk4$>KUR| zL+NQ`11X=f?;se_)2O@ZN3nnwGv%dcc&Iq{d) z0)iO#+WNOcBf|EGcLY;ys9VIL$oT6+2_Gy^Nfp925l!89f;`#B?LfWP$Y49NVfmy) z&l$$M%UcO*RK-KllE}-Xzi1)^drZaEFQmhqPYK!2IK%IP-R_a3vy1U{roJU)VbR1{uo?CY%?ni zfspsw3AgC2c^H4I=;GsU)_P+KJKt{L4cyhwf4<68%b1x*;>!CpMVI0ACjN$-ytr@o z%C9Ot(@#7ar(g8Udv%F;`&b%ALXEVm0qB=6NVwy^~|75aLvbf1Tc5?8P5H z6fsKe%}`E3XRuC>t^Zo^Jhx0iPv~G6L_9w3Yy8|2$3g1Y*0iS#9#pshTtGKaimK+L zaEOAKakKDu=LT3sMLaG`NFo5x7&mF)kd^K(q;tq!UM4Hd%NH*bAA7ytoIOv9{{kzk z_27|o2_O#X!(%v>)`+J+`_F$;w_BG^*BNlCSLmo<_G0f~4?aUmk^@k{W1Gw3V)XE10DP_TWX1b{@7&P0adol)0U^4LF(3kn%k!xHw(cdM_ct+utliQock5KN0w5phcY+BcJ-|S~%0Yj%$(cf#4cb zDwxe@bjI_rr8aQwJZ?%(iu5E7YcI{F0CXvn(kRU6S2DvoHG9~a4Y6hMew9l zz{2;2CGlEeL5nR)c^a+K_>+_Z@*aC9Bb=VvdVxa*J2~sulNn{UvuQ+PPoKb2Q`t?tXZm$@~`f4 z%7Hx3paAW5gV)3O^FNgKt1GB&rBou3e2?1P%k-Lhe5CN=C5|b^=uU4QN;388hsCam zlCoj)O_|?~`g{-Q#TiDk(oZ5t@}!(cKWE98sZ6wg-I~izw8J0;qU%_mYR%lZx#`B*;p?R@p9V-SNJ|ybff0wb%k5TlBf~1xtC?TIa@&_-F6(elh8|8+)*8f8mQv~^ zJ(7#ng(J7Y9ohfZU`^U9OSaRCZlQa1?z}>OdxC`a@zQB-7M$K$|1-=%pGvZ zKOfrx?gk=-^stf^cC$AbA~%rsrlok)Yw&Hbvu+$S?(eAf1q<|BJG(42!C3+a3@EK}tlF5J9CIX#_8wOOmM5G%O z1ZiaG8M;%tyL0HA`PSC^e%|jnj_>>N&JSf~_UyIxitD`Mysp(-bRLpQQBy|%;+{}U1jn#@ z;Y<%!cBNvsHQv6JX|CA|4z`EXAFVAhVaD0Vfxg;5HvLSTJ7Ez2$6ml78z#9J`w1(G zHaa&I>3vX1)QwFz;tzG{cgWPR5$yd!9C=R8m48DI3R+qEGWMlpz1*#LOju=*nA@*Y z?~0$GgMI9)x#O`C)-ygH+!cjpP^aW7e*qq6C+<(mKb;(P+CSYm9 zbVc)(UPw;QwB5f>zsac?3!_tBQ=}m4)j#F4botU5px5efS2($;x-o->%|M-2$4E(S$~HE zqk*4L07JhXczA$Bsm+MC{YHH|y)i-3qhgQA1Y~S7#qFe~VbfRkO&_~WfKnVUOTA6n zrGSqj#6O_57@9U9kRW#z3?^X9gA2=8+~lu5&%FN~*UOXXH(6YF%Aqr=pIAEhnt<~! zhUPGa=usAcG1P-@SID`JU-V*o%g#d%D%>P5rDkTzX;ubzp+@Y`JJQ!>WGE@8&LBq| zb4-9IjEUJ7XnNpv&*`ElVf<*qL$JUQWLP+cii{VYhTE0I@Hl;jg2#)9e zrkm_ZG}gF(Nhzt)p+lB845aA;Z0I+=k0pSW&id&lRLqv6%I`1y-ZiZM`^$T&|AYuH z{im(JX$Y*Q)%4pjy2+oPw6jnc`*Pe-w&1^Sqqabrk)P~It>w(2j#|j zezu1uyj$lp^}u;5%^`eWbrW!#-noiThq%o@SK&Q#yxqv7XN{8(^@VZc(JG{WfxXt0 zZK$L9%(ov&V33YAI>fOqXGp8&>8LrMqGLY*aUc`WF0JsHWBMBZFIduvUo6mL@@K3X zARYfb^;ToQRL4ErlDRq$r_SE3%oNXk8&;Q zwZ6^bo#(?FeWqNd=w`=Uk2L+10uHuEvk#=@pUf`E@zdOyk$_)bT71{CHEy?AEs%V; zCYb-0-x_6%JWPt+N)SC9U-guY5j)p z!1r7cP<*oX+-o+{_Ih4(V|fK&&~sFH~LeQXZEQSg>ptw z2@DAshEQhZlIO8lMu~ipQGDXoueowvWGKkB9CsLcgD@9}XmMw8Dwzo(;roR^j8>e3 zb|fO;Yv`e4#mbE_h(bzBYw%>#RKQN!V;H-yG64c+{E-{c(mF1uC9{c#aRtssSN*hT z(7*ev!bE)&4xP%rQ$Wo)6^igoND!LkHAU=tBaWMVuS>ewunC>*I1DXeS50K*;Rtfa zCEOPgbMp0=t;;v#W$tO}R9r10LhyV<%tYs(g3Gfe;uqqRKUTdw!Xu^Oktdn9+ zKP@cO&~z?nvLwE-xJ*W3xv()5cx1M5zKA=jui1X5s*v&BnvlZ_m+?DJC5#wN@mG_c zTuMSTxTh$|>=Q6H%*E9(EhbqMnze`#9auMK5`KCr zEzG*?yN&kPNe2~mJkPR@#)V(EzHU9KLNB`BvWvr)y;FzbnDl;KZgK!UORVg~u3RE4ZoCA(Du%Y3Q4*jz=( zK6?oJ?u+w8s@X8q(;D939Qggu9_TQ*vz7MN!x1Er%qs@S{O7m5dC)Pd0oIsZV;k>I z{h%GnoxW7U`g>HJJD6Fb8%nl)1h|P{5_7kCSot%je{|GCGvRr@H&(WEU>3f?5SY6p z(~=PUUFw}1PL4ShArn&@oj{Orxg)ou%bm0mi-mAPnA4IB3%yH>hD3XZ8=`nIUi60e zT{{r_Vl6&HlWpO^qTCPcOcEvWYu37i2x~xfHyoJL8w6qg*$mb+U?tg;Vza`W0qLu+DAKwUeyGhP^E6p8_i1XL4{bKU?_Eh2MI_+QA!f+&c&QD^n4#Otv8 zrF3w`@MFZypnI-#fMJoQ-|CWNd$o(?tvEzHUN;{}<;v)&ok>{N@l;%tmfIvNy;re1 zZ1<&neP)HNqg4bF-D&y?X0e}|nwal(xDszw8DsfB8lszMt)`2qqYZXx0okzcN(YFy z9=1koiP4VnnMIXG1^kNWK!r-!Bl|)-6XVe%LC@dVor%gGG|uN-7(Q#F)$ov>cD5!0 z8DAtn3kzG%*p?>6EYP!!gt~|)W^RCb*Z9V1Vt|KX#1wp}xjWr}alCETwFUYNg5GYk z&tfg>l}Nzce*+6NaMwFZ@d3uZ{zn8|fX7lbbMA(%nWTMRB!L-SIjWd%%Bxzm`@pD2 z1RtbxUA#*@LEv>3^%!(*^R3;*f!~*8@;Dl1Bb8Iv>aK>b5%Co}Ut5H|zU*N$@!04l zv`pzN-{0d2O6sioOv3UF@2YjIZjXKF|GQ7JsFjqbdWzeK;GvY$oGw4Pn_3W%Qc;DIt!5U{x zdf?vw^B2j-4Y#L<%cbLFI~QW|BFGl#td8}c4B3&su}*zL=ROrV#r=u9?1ic)|I_E( z($w0luxX^WR5bms7as08prwBIY+B3v7ZbO^n9jx~-GQ-o6Q9C$Ila!M=uffBA+8hL z!tT{u_OuE94BQ;lN38p9_C-7n*x(;iei?74P-Z`-tlUoPj26<$4(|mre|t4ukaT3i zjTJ(FEjoHR@Y@I%wmRqFT)ZZNOrqu;OEbg|#XO%`m~DP@5&97)KLKoe^+1;`0D8dB*+j{2m~i0nG&-{8{%1K+r_e9-N2ZPo%M`9in8Bm@|2 zdG03*GHRO(h!N}v)~^mD<+_=y`Wyz+&@0(bl2+lTUON+A%w>x;%adlrCI%jXIlB19 zB^@jwO~pmlAhK_PQzy>!pr3?zL^Iv(0=ud49pzFyWZn-L-&Vf$wqy~Vb)RjpsT8(| zr(_9@KYcjB&bmWO4ttFbKZ!K1dVG_?aY@%QpDlK6)v$+c=XKS3)um?{9}2OV1z56> zbNJqCn46486)DWR`L@ryUKS-8^R@dv;y2mW54Ths2~Gm7U5c+YX3w@;M9VIwfHCpy z4SkS84lSi+T9s~7KlYt+o|7h3u&5s1dO=ukB0OevxU0)&n8&(*sHa;iqYmHyDsqIh z>Xxe>R_CSoj=6c)rzVQ*;5cdJ>1;gGau+$lSH)?w?U6ijTzV4@7Q4ef-!h)dWzW8$ z5M$Rb2!@DtEYMv1n!wm`dflJz>}y6VnMpO2I%2NFwkH!tU|v=mXMC9V8-C8azebge zt&$`styVr2c${*)>!3PZI6*r#E7@*N-CFNL z?H?J|@)ZD?(S8U%oJDG*HhdUP;S2}ZnL=zBDY0JI=Ur2%-Jb7c(3A#;lK$FHs(TbI z8GI7!?TJ-1axcei(elAxe0D2)j%;CK*A;#4qpSYXD?>m`Y#aR9T)DKOv33mZEIK=b zADJv)C+sm%#xs=v_7sey(OB12$3@+naPUQukz4F4xb6$FbRqVz86zcefDJdqS?2>2 zCalEJOiYP)Ih~$Ip4@qN&*u8$O2pB=z=g%-%zdYUFK^!P20LD-rw9M;dKQ5!I;qY6 z-xupmnis>wPa74jBHqjoDJisScf0TZTKMRJ%y^qul>cx6;ZoA*eU}tzrG?3D)@2UG z49g~6H#;mRT*n$4Vi{<_CM|#+d>$Npr(5*1T>=eglP)e#934RQ2#uA8>~rnXeP^p! z`I$^H$5`Hl6T7)D{GFP@xN>(`b+T^KZf{ zGO>cim~EB=kR&3hJ!gBNzx~(TGK@O=Gt+`lB0*VF7Abp{(MKjK>vf@(UZ{m z8wTZWD>(!bs_yg67TPX6V_XW!ipe~bSGuCO&_GP>Rw#hgk-*q*-8MrmxYjtL4KO3v z#722w(~ZFbl=3jX&%80;_|FsApZen$_~CuL zD}60KXjHr-p7Ytq+AH6ae}AaGqAbR7Pw(uv2IB(yu7+0|g|3FzDjiM~e!l*%Ls}e! z7LXy&qd3tWEZd;0Ss-BXv%ZPfu+(x=^i+{hGcMyR6vyg_Lyr|pt=3#Qw9}2*;yl3i zZroN<-T!L9<+VW76Za+SXZT7C0VnZvMpJ_ZdSS|;<3e898GCPk%!8F2a#%_h9}Zk6 z2|>jQB%}1TbAC_osp-^t^#)o!Pn(VOri6d#q-(o?heL0g?Cb|(?iWI)(~SwsZvlID zZ6-@%vN{HS05=AkLi@2~mV9Jd`#swIL$(SgRC26x1V=326vA4I!I+h8@#nkgVK<{n3x%!z7q9V8>Um5|&4e|*LHTI{8xccUW9@(_i*Ll zDz`Ga%02y?od_fGWBNdsMtR3~rCyajl6}q8_5!lVAM5EVuq+x7v|*M;!UnL({c~co zWcy{$px=(te5oO~xXvo<$ab3i;2e8H!cptd74S{U0?;U27$CMV*$tDcs{6~CbRHIF zM^rCmt)D3m=il43&auFGS>7vnMNww5DPr2+Ut*pNQ~~j;%CAGlDK_YyP{C5t&+Spk ziqEW`pMBS5W4OeU)=>kJ_gf5SdCrNNR~=)3ZlUhE^sSo&f6H2IRB5hlD`9?_hk_&s z(1d#lwT}}ckhPDg4+rc`IjR<4EvBcR-#ZwvPXqsfcWZ=ZlBf@L{bRmoY%AAY6vDzM zuYn5E_g>C<7CKk0zeLL`ncjRgJALYoW=x~losFEH^t7MVuozTxu0CIu3DS8I}^{fdA|6Z~HY-gz)y;3(v&trnzLAam>n2kR7iLp#_dlxzp!bA+2pb{mt~ zrG}}k$XhxW6ew6;hQW%rzxt$h_?ZqSWR^ZebSmQe zh>E-_y+FGaI)b#I5}Ks1FRY+9PE0ZN`%p(GpJ;bKbYR1}@ru7=0oQZTg!1ZEp_v`9 zFY|6GaYv*lfn^A8TLXTx_~hIER90}Z&hia<`nEZ;#yGNp98vWR=vmSV7%WJhewErQ zWI>K_!dR4taGje- zj47cvYJM=d-EPx9%=df~%*g8b?{7WZ#Gs&BEE>DC2f~p#SxHoj;o+ z!1XCJCWhJXbJT2by1&<>-^f(Hx_Nq^GT4o%0f3wAUlr!cyes54jBNtz@U1%aWq^%$ zD=VhE+xuwXGrAr$Kr8Tp@4vS|8+mVZx34)}&|8!dTw~pOuu-u4=z+3`V762J=*aeO z_K&xvP5$KqkPGJ|lBDFHI~FRs#c0Lm-)CW;4ROPBuJd9M}$GN)@VTuI94L2T+wQCy}%FRfopO%92=M4Vj~XQNw`>w9d8|x#q+x zHadq`x@?W5Tw#{ei+J;95uefi%k6wyJk{ot%9mzl#oZ_4cL7#LQL)mj9-ihLBM^<7 zvnVj@L;W#52jlCvcKiBcUhuPww7*%@sk20}Lz{~d$u`kfC(H>T4_OF;w9eS+O(W+<8=H*bCJLJb8IzdQ0aa$jZ z-%(Hk8*JQ$c`@*YU1NM^nD`){<=O!4;7VE;Xafbx!RX30hkNGlx8`vdZ?CVcD7&5= z?(H3s(wmdRUcBI)IIGM%dim(wQx^y{@FDNqAoA3WJ{1R6vX!xzq-i&Uz~S4uc*;Ya z)RfBe!eWG0TItJU$|T|0E+eTPvoeRP8=I$b>P?F4lZmts#WT$mm{j+Hst2d%ie zy1IkCv8aIIqMd!N*jQ4uSeGUAxzxoH&ly-1Kaw?47K*}dqZe1^Sh+5zt{0>VTDG?e zB)?%!`b{&GoqMRND^3Rz)GS3YWx)CA-_&J?zg@Ys&$RMo7E~sZujz4TYJlF8vo=(c zCMBNK;d$3|JTS#Xeq8&!)`8LrmD&Vp#%YDSsyJt0CLZwgd=bD0R>r2iojg2T0RM=v zOkr-k2k0wavy-GS$zMSAu-EmrY78!iOwXQ4@2CjM?ToJJ_kZ*qH>C@KyI61|lVer_ z>soa4IdF^Kb4+6Q3Sv%(I5C=KQ-2eu)#ZI}ER*dW%H72Al{>+q916jzdT%BHsV(k) zW&>FJ6d{Sm%-b63n!{%{nPy!gz|(tRfhp^&$~Tnt-;42@j41kTC|WLMzc8iH%y0+= zIgXsuU{Py{Q73M|U~j8h4ei^&J;@{Ox8*0WsLmu$Tvzc7F~3m^3>6?B{S^;VooC;3 z$@YLnAq%_&*6o<W4%q^iaE2t*15Sa!Ffl(W z0fBA`PW@IG+=6SDZ}Y(V-aOk$KT*jt-vo)Z${DTcrFCkkS8 zgQpWmhtlWuRlLw7yjSP%GmZ~gj2W7K1=MKert^IG16n}ZM@kH+pWT#nA3i%}?`Vi9 zCc7=_yY|rL?|sWPw{Fc1d_4CM`P*VkiOzbcp7Ci-*oL{%eM!v(T!?WclXoa{te?}= z;dw~F5$snFsa5{|MZwXEA1-)3xx;VbHis5j(}288G;u%?DJ?{ZUkUIRRQ69Lnhl?( z1KJuB(@t<<&Pj?k&`H+etJ+$A1BX%$d4$oC;$o^>j;G0D>QzAdxhuN!5~D^3e`O^l zro3`c9eO@>gB`>NjF|I7VTXcncXI|DQamDxa+e$Hu6&*VwV7;p`N7V2H0Qp(0qzTZ z12luND5qAlZkV%Psc_6tGN-i6q;%p$O!%KOWf&PH`$R#oD@h7RH{UYK-e5EI#1 z=U5T|tS$!DczA5OqboYohFgxK-{6pdzP==LS ztsg26TeX{fqO;*3I<+v>csGjeFP9FLA8q}4T)K8d>reN7?y7$+c!2NO-~o*IJ$0jS za&((_f4Vrt7~9^y87(7|ZtR9b2LwC>T(G&D<>6SYZ%Oe?WO0o{sQ}Raz{tcOZk&nr z|GDLJxUcGN-@!hDVF?PE|-ze%jhb~>jMFNHPZ$#YRJ;E+JTA(A{hI}Ch_-;6l)~~fNwiMo2Ts}!;+bdl3?p!afF@hY-P-K zuN+y9Vs)B`^}+cB1)5s%9+)bLjmAZ5Fq+#-3-8Z~hLfY6-uYZHR+Ne0dv5GQr%V4> z9W!AMWUBGSP#{No3tmQJEoJ0R-;blsz56=(&LNpj&&n#H4ylz<2J_`q1j;Xl31Q17 z$*lIeUh|ONsp`IT*vzxJ@!(-9D0YQ`cJi``6d^2>0l-+SHU9K)yx%7;(7r3*y0Y$q7WUhxqG9Xg=6-LsaP1L-^wKRS-p?`TaZdT`KU} zDRH?B(AiY%h%1&7l>u$i*|M=#;PA`qlYUN^>CoH#rG?a#o(DizCaZpl4;wE2d95O^ z&Z)T=zs&q0J}l<6KFcM=_MR%J`S>{h{8$(K%pA_T?;!PgbSwLCSFa2!;5XMkOimGA zi4U9@I=I^0mGeiQ763l{tJDyrp4Tl(qH?k2Z-@u%bA+P|GAZ>WQ^`2YQCgQX|I3z>=d=6))>Z}-I<3%kHAU2U_lEDXk%$nv}cLA0bRraVP1Zr^HxSzUC z1aqn2$jV?CjXDWLHNq+D(MskPLtb4STY{O_uZPKbU+3Hnzr9N9jdT`3()ggAul5ao z+eH2T=1KbJ)Q*tuACJ9s*A=N^iU^~GHO|_a)xO{_B1)9;ZU&GXc1IFRT&YKtWRYDM zd39!s6aeGq())uL0fAUAWmt0wm6xrcuYJWU?;iRgc7S12$2J|YME&&76TLD84*8Ma z1TX>nRHDRi`>LT6;l%C<_G+GWcjvZGtpg>QiGOlTLdIi={Xn3|GVyA2(1dFc&(DF~ zTcn>X>tzF|e}y5%D73C=uRWV{&dIX+HQ}nefc%VBpKmVwUd)5sM}`{K#t|Ij=*fC& zukpL{FD7L5d~pNo!!{uG@kfUn<}yNk269Xk=(7^?{0Th$^YddfmBU<=v4OjpcurxC z#mgH*D?%V>B|bUySXxdzzkHEKX}<1K_Rd!1TsK>G*wg&^leB*StqTN9&N*x!GI;{i(`nBi`=~XQD#Bqe4;>o9WSFEShbj!S zPy_TIV=3un3n(qh7URr5>0fuWdUdIu_iOb-HFfnMlY8vYVPK#%Rj~WRn>M(B6-t12SwAAc=*hy+n}p;43#KA?dz2H{keT3o-FAs_p}c!}A1zJ;Pv zIGF;ttcOCSSm;D;@w&Sd^xD3%6;!_1*8I0!;9Y0B8Fu>Vm{@`T=2);m;m1O z^pbFjVJ_0p(3npk{^NJl$604ABBb{ZomFXyPS1NV_2ftB(Sxa$QaT(*utFIK-)bcx zTP7*C!I1sa#!dXdMgwFtd81OJL4yHbbEa;2_#ap5(x=y)i>FzygQLky_RIGEb=Zo5 z2Vn*e0z$dnnqFQP6_tqlQ9(8BtM%=f`X4`j zJYWicv6J@xx-ZA86dR7povnd6rP3#N(&q0l<}dzTl((CK>v>Ry@fv>b*3U!PhaT!i zL14)>Mcqzad$ylbv)%qZdDUsfQp5V1{4=Vwm7gj}>uLwRRz=p#E*29U}<;#uX!hlQP@`i8M` zT?k>bmw;U0&y@%x-xA(AdSzyMN92lkj}2pRg`o#^YC$M2*m>X4R#TX#-GS~g)DxdY zoqv{KpX8998#o@k37$LHNZ!+8Yj#uSZY0n2lsUBU!@FTOAFu8}1UfZ9MbSHX&g;=nBM0+%N$~acKF#vqh z>cA%*uIy0dCWu|fb{Sw9M2FP(`kP%TF0TDHF1qeM?KK+F`+KgPvd6wjDft6zj|;za zcZQ9US$!z!6%_+aF(U?&uOCzLX_b+8Bv zbp%1+-eC|uVHKTvwO^%G+8BMiUdLu~`0kBfyyzi-rnYqISg$i#m9<7&R6gd?Yf`xA4I(vOTm$O`%c z0B*>K?BFQ?q!b|;qrKpNo4q^aAsL=S6xjA49=Eu{bNq^s!l-$nuTXn(G3{ zs-r6lqPNoi=%6N_TnTRI(yebft}P3hDHI!@<(~_e2|Wqz75PuQ1-a5>b|n) z>*wRD-V^G0?eUzR3v=wPxOQWsthiwfzNbrV_%{Re$42}8a3DuIjeG4are^02>FeQ7 z-u4_c&DkvEXDT*F&zoLevCqX#73Zcfx`{L)4>zoO1$zz%KRGR7hR=;<%x2z)z}LQs z=&U<3g9zMXvVS0%Iz_R8)JHlEDk)O{YMtqVT^Jx!SL%Lj3p_d{B~R{Lc{avmXfcN9 zJRDUZA3DD%xi+QRbn^#&#au-$i44rkEU(xE2jK$|7h1E*+u{C@uJwaLV;~`z zi$sVizO@jX6$eh&EHA+HQY14Ci<^KHQSComYq{sC1f*cov0^74dE+XV>*=cKr^g&6wK$V%{ZpoD3V8}20u z<4@b)c|0z8A(xVoWSD(j?11@mSy`Vi;nPd`K9D3?=?+PN8_cOZY&wh&?xqSZf(5)?;RvC6u*2s*p9SK5(#ca867KHDBcz zaejfg=;$2d6RUiND@0WTE~THSNt?4uNlmQ{RRAZ~ln0hf%cHX1afwJC&Ikd0?VN7e zCK93Z>!X|#Al>g19Urz52yRU7(EL)i00c7%!1Mr9XL_OiPpKn-rLR4gY`Ii;K{1cl zo|$(ycNPGGoR7XMZ8)8b!Q4_)Rn;3Cw5Z3{^X+I#eg&WznsDhEh=5V(?GR~9w^9t( zZmtDd(c=tKV1qr=QG+oRM0#sm7lLs)f|l;Gk8qI%1BqQ8=8(m=7NA=Zh52f;8v1>9h`x_jH%|tf z0rUbaVRc=P0c}@v3;FYGR{kbXNXk7QdBP4#&~;MotaG=3X^|D7Yr5}^SG7ZO7{@B3 zrbczS-fP0n%e(&`-Epm4Gr`RPb1i&>UbL{Y<1GpbBhF*NZM(;-)tjQXKka3~*jpn| zI?|?B5AMq7i!ydlq`qjOqf)1T9$L0W=b=sevAbf_H@-7Ad#k=DEhUt-tC5y3(N0>` zJ-hHD<%X>oweHF9XzgMi`-QrdgiJeEhG1a^5F63C67sk)&SdILea(X&z2LU-K$sp) zVD>R@xMHk;nTT;o)2(rLNczVa?+y?;vHTMQDnEsQ>P$iE2kON6VvoYG)(T^geh(eQ z;Ol$QfdRb!|qFu5GwY!&Za){>zSAciKlqP z`N%M%62}ewZdVkPmTInY+5JR`e?3K*+ENSyh=DAm43fbSEK0K%*Bf;RMyE5}$&Ehl zNk%)!?FZD`p>siJ$Gl3h^I|*7qYBhTTb)-KO}|dK7H57gHE!2GNxzNG z{o8l4+aX7*E_`R#cIg7P5bglRL%wD{_A)Gt*&;ATI^vJpwJs!|M5m{!ZK>k17-()x zR1O_R2=v|Z`lxuX_8SMar8q_?!HI(uAu4c=W34L*;Gcg~a7cSD`_i!DuVyaMve`fm zIxD|TZQjH45EcfBOQHV$3Da3@C?h=6GrYNDx>cUn@h8sPJ z#EVF&()o|TT)rov29rxyMu%kaxeKo32_7Tk#(k~iL*8@YCiuS>1SO8q(_gD!ANK|+ ze%g{#=N@-F%RO6`l@KukF6@G_9VjvDWm4P)cL9UNMxm?PD^?ww6Vax9_i;Qp_`%Gs zg3+AwQ?Y32c1ppyR$)7XnA?gc$wG{WZ;i8)TecAZ73ztLDc%uSwE!o89dz=>_xDp@ zeMl;U9o+Ksf{{UoJ!*My>vbR7bWYrgs^ zxw#}DsYJS2HB+l!SI#M$TpWA0tE{Zd2#V|Mv{Q&tP+Bh`UnCL>OB#DML&XnX+swEE zMJ_7*ju|SBn3PvgH=^S8BwtZf2dlV3 zIRhppIu%!pEzH9T#JoJ6d`d)avO%sYKoc~xm^i|Pfy&@!DsWc37hg~IBh__;85l^q z{@ydE?jPNb=x;r-HugVJNZ`QUZ-@vx=4}bE(-KDBVql=+riC2aUyZ7q@0Jbx984To zEWC<(mJ^Wu^hfr_yAOZS7f64$_Hgx`{E9>|+YO_2>0fl(QEdmBcI%Pu z%T1X4XGryEW$jUh@b)`UP^>0v~*ypeI2 zgQb=a&^XM;DilTzs-wsz0H1n}@2SlE6-Q5e(`HBh*fXMgG$HJ1C zU3z`abr~S1I6rmf16F{*pon#Wk(T#^8WpP#713s2pasc$x&9zOusRA}Gdb7I9{%JA z2<36aW|gxM8}9+!L-kL$jNEXl02JCN-SV~;F>j}PP|piWf-b}g!zVT`-2s34fR9hl zP~f3~V1zCM_~XWe1=tFn5^6%U26nP=k_1CJDmG*CqoJYu+G@_@B?Z)koRASWpYr{+ zq0>eA61$*PPNH`@RV92!l831kq9u-T0)h@z%l?r8r><4QSOM{yfId8PY{s}wQ>a0S zKLn$1G829{a+0jmfl35E0o6ru$^zh>Uvt)`^znb3{_J${_3LQwz8gcifXS|YvkcFO zq0%;K17dOe``+b2%pl0_^qQyw32U+Og@v|4kfCCwt$ueXBM=F6i-F^dCrjE%F!893 zw}2)-e+O`W+BoqeUb2i)$=i0X(g7vxx-SkG5ZGSC*S97w8 z^E%iv?;)50-CQ$Svz}j$HjfUC**RVdU3)CHs}~Znfp6`qJ5RVhYzjsje zKoiz=o|vShZ-(Xtl%Jg+AaL*pP6?}OhSlgW^L?M88NhdTQERalN!V{c*RX>uP;h}p zVpt(KWgBSrvr!afz@-7aAt?qETd4-C!AtKd!af4Q1fc5e?hiL`d|-`xu<{=pjOp-a zZmz7k@nxV7WyTxuU#>r^24~uu$qO&mUjmN=&KtIZ8w;3q#Zm&{;xliOto0avmt}Ne zP+R1oI(N)2X1#^rZ&ZxJh(a*|kjNjlK7R>L{=Dw1uPA6;AMgYWR*NG}R>VgjxqknA zs3|x8Rw9<+je4p*aV&A9%jf1~iOsik!gTNol0j^Zs!?YtO%8q9Cv}m^E9`g{MF+B&fA>8j4&U{uwUJ*@3H|^)Wpda7M3fZ9e zjkAYk`$WFdm_@|1xN(KxR)k4qCPPq6Vk$!-^VzB6N@yQ^{X*IhlP2@D??dvK7Bvo*+W+gydr z>6Y(Jzb=o~;qQ8N2{?6~jhCBkrC=vXp_YvjYbwXQoIQ$<51(iR{4T36MBu~P@U{&w z+^MeY7a>#t1o1q)!w^4|z`O?)W_L2Wz-6o*<~1QGetK^I(p5{y%IyZ$W$U@35QGo@ zzPyXi8LcJ{_#HP#&8~gVzK@bCe9vS5pp97=W<-V&Dt0n%az0Jp+;*}cV z56*j4in5pmv^wqB+zD`Hvl9y(U?tbFj|{Py!FT1vjnI)gUTxI6k@y7>Xd_yP=LV>4 zgI0LMt+>u9LL)aoka06WSn4T~@TZ9t?`s1j&S>?9y#66N%@+RdiUw@#oa^d;$jn_a z(GPD|LyQ*3p>>%@Y44|-DHXu_Q5iYY%A6y6JK>bv5Hh45hjs`rw5&p2Swo(FD-!vs zo=e$nHQ}3mx0F37weG^9l>btxCGFnZ-ogsEMvotwwj7q_@3Ru)J4Mu*Y^8zd3?5s}-S1wWrM+&#Vgm(V)P78sA@sP z7{qA{z^7&4;rxe$K}WkhIaGdJA-rk;`qi)&Z_}>u9QxV$sEn)gOq$47dS}kn<^)Qk zR6zV8y!gCBjUeZ+n9UekOSBRt-y)J@rWMF^?X&zy^ zf(HAt_`YL=T^^uhYbM3h&yTj)Dwa*WRZNJ9Ui6{x6yM!yoa+wo*sD1wV;B7&Zm%VS z(R@{?JQZNKX_%kv?sTBqPXS}-dms5<8uMG7vsxNm%$xmtgs~T%Iy%GJcjS;Jl6zlNHHlnBBDuS(Aw{Z%M`TkL#hx`w*$?7=3B3>%MhFLO{V=gH( zn4wvSrOYTYe!?!E>7`$ zKM{DG_0(Scj=nomyWr>jh=7(C{_y+YbH=SnwF|MtBT@1m;UM3p?Vfx6K@6zBjsq(q zzxdLJ2gcQy*@ylP7@r~(Lv3-y^tY!V3d#TCW!c<#8qmUrORm^-h!*_p&&shN0+Eiv zEAjQ;4B%I-4iz{cyAsGDf#t6ufy+j1nJQ(X$WS2>dcdvmHyOvfl~5Iuky}!D-+;BA z%6M+U-aT_{+IIeHUb3i zdF4Fea%ce|958So;IvtqC|!Z5$j6by`se@6M0PKP9H{7L)<9s1|Lm+F$_FM;z+N3? zkNA#g&o059mrr1LkarJ@!(Sk2Ed z`1fxl@d!)m@S-b2`2y7dtI&<&(d=gFXRtheUqwU?E`(n;bNi7y!Frz0Am+RBwb+j! zQ3w|wANEo<^D5z0rWY?@^(JzF{0oG(v9|jywX?zIwT>8A#{oooyd32Z@-n_}odf!x ziK%>w{i_!Du0Kgd*-_k-faL|X@5F_ofazWL1x&)c9IH>{#uq93uhv3B9cT@-b*V2G zd=T7-t2JQSm|nj6VEtn+$3-8kYn@jN`2xgTqNA+%L_{a|^Ei;482g53i_e7w?Q&*o zJ!>*y>L7u@3nLosgEEg!e3h@s0)Yn1dT&{|sw%x{aAT}>Y4`XO`E1h~N2L5vjBYvk z%nLS}D++n9ahgaG33$c|d%!JQ?Pv~ale7o|cE{otAY$(d^~`C`CbM}uG!nql({EFO z?2`BNmjHBAnI-HAwID`TqEVB0w@Oyqfb`bJ4xqHJC?m!c2S>S8kPD^2gI+rR>nac# zWdNO^#kD@l39RgN2=}050=fGHaeySe`ceoxNHYaa-c~oK`NKiJd!K>5l}Xs+<}ach z4lIDXI^NOyHXmkq;MJEd#^?3b4^lizF0{XQr62+_3Y@t92e+pF z#jQ_)D?fHQsAtE*JV{6bm;suI61@KM$GGBG2Ezovrs;c7041l)!!UH!Zm@GjQ zt>C#2&)8O>XISQN%ss?;u=owfRIw&v-VTAdU9Ir#<`OKKf}2CQ`|@5L-3^EZ31~C` zEAT<4msQ1Msl-qoVsp5T4vH35tdOlC=R#oW7f6OfHjYgx?V%;sQ=^bm~NF_ z*46^OAfewgXeWY{m_TQURc?*_2m$aHzGNaGrhc~?*riZRoBLaZ+*N=3**+Ae1y>hj z893=gP%mO}vm7sS^IXk-W%^mv1?UMSOEQgolAA1gZ&E6=_)-_lt_zC+e+)j1PRyQ_ zBN;9@`SehSF;nVWSXtX?b|xdl^+$GRG!N}#IP7k<1}Vc{cv6t23eIPyi z1l1?TfDmO-IuMx%&Z#|D`lbu2qUER0JwaJA!dZQldeo&MjCe0J=KNPwZRfjCUvP^DyBT&OTJlpq9Hx07I!fI&gLHhXG0 zuPW})4X?*(RRgpr`o1*Fp1I^uZvCRjkbt~to zVq~^%{GnBMiX!-puy#=1wy5{o5@abF-N+=sNkCq$X36+lQe@-{t~b(faaAxuh0_*2gYF~8Q|dmUR7Izj6dGXA7!m+fa3ZCR809ATT~50SWx*# zJM}{cX2ZN_^Yedgto1+&2lx|g2zSXYjhi(S*zgF; zDaDwO#w%*m$}v5tc(6 zKrCs_3HEOt-UsON>=iTctZYbNE;8Be0E@-6J7Ck$j1%}TGl3N7WrZwi2}Z*z7GjOk zdWw|Vxsk{%d!0^HwmYnAv4Qv$q?_A8kAwhB>sQi9*0Dk^p6X-K#xD2FT?35T;)U&Z ziuMNBq38Q(?pCACafHUNh+%Fb31Xs8@hQ7dW)GKf#I(uM?K`{p=8ejeEc?o8m zOMz?1XWvz9aGW-X-?&)!*iksoxfam(=qwf5nz*{Bovg6e z)OB4x0{NO>Mv-sj2r7^*f&_u&J{PBU%%PYPCl}bIUBp0EmG^4_rD1N1VdtkVl>7O8 z2WUVb1^v;VG;b&K03;+nEdYmKv`ET+X^I4-0B^uEmu5}?asLn3zWxi#_d)n@I) zLT(v4v^|t((EY~}FnJwb^u_Zq*?H&xG5}e1(fy*B7zjf&>=wy(m|St z(nLB)?*c(ks`M%nP^zMI=}0Id9Sled1PHx%2pCB2#@Fx8eE;0J&oC2abDo{u&F(q7 zXMg8+ZihVXYt{Be4ZsF&ySK2m$!(&BIi+0j!SgguWGjY0`bNG~sB&hGo|j$K{Q1~c zmw~IWdwN15M`!y{Y&wnJfoEr*6@-Ai?(9p;3@%mmf#)Yd0c7S|JLuD=${u%fN3Kf8 zfKFB&B?(h2MTW}~ir@-jVJm&OM3L_Nf}&# z$bq;Cun7hG@*B_JiCTgIhs@<4mpc0oB!<|03rp32iJzR=G?l&or~a9eQxXJUix4rftWXQByw>4^Imufb6^Mnbvy` zygK8OB{Xb~Pge6tMQ#(fsTTO|k$o`(nbtl}(dcq^8}W#z1J7f6(b?H7$I62gD3@5V zwUNK?v9z1>=4!kP94YJQMuU8iQ^T0)3Niaz-Q9w1Zztse3I9JnkoP86Q`J1e2e}1R z!hcTgm|azT5s}NBx{2>pP*hYz)7wz2tV^EOr3Rp@=Y~kh#y+182!QQq+gY#0ss`jJ zUcr{1f;`Z6xynW7&zgaJf7Ww;hA(2mC%c7!=%m_o)I^69{I_JG;%GX^qvA;sy{i-} z+-8|o!!QOC4FykRL}xZF4sW-9n=AO}By~vgJ;e2y>8(O#w}0j=tf;A@_s7{mtaUK= z=+BXnFe{E4w-h8m03Z+=ta?;3#8TZ7eO>7J=c|fcPqZ*!{i8qc?M24Y&s-pT)w%dgnJ~@U)qQLRDx~PBQz#umvA{Df&-jP0 zYo=ef>`HMMCr<`(0|Wi>Su2xdk5p8`%L@apD*iqq`Cf}hbr6Vhn-=zv$5YE`&)`fo z*!dZTHx9W{WCu7Y?fv#6w-=wQhd;Fhs)Yskg+6imW48fEMS!@ZRIzGWkB|LHN$d9~uD)DwSVz z=AAeWi;V&}+jru5#&2LoB9{+zwlMw+ue`Z(X%!UufBG*R-^!br?&pb5{1GSoTh8|D zXtz1h&5s2?lyUT_4V?@SybDzuar*y>p#3W2C$H*R_Rzc4=1zm4SiB( zyqZU5b@d5+^W;UL! zV`RJB3lQHk7Db?fZq}Go7gD+gqy9*{28;LU-lObI57-YL19Iv;& z%Qrq+J~6=AH~~I9F@f6qV86-7_XCJv2ak#9n7mpw^CW%qIIMn&YW?`XkYX?ZS0k8( z#b^q5sK0J|@iGY;e}R(1rcrbGrxs6mfi5$ijcBw_QuCNfL?UsF!my%4;xf$p&BulV zq`XcnQkWg7q2+Dp!}k{uin?7ueYfWk+W(uTP|zTlfpKwWQ1Qx?&i4f-Xye7ZSfFi~ z!5W#-*V4AtC?@5!1?b`@{M4GaIGIWp^ksQfGz2#@y<}()p1(BG?swGYB-N!d8?AsJ zFB*>0mIQ=BCdNH*BDxGXw1c@DIC$o#q?`l9#4Am~s-NrrRFn&|*Fc4e+2qr;o987N zwn=Qsw}y1vMmT!!trGGbF;ZxsFXqzBM%uaNM3d?dY(PW2QAkekzRoMvo;K`0STPpe zwcAjy?-%jNP5E+?q0D6*kgxG0&adcj2w&$Y6+`Law?>9h$8#^Y+Z8!$2cWTNNS zmi|l2yc3VjNTjlPPrEQl<89&8@LVkSeh2g1^i4?8nBDs2_AT}G7A$vqdzc3Ng}=B% zK}ysK%mpTd{B#FehD7rBJ3nUvy+q!tF)HX{+hWnxdQ(Eq0E{@+AQT`zmhs)4L;=|P zXaD2y-}s5tWGestB6Nh+Ae>fi6&os2pJr?N?P777V|Lc*hkgU)80`^`gMt3aAu{$- zulu$C6AOGIk2yl=T3}|Tjn~2l$EQ7GG+LGGeloki2;C7nAM2T_-q1nFbtHo^6F*^y zbr=W^MVOyry2)YotwvR3#HO&rRCZLS^>lF>ftcZV)I*q$C}bL3yig}aM>!Av{~xWr zDFvEPid(sveAC_6_xv@k4i!m_zvS+`6e@542+?yv0mh5ip~H<3v`C)A;jW2rKP<9o zabNr)POz{Rk4z!BS2q4WG$F2{r)TxWUHEC}BhQ)u_V3%qX~zzmIY}yAse0z)j`sHb zk0Da*aBu*V*_ebkd=fjibC^MD7sqV)r>$Edpk|cVO6WaGy_VhlO)bodB;*SME2~~& zFxBDZht1cg1FEu7&IvhpR&mP94`?0-KIJ=OCU|e}*v;EFIg_xFKSXcXo1VDzD0`<(|Y8U=rdLX?eg^g|QIFWi68o>u3q&sjP7rEo2DIieSKflla4 zPu*UN73U2!)tANQ%8kjUCAF)C`E-<5IK}F2%^fk)bW^UD>xJG*c>IVUSk*Gy(AjmT60)CXSUby`Ih^Dvg5=ZfGvnY}{hml{1fo6Xfg znx3Voszd*bX$E-&BKu}a!PDv7g11K@W#yHM8(ZVJg{3H^2(o+`8sr5d9E)Lw4{a?a zX1QR-IU1*<(Y&IT4y4ghZfm>eiA+V6&Sgpn>5@EB=vS8eSRLf?&w~Q@`$+>+c;+b9 z$H#dyQEyoqg6@MHx$+fvBU*g49^9fiaiVO;0CXy-1i#&2QTqYezwKnP(z_$tknf8We2v>3Ep{gscG*z`WE~txo*UUUP&-SyK0F%-==sW^E>?O6EG=|1nZNCxw;rahf{J+s}(VubRuFNey|}{p8KiIeX7f zdB;9;yo+>NkmC3~+z_k|ou&37-1&@formzNSVAoBY|ML-o+Hp;e=VRe5#F`DJ6~65 zN#HJZna;FLiRr=kKlU zJ0;5HQMdwgeq+hed6m~H-!Tv0OYB2}gM$&hEi_5J?TFmE<7T8lF2t!qi~4B7E>`L) z=xcSU6>NI*(VSgfM(3LhKutZ-8I_@mT=(H{A@T$nZ&9W&DH+mQ6>HFm`*x*IY_h zsO4I^=IL500=;B{$Gt-0mNi{F`I5!g7-5b|KI3qSgW%6HhCE<756@R;4}Q^haPxU^Q14EypWBPk6h~V=8z!|4vZcV^P;-!UJT)0 zMmdbQXJ~7YwqvVu)to67T=G1&+RWv{OGwEmMBYnC$zsMO=d#^tFK?d zAF%t*0WzsAP-tJ>h}em4QVi!3y^V9wv{Y7tF>|>__(#1s9Pc7HvLp3v>sF>w>-T?f zZUZFep4mHU36`JV`z|l4rw~x}wx4Jm_O6)9b#wFeuOrP_zxv{WcFlT`8x!Bj#UGYv zA#$#A@o{8RIY!XI61<>90hFZM`HkvUhAX8u^9a#~#(?Xzg>>Ay#;^SHic)c?GkUrS z{NC4c>SxSamqsM2VCO1F0~wxq2!ZdagDGkufS>9|T;82-5Exw0r`7?jrig}!e62l{&R zFNZ|Y|69P!i^?}^H6}rEc~{IqY&X{LVFfT_RTvMYwhq~U)~l|l?@3^`>p+>{)`u&- zfD=0n#N=ymTbvwTF!^4$ub%!U;yq62OX-gY+?FX*I(ZJy!o!uy)=V=Qsp+W5g|!)0 z_-sSA#c(V(rT^x>51oJHGtP+7kRM%rJ|@6`(XjXRsr|6pQJP0Ojpa77#-gzs_vCtu zj9i|c1eL|OlNjkGFAYJY$a3V4K^aQ zU+AZmS{ALj+qnCAN3o|^C~=0YmVc3jde_++EdihueDI&3>qA8pl4sR2=z+J0$+B1gh^onPtZ6|X`c@1^*(1;R_GByk=`WD zYLCvKfym7%gD6@;DPJ_&5J)%yK^i6jXsLlB{=kv;@;sbAHeT6)`U8)qS+}3bv!T>w z9ozXZZ`A1=SYVQj&4b=FJ5V;fGb}2w>&AkeOC{D<7?H|nlwWCc;={au6owcsEjHw~ z7OHz2O0$FEH~%yImir8$TTY1!PQ+MSR8Urdj@`1g9Yv!9Wq*S%grd}YsAq4aJ`o5H zqB9*W8HFTFmY21j?~EO{{3Xjii%${UGT|s>;N+z$5|=$0xzjNM)92UaimIS)X*_ic z3ccndWL)g4p*wX@l+?AI5!%*n@5(r48fPc8I47Zz7S@^=8v4e3|6Fk_bH4Qs>-Xup z4RCeFrtq)Yrpn~vg))KGrhqv22ud?Ln)QOm0(7C3k1lo#&dseco<0d}-a-N8Yf*dH z$#G{E&rg5Ox}qaYMTR^O=S^aabv+}Oa$vDX1mr6c~kd_n1Gb{ZnSga5vYIjQ2zB)L(M@h2ykU1`w9m@K4mXfR}o`_ZWua4KI!&-g_#rNU%#b8XA2A> zybe(>DNuG?!b5Ev59aIUyCg}}%Hj5Y9OmDRFXcosd-fz0^V4Z?M>ItWG;d{ivxaZk z)GmK0H3>9Y6ADec1ooxsva~*M-B~!$TT$#qPs|P_@%ye|b4-u9X3dj$<7WQ@XR=6H zEj8q074mWu{ykrb-Ez99AoC@Hu)M+BU~G+5Vk<`xCx0^UtLD3^Z{QqA;Pxsq__-vg08iH`9?8nG;-1_J?)vVsPp@SbVl{{UBr!9)N6 literal 36072 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, + ) => { + return ; + }, +}; + export const arm_r_type: FeatureChoiced = { name: 'Arm Right Type', component: ( @@ -22,3 +31,30 @@ export const arm_r_type: FeatureChoiced = { return ; }, }; + +export const arm_l_type: FeatureChoiced = { + name: 'Arm Left Type', + component: ( + props: FeatureValueProps, + ) => { + return ; + }, +}; + +export const leg_r_type: FeatureChoiced = { + name: 'Leg Right Type', + component: ( + props: FeatureValueProps, + ) => { + return ; + }, +}; + +export const leg_l_type: FeatureChoiced = { + name: 'Leg Left Type', + component: ( + props: FeatureValueProps, + ) => { + return ; + }, +}; From 0b0ec5451108390ec454f75c763d4e22b0277f1a Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Sun, 6 Oct 2024 19:52:28 +0200 Subject: [PATCH 04/52] 6/10 --- config/game_options.txt | 2 +- .../preferences/cyber_limbs.dm | 30 +++++++--------- .../species_types/android/android.dm | 16 +++++++-- .../species_types/android/android_parts.dm | 34 +++++++++++++++++++ .../dopplershift_preferences/mutant_limbs.tsx | 30 ++++++++++++---- .../mutant_tricolors.tsx | 8 ++--- 6 files changed, 89 insertions(+), 31 deletions(-) diff --git a/config/game_options.txt b/config/game_options.txt index 8a2c89ec392c8..3d3bf1fbf2461 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -366,7 +366,7 @@ ROUNDSTART_RACES plasmaman #ROUNDSTART_RACES shadow ROUNDSTART_RACES ramatan ROUNDSTART_RACES anthromorph -ROUNDSTART_RACES aquatic +#ROUNDSTART_RACES aquatic ROUNDSTART_RACES insectoid ROUNDSTART_RACES genemod ROUNDSTART_RACES primitive_genemod diff --git a/modular_doppler/modular_customization/preferences/cyber_limbs.dm b/modular_doppler/modular_customization/preferences/cyber_limbs.dm index 187fac964e34a..c3e2a009c3e06 100644 --- a/modular_doppler/modular_customization/preferences/cyber_limbs.dm +++ b/modular_doppler/modular_customization/preferences/cyber_limbs.dm @@ -91,11 +91,10 @@ GLOBAL_LIST_INIT(frame_type_names, list( // Head /datum/preference/choiced/head_type - main_feature_name = "Head Type" + main_feature_name = "Add Limb: Head" savefile_key = "head_type" savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - should_generate_icons = FALSE + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES /datum/preference/choiced/head_type/compile_constant_data() var/list/data = ..() @@ -122,11 +121,10 @@ GLOBAL_LIST_INIT(frame_type_names, list( // Chest /datum/preference/choiced/chest_type - main_feature_name = "Chest Type" + main_feature_name = "Add Limb: Chest" savefile_key = "chest_type" savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - should_generate_icons = FALSE + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES /datum/preference/choiced/chest_type/compile_constant_data() var/list/data = ..() @@ -153,11 +151,10 @@ GLOBAL_LIST_INIT(frame_type_names, list( // Right arm /datum/preference/choiced/arm_r_type - main_feature_name = "Arm Right Type" + main_feature_name = "Add Limb: R-Arm" savefile_key = "arm_r_type" savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - should_generate_icons = FALSE + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES /datum/preference/choiced/arm_r_type/compile_constant_data() var/list/data = ..() @@ -184,11 +181,10 @@ GLOBAL_LIST_INIT(frame_type_names, list( // Left arm /datum/preference/choiced/arm_l_type - main_feature_name = "Arm Left Type" + main_feature_name = "Add Limb: L-Arm" savefile_key = "arm_l_type" savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - should_generate_icons = FALSE + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES /datum/preference/choiced/arm_l_type/compile_constant_data() var/list/data = ..() @@ -215,11 +211,10 @@ GLOBAL_LIST_INIT(frame_type_names, list( // Right leg /datum/preference/choiced/leg_r_type - main_feature_name = "Leg Right Type" + main_feature_name = "Add Limb: R-Leg" savefile_key = "leg_r_type" savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - should_generate_icons = FALSE + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES /datum/preference/choiced/leg_r_type/compile_constant_data() var/list/data = ..() @@ -246,11 +241,10 @@ GLOBAL_LIST_INIT(frame_type_names, list( // Left leg /datum/preference/choiced/leg_l_type - main_feature_name = "Leg Left Type" + main_feature_name = "Add Limb: L-Leg" savefile_key = "leg_l_type" savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - should_generate_icons = FALSE + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES /datum/preference/choiced/leg_l_type/compile_constant_data() var/list/data = ..() diff --git a/modular_doppler/modular_species/species_types/android/android.dm b/modular_doppler/modular_species/species_types/android/android.dm index 8f3b751ab5d53..14bc988046aea 100644 --- a/modular_doppler/modular_species/species_types/android/android.dm +++ b/modular_doppler/modular_species/species_types/android/android.dm @@ -1,6 +1,7 @@ /datum/species/android name = "Android" id = SPECIES_ANDROID + preview_outfit = /datum/outfit/android_preview examine_limb_id = SPECIES_HUMAN inherent_traits = list( TRAIT_GENELESS, @@ -26,9 +27,20 @@ */ ) mutantheart = /obj/item/organ/internal/heart/cybernetic + exotic_blood = /datum/reagent/synth_blood + exotic_bloodtype = "R*" -// bodytemp_heat_damage_limit = -// bodytemp_cold_damage_limit = + bodytemp_heat_damage_limit = (BODYTEMP_NORMAL + 146) // 456 K / 183 C + bodytemp_cold_damage_limit = (BODYTEMP_NORMAL - 80) // 230 K / -43 C + +/datum/outfit/android_preview + name = "Android (Species Preview)" + uniform = /obj/item/clothing/under/syndicate/skirt + +/datum/species/android/prepare_human_for_preview(mob/living/carbon/human/robot_for_preview) + robot_for_preview.dna.features["frame_list"][BODY_ZONE_HEAD] = /obj/item/bodypart/head/robot/android/e_three_n + regenerate_organs(robot_for_preview) + robot_for_preview.update_body(is_creating = TRUE) /datum/species/android/get_physical_attributes() return "Androids are almost, but not quite, identical to fully augmented humans. \ diff --git a/modular_doppler/modular_species/species_types/android/android_parts.dm b/modular_doppler/modular_species/species_types/android/android_parts.dm index 9ce89b3e4fa15..6c379d1564d57 100644 --- a/modular_doppler/modular_species/species_types/android/android_parts.dm +++ b/modular_doppler/modular_species/species_types/android/android_parts.dm @@ -1,5 +1,38 @@ #define ANDROID_BODYPARTS_DMI 'modular_doppler/modular_species/species_types/android/icons/android_parts.dmi' +/// +// Overwrites +/// +/obj/item/bodypart/head/robot/android + biological_state = (BIO_ROBOTIC|BIO_BLOODED) + brute_modifier = 1 + burn_modifier = 1 + +/obj/item/bodypart/chest/robot/android + biological_state = (BIO_ROBOTIC|BIO_BLOODED) + brute_modifier = 1 + burn_modifier = 1 + +/obj/item/bodypart/arm/right/robot/android + biological_state = (BIO_ROBOTIC|BIO_BLOODED) + brute_modifier = 1 + burn_modifier = 1 + +/obj/item/bodypart/arm/left/robot/android + biological_state = (BIO_ROBOTIC|BIO_BLOODED) + brute_modifier = 1 + burn_modifier = 1 + +/obj/item/bodypart/leg/right/robot/android + biological_state = (BIO_ROBOTIC|BIO_BLOODED) + brute_modifier = 1 + burn_modifier = 1 + +/obj/item/bodypart/leg/left/robot/android + biological_state = (BIO_ROBOTIC|BIO_BLOODED) + brute_modifier = 1 + burn_modifier = 1 + /// // Classic (this may look empty, but its a load-bearing definition) /// @@ -101,6 +134,7 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "e3n_head" limb_id = "e3n" + head_flags = NONE /obj/item/bodypart/chest/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_limbs.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_limbs.tsx index 3cfda4d0d9528..a99d032fe2de4 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_limbs.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_limbs.tsx @@ -6,7 +6,10 @@ import { import { FeatureDropdownInput } from '../dropdowns'; export const head_type: FeatureChoiced = { - name: 'Head Type', + name: 'Add Limb: Head', + description: ` + Add a cybernetic head to your character, this option is exclusive to this species. +`, component: ( props: FeatureValueProps, ) => { @@ -15,7 +18,10 @@ export const head_type: FeatureChoiced = { }; export const chest_type: FeatureChoiced = { - name: 'Chest Type', + name: 'Add Limb: Chest', + description: ` + Add a cybernetic chassis to your character. +`, component: ( props: FeatureValueProps, ) => { @@ -24,7 +30,10 @@ export const chest_type: FeatureChoiced = { }; export const arm_r_type: FeatureChoiced = { - name: 'Arm Right Type', + name: 'Add Limb: R-Arm', + description: ` + Add a cybernetic arm to your character. +`, component: ( props: FeatureValueProps, ) => { @@ -33,7 +42,10 @@ export const arm_r_type: FeatureChoiced = { }; export const arm_l_type: FeatureChoiced = { - name: 'Arm Left Type', + name: 'Add Limb: L-Arm', + description: ` + Add a cybernetic arm to your character. +`, component: ( props: FeatureValueProps, ) => { @@ -42,7 +54,10 @@ export const arm_l_type: FeatureChoiced = { }; export const leg_r_type: FeatureChoiced = { - name: 'Leg Right Type', + name: 'Add Limb: R-Leg', + description: ` + Add a cybernetic leg to your character. +`, component: ( props: FeatureValueProps, ) => { @@ -51,7 +66,10 @@ export const leg_r_type: FeatureChoiced = { }; export const leg_l_type: FeatureChoiced = { - name: 'Leg Left Type', + name: 'Add Limb: L-Leg', + description: ` + Add a cybernetic leg to your character. +`, component: ( props: FeatureValueProps, ) => { diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_tricolors.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_tricolors.tsx index 1083dfcef89d1..76f0a9f931ead 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_tricolors.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/dopplershift_preferences/mutant_tricolors.tsx @@ -115,10 +115,10 @@ export const caps_color: Feature = { }; export const has_markings: FeatureToggle = { - name: 'Add Part: Basic Markings', + name: 'Add Part: Markings', category: 'GAMEPLAY', description: ` - When toggled, adds basic bodymarkings to your character. + When toggled, adds bodymarkings to your character. `, component: CheckboxInput, }; @@ -166,10 +166,10 @@ export const has_moth_wings: FeatureToggle = { }; export const has_antennae: FeatureToggle = { - name: 'Add Part: Antennae', + name: 'Add Part: Moth Antennae', category: 'GAMEPLAY', description: ` - When toggled, adds antennae to your character. + When toggled, adds moff antennae to your character. `, component: CheckboxInput, }; From da946f85d15be3eae84aaddc9178f58edd86fbff Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Mon, 7 Oct 2024 12:52:44 +0200 Subject: [PATCH 05/52] crew tracker --- code/game/machinery/computer/crew.dm | 8 ++++++++ code/modules/mob/living/basic/bots/medbot/medbot_ai.dm | 4 ++++ tgui/packages/tgui/interfaces/CrewConsole.tsx | 7 +++++++ 3 files changed, 19 insertions(+) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index adac393d7bedb..65895164ce3b7 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -44,6 +44,7 @@ . += create_table_notices(list( "name", "job", + "is_robot", //DOPPLER EDIT ADDITION "life_status", "suffocation", "toxin", @@ -64,6 +65,7 @@ var/list/entry = list() entry["name"] = player_record["name"] entry["job"] = player_record["assignment"] + entry["is_robot"] = player_record["is_robot"] // DOPPLER EDIT ADDITION entry["life_status"] = player_record["life_status"] entry["suffocation"] = player_record["oxydam"] entry["toxin"] = player_record["toxdam"] @@ -245,6 +247,12 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) if (jobs[trim_assignment] != null) entry["ijob"] = jobs[trim_assignment] + // DOPPLER EDIT ADDITION START + if (isandroid(tracked_human)) + entry["is_robot"] = TRUE + // DOPPLER EDIT ADDITION END + + // Broken sensors show garbage data if (uniform.has_sensor == BROKEN_SENSORS) entry["life_status"] = rand(0,1) diff --git a/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm b/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm index f0b2f089cb6e7..67273c49d7eb3 100644 --- a/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm +++ b/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm @@ -56,6 +56,10 @@ search_range = (mode_flags & MEDBOT_STATIONARY_MODE) ? 1 : initial(search_range) var/list/ignore_keys = controller.blackboard[BB_TEMPORARY_IGNORE_LIST] for(var/mob/living/carbon/human/treatable_target in oview(search_range, controller.pawn)) + // DOPPLER EDIT ADDITION START + if(treatable_target.mob_biotypes & MOB_ROBOTIC) + continue + // DOPPLER EDIT ADDITION END if(LAZYACCESS(ignore_keys, treatable_target) || treatable_target.stat == DEAD) continue if((access_flags & BOT_COVER_EMAGGED) && treatable_target.stat == CONSCIOUS) diff --git a/tgui/packages/tgui/interfaces/CrewConsole.tsx b/tgui/packages/tgui/interfaces/CrewConsole.tsx index 9c15a551bb0ea..0d45b9206cc5d 100644 --- a/tgui/packages/tgui/interfaces/CrewConsole.tsx +++ b/tgui/packages/tgui/interfaces/CrewConsole.tsx @@ -126,6 +126,7 @@ type CrewSensor = { name: string; assignment: string | undefined; ijob: number; + is_robot: any; // DOPPLER ADDITION life_status: number; oxydam: number; toxdam: number; @@ -229,6 +230,7 @@ const CrewTableEntry = (props: CrewTableEntryProps) => { name, assignment, ijob, + is_robot, // DOPPLER ADDITION life_status, oxydam, toxdam, @@ -245,6 +247,11 @@ const CrewTableEntry = (props: CrewTableEntryProps) => { {assignment !== undefined ? ` (${assignment})` : ''} + {/* DOPPLER ADDITION START */} + {is_robot ? : ''} + + + {/* DOPPLER ADDITION END */} {oxydam !== undefined ? ( Date: Mon, 7 Oct 2024 19:00:09 +0200 Subject: [PATCH 06/52] charging implant/reagent processing --- .../~doppler_defines/declarations.dm | 2 + code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 3 +- .../reagents/chemistry/holder/mob_life.dm | 8 + .../reagents/cat2_medicine_reagents.dm | 1 + .../food_and_drinks/alcohol_reagents.dm | 27 ++-- .../food_and_drinks/drinks.dm | 4 +- .../modular_medical/reagents/reagents.dm | 17 +++ .../modular_medical/surgery/revival.dm | 29 ++++ .../modular_sounds/sound/machines/drain.wav | Bin 0 -> 11314 bytes modular_doppler/modular_species/_species.dm | 12 ++ .../species_types/android/android.dm | 88 ++++++++++- .../species_types/android/android_hud.dm | 22 +++ .../species_types/android/android_parts.dm | 3 + .../android/icons/android_hud.dmi | Bin 0 -> 223 bytes .../species_types/android/power_cord.dm | 139 ++++++++++++++++++ tgstation.dme | 3 + 17 files changed, 332 insertions(+), 27 deletions(-) create mode 100644 modular_doppler/modular_medical/surgery/revival.dm create mode 100644 modular_doppler/modular_sounds/sound/machines/drain.wav create mode 100644 modular_doppler/modular_species/species_types/android/android_hud.dm create mode 100644 modular_doppler/modular_species/species_types/android/icons/android_hud.dmi create mode 100644 modular_doppler/modular_species/species_types/android/power_cord.dm diff --git a/code/__DEFINES/~doppler_defines/declarations.dm b/code/__DEFINES/~doppler_defines/declarations.dm index 88fbb381b8a2c..225fbda53cc0c 100644 --- a/code/__DEFINES/~doppler_defines/declarations.dm +++ b/code/__DEFINES/~doppler_defines/declarations.dm @@ -8,3 +8,5 @@ #define TRAIT_OXYIMMUNE "oxyimmune" // Immune to oxygen damage, ideally give this to all non-breathing species or bad stuff will happen // Trait for extra language point. #define TRAIT_LINGUIST "Linguist" +/// Trait that defines if an android species type is charging their cell +#define TRAIT_CHARGING "Charging" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index dafb51d8d6ef1..d27432c4eedcd 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -700,6 +700,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TWITCH_ADAPTED" = TRAIT_TWITCH_ADAPTED, "TRAIT_GOLEM_LIMBATTACHMENT" = TRAIT_GOLEM_LIMBATTACHMENT, "TRAIT_LINGUIST" = TRAIT_LINGUIST, + "TRAIT_CHARGING" = TRAIT_CHARGING, ), // DOPPLER EDIT ADDITION END )) diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 8447ca019c1b1..3357e214d6161 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -382,7 +382,8 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_DETECTIVE" = TRAIT_DETECTIVE, "TRAIT_EXCITABLE" = TRAIT_EXCITABLE, "TRAIT_TWITCH_ADAPTED" = TRAIT_TWITCH_ADAPTED, - "TRAIT_LINGUIST" = TRAIT_LINGUIST + "TRAIT_LINGUIST" = TRAIT_LINGUIST, + "TRAIT_CHARGING" = TRAIT_CHARGING, ), // DOPPLER EDIT ADDITION END )) diff --git a/code/modules/reagents/chemistry/holder/mob_life.dm b/code/modules/reagents/chemistry/holder/mob_life.dm index 611de150920e4..5d7da162743b4 100644 --- a/code/modules/reagents/chemistry/holder/mob_life.dm +++ b/code/modules/reagents/chemistry/holder/mob_life.dm @@ -93,6 +93,14 @@ if(!owner) owner = reagent.holder.my_atom + //DOPPLER ADDITION BEGIN + var/can_process = reagent_process_flags_valid(owner, reagent) + //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) + reagent.holder.remove_reagent(reagent.type, reagent.metabolization_rate) + return + //DOPPLER ADDITION END + if(owner && reagent && (!dead || (reagent.chemical_flags & REAGENT_DEAD_PROCESS))) if(owner.reagent_check(reagent, seconds_per_tick, times_fired)) return diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index 8c0aa36189f99..7b6fb34efe1a4 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -220,6 +220,7 @@ inverse_chem = /datum/reagent/inverse/hercuri inverse_chem_val = 0.3 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + process_flags = REAGENT_ORGANIC | REAGENT_SYNTHETIC // DOPPLER EDIT - Lets hercuri process in synths /datum/reagent/medicine/c2/hercuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() diff --git a/modular_doppler/modular_food_drinks_and_chems/food_and_drinks/alcohol_reagents.dm b/modular_doppler/modular_food_drinks_and_chems/food_and_drinks/alcohol_reagents.dm index b529340534249..45977cf15c031 100644 --- a/modular_doppler/modular_food_drinks_and_chems/food_and_drinks/alcohol_reagents.dm +++ b/modular_doppler/modular_food_drinks_and_chems/food_and_drinks/alcohol_reagents.dm @@ -1,12 +1,7 @@ -/*STUFF WE CAN'T USE YET BECAUSE WE HAVEN'T PORTED THEIR PRECURSORS - -// Modular Booze REAGENTS, see the following file for the mixes: modular_nova\modules\customization\modules\food_and_drinks\recipes\drinks_recipes.dm - /datum/reagent/consumable/ethanol/whiskey process_flags = REAGENT_ORGANIC | REAGENT_SYNTHETIC //let's not force the detective to change his alcohol brand -*/ -/*SYNTHETIC DRINKS +//SYNTHETIC DRINKS /datum/reagent/consumable/ethanol/synthanol name = "Synthanol" description = "A runny liquid with conductive capacities. Its effects on synthetics are similar to those of alcohol on organics." @@ -120,9 +115,9 @@ icon_state = "synthignonglass" name = "glass of synthignon" desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." -*/ -// Other Booze + +// Other Booze /datum/reagent/consumable/ethanol/bloody_mary chemical_flags_doppler = REAGENT_BLOOD_REGENERATING @@ -374,7 +369,7 @@ else quality = DRINK_GOOD return ..() -/* + /datum/reagent/consumable/ethanol/oil_drum name = "Oil Drum" color = "#000000" //(0, 0, 0) @@ -395,7 +390,7 @@ else quality = DRINK_GOOD return ..() -*/ + /datum/reagent/consumable/ethanol/nord_king name = "Nord King" color = "#EB1010" //(235, 16, 16) @@ -445,7 +440,7 @@ . = ..() if(drinker.blood_volume < BLOOD_VOLUME_NORMAL) drinker.blood_volume = min(drinker.blood_volume + (1 * REM * seconds_per_tick), BLOOD_VOLUME_NORMAL) //Same as Bloody Mary, as it is roughly the same difficulty to make. Gives hemophages a bit more choices to supplant their blood levels. -/* + /datum/reagent/consumable/ethanol/abduction_fruit name = "Abduction Fruit" color = "#DEFACD" //(222, 250, 205) @@ -461,12 +456,12 @@ desc = "Mixed fruits that were never meant to be mixed..." /datum/reagent/consumable/ethanol/abduction_fruit/expose_mob(mob/living/exposed_mob, methods, reac_volume) - if(isabductor(exposed_mob) || isxenohybrid(exposed_mob)) + if(isabductor(exposed_mob)) // isxenohybrid(exposed_mob) quality = RACE_DRINK else quality = DRINK_GOOD return ..() -*/ + /datum/reagent/consumable/ethanol/bug_zapper name = "Bug Zapper" color = "#F5882A" //(222, 250, 205) @@ -529,7 +524,7 @@ else quality = DRINK_GOOD return ..() -/* + /datum/reagent/consumable/ethanol/jell_wyrm name = "Jell Wyrm" color = "#FF6200" //(255, 98, 0) @@ -553,14 +548,14 @@ #define JELLWYRM_DISGUST 25 /datum/reagent/consumable/ethanol/jell_wyrm/expose_mob(mob/living/exposed_mob, methods, reac_volume) - if(isjellyperson(exposed_mob) || isslimeperson(exposed_mob) || isluminescent(exposed_mob)) + if(isjellyperson(exposed_mob)) quality = RACE_DRINK else //if youre not a slime, jell wyrm should be GROSS exposed_mob.adjust_disgust(JELLWYRM_DISGUST) return ..() #undef JELLWYRM_DISGUST -*/ + /datum/reagent/consumable/ethanol/laval_spit //Yes Laval name = "Laval Spit" color = "#DE3009" //(222, 48, 9) diff --git a/modular_doppler/modular_food_drinks_and_chems/food_and_drinks/drinks.dm b/modular_doppler/modular_food_drinks_and_chems/food_and_drinks/drinks.dm index f4562c5599628..6723717241029 100644 --- a/modular_doppler/modular_food_drinks_and_chems/food_and_drinks/drinks.dm +++ b/modular_doppler/modular_food_drinks_and_chems/food_and_drinks/drinks.dm @@ -76,12 +76,12 @@ list_reagents = list(/datum/reagent/fuel = 25, /datum/reagent/carbondioxide = 5) custom_price = PAYCHECK_LOWER * 1.2 -/*/obj/item/reagent_containers/cup/soda_cans/doppler/synthanolcan +/obj/item/reagent_containers/cup/soda_cans/doppler/synthanolcan name = "Silly Cone's Synthanol" desc = "A recompiling can of synthanol." icon_state = "synthanolcan" list_reagents = list(/datum/reagent/consumable/ethanol/synthanol = 30) - custom_price = PAYCHECK_CREW*/ + custom_price = PAYCHECK_CREW #undef SODA_FIZZINESS_THROWN #undef SODA_FIZZINESS_SHAKE diff --git a/modular_doppler/modular_medical/reagents/reagents.dm b/modular_doppler/modular_medical/reagents/reagents.dm index 3f825dfe4bf6c..ffea7aca83b42 100644 --- a/modular_doppler/modular_medical/reagents/reagents.dm +++ b/modular_doppler/modular_medical/reagents/reagents.dm @@ -1,3 +1,20 @@ /datum/reagent ///What can process this? REAGENT_ORGANIC, REAGENT_SYNTHETIC, or REAGENT_ORGANIC | REAGENT_SYNTHETIC?. We'll assume by default that it affects organics. var/process_flags = REAGENT_ORGANIC + +/proc/reagent_process_flags_valid(mob/processor, datum/reagent/reagent) + if(ishuman(processor)) + var/mob/living/carbon/human/human_processor = processor + //Check if this mob's species is set and can process this type of reagent + //If we somehow avoided getting a species or reagent_flags set, we'll assume we aren't meant to process ANY reagents + if(human_processor.dna && human_processor.dna.species.reagent_flags) + var/processor_flags = human_processor.dna.species.reagent_flags + if((reagent.process_flags & REAGENT_SYNTHETIC) && (processor_flags & PROCESS_SYNTHETIC)) //SYNTHETIC-oriented reagents require PROCESS_SYNTHETIC + return TRUE + if((reagent.process_flags & REAGENT_ORGANIC) && (processor_flags & PROCESS_ORGANIC)) //ORGANIC-oriented reagents require PROCESS_ORGANIC + return TRUE + return FALSE + else if(reagent.process_flags == REAGENT_SYNTHETIC) + //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption) + return FALSE + return TRUE diff --git a/modular_doppler/modular_medical/surgery/revival.dm b/modular_doppler/modular_medical/surgery/revival.dm new file mode 100644 index 0000000000000..0f4f0c93aec4d --- /dev/null +++ b/modular_doppler/modular_medical/surgery/revival.dm @@ -0,0 +1,29 @@ +/datum/surgery/revival/carbon/mechanic + name = "Full System Reboot" + requires_bodypart_type = BODYTYPE_ROBOTIC + possible_locs = list(BODY_ZONE_HEAD) + target_mobtypes = list(/mob/living/carbon) + surgery_flags = parent_type::surgery_flags | SURGERY_REQUIRE_LIMB + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/open_hatch, + /datum/surgery_step/mechanic_unwrench, + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/revive/carbon/mechanic, + /datum/surgery_step/mechanic_wrench, + /datum/surgery_step/mechanic_close, + ) + +/datum/surgery/revival/carbon/mechanic/is_valid_target(mob/living/carbon/patient) + if (!(patient.mob_biotypes & (MOB_ROBOTIC|MOB_HUMANOID))) + return FALSE + var/obj/item/organ/internal/brain/target_brain = patient.get_organ_slot(ORGAN_SLOT_BRAIN) + return !isnull(target_brain) + +/datum/surgery_step/revive/carbon/mechanic + +/datum/surgery_step/revive/carbon/mechanic/on_revived(mob/surgeon, mob/living/patient) + . = ..() + var/mob/living/carbon/robotic_patient = patient + var/datum/species/android/energy_holder = robotic_patient.dna.species + energy_holder.core_energy += 1 MEGA JOULES // from the defibb :) diff --git a/modular_doppler/modular_sounds/sound/machines/drain.wav b/modular_doppler/modular_sounds/sound/machines/drain.wav new file mode 100644 index 0000000000000000000000000000000000000000..eeaee3a92fc3503d3f7b1f700ea41241ebd0763a GIT binary patch literal 11314 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 literal 0 HcmV?d00001 diff --git a/modular_doppler/modular_species/_species.dm b/modular_doppler/modular_species/_species.dm index c402d45ee48e9..19582936639a5 100644 --- a/modular_doppler/modular_species/_species.dm +++ b/modular_doppler/modular_species/_species.dm @@ -13,6 +13,8 @@ var/list/language_prefs_whitelist ///If a species can always be picked in prefs for the purposes of customizing it for ghost roles or events var/always_customizable = FALSE + ///How are we treated regarding processing reagents, by default we process them as if we're organic + var/reagent_flags = PROCESS_ORGANIC ///This is the outfit which will be used by the species its preview portrait var/datum/outfit/preview_outfit = /datum/outfit/job/assistant/consistent @@ -66,3 +68,13 @@ ADD_TRAIT(target, TRAIT_CATLIKE_GRACE, SPECIES_TRAIT) ADD_TRAIT(target, TRAIT_HATED_BY_DOGS, SPECIES_TRAIT) + +/// spec_revival logic +/datum/species/proc/spec_revival(mob/living/carbon/human/target) + return + +/mob/living/carbon/human/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) + . = ..() + if(.) + if(dna && dna.species) + dna.species.spec_revival(src) diff --git a/modular_doppler/modular_species/species_types/android/android.dm b/modular_doppler/modular_species/species_types/android/android.dm index 14bc988046aea..55b86a4ff3775 100644 --- a/modular_doppler/modular_species/species_types/android/android.dm +++ b/modular_doppler/modular_species/species_types/android/android.dm @@ -1,3 +1,8 @@ +/// The starter amount for the android's core +#define ENERGY_START_AMT 10 MEGA JOULES +/// The amount at which mob energy decreases +#define ENERGY_DRAIN_AMT 10 KILO JOULES + /datum/species/android name = "Android" id = SPECIES_ANDROID @@ -6,39 +11,103 @@ inherent_traits = list( TRAIT_GENELESS, TRAIT_LIMBATTACHMENT, - TRAIT_LIVERLESS_METABOLISM, TRAIT_NOBREATH, TRAIT_NOHUNGER, + TRAIT_NOCRITDAMAGE, TRAIT_NO_DNA_COPY, TRAIT_NO_PLASMA_TRANSFORM, - TRAIT_OVERDOSEIMMUNE, TRAIT_RADIMMUNE, TRAIT_RESISTLOWPRESSURE, - TRAIT_TOXIMMUNE, /*TG traits we remove - TRAIT_NOCRITDAMAGE, + TRAIT_LIVERLESS_METABOLISM, TRAIT_PIERCEIMMUNE, + TRAIT_OVERDOSEIMMUNE, + TRAIT_TOXIMMUNE, TRAIT_NOFIRE, TRAIT_NOBLOOD, TRAIT_NO_UNDERWEAR, TRAIT_RESISTHEAT, TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - */ + TRAIT_RESISTHIGHPRESSURE,*/ + TRAIT_STABLEHEART, ) - mutantheart = /obj/item/organ/internal/heart/cybernetic + reagent_flags = PROCESS_SYNTHETIC + mutantheart = /obj/item/organ/internal/heart/cybernetic/tier2 + mutantstomach = /obj/item/organ/internal/stomach/cybernetic/tier2 + mutantliver = /obj/item/organ/internal/liver/cybernetic/tier2 exotic_blood = /datum/reagent/synth_blood exotic_bloodtype = "R*" bodytemp_heat_damage_limit = (BODYTEMP_NORMAL + 146) // 456 K / 183 C bodytemp_cold_damage_limit = (BODYTEMP_NORMAL - 80) // 230 K / -43 C + /// Ability to recharge! + var/datum/action/innate/power_cord/power_cord + /// Hud element to display our energy level + var/atom/movable/screen/android/energy/energy_tracker + /// How much energy we start with + var/core_energy = ENERGY_START_AMT /datum/outfit/android_preview name = "Android (Species Preview)" uniform = /obj/item/clothing/under/syndicate/skirt +/datum/species/android/on_species_gain(mob/living/carbon/target, datum/species/old_species, pref_load) + . = ..() + if(ishuman(target)) + power_cord = new + power_cord.Grant(target) + +/datum/species/android/on_species_loss(mob/living/carbon/target, datum/species/new_species, pref_load) + . = ..() + if(power_cord) + power_cord.Remove(target) + if(target.hud_used) + var/datum/hud/hud_used = target.hud_used + hud_used.infodisplay -= energy_tracker + QDEL_NULL(energy_tracker) + +/datum/species/android/spec_revival(mob/living/carbon/human/target) + playsound(target.loc, 'sound/machines/chime.ogg', 50, TRUE) + target.visible_message(span_notice("[target]'s LEDs flicker to life!"), span_notice("All systems nominal. You're back online!")) + +/datum/species/android/spec_life(mob/living/carbon/human/target, seconds_per_tick, times_fired) + . = ..() + handle_hud(target) + + if(target.stat == SOFT_CRIT || target.stat == HARD_CRIT) + target.adjustFireLoss(1) //Still deal some damage in case a cold environment would be preventing us from the sweet release to robot heaven + target.adjust_bodytemperature(13) //We're overheating!! + if(prob(10)) + to_chat(target, span_warning("Alert: Critical damage taken! Cooling systems failing!")) + do_sparks(3, FALSE, target) + + if(HAS_TRAIT(target, TRAIT_CHARGING)) + return + if(core_energy > 0) + core_energy -= ENERGY_DRAIN_AMT + if(core_energy <= 0) + target.death() // You can do a lot in a day. + +/datum/species/android/proc/handle_hud(mob/living/carbon/human/target) + // update it + if(energy_tracker) + energy_tracker.update_energy_hud(core_energy) + // initialize it + else if(target.hud_used) + var/datum/hud/hud_used = target.hud_used + energy_tracker = new(null, hud_used) + hud_used.infodisplay += energy_tracker + + target.hud_used.show_hud(target.hud_used.hud_version) + /datum/species/android/prepare_human_for_preview(mob/living/carbon/human/robot_for_preview) - robot_for_preview.dna.features["frame_list"][BODY_ZONE_HEAD] = /obj/item/bodypart/head/robot/android/e_three_n + robot_for_preview.dna.features["frame_list"] = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/robot/android/e_three_n, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/robot/android/e_three_n, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/robot/android/e_three_n, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/robot/android/e_three_n, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/robot/android/e_three_n, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/robot/android/e_three_n) regenerate_organs(robot_for_preview) robot_for_preview.update_body(is_creating = TRUE) @@ -54,3 +123,6 @@ return list( "Androids are a synthetic species created by Nanotrasen as an intermediary between humans and cyborgs." ) + +#undef ENERGY_START_AMT +#undef ENERGY_DRAIN_AMT diff --git a/modular_doppler/modular_species/species_types/android/android_hud.dm b/modular_doppler/modular_species/species_types/android/android_hud.dm new file mode 100644 index 0000000000000..b5aca6d217f56 --- /dev/null +++ b/modular_doppler/modular_species/species_types/android/android_hud.dm @@ -0,0 +1,22 @@ +/// 1 tile down +#define UI_ENERGY_DISPLAY "WEST:6,CENTER-1:0" + +///Maptext define for Hemophage HUDs +#define FORMAT_ANDROID_HUD_TEXT(valuecolor, value) MAPTEXT("
[round((value/1000000), 0.01)]MJ
") + +/atom/movable/screen/android + icon = 'modular_doppler/modular_species/species_types/android/icons/android_hud.dmi' + +/atom/movable/screen/android/energy + name = "Energy Tracker" + icon_state = "energy_display" + screen_loc = UI_ENERGY_DISPLAY + +/atom/movable/screen/android/energy/proc/update_energy_hud(core_energy) + maptext = FORMAT_ANDROID_HUD_TEXT(hud_text_color(), core_energy) + +/atom/movable/screen/android/energy/proc/hud_text_color(core_energy) + return core_energy < 2.5 MEGA JOULES ? "#ffffff" : "#FFAAAA" + +#undef UI_ENERGY_DISPLAY +#undef FORMAT_ANDROID_HUD_TEXT diff --git a/modular_doppler/modular_species/species_types/android/android_parts.dm b/modular_doppler/modular_species/species_types/android/android_parts.dm index 6c379d1564d57..c5c67338ed9b1 100644 --- a/modular_doppler/modular_species/species_types/android/android_parts.dm +++ b/modular_doppler/modular_species/species_types/android/android_parts.dm @@ -13,6 +13,9 @@ brute_modifier = 1 burn_modifier = 1 +/obj/item/bodypart/chest/robot/android/check_limbs() + return + /obj/item/bodypart/arm/right/robot/android biological_state = (BIO_ROBOTIC|BIO_BLOODED) brute_modifier = 1 diff --git a/modular_doppler/modular_species/species_types/android/icons/android_hud.dmi b/modular_doppler/modular_species/species_types/android/icons/android_hud.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b524cf632804176f86b1a60dc348f9161bb8d676 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5Tn`*LkmkKF1;}MA3GxeO zaCmkj4ag~~3W+FjNi9w;$}A|!%+F(BsF)KRR!~&>{Y!Ac$FEPcymhtCojD)8A=Kca z@q3^j8CQg Q*8y1!p00i_>zopr0F~)ab^rhX literal 0 HcmV?d00001 diff --git a/modular_doppler/modular_species/species_types/android/power_cord.dm b/modular_doppler/modular_species/species_types/android/power_cord.dm new file mode 100644 index 0000000000000..066c2b21d2072 --- /dev/null +++ b/modular_doppler/modular_species/species_types/android/power_cord.dm @@ -0,0 +1,139 @@ +// Charge level defines +#define POWER_CORD_CHARGE_MAX 10 MEGA JOULES +#define POWER_CORD_CHARGE_RATE (STANDARD_CELL_RATE * 1.5) +#define POWER_CORD_CHARGE_DELAY 0.55 SECONDS +#define POWER_CORD_APC_MINIMUM_PERCENT 5 + +/datum/action/innate/power_cord + name = "Power Cord" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS + button_icon_state = "toolkit_generic" + button_icon = 'icons/obj/medical/organs/organs.dmi' + background_icon_state = "bg_default" + // What will be given in-hand + var/obj/item/hand_item/power_cord/power_cord + +/datum/action/innate/power_cord/Activate() + for(var/obj/item/hand_item/item in owner.held_items) + if(item) + owner.balloon_alert(owner, "hand occupied!") + return + power_cord = new + owner.put_in_active_hand(power_cord) + playsound(owner, 'sound/vehicles/mecha/mechmove03.ogg', 20, TRUE) + +/obj/item/hand_item/power_cord + name = "power cord" + desc = "An internal power cord. Useful if you run on electricity. Not so much otherwise." + icon = 'icons/obj/stack_objects.dmi' + icon_state = "wire" + /// What can be drained + var/static/list/cord_whitelist = typecacheof(list( + /obj/item/stock_parts/power_store, + /obj/machinery/power/apc, + )) + +// Attempt to charge from an object by using them on the power cord. +/obj/item/hand_item/power_cord/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!can_power_draw(tool, user)) + return NONE + try_power_draw(tool, user) + return ITEM_INTERACT_SUCCESS + +// Attempt to charge from an object by using the power cord on them. +/obj/item/hand_item/power_cord/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!can_power_draw(interacting_with, user)) + return NONE + try_power_draw(interacting_with, user) + return ITEM_INTERACT_SUCCESS + +/// Returns TRUE or FALSE depending on if the target object can be used as a power source. +/obj/item/hand_item/power_cord/proc/can_power_draw(obj/target, mob/user) + return ishuman(user) && is_type_in_typecache(target, cord_whitelist) + +/// Attempts to start using an object as a power source. +/obj/item/hand_item/power_cord/proc/try_power_draw(obj/target, mob/living/carbon/human/user) + user.changeNext_move(CLICK_CD_MELEE) + + var/datum/species/android/energy_holder = user.dna.species + if(energy_holder.core_energy >= POWER_CORD_CHARGE_MAX) + user.balloon_alert(user, "fully charged!") + return + + user.visible_message(span_notice("[user] inserts a power connector into [target]."), span_notice("You begin to draw power from [target].")) + do_power_draw(target, user) + + if(QDELETED(target)) + return + + if(HAS_TRAIT(user, TRAIT_CHARGING)) + REMOVE_TRAIT(user, TRAIT_CHARGING, SPECIES_TRAIT) + user.visible_message(span_notice("[user] unplugs from [target]."), span_notice("You unplug from [target].")) + +/** + * Runs a loop to charge an android from a cell or APC. + * Displays chat messages to the user and nearby observers. + * + * Stops when: + * - The user's is full. + * - The cell has less than the minimum charge. + * - The user moves, or anything else that can happen to interrupt a do_after. + * + * Arguments: + * * target - The power cell or APC to drain. + * * user - The human mob draining the power cell. + */ +/obj/item/hand_item/power_cord/proc/do_power_draw(obj/target, mob/living/carbon/human/user) + // Draw power from an APC if one was given. + var/obj/machinery/power/apc/target_apc + if(istype(target, /obj/machinery/power/apc)) + target_apc = target + + var/obj/item/stock_parts/power_store/target_cell = target_apc ? target_apc.cell : target + var/minimum_cell_charge = target_apc ? POWER_CORD_APC_MINIMUM_PERCENT : 0 + + if(!target_cell || target_cell.percent() < minimum_cell_charge) + user.balloon_alert(user, "APC charge low!") + return + var/energy_needed + while(TRUE) + ADD_TRAIT(user, TRAIT_CHARGING, SPECIES_TRAIT) + // Check if the charge level of the cell is below the minimum. + // Prevents from overloading the cell. + if(target_cell.percent() < minimum_cell_charge) + user.balloon_alert(user, "APC charge low!") + break + + // Attempt to drain charge from the cell. + if(!do_after(user, POWER_CORD_CHARGE_DELAY, target)) // slurp slurp slurp slurp + break + + // Check if the user is nearly fully charged. + // Ensures minimum draw is always lower than this margin. + var/datum/species/android/energy_holder = user.dna.species + energy_needed = POWER_CORD_CHARGE_MAX - energy_holder.core_energy + + // Calculate how much to draw from the cell this cycle. + var/current_draw = min(energy_needed, POWER_CORD_CHARGE_RATE * POWER_CORD_CHARGE_DELAY) + + var/energy_delivered = target_cell.use(current_draw, force = TRUE) + target_cell.update_appearance() + if(!energy_delivered) + // The cell could be sabotaged, which causes it to explode and qdelete. + if(QDELETED(target_cell)) + return + user.balloon_alert(user, "[target_apc ? "APC" : "Cell"] empty!") + break + + energy_holder.core_energy += energy_delivered + + playsound(user, 'modular_doppler/modular_sounds/sound/machines/drain.wav', 20, FALSE) + if(prob(10)) + do_sparks(3, FALSE, target_cell.loc) + if(energy_holder.core_energy >= POWER_CORD_CHARGE_MAX) + user.balloon_alert(user, "fully charged") + break + +#undef POWER_CORD_CHARGE_MAX +#undef POWER_CORD_CHARGE_RATE +#undef POWER_CORD_APC_MINIMUM_PERCENT diff --git a/tgstation.dme b/tgstation.dme index 1141d704b46d8..92412291d2d56 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6824,6 +6824,7 @@ #include "modular_doppler\modular_medical\reagents\medicine.dm" #include "modular_doppler\modular_medical\reagents\reagents.dm" #include "modular_doppler\modular_medical\reagents\synth_blood.dm" +#include "modular_doppler\modular_medical\surgery\revival.dm" #include "modular_doppler\modular_medical\wounds\_wounds.dm" #include "modular_doppler\modular_medical\wounds\bleed.dm" #include "modular_doppler\modular_medical\wounds\medical.dm" @@ -6846,7 +6847,9 @@ #include "modular_doppler\modular_species\_species.dm" #include "modular_doppler\modular_species\code\bloodsplatter.dm" #include "modular_doppler\modular_species\species_types\android\android.dm" +#include "modular_doppler\modular_species\species_types\android\android_hud.dm" #include "modular_doppler\modular_species\species_types\android\android_parts.dm" +#include "modular_doppler\modular_species\species_types\android\power_cord.dm" #include "modular_doppler\modular_species\species_types\anthromorph\anthromorph.dm" #include "modular_doppler\modular_species\species_types\anthromorph\anthromorph_bodyparts.dm" #include "modular_doppler\modular_species\species_types\aquatic\aquatic.dm" From eaa93e90fc7cece0b9ec37c0a447dd3409bc1d5d Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Mon, 7 Oct 2024 19:33:07 +0200 Subject: [PATCH 07/52] crew sensor tweak --- code/game/machinery/computer/crew.dm | 5 ++++- .../modular_species/species_types/android/android.dm | 1 + tgui/packages/tgui/interfaces/CrewConsole.tsx | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 65895164ce3b7..902c9c38141f5 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -44,6 +44,7 @@ . += create_table_notices(list( "name", "job", + "charge", //DOPPLER EDIT ADDITION "is_robot", //DOPPLER EDIT ADDITION "life_status", "suffocation", @@ -65,6 +66,7 @@ var/list/entry = list() entry["name"] = player_record["name"] entry["job"] = player_record["assignment"] + entry["charge"] = player_record["charge"] // DOPPLER EDIT ADDITION entry["is_robot"] = player_record["is_robot"] // DOPPLER EDIT ADDITION entry["life_status"] = player_record["life_status"] entry["suffocation"] = player_record["oxydam"] @@ -249,10 +251,11 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) // DOPPLER EDIT ADDITION START if (isandroid(tracked_human)) + var/datum/species/android/energy_holder = tracked_human.dna.species entry["is_robot"] = TRUE + entry["charge"] = "[round((energy_holder.core_energy/1000000), 0.1)]MJ" // DOPPLER EDIT ADDITION END - // Broken sensors show garbage data if (uniform.has_sensor == BROKEN_SENSORS) entry["life_status"] = rand(0,1) diff --git a/modular_doppler/modular_species/species_types/android/android.dm b/modular_doppler/modular_species/species_types/android/android.dm index 55b86a4ff3775..b7e18b55908bd 100644 --- a/modular_doppler/modular_species/species_types/android/android.dm +++ b/modular_doppler/modular_species/species_types/android/android.dm @@ -30,6 +30,7 @@ TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE,*/ TRAIT_STABLEHEART, + TRAIT_STABLELIVER, ) reagent_flags = PROCESS_SYNTHETIC mutantheart = /obj/item/organ/internal/heart/cybernetic/tier2 diff --git a/tgui/packages/tgui/interfaces/CrewConsole.tsx b/tgui/packages/tgui/interfaces/CrewConsole.tsx index 0d45b9206cc5d..e93909036b1a2 100644 --- a/tgui/packages/tgui/interfaces/CrewConsole.tsx +++ b/tgui/packages/tgui/interfaces/CrewConsole.tsx @@ -126,6 +126,7 @@ type CrewSensor = { name: string; assignment: string | undefined; ijob: number; + charge: string | undefined; // DOPPLER ADDITION is_robot: any; // DOPPLER ADDITION life_status: number; oxydam: number; @@ -230,6 +231,7 @@ const CrewTableEntry = (props: CrewTableEntryProps) => { name, assignment, ijob, + charge, // DOPPLER ADDITION is_robot, // DOPPLER ADDITION life_status, oxydam, @@ -248,7 +250,8 @@ const CrewTableEntry = (props: CrewTableEntryProps) => {
{/* DOPPLER ADDITION START */} - {is_robot ? : ''} + {is_robot ? : ''} + {charge !== undefined ? ` ${charge}` : ''} {/* DOPPLER ADDITION END */} From 5eea21b0941045dcc8d9c3f4a610a2d43de5c859 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Tue, 8 Oct 2024 00:29:56 +0200 Subject: [PATCH 08/52] implanted quirk + sechud icon --- code/__DEFINES/atom_hud.dm | 4 ++ .../~doppler_defines/declarations.dm | 8 ++- code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 1 + code/game/data_huds.dm | 2 +- .../mob/living/carbon/human/human_defines.dm | 2 +- .../quirk.dm => excitable/excitable.dm} | 0 .../implanted/code/preferences.dm | 20 +++++++ .../modular_quirks/implanted/implanted.dm | 54 ++++++++++++++++++ .../good_quirks.dm => linguist/linguist.dm} | 0 .../{code => }/overwrites/musician.dm | 0 .../modular_species/code/bloodsplatter.dm | 4 +- modular_doppler/overwrites/huds/hud.dmi | Bin 10743 -> 10814 bytes tgstation.dme | 7 ++- tgui/packages/tgui/interfaces/CrewConsole.tsx | 2 +- .../character_preferences/implanted.tsx | 7 +++ 16 files changed, 101 insertions(+), 11 deletions(-) rename modular_doppler/modular_quirks/{code/excitable/quirk.dm => excitable/excitable.dm} (100%) create mode 100644 modular_doppler/modular_quirks/implanted/code/preferences.dm create mode 100644 modular_doppler/modular_quirks/implanted/implanted.dm rename modular_doppler/modular_quirks/{code/good_quirks.dm => linguist/linguist.dm} (100%) rename modular_doppler/modular_quirks/{code => }/overwrites/musician.dm (100%) create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/implanted.tsx diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 57dc338d3ebc3..44e1a19c9c187 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -47,6 +47,10 @@ #define DIAG_CAMERA_HUD "22" /// Steady Hacked APC effect, visible only to Malf AIs #define MALF_APC_HUD "23" +// DOPPLER ADDITION BEGIN +/// If they have the implanted quirk +#define SEC_IMPLANT_HUD "25" +// DOPPLER ADDITION END //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior diff --git a/code/__DEFINES/~doppler_defines/declarations.dm b/code/__DEFINES/~doppler_defines/declarations.dm index 225fbda53cc0c..d187334b7f873 100644 --- a/code/__DEFINES/~doppler_defines/declarations.dm +++ b/code/__DEFINES/~doppler_defines/declarations.dm @@ -6,7 +6,9 @@ #define TRAIT_EXCITABLE "wagwag" /// Trait for hemophages particularly! #define TRAIT_OXYIMMUNE "oxyimmune" // Immune to oxygen damage, ideally give this to all non-breathing species or bad stuff will happen -// Trait for extra language point. -#define TRAIT_LINGUIST "Linguist" +/// Trait for extra language point. +#define TRAIT_LINGUIST "linguist" /// Trait that defines if an android species type is charging their cell -#define TRAIT_CHARGING "Charging" +#define TRAIT_CHARGING "charging" +/// Trait for people with the implanted quirk +#define TRAIT_IMPLANTED "implanted" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index d27432c4eedcd..0b62f7486cadf 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -700,6 +700,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TWITCH_ADAPTED" = TRAIT_TWITCH_ADAPTED, "TRAIT_GOLEM_LIMBATTACHMENT" = TRAIT_GOLEM_LIMBATTACHMENT, "TRAIT_LINGUIST" = TRAIT_LINGUIST, + "TRAIT_IMPLANTED" = TRAIT_IMPLANTED, "TRAIT_CHARGING" = TRAIT_CHARGING, ), // DOPPLER EDIT ADDITION END diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 3357e214d6161..52e4b0a6a5834 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -383,6 +383,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_EXCITABLE" = TRAIT_EXCITABLE, "TRAIT_TWITCH_ADAPTED" = TRAIT_TWITCH_ADAPTED, "TRAIT_LINGUIST" = TRAIT_LINGUIST, + "TRAIT_IMPLANTED" = TRAIT_IMPLANTED, "TRAIT_CHARGING" = TRAIT_CHARGING, ), // DOPPLER EDIT ADDITION END diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 58cc789430ae0..4aae21dd7f14b 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -49,7 +49,7 @@ hud_icons = list(ID_HUD) /datum/atom_hud/data/human/security/advanced - hud_icons = list(ID_HUD, IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD, WANTED_HUD) + hud_icons = list(ID_HUD, IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD, WANTED_HUD, SEC_IMPLANT_HUD) // DOPPLER EDIT, old code: hud_icons = list(ID_HUD, IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD, WANTED_HUD) /datum/atom_hud/data/human/fan_hud hud_icons = list(FAN_HUD) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index c63c99b8da537..92faf0b1cdf38 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -5,7 +5,7 @@ icon = 'icons/mob/human/human.dmi' icon_state = "human_basic" appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPSEC_FIRST_HUD,IMPSEC_SECOND_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPSEC_FIRST_HUD,IMPSEC_SECOND_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD,SEC_IMPLANT_HUD) // DOPPLER EDIT, old code: hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPSEC_FIRST_HUD,IMPSEC_SECOND_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD) hud_type = /datum/hud/human pressure_resistance = 25 can_buckle = TRUE diff --git a/modular_doppler/modular_quirks/code/excitable/quirk.dm b/modular_doppler/modular_quirks/excitable/excitable.dm similarity index 100% rename from modular_doppler/modular_quirks/code/excitable/quirk.dm rename to modular_doppler/modular_quirks/excitable/excitable.dm diff --git a/modular_doppler/modular_quirks/implanted/code/preferences.dm b/modular_doppler/modular_quirks/implanted/code/preferences.dm new file mode 100644 index 0000000000000..d35eaf20c446b --- /dev/null +++ b/modular_doppler/modular_quirks/implanted/code/preferences.dm @@ -0,0 +1,20 @@ +/datum/preference/choiced/implanted_quirk + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "implanted_quirk" + savefile_identifier = PREFERENCE_CHARACTER + can_randomize = FALSE + +/datum/preference/choiced/implanted_quirk/init_possible_values() + return list("Random") + assoc_to_keys(GLOB.possible_quirk_implants) + +/datum/preference/choiced/implanted_quirk/create_default_value() + return "Random" + +/datum/preference/choiced/implanted_quirk/is_accessible(datum/preferences/preferences) + if (!..()) + return FALSE + + return "Implanted" in preferences.all_quirks + +/datum/preference/choiced/implanted_quirk/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/modular_doppler/modular_quirks/implanted/implanted.dm b/modular_doppler/modular_quirks/implanted/implanted.dm new file mode 100644 index 0000000000000..dc160ee859ed6 --- /dev/null +++ b/modular_doppler/modular_quirks/implanted/implanted.dm @@ -0,0 +1,54 @@ +GLOBAL_LIST_INIT(possible_quirk_implants, list( + "Toolset" = /obj/item/organ/internal/cyberimp/arm/toolset, +)) + +/datum/quirk/implanted_quirk + name = "Implanted" + desc = "test" + value = 8 + mob_trait = TRAIT_IMPLANTED + gain_text = span_notice("test") + lose_text = span_danger("test") + icon = FA_ICON_WRENCH + +/datum/quirk_constant_data/implanted + associated_typepath = /datum/quirk/implanted_quirk + customization_options = list(/datum/preference/choiced/implanted_quirk) + +/datum/quirk/implanted_quirk/add_unique(client/client_source) + var/desired_implant = GLOB.possible_quirk_implants[client_source?.prefs?.read_preference(/datum/preference/choiced/implanted_quirk)] + if(isnull(desired_implant) || desired_implant == "Random") //Client gone or they chose a random prosthetic + desired_implant = GLOB.possible_quirk_implants[pick(GLOB.possible_quirk_implants)] + var/mob/living/carbon/human/human_holder = quirk_holder + var/obj/item/organ/internal/cybernetic = new desired_implant() + cybernetic.Insert(human_holder, special = TRUE, movement_flags = DELETE_IF_REPLACED) + medical_record_text = "Patient has an approved [cybernetic.name] installed within their body." + +/datum/quirk/implanted_quirk/add(client/client_source) + . = ..() + quirk_holder.update_implanted_hud() + +/datum/quirk/implanted_quirk/remove() + var/mob/living/old_holder = quirk_holder + . = ..() + old_holder.update_implanted_hud() + +/mob/living/prepare_data_huds() + . = ..() + update_implanted_hud() + +/// Adds the HUD element if src has its trait. Removes it otherwise. +/mob/living/proc/update_implanted_hud() + var/image/quirk_holder = hud_list?[SEC_IMPLANT_HUD] + if(isnull(quirk_holder)) + return + + var/icon/temporary_icon = icon(icon, icon_state, dir) + quirk_holder.pixel_y = temporary_icon.Height() - world.icon_size + + if(HAS_TRAIT(src, TRAIT_IMPLANTED)) + set_hud_image_active(SEC_IMPLANT_HUD) + quirk_holder.icon = 'modular_doppler/overwrites/huds/hud.dmi' + quirk_holder.icon_state = "hud_imp_quirk" + else + set_hud_image_inactive(SEC_IMPLANT_HUD) diff --git a/modular_doppler/modular_quirks/code/good_quirks.dm b/modular_doppler/modular_quirks/linguist/linguist.dm similarity index 100% rename from modular_doppler/modular_quirks/code/good_quirks.dm rename to modular_doppler/modular_quirks/linguist/linguist.dm diff --git a/modular_doppler/modular_quirks/code/overwrites/musician.dm b/modular_doppler/modular_quirks/overwrites/musician.dm similarity index 100% rename from modular_doppler/modular_quirks/code/overwrites/musician.dm rename to modular_doppler/modular_quirks/overwrites/musician.dm diff --git a/modular_doppler/modular_species/code/bloodsplatter.dm b/modular_doppler/modular_species/code/bloodsplatter.dm index 4243a8813a35a..87422a7f69508 100644 --- a/modular_doppler/modular_species/code/bloodsplatter.dm +++ b/modular_doppler/modular_species/code/bloodsplatter.dm @@ -1,7 +1,7 @@ /// Green blood reagent /datum/reagent/blood/green data = list("viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null) - name = "Green Blood" + name = "insect blood" color = "#50c034" // rgb: 0, 200, 0 metabolization_rate = 12.5 * REAGENTS_METABOLISM //fast rate so it disappears fast. taste_description = "iron" @@ -22,7 +22,7 @@ splatter_type = "xsplatter" /obj/effect/decal/cleanable/blood/green - name = "green blood" + name = "insect blood" desc = "It's green... And it looks like... blood?" icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" diff --git a/modular_doppler/overwrites/huds/hud.dmi b/modular_doppler/overwrites/huds/hud.dmi index 4084f10c8acc84cc02eadf4448165fa67db599f4..c0fa61ebe4112122908b584fb3343b642ded3902 100644 GIT binary patch delta 9512 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 { {/* DOPPLER ADDITION START */} - {is_robot ? : ''} + {is_robot ? : ''} {charge !== undefined ? ` ${charge}` : ''} diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/implanted.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/implanted.tsx new file mode 100644 index 0000000000000..d526e62e6cac4 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/implanted.tsx @@ -0,0 +1,7 @@ +import { FeatureChoiced } from '../base'; +import { FeatureDropdownInput } from '../dropdowns'; + +export const implanted_quirk: FeatureChoiced = { + name: 'Implanted', + component: FeatureDropdownInput, +}; From 853646b6e0298dcb6913143254520ddf50146cd8 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Tue, 8 Oct 2024 01:34:46 +0200 Subject: [PATCH 09/52] more implants --- .../code/carbon_update_icons.dm | 2 +- .../modular_medical/icons/implants.dmi | Bin 0 -> 739 bytes .../icons/implants_lefthand.dmi | Bin 0 -> 673 bytes .../modular_medical/icons/implants_onmob.dmi | Bin 0 -> 398 bytes .../icons/implants_righthand.dmi | Bin 0 -> 671 bytes .../modular_medical/icons/organ_actions.dmi | Bin 0 -> 568 bytes ...{on_limb_overlays.dmi => wounds_onmob.dmi} | Bin .../medical_designs/medical_designs.dm | 86 ++++++ .../surgery/organs/internal/cyberimp.dm | 250 ++++++++++++++++++ .../modular_quirks/implanted/implanted.dm | 8 +- .../modular_sounds/sound/machines/whirr.ogg | Bin 0 -> 14748 bytes tgstation.dme | 1 + 12 files changed, 344 insertions(+), 3 deletions(-) create mode 100644 modular_doppler/modular_medical/icons/implants.dmi create mode 100644 modular_doppler/modular_medical/icons/implants_lefthand.dmi create mode 100644 modular_doppler/modular_medical/icons/implants_onmob.dmi create mode 100644 modular_doppler/modular_medical/icons/implants_righthand.dmi create mode 100644 modular_doppler/modular_medical/icons/organ_actions.dmi rename modular_doppler/modular_medical/icons/{on_limb_overlays.dmi => wounds_onmob.dmi} (100%) create mode 100644 modular_doppler/modular_medical/surgery/organs/internal/cyberimp.dm create mode 100644 modular_doppler/modular_sounds/sound/machines/whirr.ogg diff --git a/modular_doppler/modular_medical/code/carbon_update_icons.dm b/modular_doppler/modular_medical/code/carbon_update_icons.dm index 5f5b69c3041a2..7448813256fa5 100644 --- a/modular_doppler/modular_medical/code/carbon_update_icons.dm +++ b/modular_doppler/modular_medical/code/carbon_update_icons.dm @@ -1,7 +1,7 @@ /mob/living/carbon/proc/update_bandage_overlays() remove_overlay(BANDAGE_LAYER) - var/mutable_appearance/overlays = mutable_appearance('modular_doppler/modular_medical/icons/on_limb_overlays.dmi', "", -BANDAGE_LAYER) + var/mutable_appearance/overlays = mutable_appearance('modular_doppler/modular_medical/icons/wounds_onmob.dmi', "", -BANDAGE_LAYER) overlays_standing[BANDAGE_LAYER] = overlays for(var/b in bodyparts) diff --git a/modular_doppler/modular_medical/icons/implants.dmi b/modular_doppler/modular_medical/icons/implants.dmi new file mode 100644 index 0000000000000000000000000000000000000000..51ad45a2994974f8fb1af2d061699b373bd03b38 GIT binary patch literal 739 zcmV<90v!E`P)~RJArZ zjK(l00DGTPE!Ct=GbNc004=4R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9` z^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSJU<7h zB{MHoiHkEOv#1y-X2`{vR+N~V3Sq-l78Io>XM)U*Ctgo+Nor~iK~*W4iMjcCDY(=r zE4cc(fISBQ-`_&NXIo~U0004sNklT%YgtE{U;If7rqLXBzcshW9=zfB@;b!99g@G6P8&HkS4fC zLI`Cn%kJfnhLUv67@?GBxww;eCahtML&kZ|i~Md5Kp8F$LKL~+`PebXIb&$z1&AUz zMus`gvB5+9V9mJVg2O1G;DQAh3}O_}^FBaC0t$b&g7XQ3@9qi!VI%-}xEu_Cctgj- z79o0(7luf~iAVnkUBYib?4m<}m=5sdYC~_iLT4LhhHq-PC1BB_MT?$Yo3h+cD%C^$ zWeZhR?aIBXq-OFOH`W+Cq_6(-rggPLhnBU%i1UykZ(P$jOc^A+9}XW<>bl%iT2=}l zS)D};_|Y73nd2bhbNepUm#p`=0j;#e<$uJuHErV;KJLVEhf*CRrKO*%nN+o8D$1>O ztu?MS_B0RQ_$u@(iHEHGI8zKJxWW0>x{Gt{rD&L)yh+cUbraLUz^2eme9@xk)enZ( V9wpMgMM3}o002ovPDHLkV1mSUM*{!= literal 0 HcmV?d00001 diff --git a/modular_doppler/modular_medical/icons/implants_lefthand.dmi b/modular_doppler/modular_medical/icons/implants_lefthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..74bcb1c18d996a2ba5de5bd4f6dc9d6415dbe413 GIT binary patch literal 673 zcmV;S0$%-zP)C0000vP)t-sz`(#? zXNJSn*q*DlMnh;;T4Q&6gQBUi#?8|;I6+-EYI!<GBZ(00DtXL_t(|ob8ywmV+P+MXe4hcC6z6f9x>bK@fvQXBPMFnv=YQ z5Ir?b0{{R30RNH4b<%C8@k%>&HR@`WZrztiuZ_*)&(~k2-7)QO(zpR6$>~P zO1e}T0c8UK000000D%3#-|q+bJO=;(0002f3sY~d(@rpqkzpJvhpjJaWn(XeIgchC znG~WBymE(%sj2!t4wc16j?SDE8Nzev)X|w?Q)bNON|Ii*`mCq#;gung2d|!IeZ$9~ z^-Qy1V`^GB(EfRzE{-7)t;q=ztcw#o7!}tn@?qjITgi zX~$M`F+TXp-1m!_xnPO9gG5JF6T=L~rIsI8NdYYb>2NS{cxNlX9>K%0+L6s;FZ&~h nDz?tNM>AYz{Q{bn!N>4Cl;@%O8DS})OBp;}{an^LB{Ts5AQO_n literal 0 HcmV?d00001 diff --git a/modular_doppler/modular_medical/icons/implants_righthand.dmi b/modular_doppler/modular_medical/icons/implants_righthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b9ecc781a3ffb33892a91ae056599ed28251566f GIT binary patch literal 671 zcmV;Q0$}}#P)C0000vP)t-sz`(#? zXNI1uw!_reMnhGBZ(00DnVL_t(|ob8y~Zo?oDMB_SOJM|6!|Hsyr(nxN1H*AP#AI^D% zVHhq($zCo10002+k7(ZD@zItH&J{L>^5ph0fi7@f2Bwuop)ZC!yUb9BAyB~(_b zwP(yR_pZ-SQQIzdukQ)d)V9m3&m;f<007j%_t#$efnBdYAQlMf)d!RULB;xjTp*}e zA5aPe1@(btP3uxDw_QyCbxUc@53r`R33A)T^gp6|0vv1gx`;y_Y@Q7`%r?KvmW}M{P)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sXRXis3kKmRf&r;C9|j)C}zmTnO2mTn+jnoE4cc(fQ<$K!T%fP z-dFvb0004pNkl4s5QL=M9+HV#gPUq8NsX+nU~(7@^dWQULoh;pM^H0#@Hzkl(Bm6qIWmAn*Pow%z}*%rXf3Gm6~WHH*L& z;tD-*T7fNr zMF)Cl80&j6sA?)v?f?)#Hwb1qC4l6*02B%!-&fT}z%2*yL3IDTIT-3CRpc0MU%y8k z2mF2Wf)Nx7$dmj%7qakAO~X;hXH~G5jIDFQZ>v_kncebz-9?tF4798d1O_` z=$7G13n0r0r4x!8rRZq^9T1a9DRKZl%ZUX8-z*>T4gdf&fTft&J*9>K0000 world.time) + return + recent_spin = world.time + spin_delay + + playsound(user, 'modular_doppler/modular_sounds/sound/machines/whirr.ogg', 50, FALSE) + user.visible_message(span_warning("[user] spins [src]'s bit, accelerating for a moment to thousands of RPM."), span_notice("You spin [src]'s bit, accelerating for a moment to thousands of RPM.")) + +/obj/item/organ/internal/cyberimp/arm/mining_drill/diamond + name = "\improper Dalba Masterworks 'Tunneler' Diamond Integrated Drill" + desc = "Extending from a stabilization bracer built into the upper forearm, this implant allows for a masterwork diamond mining drill to extend over the user's hand. This drill will open a hole in the universe, and that hole will be a path for those behind us!" + icon_state = "diamond" + items_to_create = list(/obj/item/pickaxe/drill/implant/diamond) + +/obj/item/pickaxe/drill/implant/diamond + name = "integrated diamond mining drill" + desc = "Extending from a stabilization bracer built into the upper forearm, this implant allows for a masterwork diamond mining drill to extend over the user's hand. This drill will open a hole in the universe, and that hole will be a path for those behind us!" + icon_state = "diamond" + inhand_icon_state = "diamond" + toolspeed = 0.2 + force = 20 + demolition_mod = 1.25 + usesound = 'sound/items/weapons/drill.ogg' + hitsound = 'sound/items/weapons/drill.ogg' diff --git a/modular_doppler/modular_quirks/implanted/implanted.dm b/modular_doppler/modular_quirks/implanted/implanted.dm index dc160ee859ed6..2d9222fd752aa 100644 --- a/modular_doppler/modular_quirks/implanted/implanted.dm +++ b/modular_doppler/modular_quirks/implanted/implanted.dm @@ -1,5 +1,9 @@ GLOBAL_LIST_INIT(possible_quirk_implants, list( - "Toolset" = /obj/item/organ/internal/cyberimp/arm/toolset, + "Engineering Toolset" = /obj/item/organ/internal/cyberimp/arm/toolset, + "Surgery Toolset" = /obj/item/organ/internal/cyberimp/arm/surgery, + "Hydroponics Toolset" = /obj/item/organ/internal/cyberimp/arm/botany, + "Razorclaw Implant" = /obj/item/organ/internal/cyberimp/arm/razor_claws, + "Excavator Implant" = /obj/item/organ/internal/cyberimp/arm/mining_drill, )) /datum/quirk/implanted_quirk @@ -17,7 +21,7 @@ GLOBAL_LIST_INIT(possible_quirk_implants, list( /datum/quirk/implanted_quirk/add_unique(client/client_source) var/desired_implant = GLOB.possible_quirk_implants[client_source?.prefs?.read_preference(/datum/preference/choiced/implanted_quirk)] - if(isnull(desired_implant) || desired_implant == "Random") //Client gone or they chose a random prosthetic + if(isnull(desired_implant)) //Client gone or they chose a random prosthetic desired_implant = GLOB.possible_quirk_implants[pick(GLOB.possible_quirk_implants)] var/mob/living/carbon/human/human_holder = quirk_holder var/obj/item/organ/internal/cybernetic = new desired_implant() diff --git a/modular_doppler/modular_sounds/sound/machines/whirr.ogg b/modular_doppler/modular_sounds/sound/machines/whirr.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bc51d5aa046764d12f0e49040f45984c3681effb GIT binary patch literal 14748 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index a82cee37fb7d6..faf94e6327dbc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6825,6 +6825,7 @@ #include "modular_doppler\modular_medical\reagents\reagents.dm" #include "modular_doppler\modular_medical\reagents\synth_blood.dm" #include "modular_doppler\modular_medical\surgery\revival.dm" +#include "modular_doppler\modular_medical\surgery\organs\internal\cyberimp.dm" #include "modular_doppler\modular_medical\wounds\_wounds.dm" #include "modular_doppler\modular_medical\wounds\bleed.dm" #include "modular_doppler\modular_medical\wounds\medical.dm" From 46b4ce571bfab42ef97f21a6b8489b82520761ea Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Tue, 8 Oct 2024 01:36:14 +0200 Subject: [PATCH 10/52] =?UTF-8?q?forgot=20this=20=F0=9F=92=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modular_doppler/modular_quirks/implanted/implanted.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/modular_doppler/modular_quirks/implanted/implanted.dm b/modular_doppler/modular_quirks/implanted/implanted.dm index 2d9222fd752aa..65b79e54bce35 100644 --- a/modular_doppler/modular_quirks/implanted/implanted.dm +++ b/modular_doppler/modular_quirks/implanted/implanted.dm @@ -2,6 +2,7 @@ GLOBAL_LIST_INIT(possible_quirk_implants, list( "Engineering Toolset" = /obj/item/organ/internal/cyberimp/arm/toolset, "Surgery Toolset" = /obj/item/organ/internal/cyberimp/arm/surgery, "Hydroponics Toolset" = /obj/item/organ/internal/cyberimp/arm/botany, + "Sanitation Toolset" = /obj/item/organ/internal/cyberimp/arm/janitor, "Razorclaw Implant" = /obj/item/organ/internal/cyberimp/arm/razor_claws, "Excavator Implant" = /obj/item/organ/internal/cyberimp/arm/mining_drill, )) From c9cb2da5bda00787ddfb2fc392c974d03250c8ee Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Tue, 8 Oct 2024 15:47:26 +0200 Subject: [PATCH 11/52] left handed quirk i guess lol --- .../~doppler_defines/declarations.dm | 14 ------- code/__DEFINES/~doppler_defines/traits.dm | 37 +++++++++++++++++-- code/_globalvars/traits/_traits.dm | 3 +- code/_globalvars/traits/admin_tooling.dm | 3 +- .../surgery/organs/internal/cyberimp.dm | 15 ++++++++ .../implanted/code/preferences.dm | 20 ---------- .../modular_quirks/left_handed/left_handed.dm | 11 ++++++ .../permitted_cybernetic/code/preferences.dm | 20 ++++++++++ .../permitted_cybernetic.dm} | 29 +++++++++------ tgstation.dme | 6 +-- .../character_preferences/implanted.tsx | 4 +- 11 files changed, 105 insertions(+), 57 deletions(-) delete mode 100644 code/__DEFINES/~doppler_defines/declarations.dm delete mode 100644 modular_doppler/modular_quirks/implanted/code/preferences.dm create mode 100644 modular_doppler/modular_quirks/left_handed/left_handed.dm create mode 100644 modular_doppler/modular_quirks/permitted_cybernetic/code/preferences.dm rename modular_doppler/modular_quirks/{implanted/implanted.dm => permitted_cybernetic/permitted_cybernetic.dm} (64%) diff --git a/code/__DEFINES/~doppler_defines/declarations.dm b/code/__DEFINES/~doppler_defines/declarations.dm deleted file mode 100644 index d187334b7f873..0000000000000 --- a/code/__DEFINES/~doppler_defines/declarations.dm +++ /dev/null @@ -1,14 +0,0 @@ -/// Trait that changes the ending effects of twitch leaving your system -#define TRAIT_TWITCH_ADAPTED "twitch_adapted" -/// Given to the detective, if they have this, they can see syndicate special descriptions. -#define TRAIT_DETECTIVE "detective_ability" -/// Trait for the excitable quirk, woof! -#define TRAIT_EXCITABLE "wagwag" -/// Trait for hemophages particularly! -#define TRAIT_OXYIMMUNE "oxyimmune" // Immune to oxygen damage, ideally give this to all non-breathing species or bad stuff will happen -/// Trait for extra language point. -#define TRAIT_LINGUIST "linguist" -/// Trait that defines if an android species type is charging their cell -#define TRAIT_CHARGING "charging" -/// Trait for people with the implanted quirk -#define TRAIT_IMPLANTED "implanted" diff --git a/code/__DEFINES/~doppler_defines/traits.dm b/code/__DEFINES/~doppler_defines/traits.dm index 5abb9806d6d8f..bc5cd10f2bff6 100644 --- a/code/__DEFINES/~doppler_defines/traits.dm +++ b/code/__DEFINES/~doppler_defines/traits.dm @@ -1,20 +1,49 @@ +//// +// Skills +//// /// trait that lets you do xenoarch magnification #define TRAIT_XENOARCH_QUALIFIED "trait_xenoarch_qualified" - /// Traits granted by glassblowing #define TRAIT_GLASSBLOWING "glassblowing" - /// Trait that is applied whenever someone or something is glassblowing #define TRAIT_CURRENTLY_GLASSBLOWING "currently_glassblowing" +//// +// Species +//// +/// Trait for hemophages particularly! +#define TRAIT_OXYIMMUNE "oxyimmune" // Immune to oxygen damage, ideally give this to all non-breathing species or bad stuff will happen +/// Trait that defines if an android species type is charging their cell +#define TRAIT_CHARGING "charging" /// Trait which lets species pick from a list of animal traits, used by genemod + subtypes and anthromorphs #define TRAIT_ANIMALISTIC "animalistic" - // Green blood traits #define TRAIT_GREEN_BLOOD "green_blood" - // Trait that lets golems put stone limbs back on #define TRAIT_GOLEM_LIMBATTACHMENT "golem_limbattachment" +//// +// Quirks +//// +/// Trait for extra language point. +#define TRAIT_LINGUIST "linguist" +/// Trait for the excitable quirk, woof! +#define TRAIT_EXCITABLE "wagwag" +/// Trait for if you are left handed +#define TRAIT_LEFT_HANDED "left_handed" +/// Trait for people with the cybernetic quirk +#define TRAIT_PERMITTED_CYBERNETIC "permitted_cybernetic" + +//// +// Jobs +//// +/// Given to the detective, if they have this, they can see syndicate special descriptions. +#define TRAIT_DETECTIVE "detective_ability" + +//// +// Reagents +//// /// Trait that was granted by a reagent. #define REAGENT_TRAIT "reagent" +/// Trait that changes the ending effects of twitch leaving your system +#define TRAIT_TWITCH_ADAPTED "twitch_adapted" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 0b62f7486cadf..b61876319f308 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -700,8 +700,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TWITCH_ADAPTED" = TRAIT_TWITCH_ADAPTED, "TRAIT_GOLEM_LIMBATTACHMENT" = TRAIT_GOLEM_LIMBATTACHMENT, "TRAIT_LINGUIST" = TRAIT_LINGUIST, - "TRAIT_IMPLANTED" = TRAIT_IMPLANTED, + "TRAIT_PERMITTED_CYBERNETIC" = TRAIT_PERMITTED_CYBERNETIC, "TRAIT_CHARGING" = TRAIT_CHARGING, + "TRAIT_LEFT_HANDED" = TRAIT_LEFT_HANDED, ), // DOPPLER EDIT ADDITION END )) diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 52e4b0a6a5834..ebeac9c899904 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -383,8 +383,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_EXCITABLE" = TRAIT_EXCITABLE, "TRAIT_TWITCH_ADAPTED" = TRAIT_TWITCH_ADAPTED, "TRAIT_LINGUIST" = TRAIT_LINGUIST, - "TRAIT_IMPLANTED" = TRAIT_IMPLANTED, + "TRAIT_PERMITTED_CYBERNETIC" = TRAIT_PERMITTED_CYBERNETIC, "TRAIT_CHARGING" = TRAIT_CHARGING, + "TRAIT_LEFT_HANDED" = TRAIT_LEFT_HANDED, ), // DOPPLER EDIT ADDITION END )) diff --git a/modular_doppler/modular_medical/surgery/organs/internal/cyberimp.dm b/modular_doppler/modular_medical/surgery/organs/internal/cyberimp.dm index e7b5ff2498f7a..eedf7f6b64a16 100644 --- a/modular_doppler/modular_medical/surgery/organs/internal/cyberimp.dm +++ b/modular_doppler/modular_medical/surgery/organs/internal/cyberimp.dm @@ -1,3 +1,6 @@ +/obj/item/organ/internal/cyberimp/arm/surgery/l + zone = BODY_ZONE_L_ARM + /obj/item/organ/internal/cyberimp/arm/botany name = "hydroponics toolset implant" desc = "A rather simple arm implant containing tools used in gardening and botanical research." @@ -11,6 +14,9 @@ /obj/item/secateurs, ) +/obj/item/organ/internal/cyberimp/arm/botany/l + zone = BODY_ZONE_L_ARM + /obj/item/implant_mounted_chainsaw name = "integrated chainsaw" desc = "A chainsaw that conceals inside your arm." @@ -51,6 +57,9 @@ /obj/item/wirebrush, ) +/obj/item/organ/internal/cyberimp/arm/janitor/l + zone = BODY_ZONE_L_ARM + /obj/item/organ/internal/cyberimp/arm/janitor/emag_act() if(obj_flags & EMAGGED) return FALSE @@ -71,6 +80,9 @@ extend_sound = 'sound/items/unsheath.ogg' retract_sound = 'sound/items/sheath.ogg' +/obj/item/organ/internal/cyberimp/arm/razor_claws/l + zone = BODY_ZONE_L_ARM + /datum/action/item_action/organ_action/toggle/razor_claws name = "Extend Claws" desc = "You can also activate the claws in your hand to change their mode." @@ -169,6 +181,9 @@ /// The bodypart overlay datum we should apply to whatever mob we are put into's someone's arm var/datum/bodypart_overlay/simple/steel_drill/drill_overlay +/obj/item/organ/internal/cyberimp/arm/mining_drill/l + zone = BODY_ZONE_L_ARM + /datum/bodypart_overlay/simple/steel_drill icon = 'modular_doppler/modular_medical/icons/implants_onmob.dmi' layers = EXTERNAL_FRONT diff --git a/modular_doppler/modular_quirks/implanted/code/preferences.dm b/modular_doppler/modular_quirks/implanted/code/preferences.dm deleted file mode 100644 index d35eaf20c446b..0000000000000 --- a/modular_doppler/modular_quirks/implanted/code/preferences.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum/preference/choiced/implanted_quirk - category = PREFERENCE_CATEGORY_MANUALLY_RENDERED - savefile_key = "implanted_quirk" - savefile_identifier = PREFERENCE_CHARACTER - can_randomize = FALSE - -/datum/preference/choiced/implanted_quirk/init_possible_values() - return list("Random") + assoc_to_keys(GLOB.possible_quirk_implants) - -/datum/preference/choiced/implanted_quirk/create_default_value() - return "Random" - -/datum/preference/choiced/implanted_quirk/is_accessible(datum/preferences/preferences) - if (!..()) - return FALSE - - return "Implanted" in preferences.all_quirks - -/datum/preference/choiced/implanted_quirk/apply_to_human(mob/living/carbon/human/target, value) - return diff --git a/modular_doppler/modular_quirks/left_handed/left_handed.dm b/modular_doppler/modular_quirks/left_handed/left_handed.dm new file mode 100644 index 0000000000000..e6bf37260744c --- /dev/null +++ b/modular_doppler/modular_quirks/left_handed/left_handed.dm @@ -0,0 +1,11 @@ +/datum/quirk/left_handed + name = "Left Handed" + desc = "test" + icon = FA_ICON_HAND + value = 0 + mob_trait = TRAIT_LEFT_HANDED + gain_text = span_notice("test") + lose_text = span_notice("test") + medical_record_text = "test" + mail_goodies = list( + ) diff --git a/modular_doppler/modular_quirks/permitted_cybernetic/code/preferences.dm b/modular_doppler/modular_quirks/permitted_cybernetic/code/preferences.dm new file mode 100644 index 0000000000000..056b0caf0939c --- /dev/null +++ b/modular_doppler/modular_quirks/permitted_cybernetic/code/preferences.dm @@ -0,0 +1,20 @@ +/datum/preference/choiced/permitted_cybernetic + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "permitted_cybernetic" + savefile_identifier = PREFERENCE_CHARACTER + can_randomize = FALSE + +/datum/preference/choiced/permitted_cybernetic/init_possible_values() + return list("Random") + assoc_to_keys(GLOB.possible_quirk_implants) + +/datum/preference/choiced/permitted_cybernetic/create_default_value() + return "Random" + +/datum/preference/choiced/permitted_cybernetic/is_accessible(datum/preferences/preferences) + if (!..()) + return FALSE + + return "Permitted Cybernetic" in preferences.all_quirks + +/datum/preference/choiced/permitted_cybernetic/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/modular_doppler/modular_quirks/implanted/implanted.dm b/modular_doppler/modular_quirks/permitted_cybernetic/permitted_cybernetic.dm similarity index 64% rename from modular_doppler/modular_quirks/implanted/implanted.dm rename to modular_doppler/modular_quirks/permitted_cybernetic/permitted_cybernetic.dm index 65b79e54bce35..9f5be89e2768c 100644 --- a/modular_doppler/modular_quirks/implanted/implanted.dm +++ b/modular_doppler/modular_quirks/permitted_cybernetic/permitted_cybernetic.dm @@ -7,33 +7,38 @@ GLOBAL_LIST_INIT(possible_quirk_implants, list( "Excavator Implant" = /obj/item/organ/internal/cyberimp/arm/mining_drill, )) -/datum/quirk/implanted_quirk - name = "Implanted" +/datum/quirk/permitted_cybernetic + name = "Permitted Cybernetic" desc = "test" value = 8 - mob_trait = TRAIT_IMPLANTED + mob_trait = TRAIT_PERMITTED_CYBERNETIC gain_text = span_notice("test") lose_text = span_danger("test") icon = FA_ICON_WRENCH /datum/quirk_constant_data/implanted - associated_typepath = /datum/quirk/implanted_quirk - customization_options = list(/datum/preference/choiced/implanted_quirk) + associated_typepath = /datum/quirk/permitted_cybernetic + customization_options = list(/datum/preference/choiced/permitted_cybernetic) -/datum/quirk/implanted_quirk/add_unique(client/client_source) - var/desired_implant = GLOB.possible_quirk_implants[client_source?.prefs?.read_preference(/datum/preference/choiced/implanted_quirk)] - if(isnull(desired_implant)) //Client gone or they chose a random prosthetic +/datum/quirk/permitted_cybernetic/add_unique(client/client_source) + var/obj/item/organ/desired_implant = GLOB.possible_quirk_implants[client_source?.prefs?.read_preference(/datum/preference/choiced/permitted_cybernetic)] + if(isnull(desired_implant)) //Client gone or they chose a random implant desired_implant = GLOB.possible_quirk_implants[pick(GLOB.possible_quirk_implants)] + var/mob/living/carbon/human/human_holder = quirk_holder + if(desired_implant.zone in GLOB.arm_zones) + if(HAS_TRAIT(human_holder, TRAIT_LEFT_HANDED)) //Left handed person? Give them a leftie implant + desired_implant = text2path("[desired_implant]/l") + var/obj/item/organ/internal/cybernetic = new desired_implant() cybernetic.Insert(human_holder, special = TRUE, movement_flags = DELETE_IF_REPLACED) - medical_record_text = "Patient has an approved [cybernetic.name] installed within their body." + medical_record_text = "Patient has a company approved [cybernetic.name] installed within their body." -/datum/quirk/implanted_quirk/add(client/client_source) +/datum/quirk/permitted_cybernetic/add(client/client_source) . = ..() quirk_holder.update_implanted_hud() -/datum/quirk/implanted_quirk/remove() +/datum/quirk/permitted_cybernetic/remove() var/mob/living/old_holder = quirk_holder . = ..() old_holder.update_implanted_hud() @@ -51,7 +56,7 @@ GLOBAL_LIST_INIT(possible_quirk_implants, list( var/icon/temporary_icon = icon(icon, icon_state, dir) quirk_holder.pixel_y = temporary_icon.Height() - world.icon_size - if(HAS_TRAIT(src, TRAIT_IMPLANTED)) + if(HAS_TRAIT(src, TRAIT_PERMITTED_CYBERNETIC)) set_hud_image_active(SEC_IMPLANT_HUD) quirk_holder.icon = 'modular_doppler/overwrites/huds/hud.dmi' quirk_holder.icon_state = "hud_imp_quirk" diff --git a/tgstation.dme b/tgstation.dme index faf94e6327dbc..452565f114d11 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -405,7 +405,6 @@ #include "code\__DEFINES\~doppler_defines\cells.dm" #include "code\__DEFINES\~doppler_defines\colony_fabricator_misc.dm" #include "code\__DEFINES\~doppler_defines\construction.dm" -#include "code\__DEFINES\~doppler_defines\declarations.dm" #include "code\__DEFINES\~doppler_defines\DNA.dm" #include "code\__DEFINES\~doppler_defines\enterprise_resource_planning.dm" #include "code\__DEFINES\~doppler_defines\examinemore.dm" @@ -6837,14 +6836,15 @@ #include "modular_doppler\modular_mood\code\mood_events\hotspring.dm" #include "modular_doppler\modular_mood\code\mood_events\race_drink.dm" #include "modular_doppler\modular_quirks\excitable\excitable.dm" -#include "modular_doppler\modular_quirks\implanted\implanted.dm" -#include "modular_doppler\modular_quirks\implanted\code\preferences.dm" +#include "modular_doppler\modular_quirks\left_handed\left_handed.dm" #include "modular_doppler\modular_quirks\linguist\linguist.dm" #include "modular_doppler\modular_quirks\paycheck_rations\code\quirk.dm" #include "modular_doppler\modular_quirks\paycheck_rations\code\rationpacks.dm" #include "modular_doppler\modular_quirks\paycheck_rations\code\reagents.dm" #include "modular_doppler\modular_quirks\paycheck_rations\code\ticket_book.dm" #include "modular_doppler\modular_quirks\paycheck_rations\code\tickets.dm" +#include "modular_doppler\modular_quirks\permitted_cybernetic\permitted_cybernetic.dm" +#include "modular_doppler\modular_quirks\permitted_cybernetic\code\preferences.dm" #include "modular_doppler\modular_sounds\code\sounds.dm" #include "modular_doppler\modular_species\_species.dm" #include "modular_doppler\modular_species\code\bloodsplatter.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/implanted.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/implanted.tsx index d526e62e6cac4..68788cbd83887 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/implanted.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/implanted.tsx @@ -1,7 +1,7 @@ import { FeatureChoiced } from '../base'; import { FeatureDropdownInput } from '../dropdowns'; -export const implanted_quirk: FeatureChoiced = { - name: 'Implanted', +export const permitted_cybernetic: FeatureChoiced = { + name: 'Permitted Cybernetic', component: FeatureDropdownInput, }; From a4210df5844ab5048cb71f58d584ac67025bda2e Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Tue, 8 Oct 2024 16:51:44 +0200 Subject: [PATCH 12/52] bug blood --- code/__DEFINES/~doppler_defines/is_helpers.dm | 2 +- .../modular_species/code/bloodsplatter.dm | 12 ------------ .../species_types/flypeople/flypeople.dm | 3 +++ .../species_types/insectoid/insectoid.dm | 2 +- .../species_types/snails/modular_snail.dm | 2 +- tgstation.dme | 1 + 6 files changed, 7 insertions(+), 15 deletions(-) create mode 100644 modular_doppler/modular_species/species_types/flypeople/flypeople.dm diff --git a/code/__DEFINES/~doppler_defines/is_helpers.dm b/code/__DEFINES/~doppler_defines/is_helpers.dm index b5acc5258dd11..37db4019befb1 100644 --- a/code/__DEFINES/~doppler_defines/is_helpers.dm +++ b/code/__DEFINES/~doppler_defines/is_helpers.dm @@ -6,4 +6,4 @@ #define ishemophage(A) (is_species(A, /datum/species/genemod/hemophage)) #define isramatan(A) (is_species(A, /datum/species/ramatan)) //Species with green blood -#define hasgreenblood(A) (isinsectoid(A) || issnail(A) || HAS_TRAIT(A, TRAIT_GREEN_BLOOD)) +#define hasgreenblood(A) (isinsectoid(A) || issnail(A) || isflyperson(A) || HAS_TRAIT(A, TRAIT_GREEN_BLOOD)) diff --git a/modular_doppler/modular_species/code/bloodsplatter.dm b/modular_doppler/modular_species/code/bloodsplatter.dm index 87422a7f69508..0da691dc38dfb 100644 --- a/modular_doppler/modular_species/code/bloodsplatter.dm +++ b/modular_doppler/modular_species/code/bloodsplatter.dm @@ -1,15 +1,3 @@ -/// Green blood reagent -/datum/reagent/blood/green - data = list("viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null) - name = "insect blood" - color = "#50c034" // rgb: 0, 200, 0 - metabolization_rate = 12.5 * REAGENTS_METABOLISM //fast rate so it disappears fast. - taste_description = "iron" - taste_mult = 1.3 - penetrates_skin = NONE - ph = 7.4 - default_container = /obj/item/reagent_containers/blood - /// In this .dm we make a green bloodsplatter subtype // Using the xenoblood icons /obj/effect/decal/cleanable/blood/hitsplatter/green diff --git a/modular_doppler/modular_species/species_types/flypeople/flypeople.dm b/modular_doppler/modular_species/species_types/flypeople/flypeople.dm new file mode 100644 index 0000000000000..ec837892e94e8 --- /dev/null +++ b/modular_doppler/modular_species/species_types/flypeople/flypeople.dm @@ -0,0 +1,3 @@ +/datum/species/fly + exotic_blood = /datum/reagent/bug_blood + exotic_bloodtype = "I*" diff --git a/modular_doppler/modular_species/species_types/insectoid/insectoid.dm b/modular_doppler/modular_species/species_types/insectoid/insectoid.dm index a7b36b3d2b590..03407ac158c0b 100644 --- a/modular_doppler/modular_species/species_types/insectoid/insectoid.dm +++ b/modular_doppler/modular_species/species_types/insectoid/insectoid.dm @@ -13,7 +13,7 @@ inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID payday_modifier = 1.0 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT - exotic_blood = /datum/reagent/blood/green + exotic_blood = /datum/reagent/bug_blood exotic_bloodtype = "I*" digitigrade_customization = DIGITIGRADE_OPTIONAL diff --git a/modular_doppler/modular_species/species_types/snails/modular_snail.dm b/modular_doppler/modular_species/species_types/snails/modular_snail.dm index e18aa0f758227..94ec105c61e4e 100644 --- a/modular_doppler/modular_species/species_types/snails/modular_snail.dm +++ b/modular_doppler/modular_species/species_types/snails/modular_snail.dm @@ -3,7 +3,7 @@ /datum/species/snail mutantliver = /obj/item/organ/internal/liver/snail //This is just a better liver to deal with toxins, it's a thematic thing. mutantheart = /obj/item/organ/internal/heart/snail //This gives them the shell buff where they take less damage from behind, and their heart's more durable. - exotic_blood = /datum/reagent/blood/green + exotic_blood = /datum/reagent/bug_blood exotic_bloodtype = "I*" digitigrade_customization = DIGITIGRADE_OPTIONAL diff --git a/tgstation.dme b/tgstation.dme index be5a3764a68b1..e438a10adf86a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6858,6 +6858,7 @@ #include "modular_doppler\modular_species\species_types\aquatic\aquatic.dm" #include "modular_doppler\modular_species\species_types\aquatic\aquatic_bodyparts.dm" #include "modular_doppler\modular_species\species_types\ethereal\ethereal.dm" +#include "modular_doppler\modular_species\species_types\flypeople\flypeople.dm" #include "modular_doppler\modular_species\species_types\genemod\genemod.dm" #include "modular_doppler\modular_species\species_types\golem\golem.dm" #include "modular_doppler\modular_species\species_types\hemophage\_hemophage_defines.dm" From 40fa98b2e7d66acf455b666320265465754dba66 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Tue, 8 Oct 2024 18:52:01 +0200 Subject: [PATCH 13/52] make the code work --- .../~doppler_defines/mutant_blacklists.dm | 1 + .../preferences/antennae.dm | 5 +- .../preferences/body_marking_lizard.dm | 7 --- .../preferences/cyber_limbs.dm | 12 ++--- .../modular_customization/preferences/ears.dm | 49 +++++++++++++++--- .../preferences/fluff.dm | 5 +- .../preferences/frills.dm | 5 +- .../preferences/horns.dm | 5 +- .../preferences/snout.dm | 5 +- .../modular_customization/preferences/tail.dm | 50 +++++++++++++++++-- .../preferences/wings.dm | 10 +++- .../permitted_cybernetic.dm | 7 +++ modular_doppler/modular_species/_species.dm | 4 +- 13 files changed, 131 insertions(+), 34 deletions(-) diff --git a/code/__DEFINES/~doppler_defines/mutant_blacklists.dm b/code/__DEFINES/~doppler_defines/mutant_blacklists.dm index f695d0626c73d..d0e8c707ab1aa 100644 --- a/code/__DEFINES/~doppler_defines/mutant_blacklists.dm +++ b/code/__DEFINES/~doppler_defines/mutant_blacklists.dm @@ -4,4 +4,5 @@ GLOBAL_LIST_INIT(species_blacklist_no_mutant, list( GLOBAL_LIST_INIT(species_blacklist_no_humanoid, list( /datum/species/golem, + /datum/species/genemod/primitive, )) diff --git a/modular_doppler/modular_customization/preferences/antennae.dm b/modular_doppler/modular_customization/preferences/antennae.dm index b44f1c156a80d..29d596e3f6996 100644 --- a/modular_doppler/modular_customization/preferences/antennae.dm +++ b/modular_doppler/modular_customization/preferences/antennae.dm @@ -1,6 +1,6 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() - if(target.dna.features["moth_antennae"]) + if(target.dna.features["moth_antennae"] && !(type in GLOB.species_blacklist_no_mutant)) if(target.dna.features["moth_antennae"] != /datum/sprite_accessory/moth_antennae/none::name && target.dna.features["moth_antennae"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/external/antennae) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -37,6 +37,9 @@ /datum/preference/choiced/moth_antennae/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/has_antennae = preferences.read_preference(/datum/preference/toggle/antennae) if(has_antennae == TRUE) return TRUE diff --git a/modular_doppler/modular_customization/preferences/body_marking_lizard.dm b/modular_doppler/modular_customization/preferences/body_marking_lizard.dm index f01bbd0f83ab7..bcadc48e0fde7 100644 --- a/modular_doppler/modular_customization/preferences/body_marking_lizard.dm +++ b/modular_doppler/modular_customization/preferences/body_marking_lizard.dm @@ -48,13 +48,6 @@ /datum/preference/toggle/markings/create_default_value() return FALSE -/datum/preference/toggle/markings/is_accessible(datum/preferences/preferences) - . = ..() - var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) - return FALSE - return TRUE - //toggle pref integration /datum/preference/choiced/lizard_body_markings category = PREFERENCE_CATEGORY_CLOTHING diff --git a/modular_doppler/modular_customization/preferences/cyber_limbs.dm b/modular_doppler/modular_customization/preferences/cyber_limbs.dm index c3e2a009c3e06..a7f599be6c7b8 100644 --- a/modular_doppler/modular_customization/preferences/cyber_limbs.dm +++ b/modular_doppler/modular_customization/preferences/cyber_limbs.dm @@ -38,15 +38,14 @@ GLOBAL_LIST_INIT(frame_type_names, list( /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() - if(target.dna.features["frame_list"]) + if(target.dna.features["frame_list"] && !(type in GLOB.species_blacklist_no_humanoid)) //head - if(target.dna.features["frame_list"][BODY_ZONE_HEAD]) + if(target.dna.features["frame_list"][BODY_ZONE_HEAD] && type == /datum/species/android) var/obj/item/bodypart/head/old_limb = target.get_bodypart(BODY_ZONE_HEAD) old_limb.drop_limb(TRUE, FALSE, FALSE) old_limb.moveToNullspace() var/obj/item/bodypart/head/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_HEAD]) replacement.try_attach_limb(target, TRUE) - return . //chest if(target.dna.features["frame_list"][BODY_ZONE_CHEST]) var/obj/item/bodypart/chest/old_limb = target.get_bodypart(BODY_ZONE_CHEST) @@ -54,7 +53,6 @@ GLOBAL_LIST_INIT(frame_type_names, list( old_limb.moveToNullspace() var/obj/item/bodypart/chest/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_CHEST]) replacement.try_attach_limb(target, TRUE) - return . //right arm if(target.dna.features["frame_list"][BODY_ZONE_R_ARM]) var/obj/item/bodypart/arm/right/old_limb = target.get_bodypart(BODY_ZONE_R_ARM) @@ -62,7 +60,6 @@ GLOBAL_LIST_INIT(frame_type_names, list( old_limb.moveToNullspace() var/obj/item/bodypart/arm/right/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_R_ARM]) replacement.try_attach_limb(target, TRUE) - return . //left arm if(target.dna.features["frame_list"][BODY_ZONE_L_ARM]) var/obj/item/bodypart/arm/left/old_limb = target.get_bodypart(BODY_ZONE_L_ARM) @@ -70,7 +67,6 @@ GLOBAL_LIST_INIT(frame_type_names, list( old_limb.moveToNullspace() var/obj/item/bodypart/arm/left/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_L_ARM]) replacement.try_attach_limb(target, TRUE) - return . //right leg if(target.dna.features["frame_list"][BODY_ZONE_R_LEG]) var/obj/item/bodypart/leg/right/old_limb = target.get_bodypart(BODY_ZONE_R_LEG) @@ -78,7 +74,6 @@ GLOBAL_LIST_INIT(frame_type_names, list( old_limb.moveToNullspace() var/obj/item/bodypart/leg/right/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_R_LEG]) replacement.try_attach_limb(target, TRUE) - return . //left leg if(target.dna.features["frame_list"][BODY_ZONE_L_LEG]) var/obj/item/bodypart/leg/left/old_limb = target.get_bodypart(BODY_ZONE_L_LEG) @@ -86,8 +81,7 @@ GLOBAL_LIST_INIT(frame_type_names, list( old_limb.moveToNullspace() var/obj/item/bodypart/leg/left/replacement = SSwardrobe.provide_type(target.dna.features["frame_list"][BODY_ZONE_L_LEG]) replacement.try_attach_limb(target, TRUE) - return . - + return . // Head /datum/preference/choiced/head_type diff --git a/modular_doppler/modular_customization/preferences/ears.dm b/modular_doppler/modular_customization/preferences/ears.dm index ebd4994c8510d..03fb895a8d247 100644 --- a/modular_doppler/modular_customization/preferences/ears.dm +++ b/modular_doppler/modular_customization/preferences/ears.dm @@ -36,7 +36,7 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() - if(target.dna.features["ears"]) + if(target.dna.features["ears"] && !(type in GLOB.species_blacklist_no_mutant)) if(target.dna.ear_type == NO_VARIATION) return . else if(target.dna.features["ears"] != /datum/sprite_accessory/ears/none::name && target.dna.features["ears"] != /datum/sprite_accessory/blank::name) @@ -44,11 +44,6 @@ var/obj/item/organ/replacement = SSwardrobe.provide_type(organ_path) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - var/obj/item/organ/internal/ears/old_part = target.get_organ_slot(ORGAN_SLOT_EARS) - if(istype(old_part)) - old_part.Remove(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) - old_part.moveToNullspace() - /// Dropdown to select which ears you'll be rocking /datum/preference/choiced/ear_variation @@ -85,6 +80,9 @@ /datum/preference/choiced/ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == CAT) return TRUE @@ -116,6 +114,9 @@ /datum/preference/choiced/lizard_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == LIZARD) return TRUE @@ -146,6 +147,9 @@ /datum/preference/choiced/fox_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == FOX) return TRUE @@ -176,6 +180,9 @@ /datum/preference/choiced/dog_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == DOG) return TRUE @@ -206,6 +213,9 @@ /datum/preference/choiced/bunny_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == BUNNY) return TRUE @@ -236,6 +246,9 @@ /datum/preference/choiced/bird_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == BIRD) return TRUE @@ -266,6 +279,9 @@ /datum/preference/choiced/mouse_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == MOUSE) return TRUE @@ -296,6 +312,9 @@ /datum/preference/choiced/monkey_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == MONKEY) return TRUE @@ -326,6 +345,9 @@ /datum/preference/choiced/deer_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == DEER) return TRUE @@ -356,6 +378,9 @@ /datum/preference/choiced/fish_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == FISH) return TRUE @@ -386,6 +411,9 @@ /datum/preference/choiced/bug_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == BUG) return TRUE @@ -416,6 +444,9 @@ /datum/preference/choiced/humanoid_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == HUMANOID) return TRUE @@ -446,6 +477,9 @@ /datum/preference/choiced/synthetic_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == SYNTHETIC) return TRUE @@ -476,6 +510,9 @@ /datum/preference/choiced/alien_ears/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == ALIEN) return TRUE diff --git a/modular_doppler/modular_customization/preferences/fluff.dm b/modular_doppler/modular_customization/preferences/fluff.dm index 36f98118ae14d..709ef1b4fea28 100644 --- a/modular_doppler/modular_customization/preferences/fluff.dm +++ b/modular_doppler/modular_customization/preferences/fluff.dm @@ -7,7 +7,7 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() - if(target.dna.features["fluff"]) + if(target.dna.features["fluff"] && !(type in GLOB.species_blacklist_no_mutant)) if(target.dna.features["fluff"] != /datum/sprite_accessory/fluff/none::name && target.dna.features["fluff"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/external/fluff) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -51,6 +51,9 @@ /datum/preference/choiced/fluff/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/has_fluff = preferences.read_preference(/datum/preference/toggle/fluff) if(has_fluff) return TRUE diff --git a/modular_doppler/modular_customization/preferences/frills.dm b/modular_doppler/modular_customization/preferences/frills.dm index ec4c3bc6b5f45..788d84ea09ab6 100644 --- a/modular_doppler/modular_customization/preferences/frills.dm +++ b/modular_doppler/modular_customization/preferences/frills.dm @@ -44,7 +44,7 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() - if(target.dna.features["frills"]) + if(target.dna.features["frills"] && !(type in GLOB.species_blacklist_no_mutant)) if(target.dna.features["frills"] != /datum/sprite_accessory/frills/none::name && target.dna.features["frills"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/external/frills) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -60,6 +60,9 @@ /datum/preference/choiced/lizard_frills/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/has_frills = preferences.read_preference(/datum/preference/toggle/frills) if(has_frills == TRUE) return TRUE diff --git a/modular_doppler/modular_customization/preferences/horns.dm b/modular_doppler/modular_customization/preferences/horns.dm index d2694dac26a97..a47a60cd1fedc 100644 --- a/modular_doppler/modular_customization/preferences/horns.dm +++ b/modular_doppler/modular_customization/preferences/horns.dm @@ -62,7 +62,7 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() - if(target.dna.features["horns"]) + if(target.dna.features["horns"] && !(type in GLOB.species_blacklist_no_mutant)) if(target.dna.features["horns"] != /datum/sprite_accessory/horns/none::name && target.dna.features["horns"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/external/horns) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -78,6 +78,9 @@ /datum/preference/choiced/lizard_horns/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/has_horns = preferences.read_preference(/datum/preference/toggle/horns) if(has_horns == TRUE) return TRUE diff --git a/modular_doppler/modular_customization/preferences/snout.dm b/modular_doppler/modular_customization/preferences/snout.dm index 793ca9e26e26c..f40ca4532386c 100644 --- a/modular_doppler/modular_customization/preferences/snout.dm +++ b/modular_doppler/modular_customization/preferences/snout.dm @@ -1,6 +1,6 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() - if(target.dna.features["snout"]) + if(target.dna.features["snout"] && !(type in GLOB.species_blacklist_no_mutant)) if(target.dna.features["snout"] != /datum/sprite_accessory/snouts/none::name && target.dna.features["snout"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/external/snout) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -36,6 +36,9 @@ /datum/preference/choiced/lizard_snout/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/has_snout = preferences.read_preference(/datum/preference/toggle/snout) if(has_snout == TRUE) return TRUE diff --git a/modular_doppler/modular_customization/preferences/tail.dm b/modular_doppler/modular_customization/preferences/tail.dm index a1fa8c0abdfba..fb091599cd9d8 100644 --- a/modular_doppler/modular_customization/preferences/tail.dm +++ b/modular_doppler/modular_customization/preferences/tail.dm @@ -37,19 +37,19 @@ if(!ishuman(target)) return - if(target.dna.features["tail_lizard"] != /datum/sprite_accessory/tails/lizard/none::name && target.dna.features["tail_lizard"] != /datum/sprite_accessory/blank::name) + if(target.dna.features["tail_lizard"] != /datum/sprite_accessory/tails/lizard/none::name && !(type in GLOB.species_blacklist_no_mutant) && target.dna.features["tail_lizard"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/external/tail/lizard) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - else if(target.dna.features["tail_cat"] != /datum/sprite_accessory/tails/human/none::name && target.dna.features["tail_cat"] != /datum/sprite_accessory/blank::name) + else if(target.dna.features["tail_cat"] != /datum/sprite_accessory/tails/human/none::name && !(type in GLOB.species_blacklist_no_mutant) && target.dna.features["tail_cat"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/external/tail/cat) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - else if(target.dna.features["tail_monkey"] != /datum/sprite_accessory/tails/monkey/none::name && target.dna.features["tail_monkey"] != /datum/sprite_accessory/blank::name) + else if(target.dna.features["tail_monkey"] != /datum/sprite_accessory/tails/monkey/none::name && !(type in GLOB.species_blacklist_no_mutant) && target.dna.features["tail_monkey"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/external/tail/monkey) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - else if((target.dna.features["tail_other"] != /datum/sprite_accessory/tails/lizard/none::name && target.dna.features["tail_other"] != /datum/sprite_accessory/blank::name) && (target.dna.tail_type != NO_VARIATION)) + else if((target.dna.features["tail_other"] != /datum/sprite_accessory/tails/lizard/none::name && !(type in GLOB.species_blacklist_no_mutant) && target.dna.features["tail_other"] != /datum/sprite_accessory/blank::name) && (target.dna.tail_type != NO_VARIATION)) var/obj/item/organ/organ_path = text2path("/obj/item/organ/external/tail/[target.dna.tail_type]") var/obj/item/organ/replacement = SSwardrobe.provide_type(organ_path) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -120,6 +120,9 @@ /datum/preference/choiced/lizard_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == LIZARD) return TRUE @@ -144,6 +147,9 @@ /datum/preference/choiced/tail_human/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == CAT) return TRUE @@ -173,6 +179,9 @@ /datum/preference/choiced/dog_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == DOG) return TRUE @@ -203,6 +212,9 @@ /datum/preference/choiced/fox_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == FOX) return TRUE @@ -233,6 +245,9 @@ /datum/preference/choiced/bunny_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == BUNNY) return TRUE @@ -263,6 +278,9 @@ /datum/preference/choiced/mouse_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == MOUSE) return TRUE @@ -293,6 +311,9 @@ /datum/preference/choiced/bird_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == BIRD) return TRUE @@ -318,6 +339,9 @@ /datum/preference/choiced/monkey_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == MONKEY) return TRUE @@ -347,6 +371,9 @@ /datum/preference/choiced/deer_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == DEER) return TRUE @@ -377,6 +404,9 @@ /datum/preference/choiced/fish_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == FISH) return TRUE @@ -407,6 +437,9 @@ /datum/preference/choiced/bug_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == BUG) return TRUE @@ -437,6 +470,9 @@ /datum/preference/choiced/synth_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == SYNTHETIC) return TRUE @@ -467,6 +503,9 @@ /datum/preference/choiced/humanoid_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == HUMANOID) return TRUE @@ -497,6 +536,9 @@ /datum/preference/choiced/alien_tail/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == ALIEN) return TRUE diff --git a/modular_doppler/modular_customization/preferences/wings.dm b/modular_doppler/modular_customization/preferences/wings.dm index 438860f888c1b..a8462d0b6ef06 100644 --- a/modular_doppler/modular_customization/preferences/wings.dm +++ b/modular_doppler/modular_customization/preferences/wings.dm @@ -17,14 +17,14 @@ if(!ishuman(target)) return - if(target.dna.features["moth_wings"]) + if(target.dna.features["moth_wings"] && !(type in GLOB.species_blacklist_no_mutant)) if(target.dna.wing_type == NO_VARIATION) return . if((target.dna.features["moth_wings"] != /datum/sprite_accessory/moth_wings/none::name && target.dna.features["moth_wings"] != /datum/sprite_accessory/blank::name)) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/external/wings/moth) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - if(target.dna.features["wings"]) + if(target.dna.features["wings"] && !(type in GLOB.species_blacklist_no_mutant)) if(target.dna.features["wings"] != /datum/sprite_accessory/wings_more/none::name && target.dna.features["wings"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/external/wings/more) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -78,6 +78,9 @@ /datum/preference/choiced/wings/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/wing_variation) if(chosen_variation == "Wings") return TRUE @@ -102,6 +105,9 @@ /datum/preference/choiced/moth_wings/is_accessible(datum/preferences/preferences) . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(species.type in GLOB.species_blacklist_no_mutant) + return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/wing_variation) if(chosen_variation == "Moth Wings") return TRUE diff --git a/modular_doppler/modular_quirks/permitted_cybernetic/permitted_cybernetic.dm b/modular_doppler/modular_quirks/permitted_cybernetic/permitted_cybernetic.dm index 9f5be89e2768c..81fd01b62605f 100644 --- a/modular_doppler/modular_quirks/permitted_cybernetic/permitted_cybernetic.dm +++ b/modular_doppler/modular_quirks/permitted_cybernetic/permitted_cybernetic.dm @@ -30,6 +30,9 @@ GLOBAL_LIST_INIT(possible_quirk_implants, list( if(HAS_TRAIT(human_holder, TRAIT_LEFT_HANDED)) //Left handed person? Give them a leftie implant desired_implant = text2path("[desired_implant]/l") + if(human_holder.dna.species.type in GLOB.species_blacklist_no_humanoid) + return + var/obj/item/organ/internal/cybernetic = new desired_implant() cybernetic.Insert(human_holder, special = TRUE, movement_flags = DELETE_IF_REPLACED) medical_record_text = "Patient has a company approved [cybernetic.name] installed within their body." @@ -56,6 +59,10 @@ GLOBAL_LIST_INIT(possible_quirk_implants, list( var/icon/temporary_icon = icon(icon, icon_state, dir) quirk_holder.pixel_y = temporary_icon.Height() - world.icon_size + if(ishuman(src)) + var/mob/living/carbon/human/target = src + if(target.dna.species.type in GLOB.species_blacklist_no_humanoid) + return if(HAS_TRAIT(src, TRAIT_PERMITTED_CYBERNETIC)) set_hud_image_active(SEC_IMPLANT_HUD) quirk_holder.icon = 'modular_doppler/overwrites/huds/hud.dmi' diff --git a/modular_doppler/modular_species/_species.dm b/modular_doppler/modular_species/_species.dm index 19582936639a5..00048be82343c 100644 --- a/modular_doppler/modular_species/_species.dm +++ b/modular_doppler/modular_species/_species.dm @@ -23,7 +23,9 @@ // Used for most races /datum/species/on_species_gain(mob/living/carbon/human/target, datum/species/old_species, pref_load) var/list/frame_bodyparts = target.dna.features["frame_list"] - if(frame_bodyparts && frame_bodyparts[BODY_ZONE_HEAD]) + if(type in GLOB.species_blacklist_no_humanoid) + return ..() + if(type == /datum/species/android && frame_bodyparts && frame_bodyparts[BODY_ZONE_HEAD]) bodypart_overrides[BODY_ZONE_HEAD] = frame_bodyparts[BODY_ZONE_HEAD] if(frame_bodyparts && frame_bodyparts[BODY_ZONE_CHEST]) bodypart_overrides[BODY_ZONE_CHEST] = frame_bodyparts[BODY_ZONE_CHEST] From 364be006ec277727303a34f6700831a01f565a37 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Tue, 8 Oct 2024 19:32:00 +0200 Subject: [PATCH 14/52] why was this unticked i didnt even touch it --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index e438a10adf86a..8291cee71e938 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6839,6 +6839,7 @@ #include "modular_doppler\modular_quirks\excitable\excitable.dm" #include "modular_doppler\modular_quirks\left_handed\left_handed.dm" #include "modular_doppler\modular_quirks\linguist\linguist.dm" +#include "modular_doppler\modular_quirks\overwrites\musician.dm" #include "modular_doppler\modular_quirks\paycheck_rations\code\quirk.dm" #include "modular_doppler\modular_quirks\paycheck_rations\code\rationpacks.dm" #include "modular_doppler\modular_quirks\paycheck_rations\code\reagents.dm" From 0d6f62bca962967c358062245c5ac716c2b1fe60 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Tue, 8 Oct 2024 19:43:22 +0200 Subject: [PATCH 15/52] the worst unit test on the repo has something to say --- modular_doppler/modular_quirks/left_handed/left_handed.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_doppler/modular_quirks/left_handed/left_handed.dm b/modular_doppler/modular_quirks/left_handed/left_handed.dm index e6bf37260744c..f699af498aa7c 100644 --- a/modular_doppler/modular_quirks/left_handed/left_handed.dm +++ b/modular_doppler/modular_quirks/left_handed/left_handed.dm @@ -1,7 +1,7 @@ /datum/quirk/left_handed name = "Left Handed" desc = "test" - icon = FA_ICON_HAND + icon = FA_ICON_HAND_SPARKLES value = 0 mob_trait = TRAIT_LEFT_HANDED gain_text = span_notice("test") From 84bdede76fea57f031bb341c32e3b4dc5539fa10 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Wed, 9 Oct 2024 21:28:10 +0200 Subject: [PATCH 16/52] IPCs are here --- .../~doppler_defines/mutant_variations.dm | 4 +- code/~doppler_earliest_defines.dm | 4 +- .../code/cybernetic_accessories/synth_ears.dm | 22 ++++ .../code/cybernetic_accessories/synth_tail.dm | 10 ++ .../code/synthetic_accessories/synth_ears.dm | 4 - .../code/synthetic_accessories/synth_tail.dm | 10 -- .../icons/cybernetic/synth_ears.dmi | Bin 0 -> 1151 bytes .../icons/cybernetic/synth_screens.dmi | Bin 0 -> 12463 bytes .../{synthetic => cybernetic}/synth_tail.dmi | Bin .../icons/synthetic/synth_ears.dmi | Bin 272 -> 0 bytes .../organs/external/tail.dm | 10 +- .../organs/internal/ears.dm | 9 +- .../modular_customization/preferences/ears.dm | 10 +- .../modular_customization/preferences/tail.dm | 8 +- .../species_types/android/android_parts.dm | 105 +++++++++++++++++- .../android/monitor_component.dm | 86 ++++++++++++++ tgstation.dme | 5 +- 17 files changed, 247 insertions(+), 40 deletions(-) create mode 100644 modular_doppler/modular_customization/accessories/code/cybernetic_accessories/synth_ears.dm create mode 100644 modular_doppler/modular_customization/accessories/code/cybernetic_accessories/synth_tail.dm delete mode 100644 modular_doppler/modular_customization/accessories/code/synthetic_accessories/synth_ears.dm delete mode 100644 modular_doppler/modular_customization/accessories/code/synthetic_accessories/synth_tail.dm create mode 100644 modular_doppler/modular_customization/accessories/icons/cybernetic/synth_ears.dmi create mode 100644 modular_doppler/modular_customization/accessories/icons/cybernetic/synth_screens.dmi rename modular_doppler/modular_customization/accessories/icons/{synthetic => cybernetic}/synth_tail.dmi (100%) delete mode 100644 modular_doppler/modular_customization/accessories/icons/synthetic/synth_ears.dmi create mode 100644 modular_doppler/modular_species/species_types/android/monitor_component.dm diff --git a/code/__DEFINES/~doppler_defines/mutant_variations.dm b/code/__DEFINES/~doppler_defines/mutant_variations.dm index df917caf41a24..4cc24ddc70254 100644 --- a/code/__DEFINES/~doppler_defines/mutant_variations.dm +++ b/code/__DEFINES/~doppler_defines/mutant_variations.dm @@ -12,7 +12,7 @@ #define MONKEY "monkey" #define DEER "deer" #define BUG "bug" -#define SYNTHETIC "synthetic" +#define CYBERNETIC "cybernetic" #define HUMANOID "humanoid" #define ALIEN "alien" @@ -30,7 +30,7 @@ GLOBAL_LIST_INIT(mutant_variations, list( LIZARD, MONKEY, MOUSE, - SYNTHETIC, + CYBERNETIC, ALIEN, )) diff --git a/code/~doppler_earliest_defines.dm b/code/~doppler_earliest_defines.dm index 677b8c5977843..2914dc5174a7f 100644 --- a/code/~doppler_earliest_defines.dm +++ b/code/~doppler_earliest_defines.dm @@ -90,7 +90,7 @@ name = DOPPLER_SPRITE_ACCESSORY_NOEARS icon_state = /datum/sprite_accessory/ears/none::icon_state -/datum/sprite_accessory/ears_more/synthetic/none +/datum/sprite_accessory/ears_more/cybernetic/none icon = 'modular_doppler/modular_customization/accessories/code/~overrides/icons/fallbacks.dmi' name = DOPPLER_SPRITE_ACCESSORY_NOEARS icon_state = /datum/sprite_accessory/ears/none::icon_state @@ -161,7 +161,7 @@ name = DOPPLER_SPRITE_ACCESSORY_NOTAIL icon_state = /datum/sprite_accessory/tails/none::icon_state -/datum/sprite_accessory/tails/synthetic/none +/datum/sprite_accessory/tails/cybernetic/none icon = /datum/sprite_accessory/tails/none::icon name = DOPPLER_SPRITE_ACCESSORY_NOTAIL icon_state = /datum/sprite_accessory/tails/none::icon_state diff --git a/modular_doppler/modular_customization/accessories/code/cybernetic_accessories/synth_ears.dm b/modular_doppler/modular_customization/accessories/code/cybernetic_accessories/synth_ears.dm new file mode 100644 index 0000000000000..8f48910d3622c --- /dev/null +++ b/modular_doppler/modular_customization/accessories/code/cybernetic_accessories/synth_ears.dm @@ -0,0 +1,22 @@ +/datum/sprite_accessory/ears_more/cybernetic + icon = 'modular_doppler/modular_customization/accessories/icons/cybernetic/synth_ears.dmi' + +/datum/sprite_accessory/ears_more/cybernetic/antennae + name = "Angled Antennae" + icon_state = "antennae" + +/datum/sprite_accessory/ears_more/cybernetic/tvantennae + name = "TV Antennae" + icon_state = "tvantennae" + +/datum/sprite_accessory/ears_more/cybernetic/cyberhead + name = "Cyberhead" + icon_state = "cyberhead" + +/datum/sprite_accessory/ears_more/cybernetic/antlers + name = "Antlers" + icon_state = "antlers" + +/datum/sprite_accessory/ears_more/cybernetic/crowned + name = "Crowned" + icon_state = "crowned" diff --git a/modular_doppler/modular_customization/accessories/code/cybernetic_accessories/synth_tail.dm b/modular_doppler/modular_customization/accessories/code/cybernetic_accessories/synth_tail.dm new file mode 100644 index 0000000000000..f5c34dac23b19 --- /dev/null +++ b/modular_doppler/modular_customization/accessories/code/cybernetic_accessories/synth_tail.dm @@ -0,0 +1,10 @@ +/datum/sprite_accessory/tails/cybernetic + icon = 'modular_doppler/modular_customization/accessories/icons/cybernetic/synth_tail.dmi' + +/datum/sprite_accessory/tails/cybernetic/default + name = "Plug" + icon_state = "plugtail" + +/datum/sprite_accessory/tails/cybernetic/cable + name = "Cable" + icon_state = "cable" diff --git a/modular_doppler/modular_customization/accessories/code/synthetic_accessories/synth_ears.dm b/modular_doppler/modular_customization/accessories/code/synthetic_accessories/synth_ears.dm deleted file mode 100644 index 31a2348f185fe..0000000000000 --- a/modular_doppler/modular_customization/accessories/code/synthetic_accessories/synth_ears.dm +++ /dev/null @@ -1,4 +0,0 @@ -/datum/sprite_accessory/ears_more/synthetic - icon = 'modular_doppler/modular_customization/accessories/icons/synthetic/synth_ears.dmi' - -// Nothing here yet diff --git a/modular_doppler/modular_customization/accessories/code/synthetic_accessories/synth_tail.dm b/modular_doppler/modular_customization/accessories/code/synthetic_accessories/synth_tail.dm deleted file mode 100644 index c3a27a449f137..0000000000000 --- a/modular_doppler/modular_customization/accessories/code/synthetic_accessories/synth_tail.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/sprite_accessory/tails/synthetic - icon = 'modular_doppler/modular_customization/accessories/icons/synthetic/synth_tail.dmi' - -/datum/sprite_accessory/tails/synthetic/default - name = "Plug" - icon_state = "plugtail" - -/datum/sprite_accessory/tails/synthetic/cable - name = "Cable" - icon_state = "cable" diff --git a/modular_doppler/modular_customization/accessories/icons/cybernetic/synth_ears.dmi b/modular_doppler/modular_customization/accessories/icons/cybernetic/synth_ears.dmi new file mode 100644 index 0000000000000000000000000000000000000000..bc1dd357615ee7260d9975db9b5ab44ce315a313 GIT binary patch literal 1151 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fOR7R5N?cNllZ!G7N;32F7#J$% z%$;zS>yUv!%lVVRE#LJ1eR<{RsVVwKyXEQ{wF}EOMMl+BH?!^yeU;1h>~ZtSs~gw6 za(h{<%f95r?*-phMXX&au{U-4sXXmg=lXJ+sV5H1NSfxEXnRz|Jm?OG)tpc19~#7F zetf>pm_vk@<(L4&S;zVNd<;*2_`qLU8#h6wDV9k!aJF33lZACW7TG65Z@&2cSAX^C z;)iE6)-PsYV4mjb;uumf=k1;SUNV6q><>&&GG}ONaCG)6n0Y2nSL=1174j_ejPeho zB+bm6OC1Tx${G=`m{oEt8XJ4xtUEW~I{n&Ty9pO(rk=mK(|-NB2a>%HSmos9j~DLQ zvqvWV`=%|cTr;ZvZoTr}s3m__mC~u*d-vv+?p=HJ>eZaDF7@xR;?LYJTWIjQ!{Zh2rxBZCW_ z+i&vz`S&;d&)eJI7wgCGldJvn<>!mP?Ryu;@2~rJ;$3%LiB*{5vz8+(+GZ>W;oYeD z@sIC%{i?s7h5hXYQp$0~XF4)>-J5&1O;dJXfbIV+*@gSQB&A%RFY-V(b3V1XV0EJMIh~~ zKxsPb2G76Z{407|@7=r^+1a0YeRX!I$F6Cy^PjT^no5RTt#HcHDO0HnQ}8;yMqbh0 z!s17`d7tFM^DiFmlwa@b_QjOz!NZ3SPwiRneR|!0lP{9@StMeM=W-#w4dnYGB>GPu68 zHS77xdptVPwWtA675w_Yr}vrm?4&q($zL^Z*ZZ!$D5JVe+0^hz>$}yQ!YkX0%!PmhQXa7qP1Dt?Y)^KMQ=%yjFIW zUtfFeka_K$MOW2te*E~c;#0);UjeUY^Y2jDwtf45>uY=Wz4*$A>XL|{X6a9tw{PCO z`Hk4LDD}mbzh?QGPuW#+JVzpEE7yZ!)#Qqg1`t|GA`s4dj zuP@&l#&~8P=k(b5-~LD*o1Yj|Dej}is4|sdk{5%gYQqvChagUcl`IoNm^?@ku4jyK V_Ps0Q+E58{tEa1<%Q~loCIB6j6fXb( literal 0 HcmV?d00001 diff --git a/modular_doppler/modular_customization/accessories/icons/cybernetic/synth_screens.dmi b/modular_doppler/modular_customization/accessories/icons/cybernetic/synth_screens.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0b1efa04bc31e2064354fa402065b9b4db1543ba GIT binary patch literal 12463 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 N22WQ%mvv4FO#qC$U-ke1 diff --git a/modular_doppler/modular_customization/organs/external/tail.dm b/modular_doppler/modular_customization/organs/external/tail.dm index afc8ea7c30201..125ff5fe3464f 100644 --- a/modular_doppler/modular_customization/organs/external/tail.dm +++ b/modular_doppler/modular_customization/organs/external/tail.dm @@ -173,18 +173,18 @@ /datum/bodypart_overlay/mutant/tail/fish/get_global_feature_list() return SSaccessories.tails_list_fish -/// Synth tail +/// Cybernetic tail // -/obj/item/organ/external/tail/synthetic +/obj/item/organ/external/tail/cybernetic preference = "feature_synth_tail" dna_block = null organ_flags = ORGAN_ROBOTIC - bodypart_overlay = /datum/bodypart_overlay/mutant/tail/synthetic + bodypart_overlay = /datum/bodypart_overlay/mutant/tail/cybernetic -/datum/bodypart_overlay/mutant/tail/synthetic +/datum/bodypart_overlay/mutant/tail/cybernetic feature_key = "tail_other" -/datum/bodypart_overlay/mutant/tail/synthetic/get_global_feature_list() +/datum/bodypart_overlay/mutant/tail/cybernetic/get_global_feature_list() return SSaccessories.tails_list_synth diff --git a/modular_doppler/modular_customization/organs/internal/ears.dm b/modular_doppler/modular_customization/organs/internal/ears.dm index 75478d96e6090..500df70c5c226 100644 --- a/modular_doppler/modular_customization/organs/internal/ears.dm +++ b/modular_doppler/modular_customization/organs/internal/ears.dm @@ -104,14 +104,13 @@ /datum/bodypart_overlay/mutant/ears/humanoid_ears/get_global_feature_list() return SSaccessories.ears_list_humanoid -/// Synthetic ears +/// Cybernetic ears // -/obj/item/organ/internal/ears/synthetic +/obj/item/organ/internal/ears/cybernetic preference = "feature_synth_ears" - organ_flags = ORGAN_ROBOTIC - bodypart_overlay = /datum/bodypart_overlay/mutant/ears/synthetic_ears + bodypart_overlay = /datum/bodypart_overlay/mutant/ears/cybernetic -/datum/bodypart_overlay/mutant/ears/synthetic_ears/get_global_feature_list() +/datum/bodypart_overlay/mutant/ears/cybernetic/get_global_feature_list() return SSaccessories.ears_list_synthetic /// Alien ears diff --git a/modular_doppler/modular_customization/preferences/ears.dm b/modular_doppler/modular_customization/preferences/ears.dm index 03fb895a8d247..827cd72ba3a03 100644 --- a/modular_doppler/modular_customization/preferences/ears.dm +++ b/modular_doppler/modular_customization/preferences/ears.dm @@ -27,7 +27,7 @@ ears_list_fish = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_more/fish)["default_sprites"] ears_list_bug = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_more/bug)["default_sprites"] ears_list_humanoid = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_more/humanoid)["default_sprites"] - ears_list_synthetic = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_more/synthetic)["default_sprites"] + ears_list_synthetic = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_more/cybernetic)["default_sprites"] ears_list_alien = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_more/alien)["default_sprites"] /datum/dna @@ -463,7 +463,7 @@ var/datum/sprite_accessory/chosen_ears = SSaccessories.ears_list_humanoid[value] return generate_ears_icon(chosen_ears) -// Synthetic +// Cybernetic /datum/preference/choiced/synthetic_ears savefile_key = "feature_synth_ears" savefile_identifier = PREFERENCE_CHARACTER @@ -481,15 +481,15 @@ if(species.type in GLOB.species_blacklist_no_mutant) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) - if(chosen_variation == SYNTHETIC) + if(chosen_variation == CYBERNETIC) return TRUE return FALSE /datum/preference/choiced/synthetic_ears/create_default_value() - return /datum/sprite_accessory/ears_more/synthetic/none::name + return /datum/sprite_accessory/ears_more/cybernetic/none::name /datum/preference/choiced/synthetic_ears/apply_to_human(mob/living/carbon/human/target, value) - if(target.dna.ear_type == SYNTHETIC) + if(target.dna.ear_type == CYBERNETIC) target.dna.features["ears"] = value /datum/preference/choiced/synthetic_ears/icon_for(value) diff --git a/modular_doppler/modular_customization/preferences/tail.dm b/modular_doppler/modular_customization/preferences/tail.dm index fb091599cd9d8..5a564a1c4f6f9 100644 --- a/modular_doppler/modular_customization/preferences/tail.dm +++ b/modular_doppler/modular_customization/preferences/tail.dm @@ -22,7 +22,7 @@ tails_list_deer = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/deer)["default_sprites"] tails_list_fish = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/fish)["default_sprites"] tails_list_bug = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/bug)["default_sprites"] - tails_list_synth = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/synthetic)["default_sprites"] + tails_list_synth = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/cybernetic)["default_sprites"] tails_list_humanoid = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/humanoid)["default_sprites"] tails_list_alien = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/alien)["default_sprites"] @@ -474,15 +474,15 @@ if(species.type in GLOB.species_blacklist_no_mutant) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) - if(chosen_variation == SYNTHETIC) + if(chosen_variation == CYBERNETIC) return TRUE return FALSE /datum/preference/choiced/synth_tail/create_default_value() - return /datum/sprite_accessory/tails/synthetic/none::name + return /datum/sprite_accessory/tails/cybernetic/none::name /datum/preference/choiced/synth_tail/apply_to_human(mob/living/carbon/human/target, value) - if(target.dna.tail_type == SYNTHETIC) + if(target.dna.tail_type == CYBERNETIC) target.dna.features["tail_other"] = value /datum/preference/choiced/synth_tail/icon_for(value) diff --git a/modular_doppler/modular_species/species_types/android/android_parts.dm b/modular_doppler/modular_species/species_types/android/android_parts.dm index c5c67338ed9b1..f49b5f0bb7a26 100644 --- a/modular_doppler/modular_species/species_types/android/android_parts.dm +++ b/modular_doppler/modular_species/species_types/android/android_parts.dm @@ -1,3 +1,6 @@ +// easy define for head_flags of android heads that dont feature eyes (aka monitor heads (aka IPCs)) +#define HEAD_MONITOR_FACE (HEAD_HAIR|HEAD_LIPS|HEAD_DEBRAIN) +// easy define for the android bodypart .dmi #define ANDROID_BODYPARTS_DMI 'modular_doppler/modular_species/species_types/android/icons/android_parts.dmi' /// @@ -59,6 +62,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "synth_head" limb_id = "synth" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/bare/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/bare/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/bare icon_static = ANDROID_BODYPARTS_DMI @@ -137,7 +149,7 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "e3n_head" limb_id = "e3n" - head_flags = NONE + head_flags = HEAD_MONITOR_FACE /obj/item/bodypart/chest/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI @@ -177,6 +189,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "mc_head" limb_id = "mc" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/mc/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/mc/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/mc icon_static = ANDROID_BODYPARTS_DMI @@ -216,6 +237,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "bs_head" limb_id = "bs" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/bs_one/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/bs_one/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/bs_one icon_static = ANDROID_BODYPARTS_DMI @@ -255,6 +285,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "bs2_head" limb_id = "bs2" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/bs_two/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/bs_two/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/bs_two icon_static = ANDROID_BODYPARTS_DMI @@ -294,6 +333,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "hi_head" limb_id = "hi" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/hi_one/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/hi_one/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/hi_one icon_static = ANDROID_BODYPARTS_DMI @@ -333,6 +381,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "hi2_head" limb_id = "hi2" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/hi_two/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/hi_two/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/hi_two icon_static = ANDROID_BODYPARTS_DMI @@ -372,6 +429,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "sgm_head" limb_id = "sgm" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/sgm/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/sgm/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/sgm icon_static = ANDROID_BODYPARTS_DMI @@ -411,6 +477,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "wtm_head" limb_id = "wtm" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/wtm/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/wtm/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/wtm icon_static = ANDROID_BODYPARTS_DMI @@ -450,6 +525,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "xmg_head" limb_id = "xmg" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/xmg_one/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/xmg_one/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI @@ -489,6 +573,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "xmg2_head" limb_id = "xmg2" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/xmg_two/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/xmg_two/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/xmg_two icon_static = ANDROID_BODYPARTS_DMI @@ -529,6 +622,15 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "zhp_head" limb_id = "zhp" + head_flags = HEAD_MONITOR_FACE + +/obj/item/bodypart/head/robot/android/zhp/on_adding(mob/living/carbon/new_owner) + . = ..() + new_owner.AddComponent(/datum/component/monitor_head) + +/obj/item/bodypart/head/robot/android/zhp/on_removal(mob/living/carbon/old_owner) + . = ..() + qdel(old_owner.GetComponent(/datum/component/monitor_head)) /obj/item/bodypart/chest/robot/android/zhp icon_static = ANDROID_BODYPARTS_DMI @@ -560,4 +662,5 @@ icon_state = "zhp_r_leg" limb_id = "zhp" +#undef HEAD_MONITOR_FACE #undef ANDROID_BODYPARTS_DMI diff --git a/modular_doppler/modular_species/species_types/android/monitor_component.dm b/modular_doppler/modular_species/species_types/android/monitor_component.dm new file mode 100644 index 0000000000000..16a260bcd4942 --- /dev/null +++ b/modular_doppler/modular_species/species_types/android/monitor_component.dm @@ -0,0 +1,86 @@ +GLOBAL_LIST_INIT(monitor_head_displays, list( + "Disabled" = "none", + "Blank" = "blank", + "Blank (White)" = "blankwhite", + "Blue Screen of Death" = "bsod", + "Blue" = "blue", + "Breakout" = "breakout", + "Console" = "console", + "Cubic Wave" = "squarewave", + "ECG Wave" = "ecgwave", + "Eight" = "eight", + "Eyes" = "eyes", + "Goggles" = "goggles", + "Gol Glider" = "golglider", + "Green" = "green", + "Heart" = "heart", + "Mono Eye" = "mono_eye", + "Nature" = "nature", + "Pink" = "pink", + "Purple" = "purple", + "Rainbow" = "rainbow", + "Red Text" = "redtext", + "Red" = "red", + "RGB" = "rgb", + "Scroll" = "scroll", + "Shower" = "shower", + "Sine Wave" = "sinewave", + "Smiley" = "yellow", + "Stars" = "stars", + "Sunburst" = "sunburst", + "Text Drop" = "textdrop", + "TV Static" = "static", + )) + +/datum/component/monitor_head + dupe_mode = COMPONENT_DUPE_UNIQUE + var/datum/action/innate/monitor_head/display_action + +/datum/component/monitor_head/Initialize(...) + . = ..() + if(!ishuman(parent)) + return COMPONENT_INCOMPATIBLE + + display_action = new + display_action.Grant(parent) + +/datum/component/monitor_head/Destroy(force) + if(display_action) + display_action.Remove(parent) + return ..() + +/datum/action/innate/monitor_head + name = "Change Display" + check_flags = AB_CHECK_CONSCIOUS + button_icon = 'icons/mob/actions/actions_silicon.dmi' + button_icon_state = "drone_vision" + background_icon_state = "bg_default" + var/datum/bodypart_overlay/simple/monitor_head/display_overlay + +/datum/action/innate/monitor_head/Activate() + var/new_display = tgui_input_list(usr, "Choose your character's screen:", "Monitor Display", GLOB.monitor_head_displays) + if(!new_display) + return + + var/mob/living/carbon/human/wearer = owner + var/obj/item/bodypart/head/monitor_head = wearer.get_bodypart(BODY_ZONE_HEAD) + + if(!display_overlay) + display_overlay = new /datum/bodypart_overlay/simple/monitor_head + + display_overlay.icon_state = "[GLOB.monitor_head_displays[new_display]]" + monitor_head.add_bodypart_overlay(display_overlay) + wearer.update_body_parts() + +/datum/action/innate/monitor_head/Remove(mob/remove_from) + if(remove_from && display_overlay) + var/mob/living/carbon/human/wearer = remove_from + var/obj/item/bodypart/head/monitor_head = wearer.get_bodypart(BODY_ZONE_HEAD) + monitor_head.remove_bodypart_overlay(display_overlay) + wearer.update_body_parts() + return ..() + +/datum/bodypart_overlay/simple/monitor_head + icon = 'modular_doppler/modular_customization/accessories/icons/cybernetic/synth_screens.dmi' + icon_state = "blank" + layers = EXTERNAL_ADJACENT diff --git a/tgstation.dme b/tgstation.dme index 8291cee71e938..91822119831fd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6706,6 +6706,8 @@ #include "modular_doppler\modular_customization\accessories\code\aquatic_accessories\aquatic_ears.dm" #include "modular_doppler\modular_customization\accessories\code\aquatic_accessories\aquatic_snout.dm" #include "modular_doppler\modular_customization\accessories\code\aquatic_accessories\aquatic_tail.dm" +#include "modular_doppler\modular_customization\accessories\code\cybernetic_accessories\synth_ears.dm" +#include "modular_doppler\modular_customization\accessories\code\cybernetic_accessories\synth_tail.dm" #include "modular_doppler\modular_customization\accessories\code\human_accessories\human_ears.dm" #include "modular_doppler\modular_customization\accessories\code\human_accessories\human_horns.dm" #include "modular_doppler\modular_customization\accessories\code\human_accessories\human_tail.dm" @@ -6750,8 +6752,6 @@ #include "modular_doppler\modular_customization\accessories\code\ramatan_accessories\ramatan_frills.dm" #include "modular_doppler\modular_customization\accessories\code\ramatan_accessories\ramatan_snout.dm" #include "modular_doppler\modular_customization\accessories\code\ramatan_accessories\ramatan_tail.dm" -#include "modular_doppler\modular_customization\accessories\code\synthetic_accessories\synth_ears.dm" -#include "modular_doppler\modular_customization\accessories\code\synthetic_accessories\synth_tail.dm" #include "modular_doppler\modular_customization\accessories\code\underwear_accessories\bras.dm" #include "modular_doppler\modular_customization\accessories\code\underwear_accessories\socks.dm" #include "modular_doppler\modular_customization\accessories\code\underwear_accessories\undershirts.dm" @@ -6853,6 +6853,7 @@ #include "modular_doppler\modular_species\species_types\android\android.dm" #include "modular_doppler\modular_species\species_types\android\android_hud.dm" #include "modular_doppler\modular_species\species_types\android\android_parts.dm" +#include "modular_doppler\modular_species\species_types\android\monitor_component.dm" #include "modular_doppler\modular_species\species_types\android\power_cord.dm" #include "modular_doppler\modular_species\species_types\anthromorph\anthromorph.dm" #include "modular_doppler\modular_species\species_types\anthromorph\anthromorph_bodyparts.dm" From 7dda0e9e84ff5c695c2213e4a8d8ab0d7c2eb4b1 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Wed, 9 Oct 2024 21:42:27 +0200 Subject: [PATCH 17/52] some more screens --- .../icons/cybernetic/synth_screens.dmi | Bin 12463 -> 9107 bytes .../android/monitor_component.dm | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/modular_doppler/modular_customization/accessories/icons/cybernetic/synth_screens.dmi b/modular_doppler/modular_customization/accessories/icons/cybernetic/synth_screens.dmi index 0b1efa04bc31e2064354fa402065b9b4db1543ba..101b6c375df96c7f21b36879488e69c99a50434a 100644 GIT binary patch literal 9107 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 Date: Wed, 9 Oct 2024 22:11:15 +0200 Subject: [PATCH 18/52] update preview --- .../species_types/android/android.dm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/modular_doppler/modular_species/species_types/android/android.dm b/modular_doppler/modular_species/species_types/android/android.dm index b7e18b55908bd..18b18edb6fad2 100644 --- a/modular_doppler/modular_species/species_types/android/android.dm +++ b/modular_doppler/modular_species/species_types/android/android.dm @@ -50,7 +50,7 @@ /datum/outfit/android_preview name = "Android (Species Preview)" - uniform = /obj/item/clothing/under/syndicate/skirt + // nude /datum/species/android/on_species_gain(mob/living/carbon/target, datum/species/old_species, pref_load) . = ..() @@ -102,13 +102,16 @@ target.hud_used.show_hud(target.hud_used.hud_version) /datum/species/android/prepare_human_for_preview(mob/living/carbon/human/robot_for_preview) + robot_for_preview.dna.ear_type = CYBERNETIC + robot_for_preview.dna.features["ears"] = "TV Antennae" + robot_for_preview.dna.features["ears_color_1"] = "#333333" robot_for_preview.dna.features["frame_list"] = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/robot/android/e_three_n, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/robot/android/e_three_n, - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/robot/android/e_three_n, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/robot/android/e_three_n, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/robot/android/e_three_n, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/robot/android/e_three_n) + BODY_ZONE_HEAD = /obj/item/bodypart/head/robot/android/sgm, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/robot/android/sgm, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/robot/android/sgm, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/robot/android/sgm, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/robot/android/sgm, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/robot/android/sgm) regenerate_organs(robot_for_preview) robot_for_preview.update_body(is_creating = TRUE) From c4161030e5caa816c5e160446f5f1470fd9425bc Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Thu, 10 Oct 2024 01:08:36 +0200 Subject: [PATCH 19/52] IPC screens update on stat change --- code/__DEFINES/~doppler_defines/is_helpers.dm | 3 ++- code/__DEFINES/~doppler_defines/traits.dm | 2 ++ code/modules/mob/living/blood.dm | 2 +- code/modules/projectiles/projectile.dm | 10 +++++++--- .../android/monitor_component.dm | 20 +++++++++++++++++++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/~doppler_defines/is_helpers.dm b/code/__DEFINES/~doppler_defines/is_helpers.dm index 37db4019befb1..432f668d26acd 100644 --- a/code/__DEFINES/~doppler_defines/is_helpers.dm +++ b/code/__DEFINES/~doppler_defines/is_helpers.dm @@ -5,5 +5,6 @@ #define issnail(A) (is_species(A, /datum/species/snail)) #define ishemophage(A) (is_species(A, /datum/species/genemod/hemophage)) #define isramatan(A) (is_species(A, /datum/species/ramatan)) -//Species with green blood +//Species blood colors #define hasgreenblood(A) (isinsectoid(A) || issnail(A) || isflyperson(A) || HAS_TRAIT(A, TRAIT_GREEN_BLOOD)) +#define hasblueblood(A) (isandroid(A) || HAS_TRAIT(A, TRAIT_BLUE_BLOOD)) diff --git a/code/__DEFINES/~doppler_defines/traits.dm b/code/__DEFINES/~doppler_defines/traits.dm index bc5cd10f2bff6..9ef069f37fb45 100644 --- a/code/__DEFINES/~doppler_defines/traits.dm +++ b/code/__DEFINES/~doppler_defines/traits.dm @@ -19,6 +19,8 @@ #define TRAIT_ANIMALISTIC "animalistic" // Green blood traits #define TRAIT_GREEN_BLOOD "green_blood" +// Blue blood traits +#define TRAIT_BLUE_BLOOD "blue_blood" // Trait that lets golems put stone limbs back on #define TRAIT_GOLEM_LIMBATTACHMENT "golem_limbattachment" diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index dfe669a7092ed..be4531be4043c 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -361,7 +361,7 @@ //to add a splatter of blood or other mob liquid. /mob/living/proc/add_splatter_floor(turf/T, small_drip) - if(get_blood_id() != /datum/reagent/blood && !hasgreenblood(src)) // DOPPLER EDIT CHANGE START - ORIGINAL: if(get_blood_id() != /datum/reagent/blood) + if(get_blood_id() != /datum/reagent/blood && !hasgreenblood(src) && !hasblueblood(src)) // DOPPLER EDIT CHANGE START - ORIGINAL: if(get_blood_id() != /datum/reagent/blood) return if(!T) T = get_turf(src) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index b46bb5d153151..50322cb7192a2 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -330,13 +330,17 @@ var/splatter_dir = dir if(starting) splatter_dir = get_dir(starting, target_turf) - if(isalien(living_target) || hasgreenblood(living_target)) // DOPPLER EDIT CHANGE - Green blood color - Original line: if(isalien(living_target)) - new /obj/effect/temp_visual/dir_setting/bloodsplatter/green(target_turf, splatter_dir) // DOPPLER EDIT CHANGE - Green blood color - Original line: new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_turf, splatter_dir) + // DOPPLER ADDITION START + // if(hasblueblood(living_target)) + // new /obj/effect/temp_visual/dir_setting/bloodsplatter/blue(target_turf, splatter_dir) + if(isalien(living_target) || hasgreenblood(living_target)) + new /obj/effect/temp_visual/dir_setting/bloodsplatter/green(target_turf, splatter_dir) + // DOPPLER ADDITION END else new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_turf, splatter_dir) if(prob(33)) living_target.add_splatter_floor(target_turf) - else if (hit_bodypart?.biological_state & (BIO_METAL|BIO_WIRED)) + if (hit_bodypart?.biological_state & (BIO_ROBOTIC)) // DOPPLER EDIT - old code: else if (hit_bodypart?.biological_state & (BIO_METAL|BIO_WIRED)) var/random_damage_mult = RANDOM_DECIMAL(0.85, 1.15) // SOMETIMES you can get more or less sparks var/damage_dealt = ((damage / (1 - (blocked / 100))) * random_damage_mult) diff --git a/modular_doppler/modular_species/species_types/android/monitor_component.dm b/modular_doppler/modular_species/species_types/android/monitor_component.dm index 96727a0b9eb34..8f9164c327300 100644 --- a/modular_doppler/modular_species/species_types/android/monitor_component.dm +++ b/modular_doppler/modular_species/species_types/android/monitor_component.dm @@ -90,6 +90,26 @@ GLOBAL_LIST_INIT(monitor_head_displays, list( wearer.update_body_parts() return ..() +/datum/action/innate/monitor_head/update_status_on_signal(mob/living/carbon/wearer, new_stat, old_stat) + . = ..() + + if(!display_overlay) + var/obj/item/bodypart/head/monitor_head = wearer.get_bodypart(BODY_ZONE_HEAD) + display_overlay = new /datum/bodypart_overlay/simple/monitor_head + monitor_head.add_bodypart_overlay(display_overlay) + + switch(new_stat) + if(SOFT_CRIT) + display_overlay.icon_state = "bsod" + if(HARD_CRIT) + display_overlay.icon_state = "static3" + if(UNCONSCIOUS) + display_overlay.icon_state = "none" + if(DEAD) + display_overlay.icon_state = "none" + + wearer.update_body_parts() + /datum/bodypart_overlay/simple/monitor_head icon = 'modular_doppler/modular_customization/accessories/icons/cybernetic/synth_screens.dmi' icon_state = "none" From e5d2ee9e234166c4a9c53ae237cb4255b050d98e Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Thu, 10 Oct 2024 03:24:57 +0200 Subject: [PATCH 20/52] robot limb construction --- code/game/objects/items/crayons.dm | 3 +- .../research/techweb/nodes/cyborg_nodes.dm | 14 + .../medical_designs/medical_designs.dm | 6 + .../species_types/android/android_parts.dm | 379 +++++++++++++----- .../android/icons/android_parts.dmi | Bin 44420 -> 46082 bytes 5 files changed, 304 insertions(+), 98 deletions(-) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 03c79049b3087..808b37c54722e 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -978,7 +978,7 @@ return ITEM_INTERACT_BLOCKING if(check_empty(user)) return ITEM_INTERACT_BLOCKING - + /* DOPPLER EDIT REMOVAL START if(isbodypart(interacting_with) && actually_paints) var/obj/item/bodypart/limb = interacting_with if(!IS_ORGANIC_LIMB(limb)) @@ -994,6 +994,7 @@ playsound(user.loc, 'sound/effects/spray.ogg', 5, TRUE, 5) limb.change_appearance(style_list_icons[choice], greyscale = FALSE) return ITEM_INTERACT_SUCCESS + DOPPLER EDIT REMOVAL END */ if(interacting_with.color) paint_color = interacting_with.color balloon_alert(user, "matched colour of target") diff --git a/code/modules/research/techweb/nodes/cyborg_nodes.dm b/code/modules/research/techweb/nodes/cyborg_nodes.dm index eeeed268be552..061f450694c43 100644 --- a/code/modules/research/techweb/nodes/cyborg_nodes.dm +++ b/code/modules/research/techweb/nodes/cyborg_nodes.dm @@ -19,6 +19,14 @@ "cybernetic_stomach", "cybernetic_liver", "cybernetic_heart", + // DOPPLER ADDITION START + "android_chest", + "android_head", + "android_l_arm", + "android_l_leg", + "android_r_arm", + "android_r_leg", + // DOPPLER ADDITION END ) experiments_to_unlock = list( /datum/experiment/scanning/people/android, @@ -193,6 +201,12 @@ "ci-nutrimentplus", "ci-toolset", "ci-surgery", + // DOPPLER ADDITION START + "ci-botany", + "ci-janitor", + "ci-razor", + "ci-drill", + // DOPPLER ADDITION END ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) diff --git a/modular_doppler/modular_medical/medical_designs/medical_designs.dm b/modular_doppler/modular_medical/medical_designs/medical_designs.dm index 48a1243e19aa7..d5516d3a80462 100644 --- a/modular_doppler/modular_medical/medical_designs/medical_designs.dm +++ b/modular_doppler/modular_medical/medical_designs/medical_designs.dm @@ -80,6 +80,12 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_CARGO +/datum/techweb_node/mining_adv/New() //Here for the integrated drill augments. + design_ids = list( + "ci-drill-diamond" + ) + return ..() + /datum/design/cyberimp_claws name = "Razor Claws Implant" desc = "Long, sharp, double-edged razors installed within the fingers, functional for cutting. All kinds of cutting." diff --git a/modular_doppler/modular_species/species_types/android/android_parts.dm b/modular_doppler/modular_species/species_types/android/android_parts.dm index f49b5f0bb7a26..461899fe610a6 100644 --- a/modular_doppler/modular_species/species_types/android/android_parts.dm +++ b/modular_doppler/modular_species/species_types/android/android_parts.dm @@ -3,6 +3,34 @@ // easy define for the android bodypart .dmi #define ANDROID_BODYPARTS_DMI 'modular_doppler/modular_species/species_types/android/icons/android_parts.dmi' +/obj/item/bodypart/proc/change_type(mob/living/user, obj/item/tool) + if(brute_dam || burn_dam) + user.balloon_alert(user, "limb damaged!") + return NONE + + var/list/possible_appearances = list() + for(var/types in GLOB.frame_types) + if(types == "none") + continue + LAZYADDASSOC(possible_appearances, types, image(icon = ANDROID_BODYPARTS_DMI, icon_state = "[types]_[body_zone]")) + //pick + var/new_type = show_radial_menu(user, src, possible_appearances, require_near = TRUE, radius = 48) + if(!new_type) + return NONE + //weld + if(tool.use_tool(src, user, delay = 2 SECONDS, volume = 20)) + var/type_to_spawn = text2path("[type]/[new_type]") + if(!type_to_spawn) + type_to_spawn = text2path("[parent_type]/[new_type]") + var/obj/item/bodypart/new_bodypart = new type_to_spawn(loc) + //inherit detail + for(var/obj/item/organ/to_transfer in contents) + to_transfer.bodypart_insert(new_bodypart) + new_bodypart.name = name + new_bodypart.desc = desc + qdel(src) + return ITEM_INTERACT_SUCCESS + /// // Overwrites /// @@ -11,11 +39,27 @@ brute_modifier = 1 burn_modifier = 1 +/obj/item/bodypart/head/robot/android/welder_act_secondary(mob/living/user, obj/item/tool) + . = ..() + return change_type(user, tool) + +/obj/item/bodypart/head/robot/android/examine(mob/user) + . = ..() + . += span_blue("Right-click with a welding-tool to alter the limb appearance.") + /obj/item/bodypart/chest/robot/android biological_state = (BIO_ROBOTIC|BIO_BLOODED) brute_modifier = 1 burn_modifier = 1 +/obj/item/bodypart/chest/robot/android/welder_act_secondary(mob/living/user, obj/item/tool) + . = ..() + return change_type(user, tool) + +/obj/item/bodypart/chest/robot/android/examine(mob/user) + . = ..() + . += span_blue("Right-click with a welding-tool to alter the limb appearance.") + /obj/item/bodypart/chest/robot/android/check_limbs() return @@ -24,35 +68,92 @@ brute_modifier = 1 burn_modifier = 1 +/obj/item/bodypart/arm/right/robot/android/welder_act_secondary(mob/living/user, obj/item/tool) + . = ..() + return change_type(user, tool) + +/obj/item/bodypart/arm/right/robot/android/examine(mob/user) + . = ..() + . += span_blue("Right-click with a welding-tool to alter the limb appearance.") + + /obj/item/bodypart/arm/left/robot/android biological_state = (BIO_ROBOTIC|BIO_BLOODED) brute_modifier = 1 burn_modifier = 1 +/obj/item/bodypart/arm/left/robot/android/welder_act_secondary(mob/living/user, obj/item/tool) + . = ..() + return change_type(user, tool) + +/obj/item/bodypart/arm/left/robot/android/examine(mob/user) + . = ..() + . += span_blue("Right-click with a welding-tool to alter the limb appearance.") + /obj/item/bodypart/leg/right/robot/android biological_state = (BIO_ROBOTIC|BIO_BLOODED) brute_modifier = 1 burn_modifier = 1 +/obj/item/bodypart/leg/right/robot/android/welder_act_secondary(mob/living/user, obj/item/tool) + . = ..() + return change_type(user, tool) + +/obj/item/bodypart/leg/right/robot/android/examine(mob/user) + . = ..() + . += span_blue("Right-click with a welding-tool to alter the limb appearance.") + /obj/item/bodypart/leg/left/robot/android biological_state = (BIO_ROBOTIC|BIO_BLOODED) brute_modifier = 1 burn_modifier = 1 +/obj/item/bodypart/leg/left/robot/android/welder_act_secondary(mob/living/user, obj/item/tool) + . = ..() + return change_type(user, tool) + +/obj/item/bodypart/leg/left/robot/android/examine(mob/user) + . = ..() + . += span_blue("Right-click with a welding-tool to alter the limb appearance.") + /// -// Classic (this may look empty, but its a load-bearing definition) +// Classic /// /obj/item/bodypart/head/robot/android/classic + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "classic_head" + limb_id = "classic" /obj/item/bodypart/chest/robot/android/classic + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "classic_chest" + limb_id = "classic" /obj/item/bodypart/arm/right/robot/android/classic + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "classic_r_arm" + limb_id = "classic" /obj/item/bodypart/arm/left/robot/android/classic + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "classic_l_arm" + limb_id = "classic" /obj/item/bodypart/leg/right/robot/android/classic + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "classic_r_leg" + limb_id = "classic" /obj/item/bodypart/leg/left/robot/android/classic + icon_static = ANDROID_BODYPARTS_DMI + icon = ANDROID_BODYPARTS_DMI + icon_state = "classic_l_leg" + limb_id = "classic" /// // Bare @@ -60,8 +161,8 @@ /obj/item/bodypart/head/robot/android/bare icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "synth_head" - limb_id = "synth" + icon_state = "bare_head" + limb_id = "bare" head_flags = HEAD_MONITOR_FACE /obj/item/bodypart/head/robot/android/bare/on_adding(mob/living/carbon/new_owner) @@ -75,32 +176,32 @@ /obj/item/bodypart/chest/robot/android/bare icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "synth_chest" - limb_id = "synth" + icon_state = "bare_chest" + limb_id = "bare" /obj/item/bodypart/arm/right/robot/android/bare icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "synth_r_arm" - limb_id = "synth" + icon_state = "bare_r_arm" + limb_id = "bare" /obj/item/bodypart/arm/left/robot/android/bare icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "synth_l_arm" - limb_id = "synth" + icon_state = "bare_l_arm" + limb_id = "bare" /obj/item/bodypart/leg/right/robot/android/bare icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "synth_r_leg" - limb_id = "synth" + icon_state = "bare_r_leg" + limb_id = "bare" /obj/item/bodypart/leg/left/robot/android/bare icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "synth_r_leg" - limb_id = "synth" + icon_state = "bare_r_leg" + limb_id = "bare" /// // Mariinsky @@ -147,39 +248,39 @@ /obj/item/bodypart/head/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "e3n_head" - limb_id = "e3n" + icon_state = "e_three_n_head" + limb_id = "e_three_n" head_flags = HEAD_MONITOR_FACE /obj/item/bodypart/chest/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "e3n_chest" - limb_id = "e3n" + icon_state = "e_three_n_chest" + limb_id = "e_three_n" /obj/item/bodypart/arm/right/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "e3n_r_arm" - limb_id = "e3n" + icon_state = "e_three_n_r_arm" + limb_id = "e_three_n" /obj/item/bodypart/arm/left/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "e3n_l_arm" - limb_id = "e3n" + icon_state = "e_three_n_l_arm" + limb_id = "e_three_n" /obj/item/bodypart/leg/right/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "e3n_r_leg" - limb_id = "e3n" + icon_state = "e_three_n_r_leg" + limb_id = "e_three_n" /obj/item/bodypart/leg/left/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "e3n_r_leg" - limb_id = "e3n" + icon_state = "e_three_n_r_leg" + limb_id = "e_three_n" /// // Morpheus @@ -235,8 +336,8 @@ /obj/item/bodypart/head/robot/android/bs_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs_head" - limb_id = "bs" + icon_state = "bs_one_head" + limb_id = "bs_one" head_flags = HEAD_MONITOR_FACE /obj/item/bodypart/head/robot/android/bs_one/on_adding(mob/living/carbon/new_owner) @@ -250,32 +351,32 @@ /obj/item/bodypart/chest/robot/android/bs_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs_chest" - limb_id = "bs" + icon_state = "bs_one_chest" + limb_id = "bs_one" /obj/item/bodypart/arm/right/robot/android/bs_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs_r_arm" - limb_id = "bs" + icon_state = "bs_one_r_arm" + limb_id = "bs_one" /obj/item/bodypart/arm/left/robot/android/bs_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs_l_arm" - limb_id = "bs" + icon_state = "bs_one_l_arm" + limb_id = "bs_one" /obj/item/bodypart/leg/right/robot/android/bs_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs_r_leg" - limb_id = "bs" + icon_state = "bs_one_r_leg" + limb_id = "bs_one" /obj/item/bodypart/leg/left/robot/android/bs_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs_r_leg" - limb_id = "bs" + icon_state = "bs_one_r_leg" + limb_id = "bs_one" /// // Bishop Cyberkinetics 2.0 @@ -283,8 +384,8 @@ /obj/item/bodypart/head/robot/android/bs_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs2_head" - limb_id = "bs2" + icon_state = "bs_two_head" + limb_id = "bs_two" head_flags = HEAD_MONITOR_FACE /obj/item/bodypart/head/robot/android/bs_two/on_adding(mob/living/carbon/new_owner) @@ -298,32 +399,32 @@ /obj/item/bodypart/chest/robot/android/bs_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs2_chest" - limb_id = "bs2" + icon_state = "bs_two_chest" + limb_id = "bs_two" /obj/item/bodypart/arm/right/robot/android/bs_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs2_r_arm" - limb_id = "bs2" + icon_state = "bs_two_r_arm" + limb_id = "bs_two" /obj/item/bodypart/arm/left/robot/android/bs_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs2_l_arm" - limb_id = "bs2" + icon_state = "bs_two_l_arm" + limb_id = "bs_two" /obj/item/bodypart/leg/right/robot/android/bs_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs2_r_leg" - limb_id = "bs2" + icon_state = "bs_two_r_leg" + limb_id = "bs_two" /obj/item/bodypart/leg/left/robot/android/bs_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "bs2_r_leg" - limb_id = "bs2" + icon_state = "bs_two_r_leg" + limb_id = "bs_two" /// // Hephaestus Industries @@ -331,8 +432,8 @@ /obj/item/bodypart/head/robot/android/hi_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi_head" - limb_id = "hi" + icon_state = "hi_one_head" + limb_id = "hi_one" head_flags = HEAD_MONITOR_FACE /obj/item/bodypart/head/robot/android/hi_one/on_adding(mob/living/carbon/new_owner) @@ -346,32 +447,32 @@ /obj/item/bodypart/chest/robot/android/hi_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi_chest" - limb_id = "hi" + icon_state = "hi_one_chest" + limb_id = "hi_one" /obj/item/bodypart/arm/right/robot/android/hi_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi_r_arm" - limb_id = "hi" + icon_state = "hi_one_r_arm" + limb_id = "hi_one" /obj/item/bodypart/arm/left/robot/android/hi_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi_l_arm" - limb_id = "hi" + icon_state = "hi_one_l_arm" + limb_id = "hi_one" /obj/item/bodypart/leg/right/robot/android/hi_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi_r_leg" - limb_id = "hi" + icon_state = "hi_one_r_leg" + limb_id = "hi_one" /obj/item/bodypart/leg/left/robot/android/hi_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi_r_leg" - limb_id = "hi" + icon_state = "hi_one_r_leg" + limb_id = "hi_one" /// // Hephaestus Industries 2.0 @@ -379,8 +480,8 @@ /obj/item/bodypart/head/robot/android/hi_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi2_head" - limb_id = "hi2" + icon_state = "hi_two_head" + limb_id = "hi_two" head_flags = HEAD_MONITOR_FACE /obj/item/bodypart/head/robot/android/hi_two/on_adding(mob/living/carbon/new_owner) @@ -394,32 +495,32 @@ /obj/item/bodypart/chest/robot/android/hi_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi2_chest" - limb_id = "hi2" + icon_state = "hi_two_chest" + limb_id = "hi_two" /obj/item/bodypart/arm/right/robot/android/hi_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi2_r_arm" - limb_id = "hi2" + icon_state = "hi_two_r_arm" + limb_id = "hi_two" /obj/item/bodypart/arm/left/robot/android/hi_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi2_l_arm" - limb_id = "hi2" + icon_state = "hi_two_l_arm" + limb_id = "hi_two" /obj/item/bodypart/leg/right/robot/android/hi_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi2_r_leg" - limb_id = "hi2" + icon_state = "hi_two_r_leg" + limb_id = "hi_two" /obj/item/bodypart/leg/left/robot/android/hi_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "hi2_r_leg" - limb_id = "hi2" + icon_state = "hi_two_r_leg" + limb_id = "hi_two" /// // Shellguard Munitions Standard Series 😎 @@ -523,8 +624,8 @@ /obj/item/bodypart/head/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg_head" - limb_id = "xmg" + icon_state = "xmg_one_head" + limb_id = "xmg_one_one" head_flags = HEAD_MONITOR_FACE /obj/item/bodypart/head/robot/android/xmg_one/on_adding(mob/living/carbon/new_owner) @@ -538,32 +639,32 @@ /obj/item/bodypart/chest/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg_chest" - limb_id = "xmg" + icon_state = "xmg_one_chest" + limb_id = "xmg_one_one" /obj/item/bodypart/arm/right/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg_r_arm" - limb_id = "xmg" + icon_state = "xmg_one_r_arm" + limb_id = "xmg_one_one" /obj/item/bodypart/arm/left/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg_l_arm" - limb_id = "xmg" + icon_state = "xmg_one_l_arm" + limb_id = "xmg_one_one" /obj/item/bodypart/leg/right/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg_r_leg" - limb_id = "xmg" + icon_state = "xmg_one_r_leg" + limb_id = "xmg_one_one" /obj/item/bodypart/leg/left/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg_r_leg" - limb_id = "xmg" + icon_state = "xmg_one_r_leg" + limb_id = "xmg_one_one" /// // Xion Manufacturing Group 2.0 @@ -571,8 +672,8 @@ /obj/item/bodypart/head/robot/android/xmg_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg2_head" - limb_id = "xmg2" + icon_state = "xmg_two_head" + limb_id = "xmg_two" head_flags = HEAD_MONITOR_FACE /obj/item/bodypart/head/robot/android/xmg_two/on_adding(mob/living/carbon/new_owner) @@ -586,32 +687,32 @@ /obj/item/bodypart/chest/robot/android/xmg_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg2_chest" - limb_id = "xmg2" + icon_state = "xmg_two_chest" + limb_id = "xmg_two" /obj/item/bodypart/arm/right/robot/android/xmg_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg2_r_arm" - limb_id = "xmg2" + icon_state = "xmg_two_r_arm" + limb_id = "xmg_two" /obj/item/bodypart/arm/left/robot/android/xmg_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg2_l_arm" - limb_id = "xmg2" + icon_state = "xmg_two_l_arm" + limb_id = "xmg_two" /obj/item/bodypart/leg/right/robot/android/xmg_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg2_r_leg" - limb_id = "xmg2" + icon_state = "xmg_two_r_leg" + limb_id = "xmg_two" /obj/item/bodypart/leg/left/robot/android/xmg_two icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI - icon_state = "xmg2_r_leg" - limb_id = "xmg2" + icon_state = "xmg_two_r_leg" + limb_id = "xmg_two" /// @@ -664,3 +765,87 @@ #undef HEAD_MONITOR_FACE #undef ANDROID_BODYPARTS_DMI + +/datum/design/android_head + name = "Android Head" + id = "android_head" + build_type = MECHFAB + build_path = /obj/item/bodypart/head/robot/android + materials = list( + /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, + /datum/material/silver=SHEET_MATERIAL_AMOUNT*3, + ) + construction_time = 20 SECONDS + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_LIMBS + ) + +/datum/design/android_chest + name = "Android Chest" + id = "android_chest" + build_type = MECHFAB + build_path = /obj/item/bodypart/chest/robot/android + materials = list( + /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, + /datum/material/silver=SHEET_MATERIAL_AMOUNT*3, + ) + construction_time = 20 SECONDS + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_LIMBS + ) + +/datum/design/android_l_arm + name = "Android Left Arm" + id = "android_l_arm" + build_type = MECHFAB + build_path = /obj/item/bodypart/arm/left/robot/android + materials = list( + /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, + /datum/material/silver=SHEET_MATERIAL_AMOUNT*3, + ) + construction_time = 20 SECONDS + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_LIMBS + ) + +/datum/design/android_r_arm + name = "Android Right Arm" + id = "android_r_arm" + build_type = MECHFAB + build_path = /obj/item/bodypart/arm/right/robot/android + materials = list( + /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, + /datum/material/silver=SHEET_MATERIAL_AMOUNT*3, + ) + construction_time = 20 SECONDS + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_LIMBS + ) + +/datum/design/android_l_leg + name = "Android Left Leg" + id = "android_l_leg" + build_type = MECHFAB + build_path = /obj/item/bodypart/leg/left/robot/android + materials = list( + /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, + /datum/material/silver=SHEET_MATERIAL_AMOUNT*3, + ) + construction_time = 20 SECONDS + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_LIMBS + ) + +/datum/design/android_r_leg + name = "Android Right Leg" + id = "android_r_leg" + build_type = MECHFAB + build_path = /obj/item/bodypart/leg/right/robot/android + materials = list( + /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, + /datum/material/silver=SHEET_MATERIAL_AMOUNT*3, + ) + construction_time = 20 SECONDS + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_LIMBS + ) diff --git a/modular_doppler/modular_species/species_types/android/icons/android_parts.dmi b/modular_doppler/modular_species/species_types/android/icons/android_parts.dmi index 793b578ed51dfbcf041f78b4c47c3123705a10a0..9a6cd5031787470beb1449a211b9e14b37d965bd 100644 GIT binary patch literal 46082 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 From d22dd170a743d2edc0f622e335384bb1ff1e6e14 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Thu, 10 Oct 2024 04:06:32 +0200 Subject: [PATCH 21/52] woops --- .../species_types/android/android_parts.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modular_doppler/modular_species/species_types/android/android_parts.dm b/modular_doppler/modular_species/species_types/android/android_parts.dm index 461899fe610a6..8d837f4eb9ec6 100644 --- a/modular_doppler/modular_species/species_types/android/android_parts.dm +++ b/modular_doppler/modular_species/species_types/android/android_parts.dm @@ -14,7 +14,7 @@ continue LAZYADDASSOC(possible_appearances, types, image(icon = ANDROID_BODYPARTS_DMI, icon_state = "[types]_[body_zone]")) //pick - var/new_type = show_radial_menu(user, src, possible_appearances, require_near = TRUE, radius = 48) + var/new_type = show_radial_menu(user, src, possible_appearances, require_near = TRUE, tooltips = TRUE, radius = 48) if(!new_type) return NONE //weld @@ -625,7 +625,7 @@ icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI icon_state = "xmg_one_head" - limb_id = "xmg_one_one" + limb_id = "xmg_one" head_flags = HEAD_MONITOR_FACE /obj/item/bodypart/head/robot/android/xmg_one/on_adding(mob/living/carbon/new_owner) @@ -640,31 +640,31 @@ icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI icon_state = "xmg_one_chest" - limb_id = "xmg_one_one" + limb_id = "xmg_one" /obj/item/bodypart/arm/right/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI icon_state = "xmg_one_r_arm" - limb_id = "xmg_one_one" + limb_id = "xmg_one" /obj/item/bodypart/arm/left/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI icon_state = "xmg_one_l_arm" - limb_id = "xmg_one_one" + limb_id = "xmg_one" /obj/item/bodypart/leg/right/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI icon_state = "xmg_one_r_leg" - limb_id = "xmg_one_one" + limb_id = "xmg_one" /obj/item/bodypart/leg/left/robot/android/xmg_one icon_static = ANDROID_BODYPARTS_DMI icon = ANDROID_BODYPARTS_DMI icon_state = "xmg_one_r_leg" - limb_id = "xmg_one_one" + limb_id = "xmg_one" /// // Xion Manufacturing Group 2.0 From c339dc144d2690b95b269d3b57b8d7833e598988 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Thu, 10 Oct 2024 16:41:32 +0200 Subject: [PATCH 22/52] commit --- modular_doppler/modular_customization/preferences/ears.dm | 6 ++++++ .../modular_species/species_types/android/android_parts.dm | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modular_doppler/modular_customization/preferences/ears.dm b/modular_doppler/modular_customization/preferences/ears.dm index 827cd72ba3a03..fcc5d817ff1c7 100644 --- a/modular_doppler/modular_customization/preferences/ears.dm +++ b/modular_doppler/modular_customization/preferences/ears.dm @@ -38,12 +38,18 @@ . = ..() if(target.dna.features["ears"] && !(type in GLOB.species_blacklist_no_mutant)) if(target.dna.ear_type == NO_VARIATION) + var/obj/item/organ/replacement = SSwardrobe.provide_type(mutantears) + replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . else if(target.dna.features["ears"] != /datum/sprite_accessory/ears/none::name && target.dna.features["ears"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/organ_path = text2path("/obj/item/organ/internal/ears/[target.dna.ear_type]") var/obj/item/organ/replacement = SSwardrobe.provide_type(organ_path) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . + var/obj/item/organ/old_part = target.get_organ_slot(ORGAN_SLOT_EARS) + if(old_part) + old_part.Remove(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) + old_part.moveToNullspace() /// Dropdown to select which ears you'll be rocking /datum/preference/choiced/ear_variation diff --git a/modular_doppler/modular_species/species_types/android/android_parts.dm b/modular_doppler/modular_species/species_types/android/android_parts.dm index 8d837f4eb9ec6..3b54fb82c8318 100644 --- a/modular_doppler/modular_species/species_types/android/android_parts.dm +++ b/modular_doppler/modular_species/species_types/android/android_parts.dm @@ -250,7 +250,7 @@ icon = ANDROID_BODYPARTS_DMI icon_state = "e_three_n_head" limb_id = "e_three_n" - head_flags = HEAD_MONITOR_FACE + head_flags = (HEAD_HAIR|HEAD_DEBRAIN) /obj/item/bodypart/chest/robot/android/e_three_n icon_static = ANDROID_BODYPARTS_DMI From b3a080cf1963c052c3d09f49546265b13f79cb2a Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Thu, 10 Oct 2024 17:31:09 +0200 Subject: [PATCH 23/52] initial --- code/__DEFINES/inventory.dm | 4 ++++ code/_globalvars/bitfields.dm | 4 ++++ code/modules/events/ghost_role/space_ninja.dm | 10 ++++++++++ code/modules/mob/living/carbon/carbon_update_icons.dm | 2 +- code/modules/surgery/organs/external/_visual_organs.dm | 2 +- code/modules/surgery/organs/external/tails.dm | 2 +- 6 files changed, 21 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index ffba025270e42..2ea30bbeaffbb 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -112,6 +112,10 @@ DEFINE_BITFIELD(no_equip_flags, list( #define HIDEBELT (1<<14) ///hides antennae #define HIDEANTENNAE (1<<15) +//DOPPLER ADDITION START +#define HIDETAIL (1<<16) +#define HIDEHORNS (1<<17) +//DOPPLER ADDITION END //bitflags for clothing coverage - also used for limbs #define HEAD (1<<0) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 45afc0e0c85a6..d1c8ae6a36544 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -206,6 +206,10 @@ DEFINE_BITFIELD(flags_inv, list( "HIDESHOES" = HIDESHOES, "HIDESNOUT" = HIDESNOUT, "HIDESUITSTORAGE" = HIDESUITSTORAGE, + // DOPPLER ADDITION START + "HIDETAIL" = HIDETAIL, + "HIDEHORNS" = HIDEHORNS, + // DOPPLER ADDITION END )) DEFINE_BITFIELD(machine_stat, list( diff --git a/code/modules/events/ghost_role/space_ninja.dm b/code/modules/events/ghost_role/space_ninja.dm index eaccbe3de39cb..14bcd03976a6f 100644 --- a/code/modules/events/ghost_role/space_ninja.dm +++ b/code/modules/events/ghost_role/space_ninja.dm @@ -23,10 +23,20 @@ if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS //spawn the ninja and assign the candidate + // DOPPLER ADDITION START - Preference Ninjas + var/loadme = tgui_alert(chosen_one, "Do you wish to load your character slot?", "Load Character?", list("Yes!", "No, I want to be random!"), timeout = 60 SECONDS) + // DOPPLER ADDITION END var/mob/living/carbon/human/ninja = create_space_ninja(spawn_location) ninja.key = chosen_one.key ninja.mind.add_antag_datum(/datum/antagonist/ninja) spawned_mobs += ninja + // DOPPLER ADDITION START - Preference Ninjas + if(loadme == "Yes!") + ninja.client?.prefs?.safe_transfer_prefs_to(ninja) + ninja.dna.update_dna_identity() + + SSquirks.AssignQuirks(ninja, ninja.client) + // DOPPLER ADDITION END message_admins("[ADMIN_LOOKUPFLW(ninja)] has been made into a space ninja by an event.") ninja.log_message("was spawned as a ninja by an event.", LOG_GAME) diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index f6ac6e8dc2ffe..1049a0bbf9aa4 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -1,6 +1,6 @@ /mob/living/carbon/update_obscured_slots(obscured_flags) ..() - if(obscured_flags & (HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT|HIDEMUTWINGS)) + if(obscured_flags & (HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT|HIDEMUTWINGS|HIDETAIL|HIDEHORNS)) // DOPPLER EDIT, old code: if(obscured_flags & (HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT|HIDEMUTWINGS)) update_body() /// Updates features and clothing attached to a specific limb with limb-specific offsets diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index 74399838f1f6b..7ac88de4d60bd 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -120,7 +120,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times feature_key = "horns" /datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart(mob/living/carbon/human/human) - if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) + if((human.head?.flags_inv & HIDEHORNS) || (human.wear_mask?.flags_inv & HIDEHORNS)) // DOPPLER EDIT, old code: if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) return FALSE return TRUE diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index ba3e711f15974..656eac6c8418b 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -153,7 +153,7 @@ return "[wagging ? "wagging_" : ""][sprite_datum.icon_state]" //add the wagging tag if we be wagging /datum/bodypart_overlay/mutant/tail/can_draw_on_bodypart(mob/living/carbon/human/human) - if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) + if(human.wear_suit && (human.wear_suit.flags_inv & HIDETAIL)) // DOPPLER EDIT, old code: if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) return FALSE return TRUE From 0e0546c412e15062fbfa82cbf609ed0ef619287a Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Thu, 10 Oct 2024 18:47:00 +0200 Subject: [PATCH 24/52] initial --- .../loadout_categories/categories/undersuit.dm | 8 +++++++- .../accessories}/code/hair.dm | 4 ++-- .../accessories}/icons/facialhair.dmi | Bin .../accessories}/icons/hair.dmi | Bin .../species_types/snails/modular_snail.dm | 13 ++++++++++++- tgstation.dme | 2 +- 6 files changed, 22 insertions(+), 5 deletions(-) rename modular_doppler/{sprite_accessories => modular_customization/accessories}/code/hair.dm (99%) rename modular_doppler/{sprite_accessories => modular_customization/accessories}/icons/facialhair.dmi (100%) rename modular_doppler/{sprite_accessories => modular_customization/accessories}/icons/hair.dmi (100%) diff --git a/modular_doppler/loadout_categories/categories/undersuit.dm b/modular_doppler/loadout_categories/categories/undersuit.dm index 9b97bd86f0735..b811519abc237 100644 --- a/modular_doppler/loadout_categories/categories/undersuit.dm +++ b/modular_doppler/loadout_categories/categories/undersuit.dm @@ -18,7 +18,13 @@ /datum/loadout_item/undersuit/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE, override_items = LOADOUT_OVERRIDE_BACKPACK) if(override_items == LOADOUT_OVERRIDE_BACKPACK && !visuals_only) if(outfit.uniform) - LAZYADD(outfit.backpack_contents, outfit.uniform) + if(equipper.jumpsuit_style == PREF_SKIRT) + outfit.uniform = "[outfit.uniform]/skirt" + if(!text2path(outfit.uniform)) + outfit.uniform = initial(outfit.uniform) + LAZYADD(outfit.backpack_contents, outfit.uniform) + else + LAZYADD(outfit.backpack_contents, outfit.uniform) outfit.uniform = item_path else outfit.uniform = item_path diff --git a/modular_doppler/sprite_accessories/code/hair.dm b/modular_doppler/modular_customization/accessories/code/hair.dm similarity index 99% rename from modular_doppler/sprite_accessories/code/hair.dm rename to modular_doppler/modular_customization/accessories/code/hair.dm index c57828ce11ade..8d2609d3b48a9 100644 --- a/modular_doppler/sprite_accessories/code/hair.dm +++ b/modular_doppler/modular_customization/accessories/code/hair.dm @@ -1,7 +1,7 @@ // Hairstyles /datum/sprite_accessory/hair/modular - icon = 'modular_doppler/sprite_accessories/icons/hair.dmi' + icon = 'modular_doppler/modular_customization/accessories/icons/hair.dmi' /datum/sprite_accessory/hair/modular/pigtails4 name = "Pigtails 4" @@ -654,7 +654,7 @@ // Facial hair /datum/sprite_accessory/facial_hair/modular - icon = 'modular_doppler/sprite_accessories/icons/facialhair.dmi' + icon = 'modular_doppler/modular_customization/accessories/icons/facialhair.dmi' /datum/sprite_accessory/facial_hair/modular/sideburns name = "Sideburns" diff --git a/modular_doppler/sprite_accessories/icons/facialhair.dmi b/modular_doppler/modular_customization/accessories/icons/facialhair.dmi similarity index 100% rename from modular_doppler/sprite_accessories/icons/facialhair.dmi rename to modular_doppler/modular_customization/accessories/icons/facialhair.dmi diff --git a/modular_doppler/sprite_accessories/icons/hair.dmi b/modular_doppler/modular_customization/accessories/icons/hair.dmi similarity index 100% rename from modular_doppler/sprite_accessories/icons/hair.dmi rename to modular_doppler/modular_customization/accessories/icons/hair.dmi diff --git a/modular_doppler/modular_species/species_types/snails/modular_snail.dm b/modular_doppler/modular_species/species_types/snails/modular_snail.dm index e18aa0f758227..24065f73f3ece 100644 --- a/modular_doppler/modular_species/species_types/snails/modular_snail.dm +++ b/modular_doppler/modular_species/species_types/snails/modular_snail.dm @@ -1,6 +1,7 @@ #define SHELL_TRANSPARENCY_ALPHA 90 /datum/species/snail + preview_outfit = /datum/outfit/snail_preview mutantliver = /obj/item/organ/internal/liver/snail //This is just a better liver to deal with toxins, it's a thematic thing. mutantheart = /obj/item/organ/internal/heart/snail //This gives them the shell buff where they take less damage from behind, and their heart's more durable. exotic_blood = /datum/reagent/blood/green @@ -12,6 +13,11 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/digitigrade/insectoid, ) +/datum/outfit/snail_preview + name = "Snail (Species Preview)" + uniform = /obj/item/clothing/under/rank/medical/chemist/pharmacologist/skirt + mask = /obj/item/clothing/mask/surgical + /datum/species/snail/on_species_gain(mob/living/carbon/new_snailperson, datum/species/old_species, pref_load) . = ..() new_snailperson.update_icons() @@ -141,7 +147,12 @@ wearer.update_worn_back() /datum/species/snail/prepare_human_for_preview(mob/living/carbon/human/snail) - snail.dna.features["mcolor"] = "#adaba7" + snail.dna.features["mcolor"] = "#797289" + snail.hairstyle = "Phoenix Half-Shaven" + snail.hair_color = "#4C3C7E" + snail.eye_color_left = "#615188" + snail.eye_color_right = "#615188" + regenerate_organs(snail, src, visual_only = TRUE) snail.update_body(TRUE) /datum/species/snail/create_pref_unique_perks() diff --git a/tgstation.dme b/tgstation.dme index 0677d12dcdb6a..2884fca875475 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6702,6 +6702,7 @@ #include "modular_doppler\modular_cosmetics\GAGS\greyscale_configs_under.dm" #include "modular_doppler\modular_crafting\code\crafting_extended.dm" #include "modular_doppler\modular_crafting\code\sheet_types.dm" +#include "modular_doppler\modular_customization\accessories\code\hair.dm" #include "modular_doppler\modular_customization\accessories\code\aquatic_accessories\aquatic_body_markings.dm" #include "modular_doppler\modular_customization\accessories\code\aquatic_accessories\aquatic_ears.dm" #include "modular_doppler\modular_customization\accessories\code\aquatic_accessories\aquatic_snout.dm" @@ -6929,7 +6930,6 @@ #include "modular_doppler\religion\code\mind.dm" #include "modular_doppler\religion\code\religious_sects.dm" #include "modular_doppler\research\designs\limbgrower_designs.dm" -#include "modular_doppler\sprite_accessories\code\hair.dm" #include "modular_doppler\stone\code\ore_veins.dm" #include "modular_doppler\stone\code\stone.dm" #include "modular_doppler\tableflip\tableflip.dm" From f33eb2e729e86eefbc9f809909e47e98905c5904 Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Thu, 10 Oct 2024 18:51:43 +0200 Subject: [PATCH 25/52] stay functional please --- modular_doppler/modular_customization/preferences/ears.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modular_doppler/modular_customization/preferences/ears.dm b/modular_doppler/modular_customization/preferences/ears.dm index fcc5d817ff1c7..827cd72ba3a03 100644 --- a/modular_doppler/modular_customization/preferences/ears.dm +++ b/modular_doppler/modular_customization/preferences/ears.dm @@ -38,18 +38,12 @@ . = ..() if(target.dna.features["ears"] && !(type in GLOB.species_blacklist_no_mutant)) if(target.dna.ear_type == NO_VARIATION) - var/obj/item/organ/replacement = SSwardrobe.provide_type(mutantears) - replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . else if(target.dna.features["ears"] != /datum/sprite_accessory/ears/none::name && target.dna.features["ears"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/organ_path = text2path("/obj/item/organ/internal/ears/[target.dna.ear_type]") var/obj/item/organ/replacement = SSwardrobe.provide_type(organ_path) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - var/obj/item/organ/old_part = target.get_organ_slot(ORGAN_SLOT_EARS) - if(old_part) - old_part.Remove(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) - old_part.moveToNullspace() /// Dropdown to select which ears you'll be rocking /datum/preference/choiced/ear_variation From f9847a64d362902588dc969bec7b3dabd655833b Mon Sep 17 00:00:00 2001 From: "Lila S." Date: Thu, 10 Oct 2024 23:33:28 +0200 Subject: [PATCH 26/52] synth wounds pt 1 --- code/__DEFINES/text.dm | 4 + code/__DEFINES/wounds.dm | 8 +- code/__DEFINES/~doppler_defines/is_helpers.dm | 2 +- code/__DEFINES/~doppler_defines/traits.dm | 7 + code/_globalvars/traits/_traits.dm | 5 + code/datums/wounds/bones.dm | 4 + .../effects/decals/cleanable/humans.dm | 4 + .../structures/crates_lockers/crates.dm | 4 + code/modules/mob/living/blood.dm | 8 +- code/modules/mob/living/carbon/carbon.dm | 2 + code/modules/mob/living/carbon/human/death.dm | 6 + code/modules/projectiles/projectile.dm | 10 +- .../reagents/reagent_containers/blood_pack.dm | 12 +- code/modules/unit_tests/quirks.dm | 4 + .../deforest_medical_items/code/injectors.dm | 22 + .../code/medstation_designs/blood.dm | 22 + .../code/storage_items_robotics.dm | 75 ++ .../code/synth_healing.dm | 104 +++ .../chemistry_reagents.dm | 9 +- .../modular_medical/reagents/blood_pack.dm | 7 + .../modular_medical/reagents/crates.dm | 14 + .../modular_medical/reagents/medicine.dm | 128 +++- .../wounds/synth/blunt/robotic_blunt.dm | 401 +++++++++++ .../wounds/synth/blunt/robotic_blunt_T1.dm | 65 ++ .../wounds/synth/blunt/robotic_blunt_T2.dm | 52 ++ .../wounds/synth/blunt/robotic_blunt_T3.dm | 398 +++++++++++ .../wounds/synth/blunt/secures_internals.dm | 416 +++++++++++ .../wounds/synth/medicine_reagents.dm | 64 ++ .../wounds/synth/robotic_burns.dm | 484 +++++++++++++ .../wounds/synth/robotic_muscle.dm | 47 ++ .../wounds/synth/robotic_pierce.dm | 152 ++++ .../wounds/synth/robotic_slash.dm | 654 ++++++++++++++++++ .../wounds/synth/sound/robotic_slash_T1.ogg | Bin 0 -> 34541 bytes .../wounds/synth/sound/robotic_slash_T2.ogg | Bin 0 -> 50347 bytes .../wounds/synth/sound/robotic_slash_T3.ogg | Bin 0 -> 63099 bytes .../modular_medical/wounds/wound_effects.dm | 9 + .../modular_species/code/bloodsplatter.dm | 90 ++- .../modular_species/icons/blood.dmi | Bin 68919 -> 148148 bytes .../species_types/android/android_parts.dm | 19 +- .../code/doppler_vendors/de_forest/vendor.dm | 5 + tgstation.dme | 14 + 41 files changed, 3296 insertions(+), 35 deletions(-) create mode 100644 modular_doppler/deforest_medical_items/code/storage_items_robotics.dm create mode 100644 modular_doppler/deforest_medical_items/code/synth_healing.dm create mode 100644 modular_doppler/modular_medical/reagents/blood_pack.dm create mode 100644 modular_doppler/modular_medical/reagents/crates.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T1.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T2.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T3.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/blunt/secures_internals.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/medicine_reagents.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/robotic_burns.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/robotic_muscle.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/robotic_pierce.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/robotic_slash.dm create mode 100644 modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T1.ogg create mode 100644 modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T2.ogg create mode 100644 modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T3.ogg diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index 3b5cb5d795011..1511bba2c0f2c 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -94,6 +94,10 @@ #define FLESH_SCAR_FILE "wounds/flesh_scar_desc.json" /// File location for bone wound descriptions #define BONE_SCAR_FILE "wounds/bone_scar_desc.json" +// DOPPLER ADDITION BEGIN - SYNTH WOUNDS +/// File location for metalic wound descriptions +#define METAL_SCAR_FILE "wounds/metal_scar_desc.json" +// DOPPLER ADDITION END /// File location for scar wound descriptions #define SCAR_LOC_FILE "wounds/scar_loc.json" /// File location for exodrone descriptions diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index 79dfb13edfcfc..409c4765f2c95 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -128,11 +128,15 @@ GLOBAL_LIST_INIT(bio_state_anatomy, list( /// Cranial fissure wound. #define WOUND_SERIES_CRANIAL_FISSURE "wound_series_cranial_fissure" -// NOVA EDIT ADDITION BEGIN - MUSCLE AND SYNTH WOUNDS +// DOPPLER ADDITION BEGIN - synth wounds // Have to put it here so I can use it in the global list of wound series /// See muscle.dm and robotic_blunt.dm #define WOUND_SERIES_MUSCLE_DAMAGE "nova_wound_series_muscle_damage" - +#define WOUND_SERIES_METAL_BLUNT_BASIC "wound_series_metal_blunt_basic" +#define WOUND_SERIES_METAL_BURN_OVERHEAT "wound_series_metal_burn_basic" +#define WOUND_SERIES_WIRE_SLASH_ELECTRICAL_DAMAGE "wound_series_metal_slash_electrical_damage_basic" +#define WOUND_SERIES_WIRE_PIERCE_ELECTRICAL_DAMAGE "wound_series_metal_pierce_electrical_damage_basic" +// DOPPLER ADDITION END /// A assoc list of (wound typepath -> wound_pregen_data instance). Every wound should have a pregen data. GLOBAL_LIST_INIT_TYPED(all_wound_pregen_data, /datum/wound_pregen_data, generate_wound_static_data()) diff --git a/code/__DEFINES/~doppler_defines/is_helpers.dm b/code/__DEFINES/~doppler_defines/is_helpers.dm index 432f668d26acd..606790c68fee3 100644 --- a/code/__DEFINES/~doppler_defines/is_helpers.dm +++ b/code/__DEFINES/~doppler_defines/is_helpers.dm @@ -6,5 +6,5 @@ #define ishemophage(A) (is_species(A, /datum/species/genemod/hemophage)) #define isramatan(A) (is_species(A, /datum/species/ramatan)) //Species blood colors -#define hasgreenblood(A) (isinsectoid(A) || issnail(A) || isflyperson(A) || HAS_TRAIT(A, TRAIT_GREEN_BLOOD)) +#define hasgreenblood(A) (isinsectoid(A) || issnail(A) || isflyperson(A) || isalien(A) || HAS_TRAIT(A, TRAIT_GREEN_BLOOD)) #define hasblueblood(A) (isandroid(A) || HAS_TRAIT(A, TRAIT_BLUE_BLOOD)) diff --git a/code/__DEFINES/~doppler_defines/traits.dm b/code/__DEFINES/~doppler_defines/traits.dm index 9ef069f37fb45..718af41a3e7db 100644 --- a/code/__DEFINES/~doppler_defines/traits.dm +++ b/code/__DEFINES/~doppler_defines/traits.dm @@ -49,3 +49,10 @@ #define REAGENT_TRAIT "reagent" /// Trait that changes the ending effects of twitch leaving your system #define TRAIT_TWITCH_ADAPTED "twitch_adapted" + +//// +// Wounds +//// +/// When someone is fixing electrical damage, this trait is set and prevents the wound from worsening. +// We use a trait to avoid erronous setting of a variable to false if two people are repairing and one stops. +#define TRAIT_ELECTRICAL_DAMAGE_REPAIRING "electrical_damage_repairing" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index b61876319f308..3a6768f06c34e 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -116,6 +116,11 @@ GLOBAL_LIST_INIT(traits_by_type, list( /datum/wound = list( "TRAIT_WOUND_SCANNED" = TRAIT_WOUND_SCANNED, ), + // DOPPLER ADDITON BEGIN + /datum/wound/electrical_damage = list( + "TRAIT_ELECTRICAL_DAMAGE_REPAIRING" = TRAIT_ELECTRICAL_DAMAGE_REPAIRING, + ), + // DOPPLER ADDITON END /obj = list( "TRAIT_WALLMOUNTED" = TRAIT_WALLMOUNTED, "TRAIT_CONTRABAND" = TRAIT_CONTRABAND, diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 3e8c49c2d5944..8c646c9536fa2 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -162,6 +162,8 @@ // DOPPLER EDIT ADDITION BEGIN - Green blood color if(hasgreenblood(victim)) new /obj/effect/temp_visual/dir_setting/bloodsplatter/green(victim.loc, victim.dir) + if(hasblueblood(victim)) + new /obj/effect/temp_visual/dir_setting/bloodsplatter/blue(victim.loc, victim.dir) else new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) // DOPPLER EDIT ADDITION END @@ -176,6 +178,8 @@ // DOPPLER EDIT ADDITION BEGIN - Green blood color if(hasgreenblood(victim)) new /obj/effect/temp_visual/dir_setting/bloodsplatter/green(victim.loc, victim.dir) + if(hasblueblood(victim)) + new /obj/effect/temp_visual/dir_setting/bloodsplatter/blue(victim.loc, victim.dir) else new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) // DOPPLER EDIT ADDITION END diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 753c94dced2c9..808357df1d8d3 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -442,6 +442,8 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) var/obj/effect/decal/cleanable/final_splatter if(istype(src, /obj/effect/decal/cleanable/blood/hitsplatter/green)) final_splatter = new /obj/effect/decal/cleanable/blood/green/splatter/over_window(prev_loc) + if(istype(src, /obj/effect/decal/cleanable/blood/hitsplatter/blue)) + final_splatter = new /obj/effect/decal/cleanable/blood/blue/splatter/over_window(prev_loc) else final_splatter = new /obj/effect/decal/cleanable/blood/splatter/over_window(prev_loc) // DOPPLER EDIT CHANGE END @@ -459,6 +461,8 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) var/obj/effect/decal/cleanable/final_splatter if(istype(src, /obj/effect/decal/cleanable/blood/hitsplatter/green)) final_splatter = new /obj/effect/decal/cleanable/blood/green/splatter/over_window(prev_loc) + if(istype(src, /obj/effect/decal/cleanable/blood/hitsplatter/blue)) + final_splatter = new /obj/effect/decal/cleanable/blood/blue/splatter/over_window(prev_loc) else final_splatter = new /obj/effect/decal/cleanable/blood/splatter/over_window(prev_loc) // DOPPLER EDIT CHANGE END diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index a7415c951f2f9..f01fe56431d94 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -277,6 +277,10 @@ new /obj/item/reagent_containers/blood/o_plus(src) new /obj/item/reagent_containers/blood/lizard(src) new /obj/item/reagent_containers/blood/ethereal(src) + // DOPPLER ADDITION START + new /obj/item/reagent_containers/blood/robot(src) + new /obj/item/reagent_containers/blood/bug(src) + // DOPPLER ADDITION END for(var/i in 1 to 3) new /obj/item/reagent_containers/blood/random(src) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index be4531be4043c..ee76e7a503b13 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -385,7 +385,9 @@ // DOPPLER EDIT CHANGE START - ORIGINAL: drop = new(T, get_static_viruses()) if(hasgreenblood(src)) drop = new /obj/effect/decal/cleanable/blood/drip/green(T, get_static_viruses()) - else + if(hasblueblood(src)) + drop = new /obj/effect/decal/cleanable/blood/drip/blue(T, get_static_viruses()) + if(!hasblueblood(src) && !hasgreenblood(src)) drop = new(T, get_static_viruses()) // DOPPLER EDIT END drop.transfer_mob_blood_dna(src) @@ -397,7 +399,9 @@ // DOPPLER EDIT CHANGE START - ORIGINAL: B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses()) if(hasgreenblood(src)) B = new /obj/effect/decal/cleanable/blood/green/splatter(T, get_static_viruses()) - else + if(hasblueblood(src)) + B = new /obj/effect/decal/cleanable/blood/blue/splatter(T, get_static_viruses()) + if(!hasblueblood(src) && !hasgreenblood(src)) B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses()) // DOPPLER EDIT END if(QDELETED(B)) //Give it up diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 47ceecd8a009d..19f83e6625d58 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1444,6 +1444,8 @@ var/obj/effect/decal/cleanable/blood/hitsplatter/our_splatter if(hasgreenblood(src)) our_splatter = new /obj/effect/decal/cleanable/blood/hitsplatter/green(loc) + if(hasblueblood(src)) + our_splatter = new /obj/effect/decal/cleanable/blood/hitsplatter/blue(loc) else our_splatter = new /obj/effect/decal/cleanable/blood/hitsplatter(loc) // DOPPLER EDIT CHANGE END diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index dd97c12bd844f..94fabcb078e43 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -8,6 +8,12 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) /mob/living/carbon/human/spawn_gibs(drop_bitflags=NONE) if(flags_1 & HOLOGRAM_1) return + // DOPPLER ADDITION START + if(hasblueblood(src)) + new /obj/effect/gibspawner/human/blue(drop_location(), src, get_static_viruses()) + if(hasgreenblood(src)) + new /obj/effect/gibspawner/human/green(drop_location(), src, get_static_viruses()) + // DOPPLER ADDITION END if(drop_bitflags & DROP_BODYPARTS) new /obj/effect/gibspawner/human(drop_location(), src, get_static_viruses()) else diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 50322cb7192a2..5bb933cb23cde 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -331,13 +331,13 @@ if(starting) splatter_dir = get_dir(starting, target_turf) // DOPPLER ADDITION START - // if(hasblueblood(living_target)) - // new /obj/effect/temp_visual/dir_setting/bloodsplatter/blue(target_turf, splatter_dir) - if(isalien(living_target) || hasgreenblood(living_target)) + if(hasblueblood(living_target)) + new /obj/effect/temp_visual/dir_setting/bloodsplatter/blue(target_turf, splatter_dir) + if(hasgreenblood(living_target)) new /obj/effect/temp_visual/dir_setting/bloodsplatter/green(target_turf, splatter_dir) - // DOPPLER ADDITION END - else + if(!hasblueblood(living_target) && !hasgreenblood(living_target)) new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_turf, splatter_dir) + // DOPPLER ADDITION END if(prob(33)) living_target.add_splatter_floor(target_turf) if (hit_bodypart?.biological_state & (BIO_ROBOTIC)) // DOPPLER EDIT - old code: else if (hit_bodypart?.biological_state & (BIO_METAL|BIO_WIRED)) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 15c79e4c150b9..9a92828c89e07 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -22,12 +22,20 @@ blood_type = new_reagent.data["blood_type"] else if(holder.has_reagent(/datum/reagent/consumable/liquidelectricity)) blood_type = "LE" + /* DOPPLER REMOVAL START else if(holder.has_reagent(/datum/reagent/lube)) blood_type = "S" + DOPPLER REMOVAL END */ else if(holder.has_reagent(/datum/reagent/water)) blood_type = "H2O" else if(holder.has_reagent(/datum/reagent/toxin/slimejelly)) blood_type = "TOX" + // DOPPLER ADDITION START + else if(holder.has_reagent(/datum/reagent/synth_blood)) + blood_type = "R" + else if(holder.has_reagent(/datum/reagent/bug_blood)) + blood_type = "I" + // DOPPLER ADDITION END else blood_type = null return ..() @@ -43,7 +51,7 @@ /obj/item/reagent_containers/blood/random/Initialize(mapload, vol) icon_state = "bloodpack" - blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L") + blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L", "LE", "R", "I") // DOPPLER EDIT, old code: blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L") return ..() /obj/item/reagent_containers/blood/a_plus @@ -71,6 +79,7 @@ blood_type = "LE" unique_blood = /datum/reagent/consumable/liquidelectricity +/* DOPPLER REMOVAL START /obj/item/reagent_containers/blood/snail blood_type = "S" unique_blood = /datum/reagent/lube @@ -78,6 +87,7 @@ /obj/item/reagent_containers/blood/snail/examine() . = ..() . += span_notice("It's a bit slimy... The label indicates that this is meant for snails.") + DOPPLER REMOVAL END */ /obj/item/reagent_containers/blood/podperson blood_type = "H2O" diff --git a/code/modules/unit_tests/quirks.dm b/code/modules/unit_tests/quirks.dm index cca2c312cfe27..d63e2beac049f 100644 --- a/code/modules/unit_tests/quirks.dm +++ b/code/modules/unit_tests/quirks.dm @@ -50,6 +50,10 @@ /datum/species/skeleton = null, // Anyone with noblood should not get a blood bag /datum/species/jelly = /obj/item/reagent_containers/blood/toxin, /datum/species/human = /obj/item/reagent_containers/blood/o_minus, + // DOPPLER ADDITION START + /datum/species/android = /obj/item/reagent_containers/blood/robot, + /datum/species/insectoid = /obj/item/reagent_containers/blood/bug, + // DOPPLER ADDITION END ) /datum/unit_test/blood_deficiency_mail/Run() diff --git a/modular_doppler/deforest_medical_items/code/injectors.dm b/modular_doppler/deforest_medical_items/code/injectors.dm index 02334261f3e32..02558b52bb102 100644 --- a/modular_doppler/deforest_medical_items/code/injectors.dm +++ b/modular_doppler/deforest_medical_items/code/injectors.dm @@ -207,3 +207,25 @@ /datum/reagent/medicine/higadrite = 5, /datum/reagent/medicine/silibinin = 5, ) + +// Medpen for robots that fixes toxin damage and purges synth chems but slows them down for a bit +/obj/item/reagent_containers/hypospray/medipen/deforest/robot_system_cleaner + name = "synthetic cleaner autoinjector" + desc = "A Deforest branded autoinjector, loaded with system cleaner for purging synthetics of reagents." + base_icon_state = "robor" + icon_state = "robor" + list_reagents = list( + /datum/reagent/medicine/system_cleaner = 15, + /datum/reagent/dinitrogen_plasmide = 5, + ) + +// Medpen for robots that fixes brain damage but slows them down for a bit +/obj/item/reagent_containers/hypospray/medipen/deforest/robot_liquid_solder + name = "synthetic smart-solder autoinjector" + desc = "A Deforest branded autoinjector, loaded with liquid solder to repair synthetic processor core damage." + base_icon_state = "robor_brain" + icon_state = "robor_brain" + list_reagents = list( + /datum/reagent/medicine/liquid_solder = 15, + /datum/reagent/dinitrogen_plasmide = 5, + ) diff --git a/modular_doppler/deforest_medical_items/code/medstation_designs/blood.dm b/modular_doppler/deforest_medical_items/code/medstation_designs/blood.dm index f7624f60d1a4e..0d523d14f4fa7 100644 --- a/modular_doppler/deforest_medical_items/code/medstation_designs/blood.dm +++ b/modular_doppler/deforest_medical_items/code/medstation_designs/blood.dm @@ -107,3 +107,25 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_DEFOREST_BLOOD, ) + +/datum/design/organic_bloodbag_robot + name = "R Blood Pack" + id = "organic_bloodbag_robot" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/blood/robot + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + +/datum/design/organic_bloodbag_bug + name = "I Blood Pack" + id = "organic_bloodbag_bug" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/blood/bug + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) diff --git a/modular_doppler/deforest_medical_items/code/storage_items_robotics.dm b/modular_doppler/deforest_medical_items/code/storage_items_robotics.dm new file mode 100644 index 0000000000000..f57467bcf266b --- /dev/null +++ b/modular_doppler/deforest_medical_items/code/storage_items_robotics.dm @@ -0,0 +1,75 @@ +// Pre-packed medkit for healing synths and repairing their wounds rapidly in the field +/obj/item/storage/medkit/robotic_repair + name = "robotic repair equipment kit" + desc = "An industrial-strength plastic box filled with supplies for repairing synthetics from critical damage." + icon = 'modular_doppler/deforest_medical_items/icons/storage.dmi' + icon_state = "synth_medkit" + inhand_icon_state = "medkit" + worn_icon = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi' + worn_icon_state = "frontier" + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + +/obj/item/storage/medkit/robotic_repair/Initialize(mapload) + . = ..() + var/static/list/list_of_everything_mechanical_medkits_can_hold = list_of_everything_medkits_can_hold + list( + /obj/item/stack/cable_coil, + /obj/item/crowbar, + /obj/item/screwdriver, + /obj/item/wrench, + /obj/item/weldingtool, + /obj/item/wirecutters, + /obj/item/multitool, + /obj/item/plunger, + /obj/item/clothing/head/utility/welding, + /obj/item/clothing/glasses/welding, + ) + var/static/list/exception_cache = typecacheof( + /obj/item/clothing/head/utility/welding, + ) + + atom_storage.set_holdable(list_of_everything_mechanical_medkits_can_hold) + LAZYINITLIST(atom_storage.exception_hold) + atom_storage.exception_hold = atom_storage.exception_hold + exception_cache + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + +/obj/item/storage/medkit/robotic_repair/stocked + +/obj/item/storage/medkit/robotic_repair/stocked/PopulateContents() + var/static/items_inside = list( + /obj/item/stack/medical/gauze = 1, + /obj/item/reagent_containers/pill/robotic_patch/synth_repair = 2, + /obj/item/stack/medical/wound_recovery/robofoam = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/robot_system_cleaner = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/coagulants = 1, // Coagulants help electrical damage + /obj/item/healthanalyzer/simple = 1, + ) + generate_items_inside(items_inside,src) + +/obj/item/storage/medkit/robotic_repair/preemo + name = "premium robotic repair equipment kit" + desc = "An industrial-strength plastic box filled with supplies for repairing synthetics from critical damage. \ + This one has extra storage on the sides for even more equipment than the standard medkit model." + icon_state = "synth_medkit_super" + +/obj/item/storage/medkit/robotic_repair/preemo/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_slots = 12 + atom_storage.max_total_storage = 12 * WEIGHT_CLASS_NORMAL + +/obj/item/storage/medkit/robotic_repair/preemo/stocked + +/obj/item/storage/medkit/robotic_repair/preemo/stocked/PopulateContents() + var/static/items_inside = list( + /obj/item/stack/medical/gauze/twelve = 1, + /obj/item/stack/cable_coil/thirty = 1, + /obj/item/reagent_containers/pill/robotic_patch/synth_repair = 4, + /obj/item/stack/medical/wound_recovery/robofoam = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/robot_system_cleaner = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/robot_liquid_solder = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/coagulants = 1, + /obj/item/reagent_containers/spray/dinitrogen_plasmide = 1, + /obj/item/healthanalyzer/simple = 1, + ) + generate_items_inside(items_inside,src) diff --git a/modular_doppler/deforest_medical_items/code/synth_healing.dm b/modular_doppler/deforest_medical_items/code/synth_healing.dm new file mode 100644 index 0000000000000..b2aac928c979b --- /dev/null +++ b/modular_doppler/deforest_medical_items/code/synth_healing.dm @@ -0,0 +1,104 @@ +// Used to stop synth structural damage +/obj/item/stack/medical/wound_recovery/robofoam + name = "robotic repair spray" + singular_name = "robotic repair spray" + desc = "A needle-tip foam gun filled with an advanced synthetic foam that rapidly \ + fills and stabilizes structural damage in synthetics. The damaged area will be \ + vulnerable to further damage while the foam hardens" + icon = 'modular_doppler/deforest_medical_items/icons/stack_items.dmi' + icon_state = "robofoam" + inhand_icon_state = "implantcase" + applicable_wounds = list( + /datum/wound/blunt/robotic, + ) + max_amount = 2 + amount = 2 + merge_type = /obj/item/stack/medical/wound_recovery/robofoam + treatment_sound = 'sound/effects/spray.ogg' + causes_pain = FALSE + +/obj/item/stack/medical/wound_recovery/robofoam/examine(mob/user) + . = ..() + . += span_notice("This cheaper foam can only be used to fill structural wounds on synthetics.") + return . + +/obj/item/stack/medical/wound_recovery/robofoam/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) + . = ..() + healed_mob.reagents.add_reagent(/datum/reagent/medicine/nanite_slurry, 5) + healed_mob.reagents.add_reagent(/datum/reagent/medicine/coagulant/fabricated, 5) + +// Used to cure practically any synthetic wound +/obj/item/stack/medical/wound_recovery/robofoam_super + name = "premium robotic repair spray" + singular_name = "premium robotic repair spray" + desc = "A needle-tip foam gun filled with an advanced synthetic foam that rapidly \ + fills and stabilizes structural damage in synthetics. The damaged area will be \ + vulnerable to further damage while the foam hardens. \ + This special premium type can also be used to repair almost any possible type \ + of synthetic damage." + icon = 'modular_doppler/deforest_medical_items/icons/stack_items.dmi' + icon_state = "robofoam_super" + inhand_icon_state = "implantcase" + applicable_wounds = list( + /datum/wound/blunt/robotic, + /datum/wound/muscle/robotic, + /datum/wound/electrical_damage, + /datum/wound/burn/robotic, + ) + max_amount = 2 + amount = 2 + merge_type = /obj/item/stack/medical/wound_recovery/robofoam_super + treatment_sound = 'sound/effects/spray.ogg' + causes_pain = FALSE + +/obj/item/stack/medical/wound_recovery/robofoam_super/examine(mob/user) + . = ..() + . += span_notice("This more expensive foam can be used to fill any type of wound on synthetics.") + return . + +/obj/item/stack/medical/wound_recovery/robofoam_super/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) + . = ..() + healed_mob.reagents.add_reagent(/datum/reagent/medicine/coagulant/fabricated, 5) + healed_mob.reagents.add_reagent(/datum/reagent/medicine/nanite_slurry, 5) + healed_mob.reagents.add_reagent(/datum/reagent/dinitrogen_plasmide, 5) + +// Synth repair patch, gives the synth a small amount of healing chems +/obj/item/reagent_containers/pill/robotic_patch + name = "robotic patch" + desc = "A chemical patch for touch-based applications on synthetics." + icon = 'modular_doppler/deforest_medical_items/icons/stack_items.dmi' + icon_state = "synth_patch" + inhand_icon_state = null + possible_transfer_amounts = list() + volume = 40 + apply_type = PATCH + apply_method = "apply" + self_delay = 3 SECONDS + dissolvable = FALSE + +/obj/item/reagent_containers/pill/robotic_patch/attack(mob/living/L, mob/user) + if(ishuman(L)) + var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) + if(!affecting) + to_chat(user, span_warning("The limb is missing!")) + return + if(!IS_ROBOTIC_LIMB(affecting)) + to_chat(user, span_notice("Robotic patches won't work on an organic limb!")) + return + return ..() + +/obj/item/reagent_containers/pill/robotic_patch/canconsume(mob/eater, mob/user) + if(!iscarbon(eater)) + return FALSE + return TRUE + +// The actual patch +/obj/item/reagent_containers/pill/robotic_patch/synth_repair + name = "robotic repair patch" + desc = "A sealed patch with a small nanite swarm along with electrical coagulant reagents to repair small amounts of synthetic damage." + icon_state = "synth_patch" + list_reagents = list( + /datum/reagent/medicine/nanite_slurry = 10, + /datum/reagent/dinitrogen_plasmide = 5, + /datum/reagent/medicine/coagulant/fabricated = 10, + ) diff --git a/modular_doppler/modular_food_drinks_and_chems/chemistry_reagents.dm b/modular_doppler/modular_food_drinks_and_chems/chemistry_reagents.dm index 744cf7e509cd0..dad2f93dd66ae 100644 --- a/modular_doppler/modular_food_drinks_and_chems/chemistry_reagents.dm +++ b/modular_doppler/modular_food_drinks_and_chems/chemistry_reagents.dm @@ -70,9 +70,14 @@ to_chat(M, span_notice("[pick("I feel oddly calm.", "I feel relaxed.", "Mew?")]")) ..() -/* + #define DERMAGEN_SCAR_FIX_AMOUNT 10 +/datum/chemical_reaction/medicine/dermagen + results = list(/datum/reagent/medicine/dermagen = 5) + required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/medicine/c2/synthflesh = 3, /datum/reagent/medicine/mine_salve = 3) + mix_message = "The slurry congeals into a thick cream." + /datum/reagent/medicine/dermagen name = "Dermagen" description = "Heals scars formed by past physical trauma when applied. Minimum 10u needed, only works when applied topically." @@ -97,7 +102,7 @@ qdel(i) #undef DERMAGEN_SCAR_FIX_AMOUNT -*/ + /** * Check if this holder contains a reagent with a `chemical_flags_doppler` containing this flag. diff --git a/modular_doppler/modular_medical/reagents/blood_pack.dm b/modular_doppler/modular_medical/reagents/blood_pack.dm new file mode 100644 index 0000000000000..68aedd7cb44aa --- /dev/null +++ b/modular_doppler/modular_medical/reagents/blood_pack.dm @@ -0,0 +1,7 @@ +/obj/item/reagent_containers/blood/robot + blood_type = "R" + unique_blood = /datum/reagent/synth_blood + +/obj/item/reagent_containers/blood/bug + blood_type = "I" + unique_blood = /datum/reagent/bug_blood diff --git a/modular_doppler/modular_medical/reagents/crates.dm b/modular_doppler/modular_medical/reagents/crates.dm new file mode 100644 index 0000000000000..b81fce1043221 --- /dev/null +++ b/modular_doppler/modular_medical/reagents/crates.dm @@ -0,0 +1,14 @@ +/obj/structure/closet/crate/freezer/surplus_limbs + name = "prosthetic limbs" + desc = "A crate containing an assortment of robust prosthetic limbs." + +/obj/structure/closet/crate/freezer/surplus_limbs/PopulateContents() + . = ..() + new /obj/item/bodypart/arm/left/robot/android(src) + new /obj/item/bodypart/arm/left/robot/android(src) + new /obj/item/bodypart/arm/right/robot/android(src) + new /obj/item/bodypart/arm/right/robot/android(src) + new /obj/item/bodypart/leg/left/robot/android(src) + new /obj/item/bodypart/leg/left/robot/android(src) + new /obj/item/bodypart/leg/right/robot/android(src) + new /obj/item/bodypart/leg/right/robot/android(src) diff --git a/modular_doppler/modular_medical/reagents/medicine.dm b/modular_doppler/modular_medical/reagents/medicine.dm index 0c91f395fce81..fd857a3b5eb26 100644 --- a/modular_doppler/modular_medical/reagents/medicine.dm +++ b/modular_doppler/modular_medical/reagents/medicine.dm @@ -1,3 +1,15 @@ +/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs + process_flags = REAGENT_ORGANIC | REAGENT_SYNTHETIC //Let's not cripple synth ops + +/datum/reagent/medicine/stimulants + process_flags = REAGENT_ORGANIC | REAGENT_SYNTHETIC //Syndicate developed 'accelerants' for synths? + +/datum/reagent/medicine/leporazine + process_flags = REAGENT_ORGANIC | REAGENT_SYNTHETIC + +/datum/reagent/flightpotion + process_flags = REAGENT_ORGANIC | REAGENT_SYNTHETIC + /datum/reagent/medicine/lidocaine name = "Lidocaine" description = "A numbing agent used often for surgeries, metabolizes slowly." @@ -15,8 +27,6 @@ . = ..() affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART,3 * REM * seconds_per_tick, 80) -//Inverse Medicines// - /datum/reagent/inverse/lidocaine name = "Lidopaine" description = "A paining agent used often for... being a jerk, metabolizes faster than lidocaine." @@ -41,3 +51,117 @@ color = "#ff7373" //255, 155. 155 clot_rate = 0.15 //Half as strong as standard coagulant passive_bleed_modifier = 0.5 // around 2/3 the bleeding reduction + + +// REAGENTS FOR SYNTHS +/datum/chemical_reaction/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/reagent/medicine/system_cleaner + name = "System Cleaner" + description = "Neutralizes harmful chemical compounds inside synthetic systems and refreshes system software." + reagent_state = LIQUID + color = "#F1C40F" + taste_description = "ethanol" + metabolization_rate = 2 * REAGENTS_METABOLISM + process_flags = REAGENT_SYNTHETIC + +/datum/reagent/medicine/system_cleaner/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, 0) + affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) + var/remove_amount = 1 * REM * seconds_per_tick; + for(var/thing in affected_mob.reagents.reagent_list) + var/datum/reagent/reagent = thing + if(reagent != src) + affected_mob.reagents.remove_reagent(reagent.type, remove_amount) + ..() + return TRUE + +/datum/chemical_reaction/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/reagent/medicine/liquid_solder + name = "Liquid Solder" + description = "Repairs brain damage in synthetics." + reagent_state = LIQUID + color = "#727272" + taste_description = "metal" + process_flags = REAGENT_SYNTHETIC + +/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick) + affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3 * REM * seconds_per_tick) + if(prob(10)) + affected_mob.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) + return ..() + +#define NANITE_SLURRY_ORGANIC_PURGE_RATE 4 +#define NANITE_SLURRY_ORGANIC_VOMIT_CHANCE 25 + +/datum/chemical_reaction/nanite_slurry + results = list(/datum/reagent/medicine/nanite_slurry = 3) + required_reagents = list(/datum/reagent/foaming_agent = 1, /datum/reagent/gold = 1, /datum/reagent/iron = 1) + mix_message = "The mixture becomes a metallic slurry." + +/datum/reagent/medicine/nanite_slurry + name = "Nanite Slurry" + description = "A localized swarm of nanomachines specialized in repairing mechanical parts. Due to the nanites needing to interface with the host's systems to repair them, a surplus of them will cause them to overheat, or for the swarm to forcefully eject out of the mouth of organics for safety." + reagent_state = LIQUID + color = "#cccccc" + overdose_threshold = 20 + metabolization_rate = 1.25 * REAGENTS_METABOLISM + process_flags = REAGENT_SYNTHETIC | REAGENT_ORGANIC + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /// How much brute and burn individually is healed per tick + var/healing = 3 + /// How much body temperature is increased by per overdose cycle on robotic bodyparts. + var/temperature_change = 50 + +/datum/reagent/medicine/nanite_slurry/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick) + var/heal_amount = healing * REM * seconds_per_tick + affected_mob.heal_bodypart_damage(heal_amount, heal_amount, required_bodytype = BODYTYPE_ROBOTIC) + return ..() + +/datum/reagent/medicine/nanite_slurry/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(affected_mob.mob_biotypes & MOB_ROBOTIC) + affected_mob.adjust_bodytemperature(temperature_change * REM * seconds_per_tick) + return ..() + affected_mob.reagents.remove_reagent(type, NANITE_SLURRY_ORGANIC_PURGE_RATE) //gets removed from organics very fast + if(prob(NANITE_SLURRY_ORGANIC_VOMIT_CHANCE)) + affected_mob.vomit(vomit_flags = (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM), vomit_type = /obj/effect/decal/cleanable/vomit/nanites) + return TRUE + +#undef NANITE_SLURRY_ORGANIC_PURGE_RATE +#undef NANITE_SLURRY_ORGANIC_VOMIT_CHANCE + +/datum/chemical_reaction/medicine/taste_suppressor + results = list(/datum/reagent/medicine/taste_suppressor = 3) + required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/sulfur = 1, /datum/reagent/water = 1) + mix_message = "The mixture becomes clear like water." + +/datum/chemical_reaction/medicine/taste_suppressor/maint + results = list(/datum/reagent/medicine/taste_suppressor = 3, /datum/reagent/chlorine = 1) // The chlorine dissociated from the sodium to allow for the synthesis of the taste suppressor + required_reagents = list(/datum/reagent/consumable/salt = 2, /datum/reagent/sulfur = 1, /datum/reagent/water = 1) + required_temp = 300 + +/datum/reagent/medicine/taste_suppressor + name = "Taste Suppressor" + description = "A colorless medicine aimed to dull the sense of taste of those that consumed it, as long as it's in their system." + color = "#AAAAAA77" + reagent_state = LIQUID + metabolization_rate = 0.5 * REAGENTS_METABOLISM + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + chemical_flags_doppler = REAGENT_BLOOD_REGENERATING // It has REAGENT_BLOOD_REGENERATING only because it makes it so Hemophages can safely drink it, which makes complete sense considering this is meant to suppress their tumor's reactiveness to anything that doesn't regenerate blood. + +/datum/reagent/medicine/taste_suppressor/on_mob_metabolize(mob/living/affected_mob) + . = ..() + + ADD_TRAIT(affected_mob, TRAIT_AGEUSIA, REF(src)) + +/datum/reagent/medicine/taste_suppressor/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + + REMOVE_TRAIT(affected_mob, TRAIT_AGEUSIA, REF(src)) diff --git a/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt.dm b/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt.dm new file mode 100644 index 0000000000000..e29e5e9dbbd8f --- /dev/null +++ b/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt.dm @@ -0,0 +1,401 @@ +/// The multiplier put against our movement effects if our victim has the determined reagent +#define ROBOTIC_WOUND_DETERMINATION_MOVEMENT_EFFECT_MOD 0.7 +/// The multiplier of stagger intensity on hit if our victim has the determined reagent +#define ROBOTIC_WOUND_DETERMINATION_STAGGER_MOVEMENT_MULT 0.7 + +/// The multiplier put against our movement effects if our limb is grasped +#define ROBOTIC_BLUNT_GRASPED_MOVEMENT_MULT 0.7 + +/datum/wound/blunt/robotic + name = "Robotic Blunt (Screws and bolts) Wound" + wound_flags = (ACCEPTS_GAUZE|SPLINT_OVERLAY|CAN_BE_GRASPED) + + default_scar_file = METAL_SCAR_FILE + + /// If we suffer severe head booboos, we can get brain traumas tied to them + var/datum/brain_trauma/active_trauma + /// What brain trauma group, if any, we can draw from for head wounds + var/brain_trauma_group + /// If we deal brain traumas, when is the next one due? + var/next_trauma_cycle + /// How long do we wait +/- 20% for the next trauma? + var/trauma_cycle_cooldown + + /// The ratio stagger score will be multiplied against for determining the final chance of moving away from the attacker. + var/stagger_movement_chance_ratio = 1 + /// The ratio stagger score will be multiplied against for determining the amount of pixelshifting we will do when we are hit. + var/stagger_shake_shift_ratio = 0.05 + + /// The ratio of stagger score to shake duration during a stagger() call + var/stagger_score_to_shake_duration_ratio = 0.1 + + /// In the stagger aftershock, the stagger score will be multiplied against for determining the chance of dropping held items. + var/stagger_drop_chance_ratio = 1.25 + /// In the stagger aftershock, the stagger score will be multiplied against for determining the chance of falling over. + var/stagger_fall_chance_ratio = 1 + + /// In the stagger aftershock, the stagger score will be multiplied against for determining how long we are knocked down for. + var/stagger_aftershock_knockdown_ratio = 0.5 + /// In the stagger after shock, the stagger score will be multiplied against this (if caused by movement) for determining how long we are knocked down for. + var/stagger_aftershock_knockdown_movement_ratio = 0.1 + + /// If the victim stops moving before the aftershock, aftershock effects will be multiplied against this. + var/aftershock_stopped_moving_score_mult = 0.1 + + /// The ratio damage applied will be multiplied against for determining our stagger score. + var/chest_attacked_stagger_mult = 2.5 + /// The minimum score an attack must do to trigger a stagger. + var/chest_attacked_stagger_minimum_score = 5 + /// The ratio of damage to stagger chance on hit. + var/chest_attacked_stagger_chance_ratio = 2 + + /// The base score given to stagger() when we successfully stagger on a move. + var/base_movement_stagger_score = 30 + /// The base chance of moving to trigger stagger(). + var/chest_movement_stagger_chance = 1 + + /// The base duration of a stagger()'s sprite shaking. + var/base_stagger_shake_duration = 1.5 SECONDS + /// The base duration of a stagger()'s sprite shaking if caused by movement. + var/base_stagger_movement_shake_duration = 1.5 SECONDS + + /// The ratio of stagger score to camera shake chance. + var/stagger_camera_shake_chance_ratio = 0.75 + /// The base duration of a stagger's aftershock's camerashake. + var/base_aftershock_camera_shake_duration = 1.5 SECONDS + /// The base strength of a stagger's aftershock's camerashake. + var/base_aftershock_camera_shake_strength = 0.5 + + /// The amount of x and y pixels we will be shaken around by during a movement stagger. + var/movement_stagger_shift = 1 + + /// If we are currently oscillating. If true, we cannot stagger(). + var/oscillating = FALSE + + /// % chance for hitting our limb to fix something. + var/percussive_maintenance_repair_chance = 10 + /// Damage must be under this to proc percussive maintenance. + var/percussive_maintenance_damage_max = 7 + /// Damage must be over this to proc percussive maintenance. + var/percussive_maintenance_damage_min = 0 + + /// The time, in world time, that we will be allowed to do another movement shake. Useful because it lets us prioritize attacked shakes over movement shakes. + var/time_til_next_movement_shake_allowed = 0 + + /// The percent our limb must get to max possible damage by burn damage alone to count as malleable if it has no T2 burn wound. + var/limb_burn_percent_to_max_threshold_for_malleable = 0.8 // must be 75% to max damage by burn damage alone + + /// The last time our victim has moved. Used for determining if we should increase or decrease the chance of having stagger aftershock. + var/last_time_victim_moved = 0 + + processes = TRUE + /// Whenever an oscillation is triggered by movement, we wait 4 seconds before trying to do another. + COOLDOWN_DECLARE(movement_stagger_cooldown) + +/datum/wound_pregen_data/blunt_metal + abstract = TRUE + required_limb_biostate = BIO_METAL + wound_series = WOUND_SERIES_METAL_BLUNT_BASIC + required_wounding_types = list(WOUND_BLUNT) + +/datum/wound_pregen_data/blunt_metal/generate_scar_priorities() + return list("[BIO_METAL]") + +/datum/wound/blunt/robotic/set_victim(new_victim) + if(victim) + UnregisterSignal(victim, COMSIG_MOVABLE_MOVED) + UnregisterSignal(victim, COMSIG_MOB_AFTER_APPLY_DAMAGE) + if(new_victim) + RegisterSignal(new_victim, COMSIG_MOVABLE_MOVED, PROC_REF(victim_moved)) + RegisterSignal(new_victim, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(victim_attacked)) + + return ..() + +/datum/wound/blunt/robotic/get_limb_examine_description() + return span_warning("This limb looks loosely held together.") + +// this wound is unaffected by cryoxadone and pyroxadone +/datum/wound/blunt/robotic/on_xadone(power) + return + +/datum/wound/blunt/robotic/wound_injury(datum/wound/old_wound, attack_direction) + . = ..() + + // hook into gaining/losing gauze so crit bone wounds can re-enable/disable depending if they're slung or not + if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group) + processes = TRUE + active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND) + next_trauma_cycle = world.time + (rand(100-WOUND_BONE_HEAD_TIME_VARIANCE, 100+WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown) + + var/obj/item/held_item = victim.get_item_for_held_index(limb.held_index || 0) + if(held_item && (disabling || prob(30 * severity))) + if(istype(held_item, /obj/item/offhand)) + held_item = victim.get_inactive_held_item() + if(held_item && victim.dropItemToGround(held_item)) + victim.visible_message(span_danger("[victim] drops [held_item] in shock!"), span_warning("The force on your [limb.plaintext_zone] causes you to drop [held_item]!"), vision_distance=COMBAT_MESSAGE_RANGE) + +/datum/wound/blunt/robotic/remove_wound(ignore_limb, replaced) + . = ..() + + QDEL_NULL(active_trauma) + +/datum/wound/blunt/robotic/handle_process(seconds_per_tick, times_fired) + . = ..() + + if (!victim || HAS_TRAIT(victim, TRAIT_STASIS)) + return + + if (limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle) + if (active_trauma) + QDEL_NULL(active_trauma) + else + active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND) + next_trauma_cycle = world.time + (rand(100-WOUND_BONE_HEAD_TIME_VARIANCE, 100+WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown) + +/// If true, allows our superstructure to be modified if we are T3. RCDs can always fix our superstructure. +/datum/wound/blunt/robotic/proc/limb_malleable() + if (!isnull(get_overheat_wound())) + return TRUE + var/burn_damage_to_max = (limb.burn_dam / limb.max_damage) // only exists for the weird case where it cant get a overheat wound + if (burn_damage_to_max >= limb_burn_percent_to_max_threshold_for_malleable) + return TRUE + return FALSE + +/// If we have one, returns a robotic overheat wound of severe severity or higher. Null otherwise. +/datum/wound/blunt/robotic/proc/get_overheat_wound() + RETURN_TYPE(/datum/wound/burn/robotic/overheat) + for (var/datum/wound/found_wound as anything in limb.wounds) + var/datum/wound_pregen_data/pregen_data = found_wound.get_pregen_data() + if (pregen_data.wound_series == WOUND_SERIES_METAL_BURN_OVERHEAT && found_wound.severity >= WOUND_SEVERITY_MODERATE) // meh solution but whateva + return found_wound + return null + +/// If our victim is lying down and is attacked in the chest, effective oscillation damage is multiplied against this. +#define OSCILLATION_ATTACKED_LYING_DOWN_EFFECT_MULT 0.5 + +/// If the attacker is wearing a diag hud, chance of percussive maintenance succeeding is multiplied against this. +#define PERCUSSIVE_MAINTENANCE_DIAG_HUD_CHANCE_MULT 1.5 +/// If our wound has been scanned by a wound analyzer, chance of percussive maintenance succeeding is multiplied against this. +#define PERCUSSIVE_MAINTENANCE_WOUND_SCANNED_CHANCE_MULT 1.5 +/// If the attacker is NOT our victim, chance of percussive maintenance succeeding is multiplied against this. +#define PERCUSSIVE_MAINTENANCE_ATTACKER_NOT_VICTIM_CHANCE_MULT 2.5 + +/// Signal handler proc to when our victim has damage applied via apply_damage(), which is a external attack. +/datum/wound/blunt/robotic/proc/victim_attacked(datum/source, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + SIGNAL_HANDLER + + if (def_zone != limb.body_zone) // use this proc since receive damage can also be called for like, chems and shit + return + if(!victim) + return + + var/effective_damage = (damage - blocked) + + var/obj/item/stack/gauze = limb.current_gauze + if(gauze) + effective_damage *= gauze.splint_factor + + switch (limb.body_zone) + + if(BODY_ZONE_CHEST) + var/oscillation_mult = 1 + if (victim.body_position == LYING_DOWN) + oscillation_mult *= OSCILLATION_ATTACKED_LYING_DOWN_EFFECT_MULT + var/oscillation_damage = effective_damage + var/stagger_damage = oscillation_damage * chest_attacked_stagger_mult + if (victim.has_status_effect(/datum/status_effect/determined)) + oscillation_damage *= ROBOTIC_WOUND_DETERMINATION_STAGGER_MOVEMENT_MULT + if ((stagger_damage >= chest_attacked_stagger_minimum_score) && prob(oscillation_damage * chest_attacked_stagger_chance_ratio)) + stagger(stagger_damage * oscillation_mult, attack_direction, attacking_item, shift = stagger_damage * stagger_shake_shift_ratio) + + if(!uses_percussive_maintenance() || damage < percussive_maintenance_damage_min || damage > percussive_maintenance_damage_max || damagetype != BRUTE || sharpness) + return + var/success_chance_mult = 1 + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + success_chance_mult *= PERCUSSIVE_MAINTENANCE_WOUND_SCANNED_CHANCE_MULT + var/mob/living/user + if (isatom(attacking_item)) + var/atom/attacking_atom = attacking_item + user = attacking_atom.loc // nullable + + if (istype(user)) + if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + success_chance_mult *= PERCUSSIVE_MAINTENANCE_DIAG_HUD_CHANCE_MULT + + if (user != victim) + success_chance_mult *= PERCUSSIVE_MAINTENANCE_ATTACKER_NOT_VICTIM_CHANCE_MULT // encourages people to get other people to beat the shit out of their limbs + if (prob(percussive_maintenance_repair_chance * success_chance_mult)) + handle_percussive_maintenance_success(attacking_item, user) + else + handle_percussive_maintenance_failure(attacking_item, user) + +#undef OSCILLATION_ATTACKED_LYING_DOWN_EFFECT_MULT +#undef PERCUSSIVE_MAINTENANCE_DIAG_HUD_CHANCE_MULT +#undef PERCUSSIVE_MAINTENANCE_WOUND_SCANNED_CHANCE_MULT +#undef PERCUSSIVE_MAINTENANCE_ATTACKER_NOT_VICTIM_CHANCE_MULT + +/// The percent, in decimal, of a stagger's shake() duration, that will be used in a addtimer() to queue aftershock(). +#define STAGGER_PERCENT_OF_SHAKE_DURATION_TO_AFTERSHOCK_DELAY 0.65 // 1 = happens at the end, .5 = happens halfway through + +/// Causes an oscillation, which 1. has a chance to move our victim away from the attacker, and 2. after a delay, calls aftershock(). +/datum/wound/blunt/robotic/proc/stagger(stagger_score, attack_direction, obj/item/attacking_item, from_movement, shake_duration = base_stagger_shake_duration, shift, knockdown_ratio = stagger_aftershock_knockdown_ratio) + if (oscillating) + return + + var/self_message = "Your [limb.plaintext_zone] oscillates" + var/message = "[victim]'s [limb.plaintext_zone] oscillates" + if (attacking_item) + message += " from the impact" + else if (from_movement) + message += " from the movement" + message += "!" + self_message += "! You might be able to avoid an aftershock by stopping and waiting..." + + if (isnull(attack_direction) && !isnull(attacking_item)) + attack_direction = get_dir(victim, attacking_item) + + if (!isnull(attack_direction) && prob(stagger_score * stagger_movement_chance_ratio)) + to_chat(victim, span_warning("The force of the blow sends you reeling!")) + var/turf/target_loc = get_step(victim, attack_direction) + victim.Move(target_loc) + + victim.visible_message(span_warning(message), ignored_mobs = victim) + to_chat(victim, span_warning(self_message)) + victim.balloon_alert(victim, "oscillation! stop moving") + + victim.Shake(pixelshiftx = shift, pixelshifty = shift, duration = shake_duration) + var/aftershock_delay = (shake_duration * STAGGER_PERCENT_OF_SHAKE_DURATION_TO_AFTERSHOCK_DELAY) + var/knockdown_time = stagger_score * knockdown_ratio + addtimer(CALLBACK(src, PROC_REF(aftershock), stagger_score, attack_direction, attacking_item, world.time, knockdown_time), aftershock_delay) + oscillating = TRUE + +#undef STAGGER_PERCENT_OF_SHAKE_DURATION_TO_AFTERSHOCK_DELAY + +#define AFTERSHOCK_GRACE_THRESHOLD_PERCENT 0.33 // lower mult = later grace period = more forgiving + +/** + * Timer proc from stagger(). + * + * Based on chance, causes items to be dropped, knockdown to be applied, and/or screenshake to occur. + * Chance is massively reduced if the victim isn't moving. + */ +/datum/wound/blunt/robotic/proc/aftershock(stagger_score, attack_direction, obj/item/attacking_item, stagger_starting_time, knockdown_time) + if (!still_exists()) + return FALSE + + var/message = "The oscillations from your [limb.plaintext_zone] spread, " + var/limb_message = "causing " + var/limb_affected + + var/stopped_moving_grace_threshold = (world.time - ((world.time - stagger_starting_time) * AFTERSHOCK_GRACE_THRESHOLD_PERCENT)) + var/victim_stopped_moving = (last_time_victim_moved <= stopped_moving_grace_threshold) + if (victim_stopped_moving) + stagger_score *= aftershock_stopped_moving_score_mult + + if (prob(stagger_score * stagger_drop_chance_ratio)) + limb_message += "your hands" + victim.drop_all_held_items() + limb_affected = TRUE + + if (prob(stagger_score * stagger_fall_chance_ratio)) + if (limb_affected) + limb_message += " and " + limb_message += "your legs" + victim.Knockdown(knockdown_time) + limb_affected = TRUE + + if (prob(stagger_score * stagger_camera_shake_chance_ratio)) + if (limb_affected) + limb_message += " and " + limb_message += "your head" + shake_camera(victim, base_aftershock_camera_shake_duration, base_aftershock_camera_shake_strength) + limb_affected = TRUE + + if (limb_affected) + message += "[limb_message] to shake uncontrollably!" + else + message += "but pass harmlessly" + if (victim_stopped_moving) + message += " thanks to your stillness" + message += "." + + to_chat(victim, span_danger(message)) + victim.balloon_alert(victim, "oscillation over") + + oscillating = FALSE + +#undef AFTERSHOCK_GRACE_THRESHOLD_PERCENT + +/// Called when percussive maintenance succeeds at its random roll. +/datum/wound/blunt/robotic/proc/handle_percussive_maintenance_success(attacking_item, mob/living/user) + victim.visible_message(span_green("[victim]'s [limb.plaintext_zone] rattles from the impact, but looks a lot more secure!"), \ + span_green("Your [limb.plaintext_zone] rattles into place!")) + remove_wound() + +/// Called when percussive maintenance fails at its random roll. +/datum/wound/blunt/robotic/proc/handle_percussive_maintenance_failure(attacking_item, mob/living/user) + to_chat(victim, span_warning("Your [limb.plaintext_zone] rattles around, but you don't sense any sign of improvement.")) + +/// If our victim has no gravity, the effects of movement are multiplied by this. +#define VICTIM_MOVED_NO_GRAVITY_EFFECT_MULT 0.5 +/// If our victim is resting, or is walking and isnt forced to move, the effects of movement are multiplied by this. +#define VICTIM_MOVED_CAREFULLY_EFFECT_MULT 0.25 + +/// Signal handler proc that applies movements affect to our victim if they were moved. +/datum/wound/blunt/robotic/proc/victim_moved(datum/source, atom/old_loc, dir, forced, list/old_locs) + SIGNAL_HANDLER + + var/overall_mult = 1 + + var/obj/item/stack/gauze = limb.current_gauze + if (gauze) + overall_mult *= gauze.splint_factor + if (!victim.has_gravity(get_turf(victim))) + overall_mult *= VICTIM_MOVED_NO_GRAVITY_EFFECT_MULT + else if (victim.body_position == LYING_DOWN || (!forced && victim.move_intent == MOVE_INTENT_WALK)) + overall_mult *= VICTIM_MOVED_CAREFULLY_EFFECT_MULT + if (victim.has_status_effect(/datum/status_effect/determined)) + overall_mult *= ROBOTIC_WOUND_DETERMINATION_MOVEMENT_EFFECT_MOD + if (limb.grasped_by) + overall_mult *= ROBOTIC_BLUNT_GRASPED_MOVEMENT_MULT + + overall_mult *= get_buckled_movement_consequence_mult(victim.buckled) + + if (limb.body_zone == BODY_ZONE_CHEST && COOLDOWN_FINISHED(src, movement_stagger_cooldown)) + var/stagger_chance = chest_movement_stagger_chance * overall_mult + if (prob(stagger_chance)) + COOLDOWN_START(src, movement_stagger_cooldown, 4 SECONDS) + stagger(base_movement_stagger_score, shake_duration = base_stagger_movement_shake_duration, from_movement = TRUE, shift = movement_stagger_shift, knockdown_ratio = stagger_aftershock_knockdown_movement_ratio) + + last_time_victim_moved = world.time + +#undef VICTIM_MOVED_NO_GRAVITY_EFFECT_MULT +#undef VICTIM_MOVED_CAREFULLY_EFFECT_MULT + +/// If our victim is buckled to a generic object, movement effects will be multiplied against this. +#define VICTIM_BUCKLED_BASE_MOVEMENT_EFFECT_MULT 0.5 +/// If our victim is buckled to a medical bed (e.g. rollerbed), movement effects will be multiplied against this. +#define VICTIM_BUCKLED_ROLLER_BED_MOVEMENT_EFFECT_MULT 0.05 + +/// Returns a multiplier to our movement effects based on what our victim is buckled to. +/datum/wound/blunt/robotic/proc/get_buckled_movement_consequence_mult(atom/movable/buckled_to) + if (!buckled_to) + return 1 + + if (istype(buckled_to, /obj/structure/bed/medical)) + return VICTIM_BUCKLED_ROLLER_BED_MOVEMENT_EFFECT_MULT + else + return VICTIM_BUCKLED_BASE_MOVEMENT_EFFECT_MULT + +#undef VICTIM_BUCKLED_BASE_MOVEMENT_EFFECT_MULT +#undef VICTIM_BUCKLED_ROLLER_BED_MOVEMENT_EFFECT_MULT + +/// If this wound can be treated in its current state by just hitting it with a low force object. Exists for conditional logic, e.g. "Should we respond +/// to percussive maintenance right now?". Critical blunt uses this to only react when the limb is malleable and superstructure is broken. +/datum/wound/blunt/robotic/proc/uses_percussive_maintenance() + return FALSE + +#undef ROBOTIC_WOUND_DETERMINATION_MOVEMENT_EFFECT_MOD +#undef ROBOTIC_WOUND_DETERMINATION_STAGGER_MOVEMENT_MULT + +#undef ROBOTIC_BLUNT_GRASPED_MOVEMENT_MULT diff --git a/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T1.dm b/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T1.dm new file mode 100644 index 0000000000000..d4db7f6311b91 --- /dev/null +++ b/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T1.dm @@ -0,0 +1,65 @@ +/datum/wound/blunt/robotic/moderate + name = "Loosened Screws" + desc = "Various semi-external fastening instruments have loosened, causing components to jostle, inhibiting limb control." + treat_text = "Recommend topical re-fastening of instruments with a screwdriver, though percussive maintenance via low-force bludgeoning may suffice - \ + albeit at risk of worsening the injury." + examine_desc = "appears to be loosely secured" + occur_text = "jostles awkwardly and seems to slightly unfasten" + severity = WOUND_SEVERITY_MODERATE + simple_treat_text = "Bandaging the wound will reduce the impact until its screws are secured - which is faster if done by \ + someone else, a roboticist, an engineer, or with a diagnostic HUD." + homemade_treat_text = "In a pinch, percussive maintenance can reset the screws - the chance of which is increased if done by someone else or \ + with a diagnostic HUD!" + status_effect_type = /datum/status_effect/wound/blunt/robotic/moderate + treatable_tools = list(TOOL_SCREWDRIVER) + interaction_efficiency_penalty = 1.2 + limp_slowdown = 2.5 + limp_chance = 30 + threshold_penalty = 20 + can_scar = FALSE + a_or_from = "from" + +/datum/wound_pregen_data/blunt_metal/loose_screws + abstract = FALSE + wound_path_to_generate = /datum/wound/blunt/robotic/moderate + viable_zones = list(BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + threshold_minimum = 30 + +/datum/wound/blunt/robotic/moderate/uses_percussive_maintenance() + return TRUE + +/datum/wound/blunt/robotic/moderate/treat(obj/item/potential_treater, mob/user) + if (potential_treater.tool_behaviour == TOOL_SCREWDRIVER) + fasten_screws(potential_treater, user) + return TRUE + + return ..() + +/// The main treatment for T1 blunt. Uses a screwdriver, guaranteed to always work, better with a diag hud. Removes the wound. +/datum/wound/blunt/robotic/moderate/proc/fasten_screws(obj/item/screwdriver_tool, mob/user) + if (!screwdriver_tool.tool_start_check()) + return + + var/delay_mult = 1 + + if (user == victim) + delay_mult *= 2 + + if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + delay_mult *= 0.5 + + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + delay_mult *= 0.5 + + var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") + var/your_or_other = (user == victim ? "your" : "[victim]'s") + victim.visible_message(span_notice("[user] begins fastening the screws of [their_or_other] [limb.plaintext_zone]..."), \ + span_notice("You begin fastening the screws of [your_or_other] [limb.plaintext_zone]...")) + + if (!screwdriver_tool.use_tool(target = victim, user = user, delay = (6 SECONDS * delay_mult), volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return + + victim.visible_message(span_green("[user] finishes fastening [their_or_other] [limb.plaintext_zone]!"), \ + span_green("You finish fastening [your_or_other] [limb.plaintext_zone]!")) + + remove_wound() diff --git a/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T2.dm b/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T2.dm new file mode 100644 index 0000000000000..1dd35f14beddc --- /dev/null +++ b/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T2.dm @@ -0,0 +1,52 @@ +/datum/wound/blunt/robotic/secures_internals/severe + name = "Detached Fastenings" + desc = "Various fastening devices are extremely loose and solder has disconnected at multiple points, causing significant jostling of internal components and \ + noticable limb dysfunction." + treat_text = "Fastening of bolts and screws by a qualified technician (though bone gel may suffice in the absence of one) followed by re-soldering." + examine_desc = "jostles with every move, solder visibly broken" + occur_text = "visibly cracks open, solder flying everywhere" + severity = WOUND_SEVERITY_SEVERE + + simple_treat_text = "If on the chest, walk, grasp it, splint, rest or buckle yourself to something to reduce movement effects. \ + Afterwards, get someone else, ideally a robo/engi to screwdriver/wrench it, and then re-solder it!" + homemade_treat_text = "If unable to screw/wrench, bone gel can, over time, secure inner components at risk of corrossion. \ + Alternatively, crowbar the limb open to expose the internals - this will make it easier to re-secure them, but has a high risk of shocking you, \ + so use insulated gloves. This will cripple the limb, so use it only as a last resort!" + + wound_flags = (ACCEPTS_GAUZE|MANGLES_EXTERIOR|SPLINT_OVERLAY|CAN_BE_GRASPED) + treatable_by = list(/obj/item/stack/medical/bone_gel) + status_effect_type = /datum/status_effect/wound/blunt/robotic/severe + treatable_tools = list(TOOL_WELDER, TOOL_CROWBAR) + + interaction_efficiency_penalty = 2 + limp_slowdown = 6 + limp_chance = 60 + + brain_trauma_group = BRAIN_TRAUMA_MILD + trauma_cycle_cooldown = 1.5 MINUTES + + threshold_penalty = 40 + + base_movement_stagger_score = 40 + + chest_attacked_stagger_chance_ratio = 5 + chest_attacked_stagger_mult = 3 + + chest_movement_stagger_chance = 2 + + stagger_aftershock_knockdown_ratio = 0.3 + stagger_aftershock_knockdown_movement_ratio = 0.2 + + a_or_from = "from" + + ready_to_secure_internals = TRUE + ready_to_resolder = FALSE + + scar_keyword = "bluntsevere" + +/datum/wound_pregen_data/blunt_metal/fastenings + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/robotic/secures_internals/severe + + threshold_minimum = 65 diff --git a/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T3.dm b/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T3.dm new file mode 100644 index 0000000000000..0c06eff483f69 --- /dev/null +++ b/modular_doppler/modular_medical/wounds/synth/blunt/robotic_blunt_T3.dm @@ -0,0 +1,398 @@ +/datum/wound/blunt/robotic/secures_internals/critical + name = "Collapsed Superstructure" + desc = "The superstructure has totally collapsed in one or more locations, causing extreme internal oscillation with every move and massive limb dysfunction" + treat_text = "Reforming of superstructure via either RCD or manual molding, followed by typical treatment of loosened internals. \ + To manually mold, the limb must be aggressively grabbed and welded held to it to make it malleable (though attacking it til thermal overload may be adequate) \ + followed by firmly grasping and molding the limb with heat-resistant gloves." + occur_text = "caves in on itself, damaged solder and shrapnel flying out in a miniature explosion" + examine_desc = "has caved in, with internal components visible through gaps in the metal" + severity = WOUND_SEVERITY_CRITICAL + + disabling = TRUE + + simple_treat_text = "If on the chest, walk, grasp it, splint, rest or buckle yourself to something to reduce movement effects. \ + Afterwards, get someone, ideally a robo/engi to firmly grasp the limb and hold a welder to it. Then, have them use their hands to mold the metal - \ + careful though, it's hot! An RCD can skip all this, but is hard to come by. Afterwards, have them screw/wrench and then re-solder the limb!" + + homemade_treat_text = "The metal can be made malleable by repeated application of a welder, to a severe burn. Afterwards, a plunger can reset the metal, \ + as can percussive maintenance. After the metal is reset, if unable to screw/wrench, bone gel can, over time, secure inner components at risk of corrossion. \ + Alternatively, crowbar the limb open to expose the internals - this will make it easier to re-secure them, but has a high risk of shocking you, \ + so use insulated gloves. This will cripple the limb, so use it only as a last resort!" + + interaction_efficiency_penalty = 2.8 + limp_slowdown = 8 + limp_chance = 80 + threshold_penalty = 60 + + brain_trauma_group = BRAIN_TRAUMA_SEVERE + trauma_cycle_cooldown = 2.5 MINUTES + + scar_keyword = "bluntcritical" + + status_effect_type = /datum/status_effect/wound/blunt/robotic/critical + + sound_effect = 'sound/effects/wounds/crack2.ogg' + + wound_flags = (ACCEPTS_GAUZE|MANGLES_EXTERIOR|SPLINT_OVERLAY|CAN_BE_GRASPED) + treatable_by = list(/obj/item/stack/medical/bone_gel) + status_effect_type = /datum/status_effect/wound/blunt/robotic/critical + treatable_tools = list(TOOL_WELDER, TOOL_CROWBAR) + + base_movement_stagger_score = 50 + + base_aftershock_camera_shake_duration = 1.75 SECONDS + base_aftershock_camera_shake_strength = 1 + + chest_attacked_stagger_chance_ratio = 6.5 + chest_attacked_stagger_mult = 4 + + chest_movement_stagger_chance = 8 + + aftershock_stopped_moving_score_mult = 0.3 + + stagger_aftershock_knockdown_ratio = 0.5 + stagger_aftershock_knockdown_movement_ratio = 0.3 + + percussive_maintenance_repair_chance = 3 + percussive_maintenance_damage_max = 6 + + regen_time_needed = 60 SECONDS + gel_damage = 20 + + ready_to_secure_internals = FALSE + ready_to_resolder = FALSE + + a_or_from = "a" + + /// Has the first stage of our treatment been completed? E.g. RCDed, manually molded... + var/superstructure_remedied = FALSE + +/datum/wound_pregen_data/blunt_metal/superstructure + abstract = FALSE + wound_path_to_generate = /datum/wound/blunt/robotic/secures_internals/critical + threshold_minimum = 125 + +/datum/wound/blunt/robotic/secures_internals/critical/item_can_treat(obj/item/potential_treater) + if(!superstructure_remedied) + if(istype(potential_treater, /obj/item/construction/rcd)) + return TRUE + if(limb_malleable() && istype(potential_treater, /obj/item/plunger)) + return TRUE + return ..() + +/datum/wound/blunt/robotic/secures_internals/critical/check_grab_treatments(obj/item/potential_treater, mob/user) + if(potential_treater.tool_behaviour == TOOL_WELDER && (!superstructure_remedied && !limb_malleable())) + return TRUE + return ..() + +/datum/wound/blunt/robotic/secures_internals/critical/treat(obj/item/item, mob/user) + if(!superstructure_remedied) + if(istype(item, /obj/item/construction/rcd)) + return rcd_superstructure(item, user) + if(uses_percussive_maintenance() && istype(item, /obj/item/plunger)) + return plunge(item, user) + if(item.tool_behaviour == TOOL_WELDER && !limb_malleable() && isliving(victim.pulledby)) + var/mob/living/living_puller = victim.pulledby + if (living_puller.grab_state >= GRAB_AGGRESSIVE) // only let other people do this + return heat_metal(item, user) + return ..() + +/datum/wound/blunt/robotic/secures_internals/critical/try_handling(mob/living/carbon/human/user) + if(user.pulling != victim || user.zone_selected != limb.body_zone) + return FALSE + + if(superstructure_remedied || !limb_malleable()) + return FALSE + + if(user.grab_state < GRAB_AGGRESSIVE) + to_chat(user, span_warning("You must have [victim] in an aggressive grab to manipulate [victim.p_their()] [LOWER_TEXT(name)]!")) + return TRUE + + user.visible_message(span_danger("[user] begins softly pressing against [victim]'s collapsed [limb.plaintext_zone]..."), \ + span_notice("You begin softly pressing against [victim]'s collapsed [limb.plaintext_zone]..."), \ + ignored_mobs = victim) + to_chat(victim, span_userdanger("[user] begins pressing against your collapsed [limb.plaintext_zone]!")) + + var/delay_mult = 1 + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + delay_mult *= 0.75 + + if(!do_after(user, 4 SECONDS, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return + mold_metal(user) + return TRUE + +/// If the user turns combat mode on after they start to mold metal, our limb takes this much brute damage. +#define MOLD_METAL_SABOTAGE_BRUTE_DAMAGE 30 // really punishing +/// Our limb takes this much brute damage on a failed mold metal attempt. +#define MOLD_METAL_FAILURE_BRUTE_DAMAGE 5 +/// If the user's hand is unprotected from heat when they mold metal, we do this much burn damage to it. +#define MOLD_METAL_HAND_BURNT_BURN_DAMAGE 5 +/// Gloves must be above or at this threshold to cause the user to not be burnt apon trying to mold metal. +#define MOLD_METAL_HEAT_RESISTANCE_THRESHOLD 1000 // less than the black gloves max resist +/** + * Standard treatment for 1st step of T3, after the limb has been made malleable. Done via aggrograb. + * High chance to work, very high with robo/engi wires and diag hud. + * Can be sabotaged by switching to combat mode. + * Deals brute to the limb on failure. + * Burns the hand of the user if it's not insulated. + */ +/datum/wound/blunt/robotic/secures_internals/critical/proc/mold_metal(mob/living/carbon/human/user) + var/chance = 60 + + var/knows_wires = FALSE + if (HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + chance *= 2 + knows_wires = TRUE + else if (HAS_TRAIT(user, TRAIT_KNOW_ENGI_WIRES)) + chance *= 1.25 + knows_wires = TRUE + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + chance *= 2 + if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + if (knows_wires) + chance *= 1.25 + else + chance *= 2 + + var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") + var/your_or_other = (user == victim ? "your" : "[victim]'s") + + if ((user != victim && user.combat_mode)) + user.visible_message(span_bolddanger("[user] molds [their_or_other] [limb.plaintext_zone] into a really silly shape! What a goofball!"), \ + span_danger("You maliciously mold [victim]'s [limb.plaintext_zone] into a weird shape, damaging it in the process!"), ignored_mobs = victim) + to_chat(victim, span_userdanger("[user] molds your [limb.plaintext_zone] into a weird shape, damaging it in the process!")) + + limb.receive_damage(brute = MOLD_METAL_SABOTAGE_BRUTE_DAMAGE, wound_bonus = CANT_WOUND, damage_source = user) + else if (prob(chance)) + user.visible_message(span_green("[user] carefully molds [their_or_other] [limb.plaintext_zone] into the proper shape!"), \ + span_green("You carefully mold [victim]'s [limb.plaintext_zone] into the proper shape!"), ignored_mobs = victim) + to_chat(victim, span_green("[user] carefully molds your [limb.plaintext_zone] into the proper shape!")) + to_chat(user, span_green("[capitalize(your_or_other)] [limb.plaintext_zone] has been molded into the proper shape! Your next step is to use a screwdriver/wrench to secure your internals.")) + set_superstructure_status(TRUE) + else + user.visible_message(span_danger("[user] accidentally molds [their_or_other] [limb.plaintext_zone] into the wrong shape!"), \ + span_danger("You accidentally mold [your_or_other] [limb.plaintext_zone] into the wrong shape!"), ignored_mobs = victim) + to_chat(victim, span_userdanger("[user] accidentally molds your [limb.plaintext_zone] into the wrong shape!")) + + limb.receive_damage(brute = MOLD_METAL_FAILURE_BRUTE_DAMAGE, damage_source = user, wound_bonus = CANT_WOUND) + + var/sufficiently_insulated_gloves = FALSE + var/obj/item/clothing/gloves/worn_gloves = user.gloves + if ((worn_gloves?.heat_protection & HANDS) && worn_gloves?.max_heat_protection_temperature && worn_gloves.max_heat_protection_temperature >= MOLD_METAL_HEAT_RESISTANCE_THRESHOLD) + sufficiently_insulated_gloves = TRUE + + if (sufficiently_insulated_gloves || HAS_TRAIT(user, TRAIT_RESISTHEAT) || HAS_TRAIT(user, TRAIT_RESISTHEATHANDS)) + return + + to_chat(user, span_danger("You burn your hand on [victim]'s [limb.plaintext_zone]!")) + var/obj/item/bodypart/affecting = user.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") + affecting?.receive_damage(burn = MOLD_METAL_HAND_BURNT_BURN_DAMAGE, damage_source = limb) + +#undef MOLD_METAL_SABOTAGE_BRUTE_DAMAGE +#undef MOLD_METAL_FAILURE_BRUTE_DAMAGE +#undef MOLD_METAL_HAND_BURNT_BURN_DAMAGE +#undef MOLD_METAL_HEAT_RESISTANCE_THRESHOLD + +/** + * A "safe" way to give our victim a T2 burn wound. Requires an aggrograb, and a welder. This is required to mold metal, the 1st step of treatment. + * Guaranteed to work. After a delay, causes a T2 burn wound with no damage. + * Can be sabotaged by enabling combat mode to cause a T3. + */ +/datum/wound/blunt/robotic/secures_internals/critical/proc/heat_metal(obj/item/welder, mob/living/user) + if (!welder.tool_use_check()) + return TRUE + + var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") + var/your_or_other = (user == victim ? "your" : "[victim]'s") + + user?.visible_message(span_danger("[user] carefully holds [welder] to [their_or_other] [limb.plaintext_zone], slowly heating it..."), \ + span_warning("You carefully hold [welder] to [your_or_other] [limb.plaintext_zone], slowly heating it..."), ignored_mobs = victim) + + var/delay_mult = 1 + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + delay_mult *= 0.75 + + if (!welder.use_tool(target = victim, user = user, delay = 3 SECONDS * delay_mult, volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + + var/wound_path = /datum/wound/burn/robotic/overheat/moderate + if (user != victim && user.combat_mode) + wound_path = /datum/wound/burn/robotic/overheat/critical // it really isnt that bad, overheat wounds are a bit funky + user.visible_message(span_danger("[user] heats [victim]'s [limb.plaintext_zone] aggressively, overheating it far beyond the necessary point!"), \ + span_danger("You heat [victim]'s [limb.plaintext_zone] aggressively, overheating it far beyond the necessary point!"), ignored_mobs = victim) + to_chat(victim, span_userdanger("[user] heats your [limb.plaintext_zone] aggressively, overheating it far beyond the necessary point!")) + + var/datum/wound/burn/robotic/overheat/overheat_wound = new wound_path + overheat_wound.apply_wound(limb, wound_source = welder) + + to_chat(user, span_green("[capitalize(your_or_other)] [limb.plaintext_zone] is now heated, allowing it to be molded! Your next step is to have someone physically reset the superstructure with their hands.")) + return TRUE + +/// Cost of an RCD to quickly fix our broken in raw matter +#define ROBOTIC_T3_BLUNT_WOUND_RCD_COST 25 +/// Cost of an RCD to quickly fix our broken in silo material +#define ROBOTIC_T3_BLUNT_WOUND_RCD_SILO_COST ROBOTIC_T3_BLUNT_WOUND_RCD_COST / 4 + +/// The "premium" treatment for 1st step of T3. Requires an RCD. Guaranteed to work, but can cause damage if delay is high. +/datum/wound/blunt/robotic/secures_internals/critical/proc/rcd_superstructure(obj/item/construction/rcd/treating_rcd, mob/user) + if (!treating_rcd.tool_use_check()) + return TRUE + + var/has_enough_matter = (treating_rcd.get_matter(user) > ROBOTIC_T3_BLUNT_WOUND_RCD_COST) + var/silo_has_enough_materials = (treating_rcd.get_silo_iron() > ROBOTIC_T3_BLUNT_WOUND_RCD_SILO_COST) + + if (!silo_has_enough_materials && !has_enough_matter) // neither the silo, nor the rcd, has enough + user?.balloon_alert(user, "not enough matter!") + return TRUE + + var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") + var/your_or_other = (user == victim ? "your" : "[victim]'s") + + var/base_time = 7 SECONDS + var/delay_mult = 1 + var/knows_wires = FALSE + if (victim == user) + delay_mult *= 2 + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + delay_mult *= 0.75 + if (HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + delay_mult *= 0.5 + knows_wires = TRUE + else if (HAS_TRAIT(user, TRAIT_KNOW_ENGI_WIRES)) + delay_mult *= 0.5 // engis are accustomed to using RCDs + knows_wires = TRUE + if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + if (knows_wires) + delay_mult *= 0.85 + else + delay_mult *= 0.5 + + var/final_time = (base_time * delay_mult) + var/misused = (final_time > base_time) // if we damage the limb when we're done + + if (user) + var/misused_text = (misused ? "unsteadily " : "") + + var/message = "[user]'s RCD whirs to life as it begins [misused_text]replacing the damaged superstructure of [their_or_other] [limb.plaintext_zone]..." + var/self_message = "Your RCD whirs to life as it begins [misused_text]replacing the damaged superstructure of [your_or_other] [limb.plaintext_zone]..." + + if (misused) // warning span if misused, notice span otherwise + message = span_danger(message) + self_message = span_danger(self_message) + else + message = span_notice(message) + self_message = span_notice(self_message) + + user.visible_message(message, self_message) + + if (!treating_rcd.use_tool(target = victim, user = user, delay = final_time, volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + playsound(get_turf(treating_rcd), 'sound/machines/ping.ogg', 75) // celebration! we did it + set_superstructure_status(TRUE) + + var/use_amount = (silo_has_enough_materials ? ROBOTIC_T3_BLUNT_WOUND_RCD_SILO_COST : ROBOTIC_T3_BLUNT_WOUND_RCD_COST) + if (!treating_rcd.useResource(use_amount, user)) + return TRUE + + if (user) + var/misused_text = (misused ? ", though it replaced a bit more than it should've..." : "!") + var/message = "[user]'s RCD lets out a small ping as it finishes replacing the superstructure of [their_or_other] [limb.plaintext_zone][misused_text]" + var/self_message = "Your RCD lets out a small ping as it finishes replacing the superstructure of [your_or_other] [limb.plaintext_zone][misused_text]" + if (misused) + message = span_danger(message) + self_message = span_danger(self_message) + else + message = span_green(message) + self_message = span_green(self_message) + + user.visible_message(message, self_message) + if (misused) + limb.receive_damage(brute = 10, damage_source = treating_rcd, wound_bonus = CANT_WOUND) + // the double message is fine here, since the first message also tells you if you fucked up and did some damage + to_chat(user, span_green("The superstructure has been reformed! Your next step is to secure the internals via a screwdriver/wrench.")) + return TRUE + +#undef ROBOTIC_T3_BLUNT_WOUND_RCD_COST +#undef ROBOTIC_T3_BLUNT_WOUND_RCD_SILO_COST + +/** + * Goofy but practical, this is the superior ghetto self-tend of T3's first step compared to percussive maintenance. + * Still requires the limb to be malleable, but has a high chance of success and doesn't burn your hand, but gives worse bonuses for wires/HUD. + */ +/datum/wound/blunt/robotic/secures_internals/critical/proc/plunge(obj/item/plunger/treating_plunger, mob/user) + if (!treating_plunger.tool_use_check()) + return TRUE + + var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") + var/your_or_other = (user == victim ? "your" : "[victim]'s") + user?.visible_message(span_notice("[user] begins plunging at the dents on [their_or_other] [limb.plaintext_zone] with [treating_plunger]..."), \ + span_green("You begin plunging at the dents on [your_or_other] [limb.plaintext_zone] with [treating_plunger]...")) + + var/delay_mult = 1 + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + delay_mult *= 0.75 + + delay_mult /= treating_plunger.plunge_mod + + if (!treating_plunger.use_tool(target = victim, user = user, delay = 6 SECONDS * delay_mult, volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + + var/success_chance = 80 + if (victim == user) + success_chance *= 0.6 + + if (HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + success_chance *= 1.25 + else if (HAS_TRAIT(user, TRAIT_KNOW_ENGI_WIRES)) + success_chance *= 1.1 + if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + success_chance *= 1.25 // it's kinda alien to do this, so even people with the wires get the full bonus of diag huds + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + success_chance *= 1.5 + + if (prob(success_chance)) + user?.visible_message(span_green("[victim]'s [limb.plaintext_zone] lets out a sharp POP as [treating_plunger] forces it into its normal position!"), \ + span_green("[victim]'s [limb.plaintext_zone] lets out a sharp POP as your [treating_plunger] forces it into its normal position!")) + to_chat(user, span_green("[capitalize(your_or_other)] [limb.plaintext_zone]'s structure has been reset to its proper position! Your next step is to secure it with a screwdriver/wrench, though bone gel would also work.")) + set_superstructure_status(TRUE) + else + user?.visible_message(span_danger("[victim]'s [limb.plaintext_zone] splinters from [treating_plunger]'s plunging!"), \ + span_danger("[capitalize(your_or_other)] [limb.plaintext_zone] splinters from your [treating_plunger]'s plunging!")) + limb.receive_damage(brute = 5, damage_source = treating_plunger) + + return TRUE + +/datum/wound/blunt/robotic/secures_internals/critical/handle_percussive_maintenance_success(attacking_item, mob/living/user) + var/your_or_other = (user == victim ? "your" : "[victim]'s") + victim.visible_message(span_green("[victim]'s [limb.plaintext_zone] gets smashed into a proper shape!"), \ + span_green("Your [limb.plaintext_zone] gets smashed into a proper shape!")) + + var/user_message = "[capitalize(your_or_other)] [limb.plaintext_zone]'s superstructure has been reset! Your next step is to screwdriver/wrench the internals, \ + though if you're desperate enough to use percussive maintenance, you might want to either use a crowbar or bone gel..." + to_chat(user, span_green(user_message)) + + set_superstructure_status(TRUE) + +/datum/wound/blunt/robotic/secures_internals/critical/handle_percussive_maintenance_failure(attacking_item, mob/living/user) + to_chat(victim, span_danger("Your [limb.plaintext_zone] only deforms more from the impact...")) + limb.receive_damage(brute = 1, damage_source = attacking_item, wound_bonus = CANT_WOUND) + +/datum/wound/blunt/robotic/secures_internals/critical/uses_percussive_maintenance() + return (!superstructure_remedied && limb_malleable()) + +/// Transitions our steps by setting both superstructure and secure internals readiness. +/datum/wound/blunt/robotic/secures_internals/critical/proc/set_superstructure_status(remedied) + superstructure_remedied = remedied + ready_to_secure_internals = remedied + +/datum/wound/blunt/robotic/secures_internals/critical/get_wound_step_info() + . = ..() + + if (!superstructure_remedied) + . = "The superstructure must be reformed." + if (!limb_malleable()) + . += " The limb must be heated to thermal overload, then manually molded with a firm grasp" + else + . += " The limb has been sufficiently heated, and can be manually molded with a firm grasp/repeated application of a low-force object" + . += " - OR an RCD may be used with little risk." diff --git a/modular_doppler/modular_medical/wounds/synth/blunt/secures_internals.dm b/modular_doppler/modular_medical/wounds/synth/blunt/secures_internals.dm new file mode 100644 index 0000000000000..335fa074a3e2f --- /dev/null +++ b/modular_doppler/modular_medical/wounds/synth/blunt/secures_internals.dm @@ -0,0 +1,416 @@ +/// A subtype of blunt wounds that has a "secure internals" step +/datum/wound/blunt/robotic/secures_internals + /// Our current counter for gel + gauze regeneration + var/regen_time_elapsed = 0 SECONDS + /// Time needed for gel to secure internals. + var/regen_time_needed = 30 SECONDS + + /// If we have used bone gel to secure internals. + var/gelled = FALSE + /// Total brute damage taken over the span of [regen_time_needed] deciseconds when we gel our limb. + var/gel_damage = 10 // brute in total + + /// If we are ready to begin screwdrivering or gelling our limb. + var/ready_to_secure_internals = FALSE + /// If our external plating has been torn open and we can access our internals without a tool + var/crowbarred_open = FALSE + /// If internals are secured, and we are ready to weld our limb closed and end the wound + var/ready_to_resolder = TRUE + +/datum/wound/blunt/robotic/secures_internals/handle_process(seconds_per_tick, times_fired) + . = ..() + + if (!victim || HAS_TRAIT(victim, TRAIT_STASIS)) + return + + if (gelled) + regen_time_elapsed += ((seconds_per_tick SECONDS) / 2) + if(victim.body_position == LYING_DOWN) + if(SPT_PROB(30, seconds_per_tick)) + regen_time_elapsed += 1 SECONDS + if(victim.IsSleeping() && SPT_PROB(30, seconds_per_tick)) + regen_time_elapsed += 1 SECONDS + + var/effective_damage = ((gel_damage / (regen_time_needed / 10)) * seconds_per_tick) + var/obj/item/stack/gauze = limb.current_gauze + if (gauze) + effective_damage *= gauze.splint_factor + limb.receive_damage(effective_damage, wound_bonus = CANT_WOUND, damage_source = src) + if(effective_damage && prob(33)) + var/gauze_text = (gauze?.splint_factor ? ", although the [gauze] helps to prevent some of the leakage" : "") + to_chat(victim, span_danger("Your [limb.plaintext_zone] sizzles as some gel leaks and warps the exterior metal[gauze_text]...")) + + if(regen_time_elapsed > regen_time_needed) + if(!victim || !limb) + qdel(src) + return + to_chat(victim, span_green("The gel within your [limb.plaintext_zone] has fully hardened, allowing you to re-solder it!")) + gelled = FALSE + ready_to_resolder = TRUE + ready_to_secure_internals = FALSE + set_disabling(FALSE) + +/datum/wound/blunt/robotic/secures_internals/modify_desc_before_span(desc) + . = ..() + + var/use_exclamation = FALSE + + if (!limb.current_gauze) // gauze covers it up + if (crowbarred_open) + . += ", [span_notice("and is violently torn open, internals visible to the outside")]" + use_exclamation = TRUE + if (gelled) + . += ", [span_notice("with fizzling blue surgical gel leaking out of the cracks")]" + use_exclamation = TRUE + if (use_exclamation) + . += "!" + +/datum/wound/blunt/robotic/secures_internals/get_scanner_description(mob/user) + . = ..() + + var/to_add = get_wound_status() + if (!isnull(to_add)) + . += "\nWound status: [to_add]" + +/datum/wound/blunt/robotic/secures_internals/get_simple_scanner_description(mob/user) + . = ..() + + var/to_add = get_wound_status() + if (!isnull(to_add)) + . += "\nWound status: [to_add]" + +/// Returns info specific to the dynamic state of the wound. +/datum/wound/blunt/robotic/secures_internals/proc/get_wound_status(mob/user) + if (crowbarred_open) + . += "The limb has been torn open, allowing ease of access to internal components, but also disabling it. " + if (gelled) + . += "Bone gel has been applied, causing progressive corrosion of the metal, but eventually securing the internals. " + +/datum/wound/blunt/robotic/secures_internals/item_can_treat(obj/item/potential_treater, mob/user) + if (potential_treater.tool_behaviour == TOOL_WELDER || potential_treater.tool_behaviour == TOOL_CAUTERY) + if (ready_to_resolder) + return TRUE + + if (ready_to_secure_internals) + if (item_can_secure_internals(potential_treater)) + return TRUE + + return ..() + +/datum/wound/blunt/robotic/secures_internals/treat(obj/item/potential_treater, mob/user) + if (ready_to_secure_internals) + if (istype(potential_treater, /obj/item/stack/medical/bone_gel)) + return apply_gel(potential_treater, user) + else if (!crowbarred_open && potential_treater.tool_behaviour == TOOL_CROWBAR) + return crowbar_open(potential_treater, user) + else if (item_can_secure_internals(potential_treater)) + return secure_internals_normally(potential_treater, user) + else if (ready_to_resolder && (potential_treater.tool_behaviour == TOOL_WELDER) || (potential_treater.tool_behaviour == TOOL_CAUTERY)) + return resolder(potential_treater, user) + + return ..() + +/// Returns TRUE if the item can be used in our 1st step (2nd if T3) of repairs. +/datum/wound/blunt/robotic/secures_internals/proc/item_can_secure_internals(obj/item/potential_treater) + return (potential_treater.tool_behaviour == TOOL_SCREWDRIVER || potential_treater.tool_behaviour == TOOL_WRENCH || istype(potential_treater, /obj/item/stack/medical/bone_gel)) + +#define CROWBAR_OPEN_SELF_TEND_DELAY_MULT 2 +#define CROWBAR_OPEN_KNOWS_ROBO_WIRES_DELAY_MULT 0.5 +#define CROWBAR_OPEN_KNOWS_ENGI_WIRES_DELAY_MULT 0.5 +#define CROWBAR_OPEN_HAS_DIAG_HUD_DELAY_MULT 0.5 +#define CROWBAR_OPEN_WOUND_SCANNED_DELAY_MULT 0.5 +/// If our limb is essential, damage dealt to it by tearing it open will be multiplied against this. +#define CROWBAR_OPEN_ESSENTIAL_LIMB_DAMAGE_MULT 1.5 + +/// The "power" put into electrocute_act whenever someone gets shocked when they crowbar open our limb +#define CROWBAR_OPEN_SHOCK_POWER 20 +/// The brute damage done to this limb (doubled on essential limbs) when it is crowbarred open +#define CROWBAR_OPEN_BRUTE_DAMAGE 20 + +/** + * Available during the "secure internals" step of T2 and T3. Requires a crowbar. Low-quality ghetto option. + * + * Tears open the limb, exposing internals. This massively increases the chance of secure internals succeeding, and removes the self-tend malice. + * + * Deals significant damage to the limb, and shocks the user (causing failure) if victim is alive, this limb is wired, and user is not insulated. + */ +/datum/wound/blunt/robotic/secures_internals/proc/crowbar_open(obj/item/crowbarring_item, mob/living/user) + if (!crowbarring_item.tool_start_check()) + return TRUE + + var/delay_mult = 1 + if (user == victim) + delay_mult *= CROWBAR_OPEN_SELF_TEND_DELAY_MULT + + var/knows_wires = FALSE + if (HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + delay_mult *= CROWBAR_OPEN_KNOWS_ROBO_WIRES_DELAY_MULT + knows_wires = TRUE + else if (HAS_TRAIT(user, TRAIT_KNOW_ENGI_WIRES)) + delay_mult *= CROWBAR_OPEN_KNOWS_ENGI_WIRES_DELAY_MULT + knows_wires = TRUE + if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + if (knows_wires) + delay_mult *= (CROWBAR_OPEN_HAS_DIAG_HUD_DELAY_MULT * 1.5) + else + delay_mult *= CROWBAR_OPEN_HAS_DIAG_HUD_DELAY_MULT + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + delay_mult *= CROWBAR_OPEN_WOUND_SCANNED_DELAY_MULT + + var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") + var/your_or_other = (user == victim ? "your" : "[victim]'s") + + var/limb_can_shock_pre_sleep = (victim.stat != DEAD && limb.biological_state & BIO_WIRED) + var/shock_or_not = (limb_can_shock_pre_sleep ? ", risking electrocution" : "") + var/self_message = span_warning("You start prying open [your_or_other] [limb.plaintext_zone] with [crowbarring_item][shock_or_not]...") + + user?.visible_message(span_bolddanger("[user] starts prying open [their_or_other] [limb.plaintext_zone] with [crowbarring_item]!"), self_message, ignored_mobs = list(victim)) + + var/victim_message + if (user != victim) // this exists so we can do a userdanger + victim_message = span_userdanger("[user] starts prying open your [limb.plaintext_zone] with [crowbarring_item]!") + else + victim_message = self_message + to_chat(victim, victim_message) + + playsound(get_turf(crowbarring_item), 'sound/machines/airlock/airlock_alien_prying.ogg', 30, TRUE) + if (!crowbarring_item.use_tool(target = victim, user = user, delay = (7 SECONDS * delay_mult), volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + + var/limb_can_shock = (victim.stat != DEAD && limb.biological_state & BIO_WIRED) // re-define the previous shock variable because we slept + var/stunned = FALSE + + var/message + + if (user && limb_can_shock) + var/electrocute_flags = (SHOCK_KNOCKDOWN|SHOCK_NO_HUMAN_ANIM|SHOCK_SUPPRESS_MESSAGE) + var/stun_chance = 100 + + if (HAS_TRAIT(user, TRAIT_SHOCKIMMUNE)) + stun_chance = 0 + + else if (iscarbon(user)) // doesn't matter if we're shock immune, it's set to 0 anyway + var/mob/living/carbon/carbon_user = user + if (carbon_user.gloves) + stun_chance *= carbon_user.gloves.siemens_coefficient + + if (ishuman(user)) + var/mob/living/carbon/human/human_user = user + stun_chance *= human_user.physiology.siemens_coeff + stun_chance *= carbon_user.dna.species.siemens_coeff + + if (stun_chance && prob(stun_chance)) + electrocute_flags &= ~SHOCK_KNOCKDOWN + electrocute_flags &= ~SHOCK_NO_HUMAN_ANIM + stunned = TRUE + + message = span_boldwarning("[user] is shocked by [their_or_other] [limb.plaintext_zone], [user.p_their()] crowbar slipping as [user.p_they()] briefly convulse!") + self_message = span_userdanger("You are shocked by [your_or_other] [limb.plaintext_zone], causing your crowbar to slip out!") + if (user != victim) + victim_message = span_userdanger("[user] is shocked by your [limb.plaintext_zone] in [user.p_their()] efforts to tear it open!") + + var/shock_damage = CROWBAR_OPEN_SHOCK_POWER + if (limb.current_gauze) + shock_damage *= limb.current_gauze.splint_factor // always good to let gauze do something + user.electrocute_act(shock_damage, limb, flags = electrocute_flags) + + if (!stunned) + var/other_shock_text = "" + var/self_shock_text = "" + if (!limb_can_shock) + other_shock_text = ", and is striken by golden bolts of electricity" + self_shock_text = ", but are immediately shocked by the electricity contained within" + message = span_boldwarning("[user] tears open [their_or_other] [limb.plaintext_zone] with [user.p_their()] crowbar[other_shock_text]!") + self_message = span_warning("You tear open [your_or_other] [limb.plaintext_zone] with your crowbar[self_shock_text]!") + if (user != victim) + victim_message = span_userdanger("Your [limb.plaintext_zone] fragments and splinters as [user] tears it open with [user.p_their()] crowbar!") + + playsound(get_turf(crowbarring_item), 'sound/effects/bang.ogg', 35, TRUE) // we did it! + to_chat(user, span_green("You've torn [your_or_other] [limb.plaintext_zone] open, heavily damaging it but making it a lot easier to screwdriver the internals!")) + var/damage = CROWBAR_OPEN_BRUTE_DAMAGE + if (limb_essential()) // can't be disabled + damage *= CROWBAR_OPEN_ESSENTIAL_LIMB_DAMAGE_MULT + limb.receive_damage(brute = CROWBAR_OPEN_BRUTE_DAMAGE, wound_bonus = CANT_WOUND, damage_source = crowbarring_item) + set_torn_open(TRUE) + + if (user == victim) + victim_message = self_message + + user.visible_message(message, self_message, ignored_mobs = list(victim)) + to_chat(victim, victim_message) + return TRUE + +#undef CROWBAR_OPEN_SELF_TEND_DELAY_MULT +#undef CROWBAR_OPEN_KNOWS_ROBO_WIRES_DELAY_MULT +#undef CROWBAR_OPEN_KNOWS_ENGI_WIRES_DELAY_MULT +#undef CROWBAR_OPEN_HAS_DIAG_HUD_DELAY_MULT +#undef CROWBAR_OPEN_WOUND_SCANNED_DELAY_MULT +#undef CROWBAR_OPEN_ESSENTIAL_LIMB_DAMAGE_MULT + +#undef CROWBAR_OPEN_BRUTE_DAMAGE +#undef CROWBAR_OPEN_SHOCK_POWER + +/// Sets [crowbarred_open] to the new value. If we werent originally disabling, or if we arent currently and we're torn open, we set disabling to true. +/datum/wound/blunt/robotic/secures_internals/proc/set_torn_open(torn_open_state) + // if we aren't disabling but we were torn open, OR if we aren't disabling by default + var/should_update_disabling = ((!disabling && torn_open_state) || !initial(disabling)) + + crowbarred_open = torn_open_state + if(should_update_disabling) + set_disabling(torn_open_state) + +/// If, on a secure internals attempt, we have less than this chance to succeed, we warn the user. +#define SECURE_INTERNALS_CONFUSED_CHANCE_THRESHOLD 25 +#define SECURE_INTERNALS_FAILURE_BRUTE_DAMAGE 5 + +/** + * The primary way of performing the secure internals step for T2/T3. Uses a screwdriver/wrench. Very hard to do by yourself, or without a diag hud/wire knowledge. + * Roboticists/engineers have a very high chance of succeeding. + * Deals some brute damage on failure, but moves to the final step of treatment (re-soldering) on success. + * + * If [crowbarred_open], made far more likely and remove the self-tend malice. + */ +/datum/wound/blunt/robotic/secures_internals/proc/secure_internals_normally(obj/item/securing_item, mob/user) + if (!securing_item.tool_start_check()) + return TRUE + + var/chance = 10 + var/delay_mult = 1 + + if (user == victim) + if (!crowbarred_open) + chance *= 0.2 + delay_mult *= 2 + + var/knows_wires = FALSE + if (crowbarred_open) + chance *= 4 // even self-tends get a high chance of success if torn open! + if (HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + chance *= 8 // almost guaranteed if it's not self surgery - guaranteed with diag hud + delay_mult *= 0.75 + knows_wires = TRUE + else if (HAS_TRAIT(user, TRAIT_KNOW_ENGI_WIRES)) + chance *= 5.5 + delay_mult *= 0.85 + knows_wires = TRUE + if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + if (knows_wires) + chance *= 1.25 // ((10 * 8) * 1.25) = 100% + else + chance *= 4 + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + chance *= 1.5 // youre not intended to fix this by yourself this way + delay_mult *= 0.8 + + var/confused = (chance < SECURE_INTERNALS_CONFUSED_CHANCE_THRESHOLD) // generate chance beforehand, so we can use this var + + var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") + var/your_or_other = (user == victim ? "your" : "[victim]'s") + user?.visible_message(span_notice("[user] begins the delicate operation of securing the internals of [their_or_other] [limb.plaintext_zone]..."), \ + span_notice("You begin the delicate operation of securing the internals of [your_or_other] [limb.plaintext_zone]...")) + if (confused) + to_chat(user, span_warning("You are confused by the layout of [your_or_other] [limb.plaintext_zone]! A diagnostic hud would help, as would knowing robo/engi wires! You could also tear the limb open with a crowbar, or get someone else to help.")) + + if (!securing_item.use_tool(target = victim, user = user, delay = (10 SECONDS * delay_mult), volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + + if (prob(chance)) + user?.visible_message(span_green("[user] finishes securing the internals of [their_or_other] [limb.plaintext_zone]!"), \ + span_green("You finish securing the internals of [your_or_other] [limb.plaintext_zone]!")) + to_chat(user, span_green("[capitalize(your_or_other)] [limb.plaintext_zone]'s internals are now secure! Your next step is to weld/cauterize it.")) + ready_to_secure_internals = FALSE + ready_to_resolder = TRUE + else + user?.visible_message(span_danger("[user] screws up and accidentally damages [their_or_other] [limb.plaintext_zone]!")) + limb.receive_damage(brute = SECURE_INTERNALS_FAILURE_BRUTE_DAMAGE, damage_source = securing_item, wound_bonus = CANT_WOUND) + + return TRUE + +#undef SECURE_INTERNALS_CONFUSED_CHANCE_THRESHOLD +#undef SECURE_INTERNALS_FAILURE_BRUTE_DAMAGE + +/** + * "Premium" ghetto option of the secure internals step for T2/T3. Requires bone gel. Guaranteed to work. + * Deals damage over time and disables the limb, but finishes the step afterwards. + */ +/datum/wound/blunt/robotic/secures_internals/proc/apply_gel(obj/item/stack/medical/bone_gel/gel, mob/user) + if (gelled) + to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.plaintext_zone] is already filled with bone gel!")) + return TRUE + + var/delay_mult = 1 + if (victim == user) + delay_mult *= 1.5 + + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + delay_mult *= 0.75 + + user.visible_message(span_danger("[user] begins hastily applying [gel] to [victim]'s [limb.plaintext_zone]..."), span_warning("You begin hastily applying [gel] to [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone], disregarding the acidic effect it seems to have on the metal...")) + + if (!do_after(user, (6 SECONDS * delay_mult), target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + + gel.use(1) + if(user != victim) + user.visible_message(span_notice("[user] finishes applying [gel] to [victim]'s [limb.plaintext_zone], emitting a fizzing noise!"), span_notice("You finish applying [gel] to [victim]'s [limb.plaintext_zone]!"), ignored_mobs=victim) + to_chat(victim, span_userdanger("[user] finishes applying [gel] to your [limb.plaintext_zone], and you can hear the sizzling of the metal...")) + else + victim.visible_message(span_notice("[victim] finishes applying [gel] to [victim.p_their()] [limb.plaintext_zone], emitting a funny fizzing sound!"), span_notice("You finish applying [gel] to your [limb.plaintext_zone], and you can hear the sizzling of the metal...")) + + gelled = TRUE + set_disabling(TRUE) + processes = TRUE + return TRUE + +/** + * The final step of T2/T3, requires a welder/cautery. Guaranteed to work. Cautery is slower. + * Once complete, removes the wound entirely. + */ +/datum/wound/blunt/robotic/secures_internals/proc/resolder(obj/item/welding_item, mob/user) + if (!welding_item.tool_start_check()) + return TRUE + + var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") + var/your_or_other = (user == victim ? "your" : "[victim]'s") + victim.visible_message(span_notice("[user] begins re-soldering [their_or_other] [limb.plaintext_zone]..."), \ + span_notice("You begin re-soldering [your_or_other] [limb.plaintext_zone]...")) + + var/delay_mult = 1 + if (welding_item.tool_behaviour == TOOL_CAUTERY) + delay_mult *= 3 // less efficient + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + delay_mult *= 0.75 + + if (!welding_item.use_tool(target = victim, user = user, delay = 7 SECONDS * delay_mult, volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + + victim.visible_message(span_green("[user] finishes re-soldering [their_or_other] [limb.plaintext_zone]!"), \ + span_notice("You finish re-soldering [your_or_other] [limb.plaintext_zone]!")) + remove_wound() + return TRUE + +/// Returns a string with our current treatment step for use in health analyzers. +/datum/wound/blunt/robotic/secures_internals/proc/get_wound_step_info() + var/string + + if (ready_to_resolder) + string = "Apply a welder/cautery to the limb to finalize repairs." + else if (ready_to_secure_internals) + string = "Use a screwdriver/wrench to secure the internals of the limb. This step is best performed by a qualified technician. \ + In absence of one, bone gel or a crowbar may be used." + + return string + +/datum/wound/blunt/robotic/secures_internals/get_scanner_description(mob/user) + . = ..() + + var/wound_step = get_wound_step_info() + if (wound_step) + . += "\n\nCurrent step: [span_notice(wound_step)]" + +/datum/wound/blunt/robotic/secures_internals/get_simple_scanner_description(mob/user) + . = ..() + + var/wound_step = get_wound_step_info() + if (wound_step) + . += "\n\nCurrent step: [span_notice(wound_step)]" diff --git a/modular_doppler/modular_medical/wounds/synth/medicine_reagents.dm b/modular_doppler/modular_medical/wounds/synth/medicine_reagents.dm new file mode 100644 index 0000000000000..a5399f26802aa --- /dev/null +++ b/modular_doppler/modular_medical/wounds/synth/medicine_reagents.dm @@ -0,0 +1,64 @@ +// a potent coolant that treats synthetic burns at decent efficiency. compared to hercuri it's worse, but without +// the lethal side effects, opting for a movement speed decrease instead +/datum/reagent/dinitrogen_plasmide + name = "Dinitrogen Plasmide" + description = "A compound of nitrogen and stabilized plasma, this substance has the ability to flash-cool overheated metals \ + while avoiding excessive damage. Being a heavy compound, it has the effect of slowing anything that metabolizes it." + ph = 4.8 + specific_heat = SPECIFIC_HEAT_PLASMA * 1.2 + color = "#b779cc" + taste_description = "dull plasma" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + process_flags = REAGENT_ORGANIC | REAGENT_SYNTHETIC + overdose_threshold = 60 // it takes a lot, if youre really messed up you CAN hit this but it's unlikely + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/dinitrogen_plasmide/on_mob_metabolize(mob/living/affected_mob) + . = ..() + + affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/dinitrogen_plasmide) + to_chat(affected_mob, span_warning("Your joints suddenly feel stiff.")) + +/datum/reagent/dinitrogen_plasmide/on_mob_end_metabolize(mob/living/affected_mob) + . = ..() + + affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/dinitrogen_plasmide) + affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/dinitrogen_plasmide_overdose) + to_chat(affected_mob, span_warning("Your joints no longer feel stiff!")) + +/datum/reagent/dinitrogen_plasmide/overdose_start(mob/living/affected_mob) + . = ..() + + to_chat(affected_mob, span_danger("You feel like your joints are filling with some viscous fluid!")) + affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/dinitrogen_plasmide_overdose) + +/datum/reagent/dinitrogen_plasmide/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) + . = ..() + + holder.remove_reagent(type, 1.2 * seconds_per_tick) // decays + holder.add_reagent(/datum/reagent/stable_plasma, 0.4 * seconds_per_tick) + holder.add_reagent(/datum/reagent/nitrogen, 0.8 * seconds_per_tick) + +/datum/movespeed_modifier/dinitrogen_plasmide + multiplicative_slowdown = 0.3 + +/datum/movespeed_modifier/dinitrogen_plasmide_overdose + multiplicative_slowdown = 1.3 + +/datum/chemical_reaction/dinitrogen_plasmide_formation + results = list(/datum/reagent/dinitrogen_plasmide = 3) + required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/nitrogen = 2) + required_catalysts = list(/datum/reagent/acetone = 0.1) + required_temp = 400 + optimal_temp = 550 + overheat_temp = 590 + + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_HEALING + +/obj/item/reagent_containers/spray/dinitrogen_plasmide + name = "coolant spray" + desc = "A medical spray bottle. This one contains dinitrogen plasmide, a potent coolant commonly used to treat synthetic burns. \ + Has the side effect of causing movement slowdown." + icon = 'icons/obj/medical/chemical.dmi' + icon_state = "sprayer_med_yellow" + list_reagents = list(/datum/reagent/dinitrogen_plasmide = 100) diff --git a/modular_doppler/modular_medical/wounds/synth/robotic_burns.dm b/modular_doppler/modular_medical/wounds/synth/robotic_burns.dm new file mode 100644 index 0000000000000..b03d615f4edcc --- /dev/null +++ b/modular_doppler/modular_medical/wounds/synth/robotic_burns.dm @@ -0,0 +1,484 @@ +#define OVERHEAT_ON_STASIS_HEAT_MULT 0.25 + +/datum/wound_pregen_data/burnt_metal + abstract = TRUE + required_limb_biostate = BIO_METAL + required_wounding_types = list(WOUND_BURN) + wound_series = WOUND_SERIES_METAL_BURN_OVERHEAT + +/datum/wound_pregen_data/burnt_metal/generate_scar_priorities() + return list("[BIO_METAL]") + +/datum/wound/burn/robotic/overheat + treat_text = "Introduction of a cold environment or lowering of body temperature." + + simple_desc = "Metals are overheated, increasing damage taken significantly and raising body temperature!" + simple_treat_text = "Ideally cryogenics, but any source of low body temperature can work. Spraying with spray bottles/extinguishers/showers \ + will quickly cool the limb, but cause damage. Hercuri is especially effective in quick cooling. \ + Clothing reduces the water/hercuri that makes it to the metal, and gauze binds it and reduces the damage taken." + homemade_treat_text = "You can also splash any liquid on it for a rather inefficient and damaging coolant!" + + default_scar_file = METAL_SCAR_FILE + + wound_flags = (ACCEPTS_GAUZE|SPLINT_OVERLAY|CAN_BE_GRASPED) // gauze binds the metal and makes it resistant to thermal shock + + processes = TRUE + + /// The virtual temperature of the chassis. Crucial for many things, like our severity, the temp we transfer, our cooling damage, etc. + var/chassis_temperature + + /// The lower bound of the chassis_temperature we can start with. + var/starting_temperature_min = (BODYTEMP_NORMAL + 200) + /// The upper bound of the chassis_temperature we can start with. + var/starting_temperature_max = (BODYTEMP_NORMAL + 250) + + /// If [chassis_temperature] goes below this, we reduce in severity. + var/cooling_threshold = (BODYTEMP_NORMAL + 3) + /// If [chassis_temperature] goes above this, we increase in severity. + var/heating_threshold = (BODYTEMP_NORMAL + 300) + + /// The buffer in kelvin we will subtract from the chassis_temperature of a wound we demote to. + var/cooling_demote_buffer = 60 + /// The buffer in kelvin we will add to the chassis_temperature of a wound we promote to. + var/heating_promote_buffer = 60 + + /// The coefficient of heat transfer we will use when shifting our temp to the victim's. + var/bodytemp_coeff = 0.04 + /// For every degree below normal bodytemp, we will multiply our incoming temperature by 1 + degrees * this. Allows incentivization of freezing yourself instead of just waiting. + var/bodytemp_difference_expose_bonus_ratio = 0.035 + /// The coefficient of heat transfer we will use when shifting our victim's temp to ours. + var/outgoing_bodytemp_coeff = 0 + /// The mult applied to heat output when we are on a important limb, e.g. head/torso. + var/important_outgoing_mult = 1.2 + /// The coefficient of heat transfer we will use when shifting our temp to a turf. + var/turf_coeff = 0.02 + + /// The maximum temperature we can cause by heating our victim. + var/max_outgoing_temperature = BODYTEMP_HEAT_WOUND_LIMIT - 1 + + /// If we are hit with burn damage, the damage will be multiplied against this to determine the effective heat we get. + var/incoming_damage_heat_coeff = 3 + + /// The coefficient of heat transfer we will use when receiving heat from reagent contact. + var/base_reagent_temp_coefficient = 0.02 + + /// The ratio of temp shift -> brute damage. Careful with this value, it can make stuff really really nasty. + var/heat_shock_delta_to_damage_ratio = 0.12 + /// The minimum heat difference we must have on reagent contact to cause heat shock damage. + var/heat_shock_minimum_delta = 5 + + /// If we are sprayed with a extinguisher/shower with obscuring clothing on (think clothing that prevents surgery), the effect is multiplied against this. + var/sprayed_with_reagent_clothed_mult = 0.15 + + /// The wound we demote to when we go below cooling threshold. If null, removes us. + var/datum/wound/burn/robotic/demotes_to + /// The wound we promote to when we go above heating threshold. + var/datum/wound/burn/robotic/promotes_to + + /// The color of the light we will generate. + var/light_color + /// The power of the light we will generate. + var/light_power + /// The range of the light we will generate. + var/light_range + + /// The glow we have attached to our victim, to simulate our limb glowing. + var/obj/effect/dummy/lighting_obj/moblight/mob_glow + + /// A bad system I'm using to track the worst scar we earned (since we can demote, we want the biggest our wound has been, not what it was when it was cured (probably moderate)) + var/datum/scar/highest_scar + + /// A assoc list of (reagent typepath -> cooling), where cooling is how much its presence will reduce the effective temperature of a reagent spray for cooling us. + var/static/list/reagent_types_to_extra_cooling = list( + /datum/reagent/medicine/c2/hercuri = 60, + /datum/reagent/dinitrogen_plasmide = 50, + ) + + /// A assoc list of (reagent typepath -> damage mult), where the mult will be multiplied against the thermal shock damage. + var/static/list/reagent_types_to_thermal_shock_mult = list( + /datum/reagent/medicine/c2/hercuri = 0.3, + /datum/reagent/dinitrogen_plasmide = 0.6, + ) + + +/datum/wound/burn/robotic/overheat/New(temperature) + chassis_temperature = (isnull(temperature) ? get_random_starting_temperature() : temperature) + + return ..() + +/datum/wound/burn/robotic/overheat/wound_injury(datum/wound/old_wound, attack_direction) + . = ..() + + if (old_wound && old_wound.severity > severity && istype(old_wound, /datum/wound/burn/robotic/overheat)) + var/datum/wound/burn/robotic/overheat/overheat_wound = old_wound + if (overheat_wound.highest_scar) + set_highest_scar(overheat_wound.highest_scar) + overheat_wound.clear_highest_scar() + + if (!highest_scar && can_scar) + var/datum/scar/new_scar = new + set_highest_scar(new_scar) + new_scar.generate(limb, src, add_to_scars = FALSE) + +/datum/wound/burn/robotic/overheat/proc/set_highest_scar(datum/scar/new_scar) + if (highest_scar) + UnregisterSignal(highest_scar, COMSIG_QDELETING) + if (new_scar) + RegisterSignal(new_scar, COMSIG_QDELETING, PROC_REF(clear_highest_scar)) + highest_scar = new_scar + +/datum/wound/burn/robotic/overheat/proc/clear_highest_scar(datum/source) + SIGNAL_HANDLER + + set_highest_scar(null) + +/datum/wound/burn/robotic/overheat/remove_wound(ignore_limb, replaced) + if (!replaced && highest_scar) + already_scarred = TRUE + highest_scar.lazy_attach(limb) + return ..() + +/datum/wound/burn/robotic/overheat/Destroy() + QDEL_NULL(mob_glow) + + highest_scar = null + return ..() + +/datum/wound/burn/robotic/overheat/set_victim(mob/living/new_victim) + if (victim) + QDEL_NULL(mob_glow) + UnregisterSignal(victim, COMSIG_MOB_AFTER_APPLY_DAMAGE) + UnregisterSignal(victim, COMSIG_ATOM_AFTER_EXPOSE_REAGENTS) + if (new_victim) + mob_glow = new_victim.mob_light(light_range, light_power, light_color) + mob_glow.set_light_on(TRUE) + RegisterSignal(new_victim, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(victim_attacked)) + RegisterSignal(new_victim, COMSIG_ATOM_AFTER_EXPOSE_REAGENTS, PROC_REF(victim_exposed_to_reagents)) + + return ..() + +/datum/wound/burn/robotic/overheat/proc/get_random_starting_temperature() + return LERP(starting_temperature_min, starting_temperature_max, rand()) // LERP since we deal with decimals + +/datum/wound/burn/robotic/get_limb_examine_description() + return span_warning("The metal on this limb is glowing radiantly.") + +/datum/wound/burn/robotic/overheat/handle_process(seconds_per_tick, times_fired) + if (isnull(victim)) + var/turf/our_turf = get_turf(limb) + if (!isnull(our_turf)) + expose_temperature(our_turf.GetTemperature(), (turf_coeff * seconds_per_tick)) + return + if (outgoing_bodytemp_coeff <= 0) + return + var/statis_mult = 1 + if (HAS_TRAIT(victim, TRAIT_STASIS)) // stasis heavily reduces the ingoing and outgoing transfer of heat + statis_mult *= OVERHEAT_ON_STASIS_HEAT_MULT + + var/difference_from_average = max((BODYTEMP_NORMAL - victim.bodytemperature), 0) + var/difference_mult = 1 + (difference_from_average * bodytemp_difference_expose_bonus_ratio) + if (expose_temperature(victim.bodytemperature, (bodytemp_coeff * seconds_per_tick * statis_mult * difference_mult))) + return + var/mult = outgoing_bodytemp_coeff + if (limb_essential()) + mult *= important_outgoing_mult + var/adjustment_allowed = max((max_outgoing_temperature - victim.bodytemperature), 0) + var/amount_to_adjust = min((((chassis_temperature - victim.bodytemperature) * mult) * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick * statis_mult), adjustment_allowed) + victim.adjust_bodytemperature(amount_to_adjust) + +/// Signal proc for when our victim is externally attacked. Increases chassis temp based on burn damage received. +/datum/wound/burn/robotic/overheat/proc/victim_attacked(datum/source, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + SIGNAL_HANDLER + + if (def_zone != limb.body_zone) // use this proc since receive damage can also be called for like, chems and shit + return + + if (!victim) + return + + if (damagetype != BURN) + return + + if (wound_bonus == CANT_WOUND) + return + + var/effective_damage = (damage - blocked) + if (effective_damage <= 0) + return + + expose_temperature((chassis_temperature + effective_damage), incoming_damage_heat_coeff) + +/** + * Signal proc for when our victim is exposed to reagents, obviously. + * + * Equalizes temp to the reagent temp, but also causes thermal shock. Basically, does damage based on the temp differential. + * Clothes reduce the effects massively. Hercuri reduces the thermal shock and gets a special temp buff. + */ +/datum/wound/burn/robotic/overheat/proc/victim_exposed_to_reagents(datum/signal_source, list/reagents, datum/reagents/source, methods, volume_modifier, show_message) + SIGNAL_HANDLER + + var/reagent_coeff = base_reagent_temp_coefficient + if (!get_location_accessible(victim, limb.body_zone)) + if (ishuman(victim)) + // hi! it's niko! small rant + // this proc has no goddamn reason to be on human, it could so easily just have used a proc on carbon that would get the required bodyparts to check + // but no. it had to hardcode the list in the proc itself so it's impossible to modularly fix this + // so instead we just say fuck it and hope to god only human subtypes get this wound + // tldr; ryll why + var/mob/living/carbon/human/human_victim = victim + for (var/obj/item/clothing/iter_clothing as anything in human_victim.get_clothing_on_part(limb)) + if (iter_clothing.clothing_flags & THICKMATERIAL) + return + + reagent_coeff *= sprayed_with_reagent_clothed_mult + + if (istype(source.my_atom, /obj/effect/particle_effect/water/extinguisher)) // this used to be a lot, lot more modular, but sadly reagent temps/volumes and shit are horribly inconsistant + expose_temperature(source.chem_temp, (2.55 * reagent_coeff), TRUE) + return + + if (istype(source.my_atom, /obj/machinery/shower)) + expose_temperature(source.chem_temp, (15 * volume_modifier * reagent_coeff), TRUE) + return + + var/total_reagent_amount = 0 + var/chem_temp_increment = 0 + var/thermal_shock_mult = 1 + // imperfect, this means you can microdose hercuri/plasmide in a huge tank of water and have the entire effect. + // really not a big deal, though, they arent really limited by availability + for (var/datum/reagent/iterated_reagent as anything in reagents) + total_reagent_amount += reagents[iterated_reagent] + chem_temp_increment += reagent_types_to_extra_cooling[iterated_reagent.type] + thermal_shock_mult *= reagent_types_to_thermal_shock_mult[iterated_reagent.type] + + var/local_chem_temp = max(source.chem_temp - chem_temp_increment, 0) + + expose_temperature(local_chem_temp, (reagent_coeff * volume_modifier * total_reagent_amount), TRUE, heat_shock_damage_mult = thermal_shock_mult) + +/// Adjusts chassis_temperature by the delta between temperature and itself, multiplied by coeff. +/// If heat_shock is TRUE, limb will receive brute damage based on the delta. +/datum/wound/burn/robotic/overheat/proc/expose_temperature(temperature, coeff = 0.02, heat_shock = FALSE, heat_shock_damage_mult = 1) + var/temp_delta = (temperature - chassis_temperature) * coeff + + var/unclamped_new_temperature = (chassis_temperature + temp_delta) + var/clamped_new_temperature + var/heat_adjustment_used + + if (temp_delta > 0) + clamped_new_temperature = min(min(chassis_temperature + max(temp_delta, 1), temperature), heating_threshold) + heat_adjustment_used = (clamped_new_temperature / unclamped_new_temperature) + else + clamped_new_temperature = max(max(chassis_temperature + min(temp_delta, -1), temperature), cooling_threshold) + heat_adjustment_used = (unclamped_new_temperature / clamped_new_temperature) + + if (heat_shock && abs(temp_delta) > heat_shock_minimum_delta) + var/gauze_mult = 1 + var/obj/item/stack/gauze = limb.current_gauze + if (gauze) + gauze_mult *= (gauze.splint_factor) * 0.4 // very very effective + + if (limb.grasped_by) + gauze_mult *= 0.7 // hold it down yourself + + if (victim) + var/gauze_or_not = (!isnull(gauze) ? ", but [gauze] helps to keep it together" : "") + var/clothing_text = (!get_location_accessible(victim, limb.body_zone) ? ", [victim.p_their()] clothing absorbing some of the liquid" : "") + victim.visible_message(span_warning("[victim]'s [limb.plaintext_zone] strains from the thermal shock[clothing_text][gauze_or_not]!")) + playsound(victim, 'sound/items/tools/welder.ogg', 25) + + var/damage = (((abs(temp_delta) * heat_shock_delta_to_damage_ratio) * gauze_mult) * heat_shock_damage_mult) * heat_adjustment_used + limb.receive_damage(brute = damage, wound_bonus = CANT_WOUND) + + chassis_temperature = clamped_new_temperature // can only be decimal or 1, so it can only reduce the intensity of the adjustment + + return check_temperature() + +/// Removes, demotes, or promotes ourselves to a new wound type if our temperature is past a heating/cooling threshold. +/datum/wound/burn/robotic/overheat/proc/check_temperature() + if (chassis_temperature <= cooling_threshold) + if (demotes_to) + victim.visible_message(span_green("[victim]'s [limb.plaintext_zone] turns a more pleasant thermal color as it cools down a little..."), span_green("Your [limb.plaintext_zone] seems to cool down a little!")) + replace_wound(new demotes_to(cooling_threshold - cooling_demote_buffer)) + return TRUE + else + victim.visible_message(span_green("[victim]'s [limb.plaintext_zone] simmers gently as it returns to its usual colors!"), span_green("Your [limb.plaintext_zone] simmers gently as it returns to its usual colors!")) + remove_wound() + return TRUE + else if (promotes_to && chassis_temperature >= heating_threshold) + victim.visible_message(span_danger("[victim]'s [limb.plaintext_zone] brightens as it overheats further!"), span_userdanger("Your [limb.plaintext_zone] sizzles and brightens as it overheats further!")) + replace_wound(new promotes_to(heating_threshold + heating_promote_buffer)) + return TRUE + +/// Returns a string with our temperature and heating/cooling thresholds, for use in health analyzers. +/datum/wound/burn/robotic/overheat/proc/get_wound_status_info() + var/current_temp_celcius = round(chassis_temperature - T0C, 0.1) + var/current_temp_fahrenheit = round(chassis_temperature * 1.8-459.67, 0.1) + + var/cool_celcius = round(cooling_threshold - T0C, 0.1) + var/cool_fahrenheit = round(cooling_threshold * 1.8-459.67, 0.1) + + var/heat_celcius = round(heating_threshold - T0C, 0.1) + var/heat_fahrenheit = round(heating_threshold * 1.8-459.67, 0.1) + + return "Its current temperature is [span_blue("[current_temp_celcius ] °C ([current_temp_fahrenheit] °F)")], \ + and needs to cool to [span_nicegreen("[cool_celcius] °C ([cool_fahrenheit] °F)")], but \ + will worsen if heated to [span_purple("[heat_celcius] °C ([heat_fahrenheit] °F)")]." + +/datum/wound/burn/robotic/overheat/get_scanner_description(mob/user) + . = ..() + + . += "\nWound status: [get_wound_status_info()]" + +/datum/wound/burn/robotic/overheat/get_simple_scanner_description(mob/user) + . = ..() + + . += "\nWound status: [get_wound_status_info()]" + +// this wound is unaffected by cryoxadone and pyroxadone +/datum/wound/burn/robotic/overheat/on_xadone(power) + return + +/datum/wound/burn/robotic/overheat/moderate + name = "Transient Overheating" + desc = "External metals have exceeded lower-bound thermal limits and have lost some structural integrity, increasing damage taken as well as the chance to \ + sustain additional wounds." + occur_text = "lets out a slight groan as it turns a dull shade of thermal red" + examine_desc = "is glowing a dull thermal red and giving off heat" + treat_text = "Reduction of body temperature to expedite the passive heat dissipation - or, if thermal shock is to be risked, application of a fire extinguisher/shower." + severity = WOUND_SEVERITY_MODERATE + + damage_multiplier_penalty = 1.15 //1.15x damage taken + + starting_temperature_min = (BODYTEMP_NORMAL + 350) + starting_temperature_max = (BODYTEMP_NORMAL + 400) + + cooling_threshold = (BODYTEMP_NORMAL + 100) + heating_threshold = (BODYTEMP_NORMAL + 500) + + cooling_demote_buffer = 60 + heating_promote_buffer = 100 + + a_or_from = "from" + + // easy to get + threshold_penalty = 30 + + status_effect_type = /datum/status_effect/wound/burn/robotic/moderate + + sound_volume = 20 + + outgoing_bodytemp_coeff = 0.0056 + bodytemp_coeff = 0.006 + + base_reagent_temp_coefficient = 0.03 + heat_shock_delta_to_damage_ratio = 0.2 + + promotes_to = /datum/wound/burn/robotic/overheat/severe + + light_color = COLOR_RED + light_power = 0.1 + light_range = 0.5 + + can_scar = FALSE + +/datum/wound_pregen_data/burnt_metal/transient_overheat + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/robotic/overheat/moderate + + threshold_minimum = 30 + +/datum/wound/burn/robotic/overheat/severe + name = "Thermal Overload" + desc = "Exterior plating has surpassed critical thermal levels, causing significant failure in structural integrity and overheating of internal systems." + occur_text = "sizzles, the externals turning a dull shade of orange" + examine_desc = "appears discolored and polychromatic, parts of it glowing a dull orange" + treat_text = "Isolation from physical hazards, and accommodation of passive heat dissipation - active cooling may be used, but temperature differentials significantly \ + raise the risk of thermal shock." + severity = WOUND_SEVERITY_SEVERE + + a_or_from = "from" + + threshold_penalty = 65 + + status_effect_type = /datum/status_effect/wound/burn/robotic/severe + damage_multiplier_penalty = 1.25 // 1.25x damage taken + + starting_temperature_min = (BODYTEMP_NORMAL + 550) + starting_temperature_max = (BODYTEMP_NORMAL + 600) + + heating_promote_buffer = 150 + + cooling_threshold = (BODYTEMP_NORMAL + 375) + heating_threshold = (BODYTEMP_NORMAL + 800) + + outgoing_bodytemp_coeff = 0.0053 + bodytemp_coeff = 0.004 + + base_reagent_temp_coefficient = 0.03 + heat_shock_delta_to_damage_ratio = 0.2 + + demotes_to = /datum/wound/burn/robotic/overheat/moderate + promotes_to = /datum/wound/burn/robotic/overheat/critical + + light_color = COLOR_BRIGHT_ORANGE + light_power = 0.8 + light_range = 0.5 + + scar_keyword = "burnsevere" + +/datum/wound_pregen_data/burnt_metal/severe + abstract = FALSE + wound_path_to_generate = /datum/wound/burn/robotic/overheat/severe + threshold_minimum = 80 + +/datum/wound/burn/robotic/overheat/critical + name = "Runaway Exothermy" + desc = "Carapace is beyond melting point, causing catastrophic structural integrity failure as well as massively heating up the subject." + occur_text = "turns a bright shade of radiant white as it sizzles and melts" + examine_desc = "is a blinding shade of white, almost melting from the heat" + treat_text = "Immediate confinement to cryogenics, as rapid overheating and physical vulnerability may occur. Active cooling is not advised, \ + since the thermal shock may be lethal with such a temperature differential." + severity = WOUND_SEVERITY_CRITICAL + + a_or_from = "from" + + sound_effect = 'sound/effects/wounds/sizzle2.ogg' + + threshold_penalty = 100 + + status_effect_type = /datum/status_effect/wound/burn/robotic/critical + + damage_multiplier_penalty = 1.5 //1.5x damage taken + + starting_temperature_min = (BODYTEMP_NORMAL + 1050) + starting_temperature_max = (BODYTEMP_NORMAL + 1100) + + cooling_demote_buffer = 100 + + cooling_threshold = (BODYTEMP_NORMAL + 775) + heating_threshold = INFINITY + + outgoing_bodytemp_coeff = 0.0055 // burn... BURN... + bodytemp_coeff = 0.0025 + + base_reagent_temp_coefficient = 0.03 + heat_shock_delta_to_damage_ratio = 0.2 + + max_outgoing_temperature = BODYTEMP_HEAT_WOUND_LIMIT // critical CAN cause wounds, but only barely + + demotes_to = /datum/wound/burn/robotic/overheat/severe + + wound_flags = (MANGLES_EXTERIOR|ACCEPTS_GAUZE|SPLINT_OVERLAY|CAN_BE_GRASPED) + + light_color = COLOR_VERY_SOFT_YELLOW + light_power = 1.3 + light_range = 1.5 + + scar_keyword = "burncritical" + +/datum/wound_pregen_data/burnt_metal/critical + abstract = FALSE + wound_path_to_generate = /datum/wound/burn/robotic/overheat/critical + threshold_minimum = 140 + +#undef OVERHEAT_ON_STASIS_HEAT_MULT diff --git a/modular_doppler/modular_medical/wounds/synth/robotic_muscle.dm b/modular_doppler/modular_medical/wounds/synth/robotic_muscle.dm new file mode 100644 index 0000000000000..4e91c58f7f675 --- /dev/null +++ b/modular_doppler/modular_medical/wounds/synth/robotic_muscle.dm @@ -0,0 +1,47 @@ +/datum/wound/muscle/robotic + sound_effect = 'sound/effects/wounds/blood1.ogg' + +/datum/wound_pregen_data/muscle/robotic + required_limb_biostate = (BIO_METAL) + +/datum/wound/muscle/robotic/moderate + name = "Overworked Servo" + desc = "A servo has been overworked, and will operate with reduced efficiency until rested." + treat_text = "A tight splint on the affected limb, as well as plenty of rest and sleep." + examine_desc = "appears to be moving sluggishly" + occur_text = "jitters for a moment before moving sluggishly" + severity = WOUND_SEVERITY_MODERATE + interaction_efficiency_penalty = 1.5 + limp_slowdown = 2 + limp_chance = 30 + threshold_penalty = 15 + status_effect_type = /datum/status_effect/wound/muscle/robotic/moderate + regen_ticks_needed = 90 + +/datum/wound_pregen_data/muscle/robotic/servo + abstract = FALSE + wound_path_to_generate = /datum/wound/muscle/robotic/moderate + threshold_minimum = 35 + +/datum/wound/muscle/robotic/severe + name = "Exhausted Piston" + sound_effect = 'sound/effects/wounds/blood2.ogg' + desc = "An important hydraulic piston has been critically overused, resulting in total dysfunction until it recovers." + treat_text = "A tight splint on the affected limb, as well as plenty of rest and sleep." + examine_desc = "is stiffly limp, the extremities splayed out widely" + occur_text = "goes completely stiff, seeming to lock into position" + severity = WOUND_SEVERITY_SEVERE + interaction_efficiency_penalty = 2 + limp_slowdown = 5 + limp_chance = 40 + threshold_penalty = 35 + disabling = TRUE + status_effect_type = /datum/status_effect/wound/muscle/robotic/severe + regen_ticks_needed = 150 + +/datum/wound_pregen_data/muscle/robotic/hydraulic + abstract = FALSE + + wound_path_to_generate = /datum/wound/muscle/robotic/severe + threshold_minimum = 80 + diff --git a/modular_doppler/modular_medical/wounds/synth/robotic_pierce.dm b/modular_doppler/modular_medical/wounds/synth/robotic_pierce.dm new file mode 100644 index 0000000000000..97ee48225eb9a --- /dev/null +++ b/modular_doppler/modular_medical/wounds/synth/robotic_pierce.dm @@ -0,0 +1,152 @@ +// Pierce +// Slow to rise but high damage overall +// Hard-ish to fix +/datum/wound/electrical_damage/pierce + heat_differential_healing_mult = 0.01 + simple_desc = "Electrical conduits have been pierced open, resulting in a fault that slowly intensifies, but with extreme maximum voltage!" + +/datum/wound_pregen_data/electrical_damage/pierce + abstract = TRUE + wound_series = WOUND_SERIES_WIRE_PIERCE_ELECTRICAL_DAMAGE + required_wounding_types = list(WOUND_PIERCE) + +/datum/wound/burn/electrical_damage/pierce/get_limb_examine_description() + return span_warning("The metal on this limb is pierced open.") + +/datum/wound/electrical_damage/pierce/wound_injury(datum/wound/old_wound = null, attack_direction = null) + if(limb.can_bleed() && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) + victim.spray_blood(attack_direction, severity) + + return ..() + +/datum/wound/electrical_damage/pierce/moderate + name = "Punctured Capacitor" + desc = "A major capacitor has been broken open, causing slow but noticable electrical damage." + occur_text = "shoots out a short stream of sparks" + examine_desc = "is shuddering gently, movements a little weak" + treat_text = "Replacing of damaged wiring, though repairs via wirecutting instruments or sutures may suffice, albeit at limited efficiency. In case of emergency, \ + subject may be subjected to high temperatures to allow solder to reset." + + sound_effect = 'modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T1.ogg' + + severity = WOUND_SEVERITY_MODERATE + + sound_volume = 30 + + threshold_penalty = 30 + + intensity = 10 SECONDS + processing_full_shock_threshold = 7 MINUTES + + processing_shock_power_per_second_max = 1.2 + processing_shock_power_per_second_min = 1.1 + + processing_shock_stun_chance = 0.5 + processing_shock_spark_chance = 35 + + process_shock_spark_count_max = 1 + process_shock_spark_count_min = 1 + + wirecut_repair_percent = 0.078 + wire_repair_percent = 0.018 + + initial_sparks_amount = 1 + + status_effect_type = /datum/status_effect/wound/electrical_damage/pierce/moderate + + a_or_from = "a" + + scar_keyword = "piercemoderate" + +/datum/wound_pregen_data/electrical_damage/pierce/moderate + abstract = FALSE + wound_path_to_generate = /datum/wound/electrical_damage/pierce/moderate + threshold_minimum = 40 + +/datum/wound/electrical_damage/pierce/severe + name = "Penetrated Transformer" + desc = "A major transformer has been pierced, causing slow-to-progess but eventually intense electrical damage." + occur_text = "sputters and goes limp for a moment as it ejects a stream of sparks" + examine_desc = "is shuddering significantly, its servos briefly giving way in a rythmic pattern" + treat_text = "Containment of damaged wiring via gauze, then application of fresh wiring/sutures, or resetting of displaced wiring via wirecutter/retractor." + + sound_effect = 'modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T2.ogg' + + severity = WOUND_SEVERITY_SEVERE + + sound_volume = 15 + + threshold_penalty = 40 + + intensity = 20 SECONDS + processing_full_shock_threshold = 6.5 MINUTES + + processing_shock_power_per_second_max = 1.6 + processing_shock_power_per_second_min = 1.5 + + processing_shock_stun_chance = 2.5 + processing_shock_spark_chance = 60 + + process_shock_spark_count_max = 2 + process_shock_spark_count_min = 1 + + wirecut_repair_percent = 0.046 + wire_repair_percent = 0.01 + + initial_sparks_amount = 3 + + status_effect_type = /datum/status_effect/wound/electrical_damage/pierce/moderate + + a_or_from = "a" + + scar_keyword = "piercemoderate" + +/datum/wound_pregen_data/electrical_damage/pierce/severe + abstract = FALSE + wound_path_to_generate = /datum/wound/electrical_damage/pierce/severe + threshold_minimum = 60 + +/datum/wound/electrical_damage/pierce/critical + name = "Ruptured PSU" + desc = "The local PSU of this limb has suffered a core rupture, causing a progressive power failure that will slowly intensify into massive electrical damage." + occur_text = "flashes with radiant blue, emitting a noise not unlike a Jacob's Ladder" + examine_desc = "'s PSU is visible, with a sizable hole in the center" + treat_text = "Immediate securing via gauze, followed by emergency cable replacement and securing via wirecutters or hemostat. \ + If the fault has become uncontrollable, extreme heat therapy is recommended." + + severity = WOUND_SEVERITY_CRITICAL + wound_flags = (ACCEPTS_GAUZE|MANGLES_EXTERIOR|CAN_BE_GRASPED|SPLINT_OVERLAY) + + sound_effect = 'modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T3.ogg' + + sound_volume = 30 + + threshold_penalty = 60 + + intensity = 30 SECONDS + processing_full_shock_threshold = 5.5 MINUTES + + processing_shock_power_per_second_max = 2.2 + processing_shock_power_per_second_min = 2.1 + + processing_shock_stun_chance = 1 + processing_shock_spark_chance = 90 + + process_shock_spark_count_max = 3 + process_shock_spark_count_min = 2 + + wirecut_repair_percent = 0.032 + wire_repair_percent = 0.008 + + initial_sparks_amount = 8 + + status_effect_type = /datum/status_effect/wound/electrical_damage/pierce/moderate + + a_or_from = "a" + + scar_keyword = "piercecritical" + +/datum/wound_pregen_data/electrical_damage/pierce/critical + abstract = FALSE + wound_path_to_generate = /datum/wound/electrical_damage/pierce/critical + threshold_minimum = 110 diff --git a/modular_doppler/modular_medical/wounds/synth/robotic_slash.dm b/modular_doppler/modular_medical/wounds/synth/robotic_slash.dm new file mode 100644 index 0000000000000..82f4308229b4b --- /dev/null +++ b/modular_doppler/modular_medical/wounds/synth/robotic_slash.dm @@ -0,0 +1,654 @@ +/// How much damage and progress is reduced when on stasis. +#define ELECTRICAL_DAMAGE_ON_STASIS_MULT 0.15 +/// How much damage and progress is reduced when limb is grasped. +#define ELECTRICAL_DAMAGE_GRASPED_MULT 0.7 +/// How much damage and progress is reduced when our victim lies down. +#define ELECTRICAL_DAMAGE_LYING_DOWN_MULT 0.7 +/// How much progress is reduced when our victim is dead. +#define ELECTRICAL_DAMAGE_DEAD_PROGRESS_MULT 0.2 // they'll be resting to, so this is more like 0.1 + +/// Base time for a wirecutter being used. +#define ELECTRICAL_DAMAGE_WIRECUTTER_BASE_DELAY 8 SECONDS +/// Base time for a cable coil being used. +#define ELECTRICAL_DAMAGE_SUTURE_WIRE_BASE_DELAY 0.8 SECONDS +/// Global damage multiplier for the power a given electrical damage wound will add per tick. +#define ELECTRICAL_DAMAGE_POWER_PER_TICK_MULT 1 +/// Global damage multiplier for how much repairing wiring will reduce intensity. Higher is more. +#define ELECTRICAL_DAMAGE_SUTURE_WIRE_HEALING_AMOUNT_MULT 1 + +/// The minimum shock power we must have available to zap our victim. Must be at least one, since electrocute_act fails if it's lower. +#define ELECTRICAL_DAMAGE_MINIMUM_SHOCK_POWER_PER_ZAP 1 +/// The maximum burn damage our limb can have before we refuse to let people who havent aggrograbbed the limb repair it with wires. This is so people can opt to just fix the burn damage. +#define ELECTRICAL_DAMAGE_MAX_BURN_DAMAGE_TO_LET_WIRES_REPAIR 5 + +/// If progress is positive (not decreasing) after applying ELECTRICAL_DAMAGE_CLOTTING_HEALING_AMOUNT, we multiply it against this. +#define ELECTRICAL_DAMAGE_CLOTTING_PROGRESS_MULT 0.5 + +/datum/wound/electrical_damage + name = "Electrical (Wires) Wound" + + simple_treat_text = "Replacing of broken wiring, or repairing via a wirecutter. Bandaging binds the wiring and reduces intensity buildup, \ + as does firmly grasping the limb - both the victim and someone else can do this. Roboticists/Engineers get a bonus to treatment, as do diagnostic HUDs." + homemade_treat_text = "Sutures can repair the wiring at reduced efficiency, as can retractors. In a pinch, high temperatures can repair the wiring!" + + wound_flags = (ACCEPTS_GAUZE|CAN_BE_GRASPED|SPLINT_OVERLAY) + + treatable_tools = list(TOOL_WIRECUTTER, TOOL_RETRACTOR) + treatable_by = list(/obj/item/stack/medical/suture) + treatable_by_grabbed = list(/obj/item/stack/cable_coil) + + default_scar_file = METAL_SCAR_FILE + + processes = TRUE + + /// How many sparks do we spawn when we're gained? + var/initial_sparks_amount = 1 + + /// How much of our damage is reduced if the target is shock immune. Percent. + var/shock_immunity_self_damage_reduction = 75 + + /// Mult for our damage if we are unimportant. + var/limb_unimportant_damage_mult = 0.8 + /// Mult for our progress if we are unimportant. + var/limb_unimportant_progress_mult = 0.8 + + /// The overall "intensity" of this wound. Goes up to [processing_full_shock_threshold], and is used for determining our effect scaling. Measured in deciseconds. + var/intensity + /// The time, in deciseconds, it takes to reach 100% power. + var/processing_full_shock_threshold = 3 MINUTES + /// If [intensity] is at or below this, we remove ourselves. + var/minimum_intensity = 0 + + /// How much shock power we add to [processing_shock_power_this_tick] per tick. Lower bound + var/processing_shock_power_per_second_min = 0.1 + /// How much shock power we add to [processing_shock_power_this_tick] per tick. Upper bound + var/processing_shock_power_per_second_max = 0.2 + + /// In the case we get below 1 power, we add the power to this buffer and use it next tick. + var/processing_shock_power_this_tick = 0 + /// The chance for each processed shock to stun the user. + var/processing_shock_stun_chance = 0 + /// The chance for each processed shock to spark. + var/processing_shock_spark_chance = 30 + /// The chance for each processed shock to message the user. + var/process_shock_message_chance = 80 + + /// Simple mult for how much of real time is added to [intensity]. + var/seconds_per_intensity_mult = 1 + + /// How many sparks we spawn if a shock sparks. Lower bound + var/process_shock_spark_count_min = 1 + /// How many sparks we spawn if a shock sparks. Upper bound + var/process_shock_spark_count_max = 1 + + // Generally should be less fast than wire, but its effectiveness should increase with severity + /// The percent, in decimal, a successful wirecut use will reduce intensity by. + var/wirecut_repair_percent + // Generally should be lower than wirecut + /// The percent, in decimal, a successful wire use will reduce intensity by. + var/wire_repair_percent + + /// The basic multiplier to all our effects. Damage, progress, etc. + var/overall_effect_mult = 1 + + /// The bodyheat our victim must be at or above to start getting passive healing. + var/heat_thresh_to_heal = (BODYTEMP_HEAT_DAMAGE_LIMIT + 30) + /// The mult that heat differences between normal and bodytemp threshold is multiplied against. Controls passive heat healing. + var/heat_differential_healing_mult = 0.08 + + /// Percent chance for a heat repair to give the victim a message. + var/heat_heal_message_chance = 20 + + /// If [get_intensity_mult()] is at or above this, the limb gets disabled. If null, it will never occur. + var/disable_at_intensity_mult + +/datum/wound_pregen_data/electrical_damage + abstract = TRUE + required_limb_biostate = (BIO_WIRED) + required_wounding_types = list(WOUND_SLASH) + wound_series = WOUND_SERIES_WIRE_SLASH_ELECTRICAL_DAMAGE + +/datum/wound_pregen_data/electrical_damage/generate_scar_priorities() + return list("[BIO_METAL]") // wire scars dont exist so we can just use metal + +/datum/wound/burn/electrical_damage/slash/get_limb_examine_description() + return span_warning("The wiring on this limb is slashed open.") + +/datum/wound/electrical_damage/handle_process(seconds_per_tick, times_fired) + . = ..() + + var/base_mult = get_base_mult() + + var/seconds_per_tick_for_intensity = seconds_per_tick * get_progress_mult() + seconds_per_tick_for_intensity = modify_progress_after_progress_mult(seconds_per_tick_for_intensity, seconds_per_tick) + + adjust_intensity(seconds_per_tick_for_intensity SECONDS) + + if (!victim || victim.stat == DEAD) + return + + var/damage_mult = get_damage_mult(victim) + var/intensity_mult = get_intensity_mult() + + damage_mult *= seconds_per_tick + damage_mult *= intensity_mult + + var/picked_damage = LERP(processing_shock_power_per_second_min, processing_shock_power_per_second_max, rand()) + processing_shock_power_this_tick += (picked_damage * damage_mult) + if (processing_shock_power_this_tick <= ELECTRICAL_DAMAGE_MINIMUM_SHOCK_POWER_PER_ZAP) + return + + var/stun_chance = (processing_shock_stun_chance * intensity_mult) * base_mult + var/spark_chance = (processing_shock_spark_chance * intensity_mult) * base_mult + + var/should_stun = SPT_PROB(stun_chance, seconds_per_tick) + var/should_message = SPT_PROB(process_shock_message_chance, seconds_per_tick) + + zap(victim, + processing_shock_power_this_tick, + stun = should_stun, + spark = SPT_PROB(spark_chance, seconds_per_tick), + animation = should_stun, message = FALSE, + message = should_stun, + tell_victim_if_no_message = should_message, + ignore_immunity = TRUE, + jitter_time = seconds_per_tick, + stutter_time = 0, + delay_stun = TRUE, + knockdown = TRUE, + ignore_gloves = TRUE + ) + processing_shock_power_this_tick = 0 + +/// If someone is aggrograbbing us and targetting our limb, intensity progress is multiplied against this. +#define LIMB_AGGROGRABBED_PROGRESS_MULT 0.5 + +/// Returns the multiplier used by our intensity progress. Intensity increment is multiplied against this. +/datum/wound/electrical_damage/proc/get_progress_mult() + var/progress_mult = get_base_mult() * seconds_per_intensity_mult + + if (!limb_essential()) + progress_mult *= limb_unimportant_progress_mult + + if (isliving(victim.pulledby)) + var/mob/living/living_puller = victim.pulledby + if (living_puller.grab_state >= GRAB_AGGRESSIVE && living_puller.zone_selected == limb.body_zone) + progress_mult *= LIMB_AGGROGRABBED_PROGRESS_MULT // they're holding it down + + if (victim.stat == DEAD) + progress_mult *= ELECTRICAL_DAMAGE_DEAD_PROGRESS_MULT // doesnt totally stop it but slows it down a lot + + return progress_mult +#undef LIMB_AGGROGRABBED_PROGRESS_MULT + +/// Returns the multiplier used by the damage we deal. +/datum/wound/electrical_damage/proc/get_damage_mult(mob/living/target) + SHOULD_BE_PURE(TRUE) + + var/damage_mult = get_base_mult() + + if (!limb_essential()) + damage_mult *= limb_unimportant_damage_mult + + return damage_mult * ELECTRICAL_DAMAGE_POWER_PER_TICK_MULT + +/// Returns the global multiplier used by both progress and damage. +/datum/wound/electrical_damage/proc/get_base_mult() + var/base_mult = 1 + + if (victim) + if (HAS_TRAIT(victim, TRAIT_STASIS)) + base_mult *= ELECTRICAL_DAMAGE_ON_STASIS_MULT + if (victim.body_position == LYING_DOWN) + base_mult *= ELECTRICAL_DAMAGE_LYING_DOWN_MULT + if (limb.grasped_by) + base_mult *= ELECTRICAL_DAMAGE_GRASPED_MULT + + if (victim.has_status_effect(/datum/status_effect/determined)) + base_mult *= WOUND_DETERMINATION_BLEED_MOD + + if (HAS_TRAIT(victim, TRAIT_SHOCKIMMUNE)) // it'd be a bit cheesy to just become immune to this, so it only makes it a lot lot better + base_mult *= shock_immunity_self_damage_reduction + + var/splint_mult = (limb.current_gauze ? limb.current_gauze.splint_factor : 1) + base_mult *= splint_mult + + return overall_effect_mult * base_mult + +/// Is called after seconds_for_intensity is modified by get_progress_mult(). +/datum/wound/electrical_damage/proc/modify_progress_after_progress_mult(seconds_for_intensity, seconds_per_tick) + if (!victim) + return seconds_for_intensity + + seconds_for_intensity -= (get_heat_healing() * seconds_per_tick) + + if (seconds_for_intensity > 0 && HAS_TRAIT(victim, TRAIT_COAGULATING)) + seconds_for_intensity *= ELECTRICAL_DAMAGE_CLOTTING_PROGRESS_MULT + + if (HAS_TRAIT(src, TRAIT_ELECTRICAL_DAMAGE_REPAIRING)) + seconds_for_intensity = min(seconds_for_intensity, 0) // it cant get any worse + + return seconds_for_intensity + +/// Returns how many deciseconds progress should be reduced by, based on the current heat of our victim's body. +/datum/wound/electrical_damage/proc/get_heat_healing(do_message = prob(heat_heal_message_chance)) + var/healing_amount = max((victim.bodytemperature - heat_thresh_to_heal), 0) * heat_differential_healing_mult + if (do_message && healing_amount) + to_chat(victim, span_notice("You feel the solder within your [limb.plaintext_zone] reform and repair your [name]...")) + + return healing_amount + +/// Changes intensity by the given amount, and then updates our status, removing ourselves if fixed. +/datum/wound/electrical_damage/proc/adjust_intensity(to_adjust) + intensity = clamp((intensity + to_adjust), 0, processing_full_shock_threshold) + + if (disable_at_intensity_mult) + set_disabling(get_intensity_mult() >= disable_at_intensity_mult) + + remove_if_fixed() + +/datum/wound/electrical_damage/wound_injury(datum/wound/electrical_damage/old_wound, attack_direction) + . = ..() + + if (old_wound) + intensity = max(intensity, old_wound.intensity) + processing_shock_power_this_tick = old_wound.processing_shock_power_this_tick + + do_sparks(initial_sparks_amount, FALSE, victim) + if (limb.can_bleed() && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) + victim.spray_blood(attack_direction, severity) + +/datum/wound/electrical_damage/modify_desc_before_span(desc, mob/user) + . = ..() + + if (limb.current_gauze) + return + + var/intensity_mult = get_intensity_mult() + if (intensity_mult < 0.2 || (victim.stat == DEAD)) + return + + . += ", and " + + var/extra + switch (intensity_mult) + if (0.2 to 0.4) + extra += "[span_deadsay("is letting out some sparks")]" + if (0.4 to 0.6) + extra += "[span_deadsay("is sparking quite a bit")]" + if (0.6 to 0.8) + extra += "[span_deadsay("is practically hemorrhaging sparks")]" + if (0.8 to 1) + extra += "[span_deadsay("has golden bolts of electricity constantly striking the surface")]" + + . += extra + +/datum/wound/electrical_damage/get_scanner_description(mob/user) + . = ..() + + . += "\nWound status: [get_wound_status_info()]" + +/datum/wound/electrical_damage/get_simple_scanner_description(mob/user) + . = ..() + + . += "\nWound status: [get_wound_status_info()]" + +/// Returns a string with our fault intensity and threshold to removal for use in health analyzers. +/datum/wound/electrical_damage/proc/get_wound_status_info() + return "Fault intensity is currently at [span_bold("[get_intensity_mult() * 100]")]%. It must be reduced to [span_blue("[minimum_intensity]")]% to remove the wound." + +// this wound is unaffected by cryoxadone and pyroxadone +/datum/wound/electrical_damage/on_xadone(power) + return + +/datum/wound/electrical_damage/item_can_treat(obj/item/potential_treater, mob/user) + if (istype(potential_treater, /obj/item/stack/cable_coil) && ((user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE) || (limb.burn_dam <= ELECTRICAL_DAMAGE_MAX_BURN_DAMAGE_TO_LET_WIRES_REPAIR))) + return TRUE // if we're aggrograbbed, or relatively undamaged, go ahead. else, we dont want to impede normal treatment + + return ..() + +/datum/wound/electrical_damage/treat(obj/item/treating_item, mob/user) + if (treating_item.tool_behaviour == TOOL_WIRECUTTER || treating_item.tool_behaviour == TOOL_RETRACTOR) + return wirecut(treating_item, user) + + if (istype(treating_item, /obj/item/stack/medical/suture) || istype(treating_item, /obj/item/stack/cable_coil)) + return suture_wires(treating_item, user) + + return ..() + +/** + * The "trauma" treatment, done with cables/sutures. Sutures get a debuff. + * Low self-tend penalty. + * Very fast, but low value. Eats up wires for breakfast. + * Has limited wire/HUD bonuses. If you're a robo, use a wirecutter instead. + */ +/datum/wound/electrical_damage/proc/suture_wires(obj/item/stack/suturing_item, mob/living/carbon/human/user) + if (!suturing_item.tool_start_check()) + return TRUE + + var/is_suture = (istype(suturing_item, /obj/item/stack/medical/suture)) + + var/change = (processing_full_shock_threshold * wire_repair_percent) * ELECTRICAL_DAMAGE_SUTURE_WIRE_HEALING_AMOUNT_MULT + var/delay_mult = 1 + if (user == victim) + delay_mult *= 1.4 + if (is_suture) + delay_mult *= 1.5 + var/obj/item/stack/medical/suture/suture_item = suturing_item + var/obj/item/stack/medical/suture/base_suture = /obj/item/stack/medical/suture + change = max(change - (suture_item.heal_brute - initial(base_suture.heal_brute)), 0.00001) + + // as this is the trauma treatment, there are less bonuses + // if youre doing this, youre probably doing this on-the-spot + if (HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + delay_mult *= 0.8 + else if (HAS_TRAIT(user, TRAIT_KNOW_ENGI_WIRES)) + delay_mult *= 0.9 + if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + delay_mult *= 0.8 + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + change *= 1.5 + + ADD_TRAIT(src, TRAIT_ELECTRICAL_DAMAGE_REPAIRING, REF(user)) + do_suture_repairs(suturing_item, user, change, delay_mult) + REMOVE_TRAIT(src, TRAIT_ELECTRICAL_DAMAGE_REPAIRING, REF(user)) + return TRUE + +/// Does a while loop that repairs us with cables. A proc for containing runtimes and allowing trait removal at all times. +/datum/wound/electrical_damage/proc/do_suture_repairs(obj/item/stack/suturing_item, mob/living/carbon/human/user, change, delay_mult) + var/is_suture = (istype(suturing_item, /obj/item/stack/medical/suture)) + var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") + var/your_or_other = (user == victim ? "your" : "[victim]'s") + var/replacing_or_suturing = (is_suture ? "repairing some" : "replacing") + while (suturing_item.tool_start_check()) + user?.visible_message(span_danger("[user] begins [replacing_or_suturing] wiring within [their_or_other] [limb.plaintext_zone] with [suturing_item]..."), \ + span_notice("You begin [replacing_or_suturing] wiring within [your_or_other] [limb.plaintext_zone] with [suturing_item]...")) + if (!suturing_item.use_tool(target = victim, user = user, delay = ELECTRICAL_DAMAGE_SUTURE_WIRE_BASE_DELAY * delay_mult, amount = 1, volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return + + if (user != victim && user.combat_mode) + user?.visible_message(span_danger("[user] mangles some of [their_or_other] [limb.plaintext_zone]'s wiring!"), \ + span_danger("You mangle some of [your_or_other] [limb.plaintext_zone]'s wiring!"), ignored_mobs = victim) + to_chat(victim, span_userdanger("[capitalize(your_or_other)] mangles some of your [limb.plaintext_zone]'s wiring!")) + adjust_intensity(change * 2) + else + var/repairs_or_replaces = (is_suture ? "repairs" : "replaces") + var/repair_or_replace = (is_suture ? "repair" : "replace") + user?.visible_message(span_notice("[user] [repairs_or_replaces] some of [their_or_other] [limb.plaintext_zone]'s wiring!"), \ + span_notice("You [repair_or_replace] some of [your_or_other] [limb.plaintext_zone]'s wiring!")) + adjust_intensity(-change) + victim?.balloon_alert(user, "intensity reduced to [get_intensity_mult() * 100]%") + + if (fixed()) + return + +/** + * The "proper" treatment, done with wirecutters/retractors. Retractors get a debuff. + * High self-tend penalty. + * Slow, but high value. + * Has high wire/HUD bonuses. The ideal treatment for a robo. + */ +/datum/wound/electrical_damage/proc/wirecut(obj/item/wirecutting_tool, mob/living/carbon/human/user) + if (!wirecutting_tool.tool_start_check()) + return TRUE + + var/is_retractor = (wirecutting_tool.tool_behaviour == TOOL_RETRACTOR) + + var/change = (processing_full_shock_threshold * wirecut_repair_percent) + var/delay_mult = 1 + if (user == victim) + delay_mult *= 2 + if (is_retractor) + delay_mult *= 2 + var/knows_wires = FALSE + if (HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + delay_mult *= 0.3 + knows_wires = TRUE + else if (HAS_TRAIT(user, TRAIT_KNOW_ENGI_WIRES)) + delay_mult *= 0.6 + knows_wires = TRUE + if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + if (knows_wires) + delay_mult *= 0.9 + else + delay_mult *= 0.75 + if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + change *= 1.5 + + ADD_TRAIT(src, TRAIT_ELECTRICAL_DAMAGE_REPAIRING, REF(user)) + do_wirecutter_repairs(wirecutting_tool, user, change, delay_mult) + REMOVE_TRAIT(src, TRAIT_ELECTRICAL_DAMAGE_REPAIRING, REF(user)) + return TRUE + +/// Does a while loop that repairs us with a wirecutter. A proc for containing runtimes and allowing trait removal at all times. +/datum/wound/electrical_damage/proc/do_wirecutter_repairs(obj/item/wirecutting_tool, mob/living/carbon/human/user, change, delay_mult) + var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") + var/your_or_other = (user == victim ? "your" : "[victim]'s") + while (wirecutting_tool.tool_start_check()) + user?.visible_message(span_danger("[user] begins resetting misplaced wiring within [their_or_other] [limb.plaintext_zone]..."), \ + span_notice("You begin resetting misplaced wiring within [your_or_other] [limb.plaintext_zone]...")) + if (!wirecutting_tool.use_tool(target = victim, user = user, delay = ELECTRICAL_DAMAGE_WIRECUTTER_BASE_DELAY * delay_mult, volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return + + if (user != victim && user.combat_mode) + user?.visible_message(span_danger("[user] mangles some of [their_or_other] [limb.plaintext_zone]'s wiring!"), \ + span_danger("You mangle some of [your_or_other] [limb.plaintext_zone]'s wiring!"), ignored_mobs = victim) + to_chat(victim, span_userdanger("[capitalize(your_or_other)] mangles some of your [limb.plaintext_zone]'s wiring!")) + adjust_intensity(change * 2) + else + user?.visible_message(span_notice("[user] resets some of [their_or_other] [limb.plaintext_zone]'s wiring!"), \ + span_notice("You reset some of [your_or_other] [limb.plaintext_zone]'s wiring!")) + adjust_intensity(-change) + victim?.balloon_alert(user, "intensity reduced to [get_intensity_mult() * 100]%") + + if (fixed()) + return + +/// If fixed() is true, we remove ourselves and return TRUE. FALSE otherwise. +/datum/wound/electrical_damage/proc/remove_if_fixed() + if (fixed()) + to_chat(victim, span_green("Your [limb.plaintext_zone] has recovered from its [name]!")) + remove_wound() + return TRUE + return FALSE + +/// Should we remove ourselves? +/datum/wound/electrical_damage/proc/fixed() + return (intensity <= minimum_intensity || isnull(limb)) + +/// Returns the multiplier we apply to our outgoing damage based off our current intensity. Is always between 0-1. +/datum/wound/electrical_damage/proc/get_intensity_mult() + return (min((intensity / processing_full_shock_threshold), 1)) + +/// Wrapper for electrocute_act +/datum/wound/electrical_damage/proc/zap( + mob/living/target, + damage, + coeff = 1, + stun, + spark = TRUE, + animation = TRUE, + message = TRUE, + ignore_immunity = FALSE, + delay_stun = FALSE, + knockdown = FALSE, + ignore_gloves = FALSE, + tell_victim_if_no_message = TRUE, + jitter_time = 20 SECONDS, + stutter_time = 4 SECONDS, +) + + var/flags = NONE + if (!stun) + flags |= SHOCK_NOSTUN + if (!animation) + flags |= SHOCK_NO_HUMAN_ANIM + if (!message) + flags |= SHOCK_SUPPRESS_MESSAGE + if (tell_victim_if_no_message && target == victim) + to_chat(target, span_warning("Your [limb.plaintext_zone] short-circuits and zaps you!")) + if (ignore_immunity) + flags |= SHOCK_IGNORE_IMMUNITY + if (delay_stun) + flags |= SHOCK_DELAY_STUN + if (knockdown) + flags |= SHOCK_KNOCKDOWN + if (ignore_gloves) + flags |= SHOCK_NOGLOVES + + target.electrocute_act(damage, limb, coeff, flags, jitter_time, stutter_time) + if (spark) + do_sparks(rand(process_shock_spark_count_min, process_shock_spark_count_max), FALSE, victim) + +// Slash +// Fast to rise, but lower damage overall +// Also a bit easy to treat +/datum/wound/electrical_damage/slash + simple_desc = "Wiring has been slashed open, resulting in a fault that quickly intensifies!" + +/datum/wound/electrical_damage/slash/moderate + name = "Frayed Wiring" + desc = "Internal wiring has suffered a slight abrasion, causing a slow electrical fault that will intensify over time." + occur_text = "lets out a few sparks, as a few frayed wires stick out" + examine_desc = "has a few frayed wires sticking out" + treat_text = "Replacing of damaged wiring, though repairs via wirecutting instruments or sutures may suffice, albeit at limited efficiency. In case of emergency, \ + subject may be subjected to high temperatures to allow solder to reset." + + sound_effect = 'modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T1.ogg' + + severity = WOUND_SEVERITY_MODERATE + + sound_volume = 30 + + threshold_penalty = 20 + + intensity = 10 SECONDS + processing_full_shock_threshold = 3 MINUTES + + processing_shock_power_per_second_max = 0.5 + processing_shock_power_per_second_min = 0.4 + + processing_shock_stun_chance = 0 + processing_shock_spark_chance = 30 + + process_shock_spark_count_max = 1 + process_shock_spark_count_min = 1 + + wirecut_repair_percent = 0.1 + wire_repair_percent = 0.023 + + initial_sparks_amount = 1 + + status_effect_type = /datum/status_effect/wound/electrical_damage/slash/moderate + + a_or_from = "from" + + scar_keyword = "slashmoderate" + +/datum/wound_pregen_data/electrical_damage/slash/moderate + abstract = FALSE + wound_path_to_generate = /datum/wound/electrical_damage/slash/moderate + threshold_minimum = 35 + +/datum/wound/electrical_damage/slash/severe + name = "Severed Conduits" + desc = "A number of wires have been completely cut, resulting in electrical faults that will intensify at a worrying rate." + occur_text = "sends some electrical fiber in the direction of the blow, beginning to profusely spark" + examine_desc = "has multiple severed wires visible to the outside" + treat_text = "Containment of damaged wiring via gauze, then application of fresh wiring/sutures, or resetting of displaced wiring via wirecutter/retractor." + + sound_effect = 'modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T2.ogg' + + severity = WOUND_SEVERITY_SEVERE + + sound_volume = 15 + + threshold_penalty = 30 + + intensity = 10 SECONDS + processing_full_shock_threshold = 2 MINUTES + + processing_shock_power_per_second_max = 0.7 + processing_shock_power_per_second_min = 0.6 + + processing_shock_stun_chance = 0 + processing_shock_spark_chance = 60 + + process_shock_spark_count_max = 2 + process_shock_spark_count_min = 1 + + wirecut_repair_percent = 0.09 + wire_repair_percent = 0.015 + + initial_sparks_amount = 3 + + status_effect_type = /datum/status_effect/wound/electrical_damage/slash/severe + + a_or_from = "from" + + scar_keyword = "slashsevere" + +/datum/wound_pregen_data/electrical_damage/slash/severe + abstract = FALSE + wound_path_to_generate = /datum/wound/electrical_damage/slash/severe + threshold_minimum = 60 + +/datum/wound/electrical_damage/slash/critical + name = "Systemic Fault" + desc = "A significant portion of the power distribution network has been cut open, resulting in massive power loss and runaway electrocution." + occur_text = "lets out a violent \"zhwarp\" sound as angry electric arcs attack the surrounding air" + examine_desc = "has lots of mauled wires sticking out" + treat_text = "Immediate securing via gauze, followed by emergency cable replacement and securing via wirecutters or retractor. \ + If the fault has become uncontrollable, extreme heat therapy is recommended." + + severity = WOUND_SEVERITY_CRITICAL + wound_flags = (ACCEPTS_GAUZE|MANGLES_EXTERIOR|CAN_BE_GRASPED|SPLINT_OVERLAY) + + sound_effect = 'modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T3.ogg' + + sound_volume = 30 + + threshold_penalty = 50 + + intensity = 10 SECONDS + processing_full_shock_threshold = 1.25 MINUTES + + processing_shock_power_per_second_max = 1.3 + processing_shock_power_per_second_min = 1.1 + + processing_shock_stun_chance = 5 + processing_shock_spark_chance = 90 + + process_shock_spark_count_max = 3 + process_shock_spark_count_min = 2 + + wirecut_repair_percent = 0.08 + wire_repair_percent = 0.01 + + initial_sparks_amount = 8 + + status_effect_type = /datum/status_effect/wound/electrical_damage/slash/critical + + a_or_from = "a" + + scar_keyword = "slashcritical" + +/datum/wound_pregen_data/electrical_damage/slash/critical + abstract = FALSE + wound_path_to_generate = /datum/wound/electrical_damage/slash/critical + threshold_minimum = 100 + +#undef ELECTRICAL_DAMAGE_ON_STASIS_MULT +#undef ELECTRICAL_DAMAGE_GRASPED_MULT +#undef ELECTRICAL_DAMAGE_LYING_DOWN_MULT +#undef ELECTRICAL_DAMAGE_DEAD_PROGRESS_MULT + +#undef ELECTRICAL_DAMAGE_WIRECUTTER_BASE_DELAY +#undef ELECTRICAL_DAMAGE_SUTURE_WIRE_BASE_DELAY + +#undef ELECTRICAL_DAMAGE_MINIMUM_SHOCK_POWER_PER_ZAP +#undef ELECTRICAL_DAMAGE_MAX_BURN_DAMAGE_TO_LET_WIRES_REPAIR +#undef ELECTRICAL_DAMAGE_POWER_PER_TICK_MULT +#undef ELECTRICAL_DAMAGE_SUTURE_WIRE_HEALING_AMOUNT_MULT + +#undef ELECTRICAL_DAMAGE_CLOTTING_PROGRESS_MULT diff --git a/modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T1.ogg b/modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cb7b3d0a79f49992a1d59f686b5b91c7176f9ae2 GIT binary patch literal 34541 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�>@N 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 x{;Oy6Z0f2#Sm73|UL_hgTVo};BNTRM3?@C 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
xomx@9TRdX#a?f{o+Urk=*9ZaJWl*)+c~G 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 literal 0 HcmV?d00001 diff --git a/modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T3.ogg b/modular_doppler/modular_medical/wounds/synth/sound/robotic_slash_T3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f0ea8e2217027a04c58ce38f27925175106b34c7 GIT binary patch literal 63099 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 W%#F|ZMhM_mg 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 z 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 z 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

gwwwpgL0KPix=Gptb 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