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