diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index be0ac101..8d50a151 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -58,8 +58,10 @@
#define BODYPART_DISABLED_DAMAGE 1
#define BODYPART_DISABLED_PARALYSIS 2
+#define DEFAULT_BODYPART_ICON 'icons/mob/human_parts.dmi'
#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi'
#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi'
+#define DEFAULT_BODYPART_ICON_CITADEL 'modular_citadel/icons/mob/mutant_bodyparts.dmi'
#define MONKEY_BODYPART "monkey"
#define TERATOMA_BODYPART "teratoma"
@@ -269,4 +271,4 @@
#define HUMAN_FIRE_STACK_ICON_NUM 3
#define PULL_PRONE_SLOWDOWN 0.6
-#define HUMAN_CARRY_SLOWDOWN 0
\ No newline at end of file
+#define HUMAN_CARRY_SLOWDOWN 0
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 43db4347..cce58af7 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -49,7 +49,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list)
return pick(GLOB.socks_list)
-/proc/random_features()
+/proc/random_features(intendedspecies)
if(!GLOB.tails_list_human.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human)
if(!GLOB.tails_list_lizard.len)
@@ -107,6 +107,8 @@
var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[mtpath]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
+ continue
if(!S.ckeys_allowed)
snowflake_mam_tails_list[S.name] = mtpath
var/list/snowflake_markings_list = list()
@@ -114,6 +116,8 @@
var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[mmpath]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
+ continue
if(!S.ckeys_allowed)
snowflake_markings_list[S.name] = mmpath
var/list/snowflake_ears_list = list()
@@ -121,6 +125,8 @@
var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[mepath]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
+ continue
if(!S.ckeys_allowed)
snowflake_ears_list[S.name] = mepath
var/list/snowflake_mam_snouts_list = list()
@@ -130,6 +136,15 @@
var/datum/sprite_accessory/S = instance
if(!S.ckeys_allowed)
snowflake_mam_snouts_list[S.name] = mspath
+ var/list/snowflake_ipc_antenna_list = list()
+ for(var/mspath in GLOB.ipc_antennas_list)
+ var/datum/sprite_accessory/mam_snouts/instance = GLOB.ipc_antennas_list[mspath]
+ if(istype(instance, /datum/sprite_accessory))
+ var/datum/sprite_accessory/S = instance
+ if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
+ continue
+ if(!S.ckeys_allowed)
+ snowflake_ipc_antenna_list[S.name] = mspath
var/color1 = random_short_color()
var/color2 = random_short_color()
var/color3 = random_short_color()
@@ -154,10 +169,10 @@
"moth_markings" = pick(GLOB.moth_markings_list),
"insect_fluff" = "None",
"taur" = "None",
- "mam_body_markings" = pick(snowflake_markings_list),
- "mam_ears" = pick(snowflake_ears_list),
- "mam_snouts" = pick(snowflake_mam_snouts_list),
- "mam_tail" = pick(snowflake_mam_tails_list),
+ "mam_body_markings" = snowflake_markings_list.len ? pick(snowflake_markings_list) : "None",
+ "mam_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None",
+ "mam_snouts" = snowflake_mam_snouts_list ? pick(snowflake_mam_snouts_list) : "None",
+ "mam_tail" = snowflake_mam_tails_list ? pick(snowflake_mam_tails_list) : "None",
"mam_tail_animated" = "None",
"xenodorsal" = "Standard",
"xenohead" = "Standard",
@@ -210,7 +225,7 @@
"womb_cum_mult" = CUM_RATE_MULT,
"womb_efficiency" = CUM_EFFICIENCY,
"womb_fluid" = "femcum",
- "ipc_screen" = "Sunburst",
+ "ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None",
"ipc_antenna" = "None",
"flavor_text" = ""))
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index 43ec9e54..360c2451 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -285,7 +285,7 @@
unique_enzymes = generate_unique_enzymes()
uni_identity = generate_uni_identity()
generate_dna_blocks()
- features = random_features()
+ features = random_features(species?.id)
/datum/dna/stored //subtype used by brain mob's stored_dna
diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm
index a3250fe1..c7ccc18f 100644
--- a/code/game/machinery/limbgrower.dm
+++ b/code/game/machinery/limbgrower.dm
@@ -136,7 +136,8 @@
limb = new buildpath(loc)
if(selected_category=="human" || selected_category=="lizard") //Species with greyscale parts should be included here
limb.icon = 'icons/mob/human_parts_greyscale.dmi'
- limb.should_draw_greyscale = TRUE
+ limb.base_bp_icon = DEFAULT_BODYPART_ICON_ORGANIC
+ limb.color_src = MUTCOLORS
else
limb.icon = 'icons/mob/human_parts.dmi'
// Set this limb up using the specias name and body zone
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 9c17a9d3..83e1bd00 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -230,6 +230,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/icon/bgstate = "steel"
var/list/bgstate_options = list("000", "midgrey", "FFF", "white", "steel", "techmaint", "dark", "plating", "reinforced")
+ var/show_mismatched_markings = FALSE //determines whether or not the markings lists should show markings that don't match the currently selected species. Intentionally left unsaved.
/datum/preferences/New(client/C)
parent = C
@@ -446,6 +447,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//Mutant stuff
var/mutant_category = 0
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "
Show mismatched markings
"
+ dat += "[show_mismatched_markings ? "Yes" : "No"]"
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS) //just in case someone sets the max rows to 1 or something dumb like that
+ dat += ""
+ mutant_category = 0
+
+
if("tail_lizard" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -1719,6 +1729,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
to_chat(user, "Invalid color. Your color is not bright enough.")
+ if("mismatched_markings")
+ show_mismatched_markings = !show_mismatched_markings
+
if("ipc_screen")
var/new_ipc_screen
new_ipc_screen = input(user, "Choose your character's screen:", "Character Preference") as null|anything in GLOB.ipc_screens_list
@@ -1726,8 +1739,18 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["ipc_screen"] = new_ipc_screen
if("ipc_antenna")
+ var/list/snowflake_antenna_list = list()
+ //Potential todo: turn all of THIS into a define to reduce copypasta.
+ for(var/path in GLOB.ipc_antennas_list)
+ var/datum/sprite_accessory/antenna/instance = GLOB.ipc_antennas_list[path]
+ if(istype(instance, /datum/sprite_accessory))
+ var/datum/sprite_accessory/S = instance
+ if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
+ continue
+ if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
+ snowflake_antenna_list[S.name] = path
var/new_ipc_antenna
- new_ipc_antenna = input(user, "Choose your character's antenna:", "Character Preference") as null|anything in GLOB.ipc_antennas_list
+ new_ipc_antenna = input(user, "Choose your character's antenna:", "Character Preference") as null|anything in snowflake_antenna_list
if(new_ipc_antenna)
features["ipc_antenna"] = new_ipc_antenna
@@ -1747,6 +1770,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/datum/sprite_accessory/tails/human/instance = GLOB.tails_list_human[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
+ continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
snowflake_tails_list[S.name] = path
var/new_tail
@@ -1764,6 +1789,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
+ continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
snowflake_tails_list[S.name] = path
var/new_tail
@@ -1781,6 +1808,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/datum/sprite_accessory/mam_snouts/instance = GLOB.snouts_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
+ continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
snowflake_snouts_list[S.name] = path
var/new_snout
@@ -1796,6 +1825,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
+ continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
snowflake_mam_snouts_list[S.name] = path
var/new_mam_snouts
@@ -1887,6 +1918,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/datum/sprite_accessory/taur/instance = GLOB.taur_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
+ continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
snowflake_taur_list[S.name] = path
var/new_taur
@@ -1905,6 +1938,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/datum/sprite_accessory/ears/instance = GLOB.ears_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
+ continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
snowflake_ears_list[S.name] = path
var/new_ears
@@ -1918,6 +1953,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
+ continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
snowflake_ears_list[S.name] = path
var/new_ears
@@ -1931,6 +1968,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
+ if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
+ continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
snowflake_markings_list[S.name] = path
var/new_mam_body_markings
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index 83eea366..96acb40d 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -21,7 +21,7 @@
if(!pref_species)
var/rando_race = pick(GLOB.roundstart_races)
pref_species = new rando_race()
- features = random_features()
+ features = random_features(pref_species?.id)
age = rand(AGE_MIN,AGE_MAX)
/datum/preferences/proc/update_preview_icon()
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
index 5e24d063..52662384 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
@@ -61,6 +61,9 @@
var/dimension_y = 32
var/center = FALSE //Should we center the sprite?
+ //For soft-restricting markings to species IDs
+ var/list/recommended_species
+
/datum/sprite_accessory/underwear
icon = 'icons/mob/underwear.dmi'
- var/has_color = FALSE
\ No newline at end of file
+ var/has_color = FALSE
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index 84c9feaa..feaa9495 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -433,10 +433,12 @@
/datum/sprite_accessory/mam_tails
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ recommended_species = list("mammal", "slimeperson", "podweak", "felinid", "insect", "avian", "aquatic") //Despite not being mammals, avians and aquatic parts are in the mammal files here.
/datum/sprite_accessory/mam_tails/none
name = "None"
icon_state = "none"
+ recommended_species = null
/datum/sprite_accessory/mam_tails_animated
color_src = MATRIXED
@@ -707,4 +709,4 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_tails_animated/wolf
name = "Wolf"
- icon_state = "wolf"
\ No newline at end of file
+ icon_state = "wolf"
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index b1bed62e..f547d0a9 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -82,6 +82,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/whitelisted = 0 //Is this species restricted to certain players?
var/whitelist = list() //List the ckeys that can use this species, if it's whitelisted.: list("John Doe", "poopface666", "SeeALiggerPullTheTrigger") Spaces & capitalization can be included or ignored entirely for each key as it checks for both.
+ var/icon_limbs //Overrides the icon used for the limbs of this species. Mainly for downstream, and also because hardcoded icons disgust me. Implemented and maintained as a favor in return for a downstream's implementation of synths.
///////////
// PROCS //
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 3df86ce4..e278e7dc 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -654,6 +654,8 @@ generate/load female uniform sprites matching all previously decided variables
. += "-robotic"
if(BP.use_digitigrade)
. += "-digitigrade[BP.use_digitigrade]"
+ if(BP.digitigrade_type)
+ . += "-[BP.digitigrade_type]"
if(BP.dmg_overlay_type)
. += "-[BP.dmg_overlay_type]"
if(BP.body_markings)
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 4a853ff0..e8e8bd7e 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -42,6 +42,8 @@
var/skin_tone = ""
var/body_gender = ""
var/species_id = ""
+ var/color_src
+ var/base_bp_icon //Overrides the icon being used for this limb. This is mainly for downstreams, implemented and maintained as a favor in return for implementing synths. And also because should_draw_* for icon overrides was pretty messy. You're welcome.
var/should_draw_gender = FALSE
var/should_draw_greyscale = FALSE
var/species_color = ""
@@ -53,6 +55,8 @@
var/auxmarking = ""
var/list/auxmarking_color = list()
+ var/digitigrade_type
+
var/animal_origin = null //for nonhuman bodypart (e.g. monkey)
var/dismemberable = 1 //whether it can be dismembered with a weapon.
@@ -281,9 +285,9 @@
if(change_icon_to_default)
if(status == BODYPART_ORGANIC)
- icon = DEFAULT_BODYPART_ICON_ORGANIC
+ icon = base_bp_icon || DEFAULT_BODYPART_ICON_ORGANIC
else if(status == BODYPART_ROBOTIC)
- icon = DEFAULT_BODYPART_ICON_ROBOTIC
+ icon = base_bp_icon || DEFAULT_BODYPART_ICON_ROBOTIC
if(owner)
owner.updatehealth()
@@ -311,7 +315,8 @@
species_id = "husk" //overrides species_id
dmg_overlay_type = "" //no damage overlay shown when husked
should_draw_gender = FALSE
- should_draw_greyscale = FALSE
+ color_src = FALSE
+ base_bp_icon = DEFAULT_BODYPART_ICON
no_update = TRUE
body_markings = "husk" // reeee
auxmarking = "husk"
@@ -321,11 +326,12 @@
if(!animal_origin)
var/mob/living/carbon/human/H = C
- should_draw_greyscale = FALSE
+ color_src = FALSE
var/datum/species/S = H.dna.species
+ base_bp_icon = S?.icon_limbs || DEFAULT_BODYPART_ICON
species_id = S.limbs_id
- should_draw_citadel = S.should_draw_citadel // Citadel Addition
+
species_flags_list = H.dna.species.species_traits
//body marking memes
@@ -340,7 +346,7 @@
if(S.use_skintones)
skin_tone = H.skin_tone
- should_draw_greyscale = TRUE
+ base_bp_icon = (base_bp_icon == DEFAULT_BODYPART_ICON) ? DEFAULT_BODYPART_ICON_ORGANIC : base_bp_icon
else
skin_tone = ""
@@ -352,18 +358,28 @@
species_color = S.fixed_mut_color
else
species_color = H.dna.features["mcolor"]
- should_draw_greyscale = TRUE
+ base_bp_icon = (base_bp_icon == DEFAULT_BODYPART_ICON) ? DEFAULT_BODYPART_ICON_ORGANIC : base_bp_icon
else
species_color = ""
+ if(base_bp_icon != DEFAULT_BODYPART_ICON)
+ color_src = MUTCOLORS //TODO - Add color matrix support to base limbs
+
+ if("legs" in S.default_features)
+ if(body_zone == BODY_ZONE_L_LEG || body_zone == BODY_ZONE_R_LEG)
+ if(DIGITIGRADE in S.species_traits)
+ digitigrade_type = lowertext(H.dna.features["legs"])
+ else
+ digitigrade_type = null
+
if("mam_body_markings" in S.default_features)
var/datum/sprite_accessory/Smark
Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if(Smark)
body_markings_icon = Smark.icon
if(H.dna.features.["mam_body_markings"] != "None")
- body_markings = lowertext(H.dna.features.["mam_body_markings"])
- auxmarking = lowertext(H.dna.features.["mam_body_markings"])
+ body_markings = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"])
+ auxmarking = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"])
else
body_markings = "plain"
auxmarking = "plain"
@@ -428,7 +444,7 @@
else
. += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
- . += image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += image(body_markings_icon, "[body_markings]_digitigrade_1_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
var/image/aux
@@ -453,28 +469,17 @@
should_draw_gender = FALSE
if(is_organic_limb())
- if(should_draw_greyscale)
- limb.icon = 'icons/mob/human_parts_greyscale.dmi'
- if(should_draw_gender)
- limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
- else if(use_digitigrade)
+ limb.icon = base_bp_icon || 'icons/mob/human_parts.dmi'
+ if(should_draw_gender)
+ limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
+ else if (use_digitigrade)
+ if(base_bp_icon == DEFAULT_BODYPART_ICON_ORGANIC) //Compatibility hack for the current iconset.
limb.icon_state = "digitigrade_[use_digitigrade]_[body_zone]"
else
- limb.icon_state = "[species_id]_[body_zone]"
- else
- limb.icon = 'icons/mob/human_parts.dmi'
- if(should_draw_gender)
- limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
- else
- limb.icon_state = "[species_id]_[body_zone]"
+ limb.icon_state = "[species_id]_digitigrade_[use_digitigrade]_[body_zone]"
- // Citadel Start
- if(should_draw_citadel && !use_digitigrade)
- limb.icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi'
- if(should_draw_gender)
- limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
- else
- limb.icon_state = "[species_id]_[body_zone]"
+ else
+ limb.icon_state = "[species_id]_[body_zone]"
// Body markings
if(body_markings)
@@ -533,11 +538,11 @@
else
marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
- marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image(body_markings_icon, "[body_markings]_digitigrade_1_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
. += marking
return
- if(should_draw_greyscale)
+ if(color_src) //TODO - add color matrix support for base species limbs
var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone))
if(draw_color)
limb.color = "#[draw_color]"
diff --git a/config/game_options.txt b/config/game_options.txt
index 7f373657..ec31204b 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -415,6 +415,7 @@ ROUNDSTART_RACES human
## Races that are strictly worse than humans that could probably be turned on without balance concerns
ROUNDSTART_RACES lizard
+ROUNDSTART_RACES synthliz
#ROUNDSTART_RACES fly
#ROUNDSTART_RACES insect
ROUNDSTART_RACES plasmaman
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index 03b829e4..6c9d59a0 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
index a8056b01..3c8d2a69 100644
--- a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -702,10 +702,12 @@
/datum/sprite_accessory/mam_snouts
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ recommended_species = list("mammal", "slimeperson", "insect", "podweak", "avian", "aquatic")
/datum/sprite_accessory/mam_snouts/none
name = "None"
icon_state = "none"
+ recommended_species = null
/******************************************
@@ -857,6 +859,29 @@
icon_state = "roundlight"
color_src = MUTCOLORS
+//Synth snouts (This is the most important part)
+/datum/sprite_accessory/mam_snouts/synthliz
+ recommended_species = list("synthliz")
+ color_src = MUTCOLORS
+ name = "Synthetic Lizard - Snout"
+ icon_state = "synthliz_basic"
+
+/datum/sprite_accessory/mam_snouts/synthliz/synthliz_under
+ color_src = MATRIXED
+ name = "Synthetic Lizard - Snout Under"
+ icon_state = "synthliz_under"
+
+/datum/sprite_accessory/mam_snouts/synthliz/synthliz_tert
+ color_src = MATRIXED
+ name = "Synthetic Lizard - Snout Tertiary"
+ icon_state = "synthliz_tert"
+
+/datum/sprite_accessory/mam_snouts/synthliz/synthliz_tertunder
+ color_src = MATRIXED
+ name = "Synthetic Lizard - Snout Tertiary Under"
+ icon_state = "synthliz_tertunder"
+
+
/******************************************
**************** Snouts *******************
@@ -1361,6 +1386,18 @@ datum/sprite_accessory/mam_tails/insect
name = "Wolf"
icon_state = "wolf"
+/datum/sprite_accessory/mam_tails/synthliz
+ recommended_species = list("synthliz")
+ color_src = MUTCOLORS
+ name = "Synthetic Lizard"
+ icon_state = "synthliz"
+
+/datum/sprite_accessory/mam_tails_animated/synthliz
+ recommended_species = list("synthliz")
+ color_src = MUTCOLORS
+ name = "Synthetic Lizard"
+ icon_state = "synthliz"
+
/******************************************
************ Body Markings ****************
*******************************************/
@@ -1371,6 +1408,7 @@ datum/sprite_accessory/mam_tails/insect
color_src = MATRIXED
gender_specific = 0
icon = 'modular_citadel/icons/mob/mam_markings.dmi'
+ recommended_species = list("mammal", "xeno", "slimeperson", "podweak", "avian", "aquatic")
/datum/sprite_accessory/mam_body_markings/none
name = "None"
@@ -1544,6 +1582,26 @@ datum/sprite_accessory/mam_tails/insect
icon_state = "xeno"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+/datum/sprite_accessory/mam_body_markings/synthliz
+ recommended_species = list("synthliz")
+ name = "Synthetic Lizard - Plates"
+ icon_state = "synthlizscutes"
+
+/datum/sprite_accessory/mam_body_markings/synthliz/synthliz_noplates
+ name = "Synthetic Lizard - No plates"
+ icon_state = "synthliznoplates"
+
+/datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecs
+ name = "Synthetic Lizard - Pecs"
+ icon_state = "synthlizpecs"
+
+/datum/sprite_accessory/mam_body_markings/synthliz/synthliz_lights
+ name = "Synthetic Lizard - Lights"
+ icon_state = "synthlizlights"
+
+/datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecslight
+ name = "Synthetic Lizard - Pecs Light"
+ icon_state = "synthlizpecslight"
/******************************************
************ Taur Bodies ******************
@@ -1558,10 +1616,12 @@ datum/sprite_accessory/mam_tails/insect
dimension_x = 64
var/taur_mode = NOT_TAURIC
color_src = MATRIXED
+ recommended_species = list("human", "lizard", "insect", "mammal", "xeno", "jelly", "slimeperson", "podweak", "avian", "aquatic")
/datum/sprite_accessory/taur/none
name = "None"
icon_state = "None"
+ recommended_species = null
/datum/sprite_accessory/taur/cow
name = "Cow"
@@ -1652,6 +1712,43 @@ datum/sprite_accessory/mam_tails/insect
icon_state = "wolf"
taur_mode = PAW_TAURIC
+//Synth Taurs (Ported from Virgo)
+/datum/sprite_accessory/taur/synthliz
+ name = "Virgo - Synthetic Lizard"
+ icon_state = "synthlizard"
+ taur_mode = PAW_TAURIC
+ recommended_species = list("synthliz")
+
+/datum/sprite_accessory/taur/synthliz/inv
+ name = "Virgo - Synthetic Lizard (Inverted)"
+ icon_state = "synthlizardinv"
+
+/datum/sprite_accessory/taur/synthliz/feline
+ name = "Virgo - Synthetic Feline"
+ icon_state = "synthfeline"
+
+/datum/sprite_accessory/taur/synthliz/feline/inv
+ name = "Virgo - Synthetic Feline (Inverted)"
+ icon_state = "synthfelineinv"
+
+/datum/sprite_accessory/taur/synthliz/horse
+ name = "Virgo - Synthetic Horse"
+ icon_state = "synthhorse"
+ taur_mode = HOOF_TAURIC
+ //alt_taur_mode = PAW_TAURIC
+
+/datum/sprite_accessory/taur/synthliz/horse/inv
+ name = "Virgo - Synthetic Horse (Inverted)"
+ icon_state = "synthhorseinv"
+
+/datum/sprite_accessory/taur/synthliz/wolf
+ name = "Virgo - Synthetic Wolf"
+ icon_state = "synthwolf"
+
+/datum/sprite_accessory/taur/synthliz/wolf/inv
+ name = "Virgo - Synthetic Wolf (Inverted)"
+ icon_state = "synthwolfinv"
+
/******************************************
*************** Ayyliums ******************
*******************************************/
@@ -1831,10 +1928,12 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/antenna
icon = 'modular_citadel/icons/mob/ipc_antennas.dmi'
color_src = MUTCOLORS2
+ recommended_species = list("ipc")
/datum/sprite_accessory/antenna/none
name = "None"
icon_state = "None"
+ recommended_species = null
/datum/sprite_accessory/antenna/antennae
name = "Angled Antennae"
@@ -1856,6 +1955,52 @@ datum/sprite_accessory/mam_tails/insect
name = "Crowned"
icon_state = "crowned"
+/datum/sprite_accessory/antenna/synthliz
+ recommended_species = list("synthliz")
+ color_src = MUTCOLORS
+ name = "Synthetic Lizard - Antennae"
+ icon_state = "synth_antennae"
+
+/datum/sprite_accessory/antenna/synthliz/synthliz_curled
+ color_src = MUTCOLORS
+ name = "Synthetic Lizard - Curled"
+ icon_state = "synth_curled"
+
+/datum/sprite_accessory/antenna/synthliz/synthliz_thick
+ color_src = MUTCOLORS
+ name = "Synthetic Lizard - Thick"
+ icon_state = "synth_thick"
+
+/datum/sprite_accessory/antenna/synthliz/synth_thicklight
+ color_src = MATRIXED
+ name = "Synthetic Lizard - Thick Light"
+ icon_state = "synth_thicklight"
+
+/datum/sprite_accessory/antenna/synthliz/synth_short
+ color_src = MUTCOLORS
+ name = "Synthetic Lizard - Short"
+ icon_state = "synth_short"
+
+/datum/sprite_accessory/antenna/synthliz/synth_sharp
+ color_src = MUTCOLORS
+ name = "Synthetic Lizard - Sharp"
+ icon_state = "synth_sharp"
+
+/datum/sprite_accessory/antenna/synthliz/synth_sharplight
+ color_src = MATRIXED
+ name = "Synthetic Lizard - Sharp Light"
+ icon_state = "synth_sharplight"
+
+/datum/sprite_accessory/antenna/synthliz/synth_horns
+ color_src = MUTCOLORS
+ name = "Synthetic Lizard - Horns"
+ icon_state = "synth_horns"
+
+/datum/sprite_accessory/antenna/synthliz/synth_hornslight
+ color_src = MATRIXED
+ name = "Synthetic Lizard - Horns Light"
+ icon_state = "synth_hornslight"
+
// *** Snooooow flaaaaake ***
/datum/sprite_accessory/horns/guilmon
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species.dm b/modular_citadel/code/modules/mob/living/carbon/human/species.dm
index 1c7456a8..7e888ddd 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/species.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species.dm
@@ -163,4 +163,4 @@
/obj/item/bodypart
- var/should_draw_citadel = FALSE
+ var/icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index ba8359f9..fede1f07 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -2,7 +2,7 @@
name = "Anthro"
id = "mammal"
default_color = "4B4B4B"
- should_draw_citadel = TRUE
+ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,WINGCOLOR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "legs", "deco_wings")
@@ -53,7 +53,7 @@
id = "avian"
say_mod = "chirps"
default_color = "BCAC9B"
- should_draw_citadel = TRUE
+ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,WINGCOLOR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("mam_snouts", "wings", "taur", "mam_tail", "mam_body_markings", "taur", "deco_wings")
@@ -99,10 +99,10 @@
name = "Aquatic"
id = "aquatic"
default_color = "BCAC9B"
- should_draw_citadel = TRUE
+ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,WINGCOLOR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("mam_tail", "mam_ears","mam_body_markings", "taur", "legs", "mam_snouts", "deco_wings")
+ mutant_bodyparts = list("mam_tail", "mam_ears","mam_body_markings", "taur", "mam_snouts", "deco_wings")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "Shark", "mam_ears" = "None", "mam_body_markings" = "Shark", "mam_snouts" = "Round", "taur" = "None", "legs" = "Normal Legs", "deco_wings" = "None")
attack_verb = "bite"
attack_sound = 'sound/weapons/bite.ogg'
@@ -146,7 +146,7 @@
name = "Insect"
id = "insect"
default_color = "BCAC9B"
- should_draw_citadel = TRUE
+ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
mutant_bodyparts = list("mam_ears", "mam_body_markings", "mam_tail", "taur", "moth_wings","moth_markings", "mam_snouts", "moth_fluff")
@@ -212,7 +212,7 @@
id = "xeno"
say_mod = "hisses"
default_color = "00FF00"
- should_draw_citadel = TRUE
+ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,WINGCOLOR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "mam_body_markings", "taur", "legs", "deco_wings")
@@ -240,6 +240,60 @@
C.Digitigrade_Leg_Swap(TRUE)
. = ..()
+//Synthetic Lizard
+/datum/species/synthliz
+ name = "Synthetic Lizardperson"
+ id = "synthliz"
+ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
+ say_mod = "beeps"
+ default_color = "00FF00"
+ species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR)
+ inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
+ mutant_bodyparts = list("ipc_antenna", "mam_tail", "mam_snouts", "legs", "mam_body_markings", "taur")
+ default_features = list("ipc_antenna" = "Synthetic Lizard - Antennae","mam_tail" = "Synthetic Lizard", "mam_snouts" = "Synthetic Lizard - Snout", "legs" = "Digitigrade Legs", "mam_body_markings" = "Synthetic Lizard - Plates", "taur" = "None")
+ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
+ //gib_types = list(/obj/effect/gibspawner/ipc, /obj/effect/gibspawner/ipc/bodypartless)
+ mutanttongue = /obj/item/organ/tongue/robot/ipc
+ //Just robo looking parts.
+ mutant_heart = /obj/item/organ/heart/ipc
+ mutantlungs = /obj/item/organ/lungs/ipc
+ mutantliver = /obj/item/organ/liver/ipc
+ mutantstomach = /obj/item/organ/stomach/ipc
+ mutanteyes = /obj/item/organ/eyes/ipc
+
+ exotic_bloodtype = "S"
+
+
+/datum/species/synthliz/qualifies_for_rank(rank, list/features)
+ return TRUE
+
+//I wag in death
+/datum/species/synthliz/spec_death(gibbed, mob/living/carbon/human/H)
+ if(H)
+ stop_wagging_tail(H)
+
+/datum/species/synthliz/spec_stun(mob/living/carbon/human/H,amount)
+ if(H)
+ stop_wagging_tail(H)
+ . = ..()
+
+/datum/species/synthliz/can_wag_tail(mob/living/carbon/human/H)
+ return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
+
+/datum/species/synthliz/is_wagging_tail(mob/living/carbon/human/H)
+ return ("mam_waggingtail" in mutant_bodyparts)
+
+/datum/species/synthliz/start_wagging_tail(mob/living/carbon/human/H)
+ if("mam_tail" in mutant_bodyparts)
+ mutant_bodyparts -= "mam_tail"
+ mutant_bodyparts |= "mam_waggingtail"
+ H.update_body()
+
+/datum/species/synthliz/stop_wagging_tail(mob/living/carbon/human/H)
+ if("mam_waggingtail" in mutant_bodyparts)
+ mutant_bodyparts -= "mam_waggingtail"
+ mutant_bodyparts |= "mam_tail"
+ H.update_body()
//Praise the Omnissiah, A challange worthy of my skills - HS
//EXOTIC//
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm
index 8fd01393..8e866e46 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm
@@ -3,7 +3,7 @@
id = "ipc"
say_mod = "beeps"
default_color = "00FF00"
- should_draw_citadel = TRUE
+ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
blacklisted = 0
sexes = 0
species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING)
diff --git a/modular_citadel/icons/mob/ipc_antennas.dmi b/modular_citadel/icons/mob/ipc_antennas.dmi
index b60f4002..71b8f35b 100644
Binary files a/modular_citadel/icons/mob/ipc_antennas.dmi and b/modular_citadel/icons/mob/ipc_antennas.dmi differ
diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi
index cd1afeb4..9dd29b0c 100644
Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ
diff --git a/modular_citadel/icons/mob/mam_snouts.dmi b/modular_citadel/icons/mob/mam_snouts.dmi
index 87b96c11..f1d1ed7c 100644
Binary files a/modular_citadel/icons/mob/mam_snouts.dmi and b/modular_citadel/icons/mob/mam_snouts.dmi differ
diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi
index ec52ccfc..034427e7 100644
Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ
diff --git a/modular_citadel/icons/mob/mam_taur.dmi b/modular_citadel/icons/mob/mam_taur.dmi
index 84367ebf..db1f001f 100644
Binary files a/modular_citadel/icons/mob/mam_taur.dmi and b/modular_citadel/icons/mob/mam_taur.dmi differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index f2edf133..a7973408 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ