diff --git a/aurorastation.dme b/aurorastation.dme index 19bcf0280a1..fdf596a520d 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -93,6 +93,7 @@ #include "code\__DEFINES\overmap.dm" #include "code\__DEFINES\path.dm" #include "code\__DEFINES\pipes.dm" +#include "code\__DEFINES\prefs.dm" #include "code\__DEFINES\procpath.dm" #include "code\__DEFINES\profiler_tracy.dm" #include "code\__DEFINES\projectiles.dm" @@ -1735,7 +1736,6 @@ #include "code\modules\client\preferences_spawnpoints.dm" #include "code\modules\client\preferences_toggles.dm" #include "code\modules\client\ui_style.dm" -#include "code\modules\client\preference_setup\_defines.dm" #include "code\modules\client\preference_setup\preference_setup.dm" #include "code\modules\client\preference_setup\preferences_sql.dm" #include "code\modules\client\preference_setup\antagonism\01_candidacy.dm" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 58cf86bccdb..b1fe0de45d1 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -420,6 +420,9 @@ #define PROSTHETIC_TESLA "Tesla Powered Prosthetics" #define PROSTHETIC_TESLA_BODY "Industrial Tesla Powered Prosthetics" #define PROSTHETIC_VAURCA "Vaurca Robotic Limb" +#define PROSTHETIC_HOPLAN "Hoplan Head" +#define PROSTHETIC_RAXUS "Raxus Head" +#define PROSTHETIC_INDRICUS "Indricus Head" //Brain Damage defines #define BRAIN_DAMAGE_MILD 10 diff --git a/code/__DEFINES/prefs.dm b/code/__DEFINES/prefs.dm new file mode 100644 index 00000000000..4d058b8ac1e --- /dev/null +++ b/code/__DEFINES/prefs.dm @@ -0,0 +1,18 @@ +#define EQUIP_PREVIEW_LOADOUT 1 +#define EQUIP_PREVIEW_JOB 2 +#define EQUIP_PREVIEW_ALL (EQUIP_PREVIEW_LOADOUT|EQUIP_PREVIEW_JOB) + +/// External organ. Is a prosthesis with a robo-limb manufacturer. +#define ORGAN_PREF_CYBORG "cyborg" +/// External organ. Amputated. +#define ORGAN_PREF_AMPUTATED "amputated" +/// External organ. Nymph-limb. +#define ORGAN_PREF_NYMPH "nymph" + +/// Internal organ. Assisted, so halfway through mechanical. +#define ORGAN_PREF_ASSISTED "assisted" +/// Internal organ. Mechanical, so has a robo-limb manufacturer. +#define ORGAN_PREF_MECHANICAL "mechanical" +/// Internal organ. Removed, used for appendixes. +#define ORGAN_PREF_REMOVED "removed" +/// Note that a "normal" limb or organ has no pref, so there's no define for it. diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 110c94eb3a7..cdf93e8baa5 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -32,6 +32,7 @@ continue if(!(species in S.species_allowed)) continue + valid_hairstyles[hairstyle] = GLOB.hair_styles_list[hairstyle] if(valid_hairstyles.len) @@ -39,8 +40,8 @@ return h_style -/// Species must be a datum. -/proc/random_facial_hair_style(gender, species = /datum/species/human) +/// Species must be a datum type. +/proc/random_facial_hair_style(gender, species = /datum/species/human, organ_status, robolimb_manufacturer) var/f_style = "Shaved" var/list/valid_facialhairstyles = list() @@ -52,6 +53,8 @@ continue if(!(species in S.species_allowed)) continue + if(!check_robolimb_appropriate(S, organ_status, robolimb_manufacturer)) + continue valid_facialhairstyles[facialhairstyle] = GLOB.facial_hair_styles_list[facialhairstyle] @@ -60,6 +63,33 @@ return f_style +/** + * This proc checks if a sprite_accessory appropriate for a given organ and robolimb. The second argument must be an ORGAN_PREF define. + * This can easily be made into a more general helper if needed by just turning organ_status into a boolean and feeding an instance into robolimb_manufacturer, maybe. +*/ +/proc/check_robolimb_appropriate(datum/sprite_accessory/S, organ_status, robolimb_manufacturer) + if(S.robotize_type_required) + if(S.required_organ) + // Null robotize_type_required means it doesn't matter what prosthetic type we use. + if(isnull(S.robotize_type_required)) + return TRUE + if(organ_status == ORGAN_PREF_CYBORG) + if(length(S.robotize_type_required)) + var/datum/robolimb/R + if(GLOB.all_robolimbs[robolimb_manufacturer]) + R = GLOB.all_robolimbs[robolimb_manufacturer] + else + R = GLOB.basic_robolimb + if(!(R.company in S.robotize_type_required)) + return FALSE + else + // Empty list means we can't have a prosthetic type to use this marking. + return FALSE + else if(length(S.robotize_type_required)) + // There's a robotize type required and our limb is not a prosthetic. + return FALSE + return TRUE + /proc/sanitize_name(name, species = SPECIES_HUMAN) var/datum/species/current_species if(species) diff --git a/code/modules/client/preference_setup/_defines.dm b/code/modules/client/preference_setup/_defines.dm deleted file mode 100644 index 0c4dbb60042..00000000000 --- a/code/modules/client/preference_setup/_defines.dm +++ /dev/null @@ -1,3 +0,0 @@ -#define EQUIP_PREVIEW_LOADOUT 1 -#define EQUIP_PREVIEW_JOB 2 -#define EQUIP_PREVIEW_ALL (EQUIP_PREVIEW_LOADOUT|EQUIP_PREVIEW_JOB) diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 6edf6a3ecff..16d9e4cb92d 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -244,25 +244,25 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/status = pref.organ_data[name] var/organ_name = name - if(status == "cyborg") + if(status == ORGAN_PREF_CYBORG) var/datum/robolimb/R if(pref.rlimb_data[name] && GLOB.all_robolimbs[pref.rlimb_data[name]]) R = GLOB.all_robolimbs[pref.rlimb_data[name]] else R = GLOB.basic_robolimb out += "
  • - [R.company] [capitalize_first_letters(parse_zone(organ_name))] Prosthesis
  • " - else if(status == "amputated") + else if(status == ORGAN_PREF_AMPUTATED) out += "
  • - Amputated [capitalize_first_letters(parse_zone(organ_name))]
  • " - else if(status == "mechanical") + else if(status == ORGAN_PREF_MECHANICAL) var/datum/robolimb/R if(pref.rlimb_data[name] && GLOB.all_robolimbs[pref.rlimb_data[name]]) R = GLOB.all_robolimbs[pref.rlimb_data[name]] else R = GLOB.basic_robolimb out += "
  • - [R.company] Mechanical [capitalize_first_letters(parse_zone(organ_name))]
  • " - else if(status == "nymph") + else if(status == ORGAN_PREF_NYMPH) out += "
  • - Diona Nymph [capitalize_first_letters(parse_zone(organ_name))]
  • " - else if(status == "assisted") + else if(status == ORGAN_PREF_ASSISTED) switch(organ_name) if(BP_HEART) out += "
  • - Pacemaker-Assisted [capitalize_first_letters(parse_zone(organ_name))]
  • " @@ -272,7 +272,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O out += "
  • - Retinal Overlayed [capitalize_first_letters(parse_zone(organ_name))]
  • " else out += "
  • - Mechanically Assisted [capitalize_first_letters(parse_zone(organ_name))]
  • " - else if(status == "removed") + else if(status == ORGAN_PREF_REMOVED) out += "
  • - Removed [capitalize_first_letters(parse_zone(organ_name))]
  • " if(length(pref.organ_data)) @@ -395,6 +395,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(!(mob_species.type in S.species_allowed)) continue + if(!verify_robolimb_appropriate(S)) + continue + valid_hairstyles[hairstyle] = GLOB.hair_styles_list[hairstyle] if(valid_hairstyles.len) @@ -417,6 +420,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(!(mob_species.type in S.species_allowed)) continue + if(!verify_robolimb_appropriate(S)) + continue valid_facialhairstyles[facialhairstyle] = GLOB.facial_hair_styles_list[facialhairstyle] @@ -435,6 +440,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(!(mob_species.type in S.species_allowed)) continue + if(!verify_robolimb_appropriate(S)) + continue valid_hair_gradients[hair_gradient] = valid_hair_gradients[hair_gradient] @@ -520,6 +527,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(!(mob_species.type in S.species_allowed)) continue + if(!verify_robolimb_appropriate(S)) + continue valid_hairstyles[hairstyle] = GLOB.hair_styles_list[hairstyle] @@ -625,6 +634,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(!(mob_species.type in S.species_allowed)) continue + if(!verify_robolimb_appropriate(S)) + continue valid_facialhairstyles[facialhairstyle] = GLOB.facial_hair_styles_list[facialhairstyle] @@ -661,10 +672,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/datum/species/species = GLOB.all_species[pref.species] for(var/M in usable_markings) var/datum/sprite_accessory/S = usable_markings[M] - if(!S.species_allowed.len) + if(!length(S.species_allowed)) continue else if(!(species.type in S.species_allowed)) usable_markings -= M + if(!verify_robolimb_appropriate(S)) + usable_markings -= M if (!usable_markings.len) alert(user, "This species does not have any body markings available.") @@ -707,7 +720,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["limbs"]) - var/list/acceptable_organ_input = list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") + var/list/acceptable_organ_input = list("Head", "Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") var/limb_name = tgui_input_list(user, "Which limb do you want to change?", "Limbs", acceptable_organ_input) if(!limb_name && !CanUseTopic(user)) return TOPIC_NOACTION @@ -746,7 +759,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if("Upper Body") limb = BP_CHEST carries_organs = 1 - if(BP_HEAD) + if("Head") limb = BP_HEAD carries_organs = 1 else @@ -769,10 +782,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.rlimb_data -= third_limb if("Amputated") - pref.organ_data[limb] = "amputated" + pref.organ_data[limb] = ORGAN_PREF_AMPUTATED pref.rlimb_data[limb] = null if(second_limb) - pref.organ_data[second_limb] = "amputated" + pref.organ_data[second_limb] = ORGAN_PREF_AMPUTATED pref.rlimb_data[second_limb] = null if("Prosthesis") @@ -782,6 +795,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/datum/robolimb/M = GLOB.chargen_robolimbs[company] if(!(tmp_species in M.species_can_use)) continue + if(!(limb in M.allowed_external_organs)) + continue usable_manufacturers[company] = M if(!usable_manufacturers.len) return @@ -789,20 +804,22 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(!choice) return pref.rlimb_data[limb] = choice - pref.organ_data[limb] = "cyborg" + pref.organ_data[limb] = ORGAN_PREF_CYBORG if(second_limb) pref.rlimb_data[second_limb] = choice - pref.organ_data[second_limb] = "cyborg" - if(third_limb && pref.organ_data[third_limb] == "amputated") + pref.organ_data[second_limb] = ORGAN_PREF_CYBORG + if(third_limb && pref.organ_data[third_limb] == ORGAN_PREF_AMPUTATED) pref.organ_data[third_limb] = null if("Diona Nymph") - pref.organ_data[limb] = "nymph" + pref.organ_data[limb] = ORGAN_PREF_NYMPH pref.rlimb_data[limb] = null if(second_limb) - pref.organ_data[second_limb] = "nymph" + pref.organ_data[second_limb] = ORGAN_PREF_NYMPH pref.rlimb_data[second_limb] = null + // Recheck markings in case we changed prosthetics. + recheck_markings_and_facial_hair() return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["organs"]) @@ -828,7 +845,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if("Normal") pref.organ_data[organ_name] = null if("Assisted") - pref.organ_data[organ_name] = "assisted" + pref.organ_data[organ_name] = ORGAN_PREF_ASSISTED if("Mechanical") var/tmp_species = pref.species ? pref.species : SPECIES_HUMAN @@ -837,6 +854,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/datum/robolimb/M = GLOB.chargen_robolimbs[company] if(!(tmp_species in M.species_can_use)) continue + if(!(organ_name in M.allowed_internal_organs)) + continue usable_manufacturers[company] = M if(!usable_manufacturers.len) return @@ -844,22 +863,18 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(!choice) return - - var/datum/robolimb/R = GLOB.all_robolimbs[choice] - if(!(organ_name in R.allowed_internal_organs)) - alert(user, "You can not select this manufacturer for this organ.") - return pref.rlimb_data[organ_name] = choice - pref.organ_data[organ_name] = "mechanical" + pref.organ_data[organ_name] = ORGAN_PREF_MECHANICAL if("Removed") - pref.organ_data[organ_name] = "removed" + pref.organ_data[organ_name] = ORGAN_PREF_REMOVED return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["reset_organs"]) pref.organ_data.Cut() pref.rlimb_data.Cut() + recheck_markings_and_facial_hair() return TOPIC_REFRESH_UPDATE_PREVIEW @@ -958,14 +973,25 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O user << browse(dat.Join(), "window=species;size=700x400") -/*/datum/category_item/player_setup_item/general/body/proc/reset_limbs() +/// This proc verifies if a sprite accessory can be put on a robolimb, checking its manufacturer. +/datum/category_item/player_setup_item/general/body/proc/verify_robolimb_appropriate(datum/sprite_accessory/S) + var/organ_status = pref.organ_data[S.required_organ] + var/robolimb_manufacturer = pref.rlimb_data[S.required_organ] + . = check_robolimb_appropriate(S, organ_status, robolimb_manufacturer) - for(var/organ in pref.organ_data) - pref.organ_data[organ] = null - while(null in pref.organ_data) - pref.organ_data -= null +/// This proc is used to check markings and facial hair after changing prosthesis. +/datum/category_item/player_setup_item/general/body/proc/recheck_markings_and_facial_hair() + if(length(pref.body_markings)) + for(var/marking in pref.body_markings) + var/datum/sprite_accessory/S = GLOB.body_marking_styles_list[marking] + if(!verify_robolimb_appropriate(S)) + pref.body_markings -= marking + to_chat(pref.client, SPAN_WARNING("Removed the [marking] marking as it is not appropriate for your current robo-limb!")) - for(var/organ in pref.rlimb_data) - pref.rlimb_data[organ] = null - while(null in pref.rlimb_data) - pref.rlimb_data -= null*/ + if(pref.f_style) + var/datum/sprite_accessory/F = GLOB.facial_hair_styles_list[pref.f_style] + if(!verify_robolimb_appropriate(F)) + var/datum/species/user_species = GLOB.all_species[pref.species] + var/organ_status = pref.organ_data[F.required_organ] + var/robolimb_manufacturer = pref.rlimb_data[F.required_organ] + pref.f_style = random_facial_hair_style(pref.gender, user_species.type, organ_status, robolimb_manufacturer) diff --git a/code/modules/mob/abstract/new_player/sprite_accessories.dm b/code/modules/mob/abstract/new_player/sprite_accessories.dm index 70ad8dc23f7..090ca5f9889 100644 --- a/code/modules/mob/abstract/new_player/sprite_accessories.dm +++ b/code/modules/mob/abstract/new_player/sprite_accessories.dm @@ -17,27 +17,34 @@ */ /datum/sprite_accessory - - var/icon // the icon file the accessory is located in - var/icon_state // the icon_state of the accessory - var/preview_state // a custom preview state for whatever reason - - var/name // the preview name of the accessory - - // Determines if the accessory will be skipped or included in random hair generations + /// The icon file the accessory is located in. + var/icon + /// The icon_state of the accessory. + var/icon_state + /// A custom preview state if wanted. + var/preview_state + /// The name of the accessory. + var/name + /// Determines if the accessory will be skipped or included in random hair generation. var/gender = NEUTER - - // Restrict some styles to specific species. This requires the type path of the datum of the species in question, as well as all children of that datum if applicable. - var/list/species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie) - - // Whether or not the accessory can be affected by colouration - var/do_colouration = 1 - - // The blend mode to use when blending this icon with its color. May not apply to all sprite_accessory types, and must be a ICON_* blend mode, not BLEND_*! + /// Restrict some styles to specific species. This requires the type path of the datum of the species in question, as well as all children if applicable. + var/list/species_allowed = list( + /datum/species/human, + /datum/species/human/offworlder, + /datum/species/machine/shell, + /datum/species/machine/shell/rogue, + /datum/species/zombie + ) + /// Whether or not the accessory can be affected by colouration. + var/do_colouration = TRUE + /// The blend mode to use when blending this icon with its color. May not apply to all sprite_accessory types, and must be a ICON_* blend mode, not BLEND_*! var/icon_blend_mode = ICON_ADD - - //This is to provide safe names to use for hair/sprite to text. See Skrell tentacles for example - var/chatname = null + /// This is to provide safe names to use for hair/sprite to text. See Skrell tentacles for an example. + var/chatname + /// The organ the markings go over. Used to check if a marking can go over a certain organ. Must be an organ tag. + var/required_organ + /// Required prosthetic types to use this marking, if any. List is "any of". Null means no robotize type required. Empty list means there must be NO robotize type. + var/list/robotize_type_required /* @@ -4141,8 +4148,15 @@ Follow by example and make good judgement based on length which list to include name = "blank IPC screen" icon_state = "ipc_blank" species_allowed = list(/datum/species/machine) + robotize_type_required = list() + required_organ = BP_HEAD gender = NEUTER +/datum/sprite_accessory/facial_hair/ipc_screen_blank/none + name = "no IPC screen" + icon_state = "none" + robotize_type_required = list(PROSTHETIC_HOPLAN, PROSTHETIC_RAXUS, PROSTHETIC_INDRICUS) + /datum/sprite_accessory/facial_hair/ipc_screen_blank/ipc_screen_blue name = "blue IPC screen" icon_state = "ipc_blue" @@ -4545,8 +4559,6 @@ Follow by example and make good judgement based on length which list to include var/is_genetic = TRUE // If TRUE, the marking is considered genetic and is embedded into DNA. var/is_painted = FALSE // If TRUE, the marking can be put on prosthetics/robolimbs. - var/robotize_type_required // if set, this marking will only apply when put on a valid robolimb type - /datum/sprite_accessory/marking/bandage_head name = "Bandage, head 1" icon_state = "bandage1" @@ -6172,6 +6184,56 @@ Follow by example and make good judgement based on length which list to include body_parts = list(BP_GROIN) do_colouration = FALSE +// Baseline markings. +/datum/sprite_accessory/marking/baseline_head + name = "Baseline - Raxus Primary Colors" + icon = 'icons/mob/human_races/markings_baseline.dmi' + icon_state = "raxus_primary" + is_painted = TRUE + body_parts = list(BP_HEAD) + robotize_type_required = list(PROSTHETIC_RAXUS) + +/datum/sprite_accessory/marking/baseline_head/lights + name = "Baseline - Raxus Head Lights" + icon_state = "raxus_lights" + +/datum/sprite_accessory/marking/baseline_head/indricus + name = "Baseline - Indricus Primary Colors" + icon_state = "indricus_primary" + robotize_type_required = list(PROSTHETIC_INDRICUS) + +/datum/sprite_accessory/marking/baseline_head/indricus/lights + name = "Baseline - Indricus Lights" + icon_state = "indricus_lights" + +/datum/sprite_accessory/marking/baseline_head/hoplan + name = "Baseline - Hoplan Primary Colors" + icon_state = "indricus_primary" + robotize_type_required = list(PROSTHETIC_HOPLAN) + +/datum/sprite_accessory/marking/baseline_head/hoplan/lights + name = "Baseline - Hoplan Lights" + icon_state = "hoplan_lights" + +/datum/sprite_accessory/marking/baseline_color + name = "Baseline - Primary Colors" + icon = 'icons/mob/human_races/markings_baseline.dmi' + icon_state = "machine_primary" + is_painted = TRUE + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) + +/datum/sprite_accessory/marking/baseline_color/arm + name = "Baseline - Primary Arm Colors" + body_parts = list(BP_R_ARM, BP_L_ARM, BP_R_HAND, BP_L_HAND) + +/datum/sprite_accessory/marking/baseline_color/arm + name = "Baseline - Primary Leg Colors" + body_parts = list(BP_R_LEG, BP_L_LEG, BP_R_LEG, BP_L_LEG) + +/datum/sprite_accessory/marking/baseline_color/chest + name = "Baseline - Primary Head Colors" + body_parts = list(BP_HEAD) + //bishop /datum/sprite_accessory/marking/bishop_lights name = "Bishop - Lights Colour" @@ -6180,7 +6242,7 @@ Follow by example and make good judgement based on length which list to include icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_HEAD) - robotize_type_required = PROSTHETIC_BC + robotize_type_required = list(PROSTHETIC_BC) /datum/sprite_accessory/marking/bishop_lights/bishop_mask name = "Bishop - Face Mask" @@ -6217,7 +6279,7 @@ Follow by example and make good judgement based on length which list to include icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) - robotize_type_required = PROSTHETIC_IND + robotize_type_required = list(PROSTHETIC_IND) /datum/sprite_accessory/marking/g1_panels/g1_head name = "G1 - Head Panel Colors" @@ -6244,7 +6306,7 @@ Follow by example and make good judgement based on length which list to include icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) - robotize_type_required = PROSTHETIC_HI + robotize_type_required = list(PROSTHETIC_HI) /datum/sprite_accessory/marking/g2_panels/g2_head name = "G2 - Head Panel Colors" @@ -6271,7 +6333,7 @@ Follow by example and make good judgement based on length which list to include icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) - robotize_type_required = PROSTHETIC_ZH + robotize_type_required = list(PROSTHETIC_ZH) /datum/sprite_accessory/marking/zeng_panels/zeng_head name = "Zeng-Hu - Head Panel Colors" @@ -6298,7 +6360,7 @@ Follow by example and make good judgement based on length which list to include icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) - robotize_type_required = PROSTHETIC_XMG + robotize_type_required = list(PROSTHETIC_XMG) /datum/sprite_accessory/marking/xion_panels/xion_head name = "Xion - Head Panel Colors" diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 3a9d7fbd978..96f32dabeb8 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -175,6 +175,7 @@ continue if(!(species.type in S.species_allowed)) continue + valid_hairstyles += hairstyle return valid_hairstyles diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index b91a79cbde7..c1fd25a65c2 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -104,7 +104,7 @@ O.status = 0 switch(status) - if ("amputated") + if (ORGAN_PREF_AMPUTATED) organs_by_name[O.limb_name] = null organs -= O if(O.children) // This might need to become recursive. @@ -112,14 +112,14 @@ organs_by_name[child.limb_name] = null organs -= child - if ("nymph") + if (ORGAN_PREF_NYMPH) if (organ_data[name]) O.AddComponent(/datum/component/nymph_limb) var/datum/component/nymph_limb/D = O.GetComponent(/datum/component/nymph_limb) if(D) D.nymphize(src, O.limb_name, TRUE) - if ("cyborg") + if (ORGAN_PREF_CYBORG) if (rlimb_data[name]) O.force_skintone = FALSE for(var/thing in O.children) @@ -132,14 +132,14 @@ var/obj/item/organ/I = internal_organs_by_name[name] if(I) switch (status) - if ("assisted") + if (ORGAN_PREF_ASSISTED) I.mechassist() - if ("mechanical") + if (ORGAN_PREF_MECHANICAL) if (rlimb_data[name]) I.robotize(rlimb_data[name]) else I.robotize() - if ("removed") + if (ORGAN_PREF_REMOVED) qdel(I) if (apply_markings) @@ -162,7 +162,7 @@ for(var/BP in mark_datum.body_parts) var/obj/item/organ/external/O = organs_by_name[BP] if(O) - if(mark_datum.robotize_type_required && O.robotize_type != mark_datum.robotize_type_required) + if(length(mark_datum.robotize_type_required) && !(O.robotize_type in mark_datum.robotize_type_required)) continue var/list/attr = list("color" = mark_color, "datum" = mark_datum) if (mark_datum.is_genetic) diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index db126f5fc46..5fefce39009 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -17,11 +17,17 @@ GLOBAL_DATUM(basic_robolimb, /datum/robolimb) GLOB.internal_robolimbs[R.company] = R /datum/robolimb - var/company = "Unbranded" // Shown when selecting the limb. - var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb. - var/icon = 'icons/mob/human_races/ipc/robotic.dmi' // Icon base to draw from. - var/unavailable_at_chargen // If set, not available at chargen. - var/lifelike = FALSE // If set, appears organic. + /// Shown when selecting the limb. + var/company = "Unbranded" + /// Seen when examining a limb. + var/desc = "A generic unbranded robotic prosthesis." + /// Icon base to draw from. + var/icon = 'icons/mob/human_races/ipc/robotic.dmi' + /// If set, not available in character setup. + var/unavailable_at_chargen + /// If set, it appears as organic on examine, like synthskin. + var/lifelike = FALSE + /// Which species can use this prosthetic type. var/list/species_can_use = list( SPECIES_HUMAN, SPECIES_SKRELL, @@ -37,14 +43,40 @@ GLOBAL_DATUM(basic_robolimb, /datum/robolimb) SPECIES_IPC_BISHOP, SPECIES_HUMAN_OFFWORLD ) - var/paintable = 0 //tired of istype exceptions. bullshit to find, and by god do i know it after this project. - var/linked_frame = SPECIES_IPC_UNBRANDED //which machine species this limb will create - var/brute_mod = 0.9 //how resistant is this mode to brute damage - var/burn_mod = 1.1 //how resistant is this mode to burn damage - var/fabricator_available = FALSE //if you can print this limb in the robotics fabricator - var/internal_organ_suffix = "prosthetic" //this is used to define the icon - var/list/allowed_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_LIVER, BP_KIDNEYS, BP_STOMACH)//what organs can be augmented by this brand + /// If this prosthetic type is paintable. + var/paintable = 0 + /// Which IPC species this prosthetic type will create. + var/linked_frame = SPECIES_IPC_UNBRANDED + /// How resistant this prosthetic type is to brute damage. + var/brute_mod = 0.9 + /// How resistant this prosthetic type is to burn damage. + var/burn_mod = 1.1 + /// If you can print this prosthetic type in the robotics fabricator. + var/fabricator_available = FALSE + /// Suffix used for the icon. + var/internal_organ_suffix = "prosthetic" + /// If this prosthetic type can be used for internal organs. var/allows_internal = TRUE + /// What internal organs you can pick this prosthetic type for. + var/list/allowed_internal_organs = list( + BP_HEART, + BP_EYES, + BP_LUNGS, + BP_LIVER, + BP_KIDNEYS, + BP_STOMACH + ) + /// What external organs you can pick this prosthetic type for. + var/list/allowed_external_organs = list( + BP_L_ARM, + BP_R_ARM, + BP_L_HAND, + BP_R_HAND, + BP_L_LEG, + BP_R_LEG, + BP_L_FOOT, + BP_R_FOOT + ) /datum/robolimb/proc/malfunctioning_check() return FALSE @@ -154,3 +186,30 @@ GLOBAL_DATUM(basic_robolimb, /datum/robolimb) icon = 'icons/mob/human_races/vaurca/r_vaurcalimbs.dmi' species_can_use = list(SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR) allows_internal = FALSE + +/datum/robolimb/hoplan + company = PROSTHETIC_HOPLAN + desc = "A refined helmet with an industrial lean. Extra plating seems to be applied to the top surface while the rest of the head features \ + small breaks in the armor and running lights. A polished screen hides four optic sensors behind a display." + species_can_use = list(SPECIES_IPC) + icon = 'icons/mob/human_races/ipc/hoplan.dmi' + allowed_external_organs = list(BP_HEAD) + +/datum/robolimb/indricus + company = PROSTHETIC_INDRICUS + desc = "One lens-like eye dominates this style of head, with a camera like adjustable segment, this head is entirely encased with no seams or \ + crevices bar service hatches." + species_can_use = list(SPECIES_IPC) + linked_frame = SPECIES_IPC + icon = 'icons/mob/human_races/ipc/indricus.dmi' + allowed_external_organs = list(BP_HEAD) + +/datum/robolimb/raxus + company = PROSTHETIC_RAXUS + desc = "Imposing and bold, this angled helmet features a collection of small pin-prick optic sensors to make up for its lack of inherent eyes. \ + The top of the head extends outward, where the thinner point meets halfway down the face before extending in to a similarly wide jaw, \ + giving the head a shape almost like an cubic hourglass." + species_can_use = list(SPECIES_IPC) + linked_frame = SPECIES_IPC + icon = 'icons/mob/human_races/ipc/raxus.dmi' + allowed_external_organs = list(BP_HEAD) diff --git a/html/changelogs/mattatlas-baselinerework.yml b/html/changelogs/mattatlas-baselinerework.yml new file mode 100644 index 00000000000..4a0442692f7 --- /dev/null +++ b/html/changelogs/mattatlas-baselinerework.yml @@ -0,0 +1,43 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: MattAtlas + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added new Baseline sprites made by Noble Row." + - rscadd: "Added new Baseline head types, sprites made by Noble Row. To select them, change the head prosthesis type as you would with a normal limb." + - rscadd: "Added a system to allow markings and hair to be restricted to certain prosthesis types." diff --git a/icons/mob/human_face/ipc_screens.dmi b/icons/mob/human_face/ipc_screens.dmi index 3cd1606d4ed..b8c55d018ce 100644 Binary files a/icons/mob/human_face/ipc_screens.dmi and b/icons/mob/human_face/ipc_screens.dmi differ diff --git a/icons/mob/human_races/ipc/hoplan.dmi b/icons/mob/human_races/ipc/hoplan.dmi new file mode 100644 index 00000000000..02a2803872c Binary files /dev/null and b/icons/mob/human_races/ipc/hoplan.dmi differ diff --git a/icons/mob/human_races/ipc/indricus.dmi b/icons/mob/human_races/ipc/indricus.dmi new file mode 100644 index 00000000000..592dabeee05 Binary files /dev/null and b/icons/mob/human_races/ipc/indricus.dmi differ diff --git a/icons/mob/human_races/ipc/r_machine.dmi b/icons/mob/human_races/ipc/r_machine.dmi index 877e70e626a..f257f3f26e8 100644 Binary files a/icons/mob/human_races/ipc/r_machine.dmi and b/icons/mob/human_races/ipc/r_machine.dmi differ diff --git a/icons/mob/human_races/ipc/raxus.dmi b/icons/mob/human_races/ipc/raxus.dmi new file mode 100644 index 00000000000..c22fc54ce4c Binary files /dev/null and b/icons/mob/human_races/ipc/raxus.dmi differ diff --git a/icons/mob/human_races/markings_baseline.dmi b/icons/mob/human_races/markings_baseline.dmi new file mode 100644 index 00000000000..0e4dae31fb8 Binary files /dev/null and b/icons/mob/human_races/markings_baseline.dmi differ