diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index 9f3e6b4db0..aea7d42be6 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -97,6 +97,7 @@
#define NO_DNA_COPY 14
#define DRINKSBLOOD 15
#define NOEYES 16
+#define MARKINGS 17
#define ORGAN_SLOT_BRAIN "brain"
#define ORGAN_SLOT_APPENDIX "appendix"
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index f642791224..c7daff49ed 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -93,6 +93,7 @@
#define MUTCOLORS3 36
#define NOAROUSAL 37 //Stops all arousal effects
#define NOGENITALS 38 //Cannot create, use, or otherwise have genitals
+#define MATRIXED 39 //if icon is color matrix'd
//Citadel istypes
#define isborer(A) (istype(A, /mob/living/simple_animal/borer))
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 7301284ee4..709a4daeba 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -51,10 +51,11 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
//Human Overlays Indexes/////////
//LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS
-#define MUTATIONS_LAYER 30 //mutations. Tk headglows, cold resistance glow, etc
-#define GENITALS_BEHIND_LAYER 29 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer
-#define BODY_BEHIND_LAYER 28 //certain mutantrace features (tail when looking south) that must appear behind the body parts
-#define BODYPARTS_LAYER 27 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
+#define MUTATIONS_LAYER 31 //mutations. Tk headglows, cold resistance glow, etc
+#define GENITALS_BEHIND_LAYER 30 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer
+#define BODY_BEHIND_LAYER 29 //certain mutantrace features (tail when looking south) that must appear behind the body parts
+#define BODYPARTS_LAYER 28 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
+#define MARKING_LAYER 27 //Matrixed body markings because clashing with snouts?
#define BODY_ADJ_LAYER 26 //certain mutantrace features (snout, body markings) that must appear above the body parts
#define GENITALS_ADJ_LAYER 25
#define BODY_LAYER 24 //underwear, undershirts, socks, eyes, lips(makeup)
@@ -82,7 +83,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define HANDS_LAYER 3
#define BODY_FRONT_LAYER 2
#define FIRE_LAYER 1 //If you're on fire
-#define TOTAL_LAYERS 30 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
+#define TOTAL_LAYERS 31 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
//Human Overlay Index Shortcuts for alternate_worn_layer, layers
//Because I *KNOW* somebody will think layer+1 means "above"
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index 9e38d9cf1e..b6c968b163 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -37,6 +37,7 @@ GLOBAL_LIST_EMPTY(mam_ears_list)
GLOBAL_LIST_EMPTY(mam_tails_list)
GLOBAL_LIST_EMPTY(mam_tails_animated_list)
GLOBAL_LIST_EMPTY(taur_list)
+GLOBAL_LIST_EMPTY(mam_snouts_list)
//Exotic Species
GLOBAL_LIST_EMPTY(exotic_tails_list)
@@ -242,7 +243,7 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
if("Wolf")
hdna.features["mam_tail"] = "Wolf"
hdna.features["mam_ears"] = "Wolf"
- hdna.features["snout"] = "Wolf"
+ hdna.features["mam_snouts"] = "Wolf"
hdna.features["mam_body_markings"] = "Wolf"
hdna.features["mcolor"] = "555"
hdna.features["mcolor2"] = "999"
@@ -250,7 +251,7 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
if("Fox")
hdna.features["mam_tail"] = "Fox"
hdna.features["mam_ears"] = "Fox"
- hdna.features["snout"] = "Fox, Long"
+ hdna.features["mam_snouts"] = "Fox, Long"
hdna.features["mam_body_markings"] = "Fox"
hdna.features["mcolor"] = "f60"
hdna.features["mcolor2"] = "fff"
@@ -258,6 +259,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
if("Fennec")
hdna.features["mam_tail"] = "Fennec"
hdna.features["mam_ears"] = "Fennec"
- hdna.features["snout"] = "Fox, Short"
+ hdna.features["mam_snouts"] = "Fox, Short"
hdna.features["mam_body_markings"] = "Fox"
H.regenerate_icons()
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index c590c844eb..7d578337bc 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -511,6 +511,13 @@
var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems)
announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common
+/proc/GetHexColors(const/hexa)
+ return list(
+ GetRedPart(hexa)/ 255,
+ GetGreenPart(hexa)/ 255,
+ GetBluePart(hexa)/ 255
+ )
+
/proc/GetRedPart(const/hexa)
return hex2num(copytext(hexa, 2, 4))
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 4a7f2fdbc1..f6ef08fe0d 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -37,13 +37,9 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_snouts, GLOB.mam_snouts_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails_animated, GLOB.mam_tails_animated_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/taur, GLOB.taur_list)
- //avian bodyparts (i swear this isn't starbound)
-// init_sprite_accessory_subtypes(/datum/sprite_accessory/beaks/avian, GLOB.avian_beaks_list)
-// init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/avian, GLOB.avian_tails_list)
-// init_sprite_accessory_subtypes(/datum/sprite_accessory/avian_wings, GLOB.avian_wings_list)
-// init_sprite_accessory_subtypes(/datum/sprite_accessory/avian_open_wings, GLOB.avian_open_wings_list)
//xeno parts (hiss?)
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_head, GLOB.xeno_head_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_tail, GLOB.xeno_tail_list)
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index d2cb3baa6a..5fb64004c0 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -712,7 +712,19 @@ world
var/static/icon/flat_template = icon('icons/effects/effects.dmi', "nothing")
#define BLANK icon(flat_template)
- #define SET_SELF(SETVAR) var/icon/SELF_ICON=icon(icon(curicon, curstate, base_icon_dir),"",SOUTH,no_anim?1:null);if(A.alpha<255)SELF_ICON.Blend(rgb(255,255,255,A.alpha),ICON_MULTIPLY);if(A.color)SELF_ICON.Blend(A.color,ICON_MULTIPLY);;##SETVAR=SELF_ICON;
+ #define SET_SELF(SETVAR) do { \
+ var/icon/SELF_ICON=icon(icon(curicon, curstate, base_icon_dir),"",SOUTH,no_anim?1:null); \
+ if(A.alpha<255) { \
+ SELF_ICON.Blend(rgb(255,255,255,A.alpha),ICON_MULTIPLY);\
+ } \
+ if(A.color) { \
+ if(islist(A.color)){ \
+ SELF_ICON.MapColors(arglist(A.color))} \
+ else{ \
+ SELF_ICON.Blend(A.color,ICON_MULTIPLY)} \
+ } \
+ ##SETVAR=SELF_ICON;\
+ } while (0)
#define INDEX_X_LOW 1
#define INDEX_X_HIGH 2
@@ -860,7 +872,11 @@ world
flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1)
if(A.color)
- flat.Blend(A.color, ICON_MULTIPLY)
+ if(islist(A.color))
+ flat.MapColors(arglist(A.color))
+ else
+ flat.Blend(A.color, ICON_MULTIPLY)
+
if(A.alpha < 255)
flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 92132b092e..eff6f54653 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -91,6 +91,8 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
if(!GLOB.mam_ears_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list)
+ if(!GLOB.mam_snouts_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_snouts, GLOB.mam_snouts_list)
// if(ishuman(src))
// var/mob/living/carbon/human/H = src
@@ -113,11 +115,11 @@
"mcolor2" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"mcolor3" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"tail_lizard" = pick(GLOB.tails_list_lizard),
- "tail_human" = "None",
+ "tail_human" = pick(GLOB.tails_list_human),
"wings" = "None",
"snout" = pick(GLOB.snouts_list),
"horns" = pick(GLOB.horns_list),
- "ears" = "None",
+ "ears" = pick(GLOB.ears_list),
"frills" = pick(GLOB.frills_list),
"spines" = pick(GLOB.spines_list),
"body_markings" = pick(GLOB.body_markings_list),
@@ -127,6 +129,7 @@
"taur" = "None",
"mam_body_markings" = pick(GLOB.mam_body_markings_list),
"mam_ears" = pick(GLOB.mam_ears_list),
+ "mam_snouts" = pick(GLOB.mam_snouts_list),
"mam_tail" = pick(GLOB.mam_tails_list),
"mam_tail_animated" = "None",
"xenodorsal" = "Standard",
diff --git a/code/datums/browser.dm b/code/datums/browser.dm
index 358f2bfe29..4c501a3e7f 100644
--- a/code/datums/browser.dm
+++ b/code/datums/browser.dm
@@ -463,4 +463,3 @@
// so just reset the user mob's machine var
if(src && src.mob)
src.mob.unset_machine()
- return
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index c85eb95b05..7216b73af6 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -72,4 +72,6 @@
var/list/credits //lazy list of all credit object bound to this client
- var/datum/player_details/player_details //these persist between logins/logouts during the same round.
\ No newline at end of file
+ var/datum/player_details/player_details //these persist between logins/logouts during the same round.
+
+ var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen.
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 85d1b4f150..f93b799e8d 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -454,6 +454,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
GLOB.ahelp_tickets.ClientLogout(src)
GLOB.directory -= ckey
GLOB.clients -= src
+ QDEL_LIST_ASSOC_VAL(char_render_holders)
if(movingmob != null)
movingmob.client_mobs_in_contents -= mob
UNSETEMPTY(movingmob.client_mobs_in_contents)
@@ -877,3 +878,23 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
/client/proc/AnnouncePR(announcement)
if(prefs && prefs.chat_toggles & CHAT_PULLR)
to_chat(src, announcement)
+
+/client/proc/show_character_previews(mutable_appearance/MA)
+ var/pos = 0
+ for(var/D in GLOB.cardinals)
+ pos++
+ var/obj/screen/O = LAZYACCESS(char_render_holders, "[D]")
+ if(!O)
+ O = new
+ LAZYSET(char_render_holders, "[D]", O)
+ screen |= O
+ O.appearance = MA
+ O.dir = D
+ O.screen_loc = "character_preview_map:0,[pos]"
+
+/client/proc/clear_character_previews()
+ for(var/index in char_render_holders)
+ var/obj/screen/S = char_render_holders[index]
+ screen -= S
+ qdel(S)
+ char_render_holders = null
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 53a8d84af2..30d6306b0f 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -74,17 +74,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
var/list/features = list("mcolor" = "FFF",
- "tail_lizard" = "Smooth", "tail_human" = "None",
- "snout" = "Round", "horns" = "None", "ears" = "None",
+ "tail_lizard" = "Smooth", "tail_human" = "Cat",
+ "snout" = "Round", "horns" = "None", "ears" = "Cat",
"wings" = "None", "frills" = "None", "spines" = "None",
"body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain")
var/list/custom_names = list()
var/prefered_security_department = SEC_DEPT_RANDOM
- //Mob preview
- var/icon/preview_icon = null
-
//Quirk list
var/list/positive_quirks = list()
var/list/negative_quirks = list()
@@ -155,17 +152,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
menuoptions = list()
return
-#define APPEARANCE_CATEGORY_COLUMN "
"
+#define APPEARANCE_CATEGORY_COLUMN " | "
#define MAX_MUTANT_ROWS 4
/datum/preferences/proc/ShowChoices(mob/user)
if(!user || !user.client)
return
- if(current_tab == 2) //CITADEL EDIT, for muh nudies
- update_preview_icon(nude=TRUE)
- else
- update_preview_icon(nude=FALSE) //EDIT END
- user << browse_rsc(preview_icon, "previewicon.png")
+ update_preview_icon()
var/list/dat = list("")
dat += "Character Settings"
@@ -210,14 +203,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
+ dat += ""
//Character Appearance
if(2)
- update_preview_icon(nude=TRUE)
- user << browse_rsc(preview_icon, "previewicon.png")
+ if(path)
+ var/savefile/S = new /savefile(path)
+ if(S)
+ dat += ""
+ var/name
+ var/unspaced_slots = 0
+ for(var/i=1, i<=max_save_slots, i++)
+ unspaced_slots++
+ if(unspaced_slots > 4)
+ dat += " "
+ unspaced_slots = 0
+ S.cd = "/character[i]"
+ S["real_name"] >> name
+ if(!name)
+ name = "Character[i]"
+ dat += "[name] "
+ dat += ""
+
+ update_preview_icon()
dat += ""
- dat += ""
- dat += "Set Flavor Text "
+ dat += "Flavor Text"
+ dat += "Set Examine Text "
if(lentext(features["flavor_text"]) <= 40)
if(!lentext(features["flavor_text"]))
dat += "\[...\]"
@@ -254,10 +260,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
dat += "[TextPreview(features["flavor_text"])]... "
dat += "Body"
- dat += "Gender: [gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))] "
- dat += "Species:[pref_species.id] "
- dat += "Random Body "
- dat += "Always Random Body: [be_random_body ? "Yes" : "No"] "
+ dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))] "
+ dat += "Species:[pref_species.id] "
+ dat += "Random Body "
+ dat += "Always Random Body:[be_random_body ? "Yes" : "No"] "
var/use_skintones = pref_species.use_skintones
if(use_skintones)
@@ -265,17 +271,23 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Skin Tone"
- dat += "[skin_tone] "
+ dat += "[skin_tone] "
var/mutant_colors
if((MUTCOLORS in pref_species.species_traits) || (MUTCOLORS_PARTSONLY in pref_species.species_traits))
if(!use_skintones)
dat += APPEARANCE_CATEGORY_COLUMN
- dat += "Body Colors "
- dat += "Primary Color: Change "
- dat += "Secondary Color: Change "
- dat += "Tertiary Color: Change "
+ dat += "Body Colors"
+
+ dat += "Primary Color: "
+ dat += " Change "
+
+ dat += "Secondary Color: "
+ dat += " Change "
+
+ dat += "Tertiary Color: "
+ dat += " Change "
mutant_colors = TRUE
if((EYECOLOR in pref_species.species_traits) && !(NOEYES in pref_species.species_traits))
@@ -297,13 +309,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Hair Style"
- dat += "[hair_style] "
+ dat += "[hair_style]"
dat += "< > "
dat += " Change "
dat += "Facial Hair Style"
- dat += "[facial_hair_style] "
+ dat += "[facial_hair_style]"
dat += "< > "
dat += " Change "
@@ -317,7 +329,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Tail"
- dat += "[features["tail_lizard"]] "
+ dat += "[features["tail_lizard"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -330,7 +342,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Tail"
- dat += "[features["mam_tail"]] "
+ dat += "[features["mam_tail"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -342,7 +354,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Tail"
- dat += "[features["tail_human"]] "
+ dat += "[features["tail_human"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -354,7 +366,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Snout"
- dat += "[features["snout"]] "
+ dat += "[features["snout"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -366,7 +378,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Horns"
- dat += "[features["horns"]] "
+ dat += "[features["horns"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -377,7 +389,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Frills"
- dat += "[features["frills"]] "
+ dat += "[features["frills"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -390,7 +402,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Spines"
- dat += "[features["spines"]] "
+ dat += "[features["spines"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -403,7 +415,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Body Markings"
- dat += "[features["body_markings"]] "
+ dat += "[features["body_markings"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -415,7 +427,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Species Markings"
- dat += "[features["mam_body_markings"]] "
+ dat += "[features["mam_body_markings"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -427,7 +439,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Ears"
- dat += "[features["mam_ears"]] "
+ dat += "[features["mam_ears"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -439,7 +451,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Ears"
- dat += "[features["ears"]] "
+ dat += "[features["ears"]]"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += " | "
+ mutant_category = 0
+ if("mam_snouts" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Snout"
+
+ dat += "[features["mam_snouts"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -451,7 +475,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Legs"
- dat += "[features["legs"]] "
+ dat += "[features["legs"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -463,7 +487,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Moth wings"
- dat += "[features["moth_wings"]] "
+ dat += "[features["moth_wings"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -475,7 +499,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Tauric Body"
- dat += "[features["taur"]] "
+ dat += "[features["taur"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -487,7 +511,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Wings"
- dat += "[features["wings"]] "
+ dat += "[features["wings"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -499,7 +523,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Caste Head"
- dat += "[features["xenohead"]] "
+ dat += "[features["xenohead"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -511,7 +535,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Tail"
- dat += "[features["xenotail"]] "
+ dat += "[features["xenotail"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -523,7 +547,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Dorsal Spines"
- dat += "[features["xenodorsal"]] "
+ dat += "[features["xenodorsal"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -535,7 +559,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Screen"
- dat += "[features["ipc_screen"]] "
+ dat += "[features["ipc_screen"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -547,7 +571,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Antenna"
- dat += "[features["ipc_antenna"]] "
+ dat += "[features["ipc_antenna"]]"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -560,53 +584,69 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += " "
- dat += " | "
-
+ dat += " | "
+ dat += ""
+ dat += "Color:"
+ dat += " Change
"
+ dat += "Cup Size:[features["breasts_size"]]"
+ dat += "Breast Shape:[features["breasts_shape"]]"
+ dat += ""
+ dat += ""
+ dat += ""
if (1) // Game Preferences
dat += ""
if(unlock_content)
dat += "Ghost Form: [ghost_form]
"
@@ -731,18 +786,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Midround Antagonist: [(toggles & MIDROUND_ANTAG) ? "Enabled" : "Disabled"]
"
dat += "
"
- dat += "Citadel Preferences
" //Because fuck me if preferences can't be fucking modularized and expected to update in a reasonable timeframe.
- dat += "Arousal:[arousable == TRUE ? "Enabled" : "Disabled"]
"
- dat += "Exhibitionist:[features["exhibitionist"] == TRUE ? "Yes" : "No"]
"
- dat += "Voracious MediHound sleepers: [(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]
"
- dat += "Hear Vore Sounds: [(cit_toggles & EATING_NOISES) ? "Yes" : "No"]
"
- dat += "Hear Vore Digestion Sounds: [(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"]
"
- dat += "Widescreen: [widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]
"
- dat += "Auto stand: [autostand ? "Enabled" : "Disabled"]
"
- dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
"
- if (user && user.client && !user.client.prefs.screenshake==0)
- dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
"
- dat += "
"
if(3)
if(!gear_tab)
@@ -804,9 +847,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Reset Setup"
dat += ""
- var/datum/browser/popup = new(user, "preferences", "Character Setup
", 640, 770)
+ winshow(user, "preferences_window", TRUE)
+ var/datum/browser/popup = new(user, "preferences_browser", "Character Setup
", 640, 770)
popup.set_content(dat.Join())
- popup.open(0)
+ popup.open(FALSE)
+ onclose(user, "preferences_window", src)
#undef APPEARANCE_CATEGORY_COLUMN
#undef MAX_MUTANT_ROWS
@@ -932,12 +977,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
HTML += "
[message]"
HTML += "Reset Preferences"
- user << browse(null, "window=preferences")
var/datum/browser/popup = new(user, "mob_occupation", "Occupation Preferences
", width, height)
popup.set_window_options("can_close=0")
popup.set_content(HTML)
- popup.open(0)
- return
+ popup.open(FALSE)
/datum/preferences/proc/SetJobPreferenceLevel(datum/job/job, level)
if (!job)
@@ -1126,12 +1169,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
[has_quirk ? "Lose" : "Take"] ([quirk_cost] pts.)
"
dat += "
Reset Traits"
- user << browse(null, "window=preferences")
var/datum/browser/popup = new(user, "mob_occupation", "Quirk Preferences
", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way
popup.set_window_options("can_close=0")
popup.set_content(dat.Join())
- popup.open(0)
- return
+ popup.open(FALSE)
/datum/preferences/proc/GetQuirkBalance()
var/bal = 0
@@ -1140,6 +1181,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
bal -= initial(T.value)
return bal
+/datum/preferences/Topic(href, href_list, hsrc) //yeah, gotta do this I guess..
+ . = ..()
+ if(href_list["close"])
+ var/client/C = usr.client
+ if(C)
+ C.clear_character_previews()
+
/datum/preferences/proc/process_link(mob/user, list/href_list)
if(href_list["jobbancheck"])
var/job = sanitizeSQL(href_list["jobbancheck"])
@@ -1412,6 +1460,23 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(result)
var/newtype = GLOB.species_list[result]
pref_species = new newtype()
+ //let's ensure that no weird shit happens on species swapping.
+ if(!("body_markings" in pref_species.default_features))
+ features["body_markings"] = "None"
+ if(!("mam_body_markings" in pref_species.default_features))
+ features["mam_body_markings"] = "None"
+ if("mam_body_markings" in pref_species.default_features && features["mam_body_markings"] == "None")
+ features["mam_body_markings"] = "Plain"
+ if("tail_lizard" in pref_species.default_features)
+ features["tail_lizard"] = "Smooth"
+ if("mam_tail" in pref_species.default_features)
+ features["mam_tail"] = "None"
+ if("mam_ears" in pref_species.default_features)
+ features["mam_ears"] = "None"
+ if(pref_species.id == "felinid")
+ features["mam_tail"] = "Cat"
+ features["mam_ears"] = "Cat"
+
//Now that we changed our species, we must verify that the mutant colour is still allowed.
var/temp_hsv = RGBtoHSV(features["mcolor"])
if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
@@ -1427,8 +1492,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
features["mcolor"] = pref_species.default_color
+ update_preview_icon()
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
+ update_preview_icon()
else
to_chat(user, "Invalid color. Your color is not bright enough.")
@@ -1438,8 +1505,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
features["mcolor2"] = pref_species.default_color
+ update_preview_icon()
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
features["mcolor2"] = sanitize_hexcolor(new_mutantcolor)
+ update_preview_icon()
else
to_chat(user, "Invalid color. Your color is not bright enough.")
@@ -1449,8 +1518,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
features["mcolor3"] = pref_species.default_color
+ update_preview_icon()
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
features["mcolor3"] = sanitize_hexcolor(new_mutantcolor)
+ update_preview_icon()
else
to_chat(user, "Invalid color. Your color is not bright enough.")
@@ -1516,6 +1587,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_snout)
features["snout"] = new_snout
+ if("mam_snouts")
+ var/new_mam_snouts
+ new_mam_snouts = input(user, "Choose your character's snout:", "Character Preference") as null|anything in GLOB.mam_snouts_list
+ if(new_mam_snouts)
+ features["mam_snouts"] = new_mam_snouts
+
if("horns")
var/new_horns
new_horns = input(user, "Choose your character's horns:", "Character Preference") as null|anything in GLOB.horns_list
@@ -1551,12 +1628,16 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in GLOB.body_markings_list
if(new_body_markings)
features["body_markings"] = new_body_markings
+ if(new_body_markings != "None")
+ features["mam_body_markings"] = "None"
+ update_preview_icon()
if("legs")
var/new_legs
new_legs = input(user, "Choose your character's legs:", "Character Preference") as null|anything in GLOB.legs_list
if(new_legs)
features["legs"] = new_legs
+ update_preview_icon()
if("moth_wings")
var/new_moth_wings
@@ -1625,6 +1706,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_mam_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in snowflake_markings_list
if(new_mam_body_markings)
features["mam_body_markings"] = new_mam_body_markings
+ if(new_mam_body_markings != "None")
+ features["body_markings"] = "None"
+ else if(new_mam_body_markings == "None")
+ features["mam_body_markings"] = "Plain"
+ features["body_markings"] = "None"
+ update_preview_icon()
//Xeno Bodyparts
if("xenohead")//Head or caste type
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index dbf782c5fe..c3b2c15bdb 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -301,6 +301,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_mam_ears"] >> features["mam_ears"]
S["feature_mam_tail_animated"] >> features["mam_tail_animated"]
S["feature_taur"] >> features["taur"]
+ S["feature_mam_snouts"] >> features["mam_snouts"]
//Xeno features
S["feature_xeno_tail"] >> features["xenotail"]
S["feature_xeno_dors"] >> features["xenodorsal"]
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index c9710a5457..6b67ada775 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -20,17 +20,19 @@
features = random_features()
age = rand(AGE_MIN,AGE_MAX)
-/datum/preferences/proc/update_preview_icon(nude = FALSE)
+/datum/preferences/proc/update_preview_icon()
// Silicons only need a very basic preview since there is no customization for them.
+// var/wide_icon = FALSE //CITDEL THINGS
+// if(features["taur"] != "None")
+// wide_icon = TRUE
+
if(job_engsec_high)
switch(job_engsec_high)
if(AI_JF)
- preview_icon = icon('icons/mob/ai.dmi', "AI", SOUTH)
- preview_icon.Scale(64, 64)
+ parent.show_character_previews(image('icons/mob/ai.dmi', icon_state = "AI", dir = SOUTH))
return
if(CYBORG)
- preview_icon = icon('icons/mob/robots.dmi', "robot", SOUTH)
- preview_icon.Scale(64, 64)
+ parent.show_character_previews(image('icons/mob/robots.dmi', icon_state = "robot", dir = SOUTH))
return
// Set up the dummy for its photoshoot
@@ -57,30 +59,11 @@
previewJob = job
break
- if(previewJob && !nude)
- mannequin.job = previewJob.title
- previewJob.equip(mannequin, TRUE)
- COMPILE_OVERLAYS(mannequin)
- CHECK_TICK
- preview_icon = icon('icons/effects/effects.dmi', "nothing")
- preview_icon.Scale(48+32, 16+32)
- CHECK_TICK
- mannequin.setDir(NORTH)
+ if(previewJob)
+ if(current_tab != 2)
+ mannequin.job = previewJob.title
+ previewJob.equip(mannequin, TRUE)
- var/icon/stamp = getFlatIcon(mannequin)
- CHECK_TICK
- preview_icon.Blend(stamp, ICON_OVERLAY, 25, 17)
- CHECK_TICK
- mannequin.setDir(WEST)
- stamp = getFlatIcon(mannequin)
- CHECK_TICK
- preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9)
- CHECK_TICK
- mannequin.setDir(SOUTH)
- stamp = getFlatIcon(mannequin)
- CHECK_TICK
- preview_icon.Blend(stamp, ICON_OVERLAY, 49, 1)
- CHECK_TICK
- preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser.
- CHECK_TICK
+ COMPILE_OVERLAYS(mannequin)
+ parent.show_character_previews(new /mutable_appearance(mannequin))
unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm
index 76fa1cefe1..2778e3e29c 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -1522,18 +1522,3 @@
/datum/sprite_accessory/moth_wings/snow
name = "Snow"
icon_state = "snow"
-
-//Lunasune
-/datum/sprite_accessory/mam_ears/lunasune
- name = "lunasune"
- icon_state = "lunasune"
- hasinner = 1
- extra = TRUE
- extra_color_src = MUTCOLORS2
- ckeys_allowed = list("invader4352")
-
-/datum/sprite_accessory/mam_tails/lunasune
- name = "lunasune"
- icon_state = "lunasune"
- extra = TRUE
- ckeys_allowed = list("invader4352")
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index aee1daa449..b4c6bd9c52 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -317,9 +317,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
if(!HD) //Decapitated
return
-
if(H.has_trait(TRAIT_HUSK))
return
+
var/datum/sprite_accessory/S
var/list/standing = list()
@@ -351,7 +351,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.facial_hair_style && (FACEHAIR in species_traits) && (!facialhair_hidden || dynamic_fhair_suffix))
S = GLOB.facial_hair_styles_list[H.facial_hair_style]
if(S)
-
//List of all valid dynamic_fhair_suffixes
var/static/list/fextensions
if(!fextensions)
@@ -410,7 +409,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else if(H.hair_style && (HAIR in species_traits))
S = GLOB.hair_styles_list[H.hair_style]
if(S)
-
//List of all valid dynamic_hair_suffixes
var/static/list/extensions
if(!extensions)
@@ -612,6 +610,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "mam_ears"
+ if("mam_snouts" in mutant_bodyparts) //Take a closer look at that snout!
+ if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE)) || !HD || HD.status == BODYPART_ROBOTIC)
+ bodyparts_to_add -= "mam_snouts"
+
if("taur" in mutant_bodyparts)
if(!H.dna.features["taur"] || H.dna.features["taur"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)))
bodyparts_to_add -= "taur"
@@ -696,13 +698,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer)
+ accessory_overlay.color = null //just because. reee.
+
//A little rename so we don't have to use tail_lizard or tail_human when naming the sprites.
if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail" || bodypart == "xenotail")
bodypart = "tail"
- else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human" || bodypart == "mam_waggingtail")
+ else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human")
bodypart = "waggingtail"
+ if(bodypart == "mam_waggingtail")
+ bodypart = "tailwag"
if(bodypart == "mam_ears" || bodypart == "ears")
bodypart = "ears"
+ if(bodypart == "mam_snouts" || bodypart == "snout")
+ bodypart = "snout"
if(bodypart == "xenohead")
bodypart = "xhead"
@@ -714,6 +722,15 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(S.center)
accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y)
+ var/list/colorlist = list()
+ colorlist.Cut()
+ colorlist += ReadRGB(H.dna.features["mcolor"])
+ colorlist += ReadRGB(H.dna.features["mcolor2"])
+ colorlist += ReadRGB(H.dna.features["mcolor3"])
+ colorlist += list(0,0,0)
+ for(var/index=1, index<=colorlist.len, index++)
+ colorlist[index] = colorlist[index]/255
+
if(!(H.has_trait(TRAIT_HUSK)))
if(!forced_colour)
switch(S.color_src)
@@ -732,6 +749,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
accessory_overlay.color = "#[fixed_mut_color3]"
else
accessory_overlay.color = "#[H.dna.features["mcolor3"]]"
+
+ if(MATRIXED)
+ accessory_overlay.color = list(colorlist)
+
if(HAIR)
if(hair_color == "mutcolor")
accessory_overlay.color = "#[H.dna.features["mcolor"]]"
@@ -743,6 +764,21 @@ GLOBAL_LIST_EMPTY(roundstart_races)
accessory_overlay.color = "#[H.eye_color]"
else
accessory_overlay.color = forced_colour
+ else
+ if(bodypart == "ears")
+ accessory_overlay.icon_state = "m_ears_none_[layertext]"
+ if(bodypart == "tail")
+ accessory_overlay.icon_state = "m_tail_husk_[layertext]"
+ if(MATRIXED)
+ var/list/husklist = list()
+ husklist += ReadRGB("#a3a3a3")
+ husklist += ReadRGB("#a3a3a3")
+ husklist += ReadRGB("#a3a3a3")
+ husklist += list(0,0,0)
+ for(var/index=1, index<=husklist.len, index++)
+ husklist[index] = husklist[index]/255
+ accessory_overlay.color = husklist
+
standing += accessory_overlay
if(S.hasinner)
diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm
index 7207a4f49d..1ee697d66c 100644
--- a/code/modules/mob/living/carbon/human/species_types/felinid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm
@@ -4,8 +4,8 @@
id = "felinid"
limbs_id = "human"
- mutant_bodyparts = list("ears", "tail_human")
- default_features = list("mcolor" = "FFF", "tail_human" = "Cat", "ears" = "Cat", "wings" = "None")
+ mutant_bodyparts = list("mam_ears", "mam_tail")
+ default_features = list("mcolor" = "FFF", "mam_tail" = "Cat", "mam_ears" = "Cat", "wings" = "None")
mutantears = /obj/item/organ/ears/cat
mutanttail = /obj/item/organ/tail/cat
@@ -23,38 +23,39 @@
stop_wagging_tail(H)
. = ..()
+
/datum/species/human/felinid/can_wag_tail(mob/living/carbon/human/H)
- return ("tail_human" in mutant_bodyparts) || ("waggingtail_human" in mutant_bodyparts)
+ return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/human/felinid/is_wagging_tail(mob/living/carbon/human/H)
- return ("waggingtail_human" in mutant_bodyparts)
+ return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/human/felinid/start_wagging_tail(mob/living/carbon/human/H)
- if("tail_human" in mutant_bodyparts)
- mutant_bodyparts -= "tail_human"
- mutant_bodyparts |= "waggingtail_human"
+ if("mam_tail" in mutant_bodyparts)
+ mutant_bodyparts -= "mam_tail"
+ mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/human/felinid/stop_wagging_tail(mob/living/carbon/human/H)
- if("waggingtail_human" in mutant_bodyparts)
- mutant_bodyparts -= "waggingtail_human"
- mutant_bodyparts |= "tail_human"
+ if("mam_waggingtail" in mutant_bodyparts)
+ mutant_bodyparts -= "mam_waggingtail"
+ mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas!
- if(H.dna.features["tail_human"] == "None")
- H.dna.features["tail_human"] = "Cat"
- if(H.dna.features["ears"] == "None")
- H.dna.features["ears"] = "Cat"
- if(H.dna.features["ears"] == "Cat")
+ if(H.dna.features["mam_tail"] == "None")
+ H.dna.features["mam_tail"] = "Cat"
+ if(H.dna.features["mam_ears"] == "None")
+ H.dna.features["mam_ears"] = "Cat"
+ if(H.dna.features["mam_ears"] == "Cat")
var/obj/item/organ/ears/cat/ears = new
ears.Insert(H, drop_if_replaced = FALSE)
else
mutantears = /obj/item/organ/ears
- if(H.dna.features["tail_human"] == "Cat")
+ if(H.dna.features["mam_tail"] == "Cat")
var/obj/item/organ/tail/cat/tail = new
tail.Insert(H, drop_if_replaced = FALSE)
else
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 72052f0fa1..71717bfc16 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -359,7 +359,6 @@ There are several things that need to be remembered:
apply_overlay(BELT_LAYER)
-
/mob/living/carbon/human/update_inv_wear_suit()
remove_overlay(SUIT_LAYER)
@@ -391,8 +390,6 @@ There are several things that need to be remembered:
else if(S.taurmode == NOT_TAURIC && S.adjusted == NORMAL_STYLE)
S.alternate_worn_icon = null
-
-
overlays_standing[SUIT_LAYER] = S.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = ((wear_suit.alternate_worn_icon) ? S.alternate_worn_icon : 'icons/mob/suit.dmi'))
var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER]
if(OFFSET_SUIT in dna.species.offset_features)
@@ -477,7 +474,6 @@ There are several things that need to be remembered:
out += overlays_standing[i]
return out
-
//human HUD updates for items in our inventory
//update whether our head item appears on our hud.
@@ -614,7 +610,7 @@ generate/load female uniform sprites matching all previously decided variables
else if(dna.species.fixed_mut_color)
. += "-coloured-[dna.species.fixed_mut_color]"
else if(dna.features["mcolor"])
- . += "-coloured-[dna.features["mcolor"]]"
+ . += "-coloured-[dna.features["mcolor"]]-[dna.features["mcolor2"]]-[dna.features["mcolor3"]]"
else
. += "-not_coloured"
@@ -644,6 +640,8 @@ generate/load female uniform sprites matching all previously decided variables
. += "-digitigrade[BP.use_digitigrade]"
if(BP.dmg_overlay_type)
. += "-[BP.dmg_overlay_type]"
+ if(BP.body_markings)
+ . += "-[BP.body_markings]"
if(has_trait(TRAIT_HUSK))
. += "-husk"
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index be98d1bfab..43abe7c825 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -261,11 +261,13 @@
if(!has_trait(TRAIT_HUSK))
remove_trait(TRAIT_DISFIGURED, "husk")
update_body()
+ return TRUE
/mob/living/proc/become_husk(source)
if(!has_trait(TRAIT_HUSK))
add_trait(TRAIT_DISFIGURED, "husk")
update_body()
+ . = TRUE
add_trait(TRAIT_HUSK, source)
/mob/living/proc/cure_fakedeath(list/sources)
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 8d0547d2c5..5beb9e87d8 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -45,6 +45,10 @@
var/species_color = ""
var/mutation_color = ""
var/no_update = 0
+ var/list/body_markings = list() //for bodypart markings
+ var/list/markings_color = list()
+ var/auxmarking
+ var/list/auxmarking_color = list()
var/animal_origin = null //for nonhuman bodypart (e.g. monkey)
var/dismemberable = 1 //whether it can be dismembered with a weapon.
@@ -285,6 +289,7 @@
should_draw_gender = FALSE
should_draw_greyscale = FALSE
no_update = TRUE
+ body_markings = "husk" // reeee
if(no_update)
return
@@ -298,6 +303,16 @@
should_draw_citadel = S.should_draw_citadel // Citadel Addition
species_flags_list = H.dna.species.species_traits
+ //body marking memes
+ var/list/colorlist = list()
+ colorlist.Cut()
+ colorlist += ReadRGB(H.dna.features["mcolor"])
+ colorlist += ReadRGB(H.dna.features["mcolor2"])
+ colorlist += ReadRGB(H.dna.features["mcolor3"])
+ colorlist += list(0,0,0)
+ for(var/index=1, index<=colorlist.len, index++)
+ colorlist[index] = colorlist[index]/255
+
if(S.use_skintones)
skin_tone = H.skin_tone
should_draw_greyscale = TRUE
@@ -316,6 +331,17 @@
else
species_color = ""
+ if("mam_body_markings" in S.default_features)
+ if(H.dna.features.["mam_body_markings"] != "None")
+ body_markings = lowertext(H.dna.features.["mam_body_markings"])
+ if(MATRIXED)
+ markings_color = list(colorlist)
+ else
+ markings_color = (H.dna.features.["mcolor"])
+ else
+ body_markings = "None"
+ markings_color = ""
+
if(!dropping_limb && H.dna.check_mutation(HULK))
mutation_color = "00aa00"
else
@@ -346,6 +372,7 @@
//Gives you a proper icon appearance for the dismembered limb
/obj/item/bodypart/proc/get_limb_icon(dropped)
+ cut_overlays()
icon_state = "" //to erase the default sprite, we're building the visual aspects of the bodypart through overlays alone.
. = list()
@@ -358,9 +385,17 @@
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir)
if(burnstate)
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir)
+ if(body_markings)
+ if(use_digitigrade == NOT_DIGITIGRADE)
+ . += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ else
+ . += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
var/image/aux
+ var/image/marking
+ var/image/auxmarking
+
. += limb
if(animal_origin)
@@ -403,11 +438,31 @@
limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
else
limb.icon_state = "[species_id]_[body_zone]"
+
+ // Body markings
+ if(body_markings)
+ if(species_id == "husk")
+ marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
+ else if(species_id == "husk" && use_digitigrade)
+ marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+
+ else if(!use_digitigrade)
+ marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ else
+ marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += marking
+
// Citadel End
if(aux_zone)
aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir)
. += aux
+ if(body_markings)
+ if(species_id == "husk")
+ auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
+ else
+ auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
+ . += auxmarking
else
limb.icon = icon
@@ -416,17 +471,45 @@
else
limb.icon_state = "[body_zone]"
if(aux_zone)
- aux = image(limb.icon, "[aux_zone]", -aux_layer, image_dir)
+ aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir)
. += aux
+ if(body_markings)
+ if(species_id == "husk")
+ auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
+ else
+ auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
+ . += auxmarking
+
+ if(body_markings)
+ if(species_id == "husk")
+ marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
+ else if(species_id == "husk" && use_digitigrade)
+ marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+
+ else if(!use_digitigrade)
+ marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ else
+ marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += marking
return
if(should_draw_greyscale)
+ marking.color = null
var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone))
if(draw_color)
limb.color = "#[draw_color]"
if(aux_zone)
aux.color = "#[draw_color]"
+ if(body_markings)
+ auxmarking.color = list(markings_color)
+
+ if(body_markings)
+ if(species_id == "husk")
+ marking.color = "#141414"
+ else
+ marking.color = list(markings_color)
+
/obj/item/bodypart/deconstruct(disassembled = TRUE)
drop_organs()
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index 9d9e26c6fa..9cc56a6ca8 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -288,6 +288,7 @@
O.drop_limb(1)
qdel(O)
N.attach_limb(src)
+
if(body_plan_changed && ishuman(src))
var/mob/living/carbon/human/H = src
if(H.w_uniform)
@@ -311,4 +312,4 @@
S.adjusted = NORMAL_STYLE
else
S.adjusted = ALT_STYLE
- H.update_inv_wear_suit()
\ No newline at end of file
+ H.update_inv_wear_suit()
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index f162d36633..47ef8e816f 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 99850c34ba..65f4a22664 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -268,3 +268,30 @@ window "statwindow"
is-default = true
saved-params = ""
+ window "preferences_window"
+ elem "preferences_window"
+ type = MAIN
+ pos = 372,0
+ size = 1120x1000
+ anchor1 = none
+ anchor2 = none
+ background-color = none
+ is-visible = false
+ saved-params = "pos;size;is-minimized;is-maximized"
+ statusbar = false
+ elem "preferences_browser"
+ type = BROWSER
+ pos = -8,-8
+ size = 896x1008
+ anchor1 = 0,0
+ anchor2 = 90,100
+ background-color = none
+ saved-params = ""
+ elem "character_preview_map"
+ type = MAP
+ pos = 887,0
+ size = 313x1000
+ anchor1 = 90,0
+ anchor2 = 100,100
+ right-click = true
+ saved-params = "zoom;letterbox;zoom-mode"
diff --git a/modular_citadel/code/init.dm b/modular_citadel/code/init.dm
index 6df5be02eb..2c2b5b811f 100644
--- a/modular_citadel/code/init.dm
+++ b/modular_citadel/code/init.dm
@@ -9,6 +9,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails_animated, GLOB.mam_tails_animated_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_snouts, GLOB.mam_snouts_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/taur, GLOB.taur_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_head, GLOB.xeno_head_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_tail, GLOB.xeno_tail_list)
diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm
index 927d324e23..358208c1d7 100644
--- a/modular_citadel/code/modules/client/preferences.dm
+++ b/modular_citadel/code/modules/client/preferences.dm
@@ -40,6 +40,7 @@
"mcolor3" = "FFF",
"mam_body_markings" = "None",
"mam_ears" = "None",
+ "mam_snouts" = "None",
"mam_tail" = "None",
"mam_tail_animated" = "None",
"xenodorsal" = "Standard",
diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm
index 8f65e47d2b..209d46db61 100644
--- a/modular_citadel/code/modules/client/preferences_savefile.dm
+++ b/modular_citadel/code/modules/client/preferences_savefile.dm
@@ -40,6 +40,7 @@
WRITE_FILE(S["feature_mam_ears"], features["mam_ears"])
WRITE_FILE(S["feature_mam_tail_animated"], features["mam_tail_animated"])
WRITE_FILE(S["feature_taur"], features["taur"])
+ WRITE_FILE(S["feature_mam_snouts"], features["mam_snouts"])
//Xeno features
WRITE_FILE(S["feature_xeno_tail"], features["xenotail"])
WRITE_FILE(S["feature_xeno_dors"], features["xenodorsal"])
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 38343838e9..b22989024e 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
@@ -7,12 +7,6 @@
var/extra2_color_src = MUTCOLORS3
var/list/ckeys_allowed
-/* tbi eventually idk
-/datum/sprite_accessory/legs/digitigrade_mam
- name = "Anthro Digitigrade Legs"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-*/
-
/datum/sprite_accessory/moth_wings/none
name = "None"
icon_state = "none"
@@ -29,14 +23,146 @@
name = "None"
icon_state = "None"
+
+/datum/sprite_accessory/tails/lizard/axolotl
+ name = "Axolotl"
+ icon_state = "axolotl"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
+/datum/sprite_accessory/tails_animated/lizard/axolotl
+ name = "Axolotl"
+ icon_state = "axolotl"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
+/************* Lizard compatable snoots ************/
+/datum/sprite_accessory/snouts/bird
+ name = "Beak"
+ icon_state = "bird"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/bigbeak
+ name = "Big Beak"
+ icon_state = "bigbeak"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/bug
+ name = "Bug"
+ icon_state = "bug"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ extra2 = TRUE
+ extra2_color_src = MUTCOLORS3
+
+/datum/sprite_accessory/snouts/elephant
+ name = "Elephant"
+ icon_state = "elephant"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+ extra = TRUE
+ extra_color_src = MUTCOLORS3
+
+/datum/sprite_accessory/snouts/lcanid
+ name = "Mammal, Long"
+ icon_state = "lcanid"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/lcanidalt
+ name = "Mammal, Long ALT"
+ icon_state = "lcanidalt"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/scanid
+ name = "Mammal, Short"
+ icon_state = "scanid"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/scanidalt
+ name = "Mammal, Short ALT"
+ icon_state = "scanidalt"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/wolf
+ name = "Mammal, Thick"
+ icon_state = "wolf"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/wolfalt
+ name = "Mammal, Thick ALT"
+ icon_state = "wolfalt"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/redpanda
+ name = "WahCoon"
+ icon_state = "wah"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/rhino
+ name = "Horn"
+ icon_state = "rhino"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+ extra = TRUE
+ extra = MUTCOLORS3
+
+/datum/sprite_accessory/snouts/rodent
+ name = "Rodent"
+ icon_state = "rodent"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/husky
+ name = "Husky"
+ icon_state = "husky"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/otie
+ name = "Otie"
+ icon_state = "otie"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/pede
+ name = "Scolipede"
+ icon_state = "pede"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/sergal
+ name = "Sergal"
+ icon_state = "sergal"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/snouts/shark
+ name = "Shark"
+ icon_state = "shark"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+
+/datum/sprite_accessory/snouts/toucan
+ name = "Toucan"
+ icon_state = "toucan"
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
+ color_src = MATRIXED
+
/******************************************
************ Human Ears/Tails *************
*******************************************/
/datum/sprite_accessory/tails/human/ailurus
name = "Red Panda"
- icon_state = "ailurus"
- color_src = 0
+ icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/axolotl
@@ -49,7 +175,7 @@
icon_state = "axolotl"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/tails_animated/axolotl
+/datum/sprite_accessory/tails_animated/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
@@ -58,6 +184,7 @@
name = "Bear"
icon_state = "bear"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = MATRIXED
/datum/sprite_accessory/tails/human/bear
name = "Bear"
@@ -83,7 +210,7 @@
name = "Cow"
icon_state = "cow"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- gender_specific = 1
+ color_src = MATRIXED
/datum/sprite_accessory/tails/human/cow
name = "Cow"
@@ -105,6 +232,7 @@
name = "Eevee"
icon_state = "eevee"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = MATRIXED
/datum/sprite_accessory/tails/human/eevee
name = "Eevee"
@@ -120,12 +248,13 @@
name = "Elephant"
icon_state = "elephant"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = MATRIXED
/datum/sprite_accessory/ears/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- hasinner = 1
+ color_src = MATRIXED
/datum/sprite_accessory/tails/human/fennec
name = "Fennec"
@@ -141,39 +270,33 @@
name = "Fish"
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MUTCOLORS3
+ color_src = MATRIXED
/datum/sprite_accessory/tails/human/fish
name = "Fish"
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- extra = TRUE
- extra_color_src = MUTCOLORS3
/datum/sprite_accessory/tails_animated/human/fish
name = "Fish"
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- extra = TRUE
- extra_color_src = MUTCOLORS3
/datum/sprite_accessory/ears/fox
name = "Fox"
icon_state = "fox"
- hasinner = 1
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/fox
name = "Fox"
icon_state = "fox"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- extra = TRUE
/datum/sprite_accessory/tails_animated/human/fox
name = "Fox"
icon_state = "fox"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- extra = TRUE
/datum/sprite_accessory/tails/human/horse
name = "Horse"
@@ -191,15 +314,13 @@
name = "Husky"
icon_state = "husky"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- extra = TRUE
/datum/sprite_accessory/tails_animated/human/husky
name = "Husky"
icon_state = "husky"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- extra = TRUE
- /datum/sprite_accessory/tails/human/insect
+/datum/sprite_accessory/tails/human/insect
name = "Insect"
icon_state = "insect"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
@@ -217,188 +338,199 @@
/datum/sprite_accessory/tails/human/kitsune
name = "Kitsune"
icon_state = "kitsune"
- extra = TRUE
- extra_color_src = MUTCOLORS2
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/kitsune
name = "Kitsune"
icon_state = "kitsune"
- extra = TRUE
- extra_color_src = MUTCOLORS2
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/lab
name = "Dog, Floppy"
icon_state = "lab"
- hasinner = 0
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/murid
name = "Murid"
icon_state = "murid"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = MATRIXED
/datum/sprite_accessory/tails/human/murid
name = "Murid"
icon_state = "murid"
- color_src = 0
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/murid
name = "Murid"
icon_state = "murid"
- color_src = 0
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/otie
name = "Otusian"
icon_state = "otie"
- hasinner= 1
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/otie
name = "Otusian"
icon_state = "otie"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/otie
name = "Otusian"
icon_state = "otie"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/orca
name = "Orca"
icon_state = "orca"
- extra = TRUE
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/orca
name = "Orca"
icon_state = "orca"
- extra = TRUE
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/pede
name = "Scolipede"
icon_state = "pede"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MUTCOLORS2
- extra_color_src = MUTCOLORS3
+ color_src = MATRIXED
/datum/sprite_accessory/tails/human/pede
name = "Scolipede"
icon_state = "pede"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/pede
name = "Scolipede"
icon_state = "pede"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
- hasinner= 1
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
- color_src = 0
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
- color_src = 0
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/sergal
name = "Sergal"
icon_state = "sergal"
- hasinner= 1
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = MATRIXED
/datum/sprite_accessory/tails/human/sergal
name = "Sergal"
icon_state = "sergal"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/sergal
name = "Sergal"
icon_state = "sergal"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/skunk
name = "skunk"
icon_state = "skunk"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = MATRIXED
/datum/sprite_accessory/tails/human/skunk
name = "skunk"
icon_state = "skunk"
- color_src = 0
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/skunk
name = "skunk"
icon_state = "skunk"
- color_src = 0
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/shark
name = "Shark"
icon_state = "shark"
- color_src = MUTCOLORS
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/shark/datashark
name = "datashark"
icon_state = "datashark"
- color_src = 0
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/squirrel
name = "Squirrel"
icon_state = "squirrel"
- hasinner= 1
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = MATRIXED
/datum/sprite_accessory/tails/human/squirrel
name = "Squirrel"
icon_state = "squirrel"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/squirrel
name = "Squirrel"
icon_state = "squirrel"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/yentacle
name = "Tentacle"
icon_state = "tentacle"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/tentacle
name = "Tentacle"
icon_state = "tentacle"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/wolf
name = "Wolf"
icon_state = "wolf"
- hasinner = 1
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
icon_state = "wolf"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/wolf
name = "Wolf"
icon_state = "wolf"
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/******************************************
@@ -406,126 +538,253 @@
*******************************************/
/datum/sprite_accessory/mam_ears
- extra = TRUE
- extra2 = TRUE
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- extra_icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- extra2_icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = MATRIXED
/datum/sprite_accessory/mam_ears/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/mam_tails
- extra = TRUE
- extra2 = TRUE
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- extra_icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- extra2_icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/mam_tails/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/mam_tails_animated
- extra = TRUE
- extra2 = TRUE
+ color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- extra_icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- extra2_icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/mam_tails_animated/none
name = "None"
icon_state = "none"
+ color_src = MATRIXED
-/datum/sprite_accessory/snouts
+/datum/sprite_accessory/mam_snouts
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
-/datum/sprite_accessory/snouts/none
+/datum/sprite_accessory/mam_snouts/none
name = "None"
icon_state = "none"
- extra_icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- extra2_icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
/******************************************
**************** Snouts *******************
*******************************************/
-/datum/sprite_accessory/snouts/bird
+/datum/sprite_accessory/mam_snouts/bird
name = "Beak"
icon_state = "bird"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MUTCOLORS3
-/datum/sprite_accessory/snouts/bigbeak
+/datum/sprite_accessory/mam_snouts/bigbeak
name = "Big Beak"
icon_state = "bigbeak"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MUTCOLORS3
-/datum/sprite_accessory/snouts/elephant
+/datum/sprite_accessory/mam_snouts/bug
+ name = "Bug"
+ icon_state = "bug"
+ color_src = MUTCOLORS
+ extra2 = TRUE
+ extra2_color_src = MUTCOLORS3
+
+/datum/sprite_accessory/mam_snouts/elephant
name = "Elephant"
icon_state = "elephant"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
extra = TRUE
extra_color_src = MUTCOLORS3
-/datum/sprite_accessory/snouts/lcanid
- name = "Fox, Long"
+/datum/sprite_accessory/mam_snouts/lcanid
+ name = "Mammal, Long"
icon_state = "lcanid"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- extra = TRUE
-/datum/sprite_accessory/snouts/scanid
- name = "Fox, Short"
+/datum/sprite_accessory/mam_snouts/lcanidalt
+ name = "Mammal, Long ALT"
+ icon_state = "lcanidalt"
+
+/datum/sprite_accessory/mam_snouts/scanid
+ name = "Mammal, Short"
icon_state = "scanid"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- extra = TRUE
-/datum/sprite_accessory/snouts/wolf
- name = "Wolf"
+/datum/sprite_accessory/mam_snouts/scanidalt
+ name = "Mammal, Short ALT"
+ icon_state = "scanidalt"
+
+/datum/sprite_accessory/mam_snouts/wolf
+ name = "Mammal, Thick"
icon_state = "wolf"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- extra = TRUE
-/datum/sprite_accessory/snouts/rhino
+/datum/sprite_accessory/mam_snouts/wolfalt
+ name = "Mammal, Thick ALT"
+ icon_state = "wolfalt"
+
+/datum/sprite_accessory/mam_snouts/redpanda
+ name = "WahCoon"
+ icon_state = "wah"
+
+/datum/sprite_accessory/mam_snouts/rhino
name = "Horn"
icon_state = "rhino"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
extra = TRUE
extra = MUTCOLORS3
-/datum/sprite_accessory/snouts/husky
+/datum/sprite_accessory/mam_snouts/rodent
+ name = "Rodent"
+ icon_state = "rodent"
+
+/datum/sprite_accessory/mam_snouts/husky
name = "Husky"
icon_state = "husky"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- extra = TRUE
-/datum/sprite_accessory/snouts/otie
+/datum/sprite_accessory/mam_snouts/otie
name = "Otie"
icon_state = "otie"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- extra = TRUE
-/datum/sprite_accessory/snouts/pede
+/datum/sprite_accessory/mam_snouts/pede
name = "Scolipede"
icon_state = "pede"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- extra = TRUE
- color_src = MUTCOLORS
- extra_color_src = MUTCOLORS2
-/datum/sprite_accessory/snouts/sergal
+/datum/sprite_accessory/mam_snouts/sergal
name = "Sergal"
icon_state = "sergal"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MUTCOLORS2
-/datum/sprite_accessory/snouts/toucan
+/datum/sprite_accessory/mam_snouts/shark
+ name = "Shark"
+ icon_state = "shark"
+
+/datum/sprite_accessory/mam_snouts/toucan
name = "Toucan"
icon_state = "toucan"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MUTCOLORS3
+
+/datum/sprite_accessory/mam_snouts/sharp
+ name = "Sharp"
+ icon_state = "sharp"
+ color_src = MUTCOLORS
+
+/datum/sprite_accessory/mam_snouts/round
+ name = "Round"
+ icon_state = "round"
+ color_src = MUTCOLORS
+
+/datum/sprite_accessory/mam_snouts/sharplight
+ name = "Sharp + Light"
+ icon_state = "sharplight"
+ color_src = MUTCOLORS
+
+/datum/sprite_accessory/mam_snouts/roundlight
+ name = "Round + Light"
+ icon_state = "roundlight"
+ color_src = MUTCOLORS
+
+
+/******************************************
+**************** Snouts *******************
+*************but higher up*****************/
+
+/datum/sprite_accessory/mam_snouts/fbird
+ name = "Beak (Top)"
+ icon_state = "fbird"
+
+/datum/sprite_accessory/mam_snouts/fbigbeak
+ name = "Big Beak (Top)"
+ icon_state = "fbigbeak"
+
+/datum/sprite_accessory/mam_snouts/fbug
+ name = "Bug (Top)"
+ icon_state = "fbug"
+ color_src = MUTCOLORS
+ extra2 = TRUE
+ extra2_color_src = MUTCOLORS3
+
+/datum/sprite_accessory/mam_snouts/felephant
+ name = "Elephant (Top)"
+ icon_state = "felephant"
+ extra = TRUE
+ extra_color_src = MUTCOLORS3
+
+/datum/sprite_accessory/mam_snouts/flcanid
+ name = "Mammal, Long (Top)"
+ icon_state = "flcanid"
+
+/datum/sprite_accessory/mam_snouts/flcanidalt
+ name = "Mammal, Long ALT (Top)"
+ icon_state = "flcanidalt"
+
+/datum/sprite_accessory/mam_snouts/fscanid
+ name = "Mammal, Short (Top)"
+ icon_state = "fscanid"
+
+/datum/sprite_accessory/mam_snouts/fscanidalt
+ name = "Mammal, Short ALT (Top)"
+ icon_state = "fscanidalt"
+
+/datum/sprite_accessory/mam_snouts/fwolf
+ name = "Mammal, Thick (Top)"
+ icon_state = "fwolf"
+
+/datum/sprite_accessory/mam_snouts/fwolfalt
+ name = "Mammal, Thick ALT (Top)"
+ icon_state = "fwolfalt"
+
+/datum/sprite_accessory/mam_snouts/fredpanda
+ name = "WahCoon (Top)"
+ icon_state = "fwah"
+
+/datum/sprite_accessory/mam_snouts/frhino
+ name = "Horn (Top)"
+ icon_state = "frhino"
+ extra = TRUE
+ extra = MUTCOLORS3
+
+/datum/sprite_accessory/mam_snouts/frodent
+ name = "Rodent (Top)"
+ icon_state = "frodent"
+
+/datum/sprite_accessory/mam_snouts/fhusky
+ name = "Husky (Top)"
+ icon_state = "fhusky"
+
+/datum/sprite_accessory/mam_snouts/fotie
+ name = "Otie (Top)"
+ icon_state = "fotie"
+
+/datum/sprite_accessory/mam_snouts/fpede
+ name = "Scolipede (Top)"
+ icon_state = "fpede"
+
+/datum/sprite_accessory/mam_snouts/fsergal
+ name = "Sergal (Top)"
+ icon_state = "fsergal"
+
+/datum/sprite_accessory/mam_snouts/fshark
+ name = "Shark (Top)"
+ icon_state = "fshark"
+
+/datum/sprite_accessory/mam_snouts/ftoucan
+ name = "Toucan (Top)"
+ icon_state = "ftoucan"
+
+/datum/sprite_accessory/mam_snouts/fsharp
+ name = "Sharp (Top)"
+ icon_state = "fsharp"
+ color_src = MUTCOLORS
+
+/datum/sprite_accessory/mam_snouts/fround
+ name = "Round (Top)"
+ icon_state = "fround"
+ color_src = MUTCOLORS
+
+/datum/sprite_accessory/mam_snouts/fsharplight
+ name = "Sharp + Light (Top)"
+ icon_state = "fsharplight"
+ color_src = MUTCOLORS
+
+/datum/sprite_accessory/mam_snouts/froundlight
+ name = "Round + Light (Top)"
+ icon_state = "froundlight"
+ color_src = MUTCOLORS
/******************************************
***************** Ears ********************
@@ -539,18 +798,47 @@
name = "Bear"
icon_state = "bear"
+/datum/sprite_accessory/mam_ears/bigwolf
+ name = "Big Wolf"
+ icon_state = "bigwolf"
+
+/datum/sprite_accessory/mam_ears/bigwolfinner
+ name = "Big Wolf (ALT)"
+ icon_state = "bigwolfinner"
+ hasinner = 1
+
+/datum/sprite_accessory/mam_ears/bigwolfdark
+ name = "Dark Big Wolf"
+ icon_state = "bigwolfdark"
+
+/datum/sprite_accessory/mam_ears/bigwolfinnerdark
+ name = "Dark Big Wolf (ALT)"
+ icon_state = "bigwolfinnerdark"
+ hasinner = 1
+
+/datum/sprite_accessory/mam_ears/cat
+ name = "Cat"
+ icon_state = "cat"
+ hasinner = 1
+ color_src = HAIR
+
/datum/sprite_accessory/mam_ears/catbig
name = "Cat, Big"
icon_state = "catbig"
- hasinner = 1
/datum/sprite_accessory/mam_ears/cow
name = "Cow"
icon_state = "cow"
+/datum/sprite_accessory/mam_ears/curled
+ name = "Curled Horn"
+ icon_state = "horn1"
+ color_src = MUTCOLORS3
+
/datum/sprite_accessory/mam_ears/deer
name = "Deer"
icon_state = "deer"
+ color_src = MUTCOLORS3
/datum/sprite_accessory/mam_ears/eevee
name = "Eevee"
@@ -563,17 +851,14 @@
/datum/sprite_accessory/mam_ears/fennec
name = "Fennec"
icon_state = "fennec"
- hasinner = 1
/datum/sprite_accessory/mam_ears/fish
name = "Fish"
icon_state = "fish"
- color_src = MUTCOLORS3
/datum/sprite_accessory/mam_ears/fox
name = "Fox"
icon_state = "fox"
- hasinner = 1
/datum/sprite_accessory/mam_ears/husky
name = "Husky"
@@ -583,6 +868,11 @@
name = "kangaroo"
icon_state = "kangaroo"
+/datum/sprite_accessory/mam_ears/jellyfish
+ name = "Jellyfish"
+ icon_state = "jellyfish"
+ color_src = HAIR
+
/datum/sprite_accessory/mam_ears/lab
name = "Dog, Long"
icon_state = "lab"
@@ -591,37 +881,25 @@
name = "Murid"
icon_state = "murid"
-/datum/sprite_accessory/mam_ears/neko
- name = "Neko"
- icon_state = "cat"
- hasinner = 1
- color_src = HAIR
-
/datum/sprite_accessory/mam_ears/otie
name = "Otusian"
icon_state = "otie"
- hasinner= 1
/datum/sprite_accessory/mam_ears/squirrel
name = "Squirrel"
icon_state = "squirrel"
- hasinner= 1
/datum/sprite_accessory/mam_ears/pede
name = "Scolipede"
icon_state = "pede"
- color_src = MUTCOLORS2
- extra_color_src = MUTCOLORS3
/datum/sprite_accessory/mam_ears/rabbit
name = "Rabbit"
icon_state = "rabbit"
- hasinner= 1
/datum/sprite_accessory/mam_ears/sergal
name = "Sergal"
icon_state = "sergal"
- hasinner= 1
/datum/sprite_accessory/mam_ears/skunk
name = "skunk"
@@ -630,20 +908,19 @@
/datum/sprite_accessory/mam_ears/wolf
name = "Wolf"
icon_state = "wolf"
- hasinner = 1
/******************************************
*********** Tails and Things **************
*******************************************/
/datum/sprite_accessory/mam_tails/ailurus
- name = "Ailurus"
- icon_state = "ailurus"
+ name = "Red Panda"
+ icon_state = "wah"
extra = TRUE
/datum/sprite_accessory/mam_tails_animated/ailurus
- name = "Ailurus"
- icon_state = "ailurus"
+ name = "Red Panda"
+ icon_state = "wah"
extra = TRUE
/datum/sprite_accessory/mam_tails/axolotl
@@ -662,6 +939,16 @@
name = "Bear"
icon_state = "bear"
+/datum/sprite_accessory/mam_tails/cat
+ name = "Cat"
+ icon_state = "cat"
+ color_src = HAIR
+
+/datum/sprite_accessory/mam_tails_animated/cat
+ name = "Cat"
+ icon_state = "cat"
+ color_src = HAIR
+
/datum/sprite_accessory/mam_tails/catbig
name = "Cat, Big"
icon_state = "catbig"
@@ -670,6 +957,14 @@
name = "Cat, Big"
icon_state = "catbig"
+/datum/sprite_accessory/mam_tails/corvid
+ name = "Corvid"
+ icon_state = "crow"
+
+/datum/sprite_accessory/mam_tails_animated/corvid
+ name = "Corvid"
+ icon_state = "crow"
+
/datum/sprite_accessory/mam_tail/cow
name = "Cow"
icon_state = "cow"
@@ -678,19 +973,13 @@
name = "Cow"
icon_state = "cow"
-/datum/sprite_accessory/mam_ears/curled
- name = "Curled Horn"
- icon_state = "horn1"
-
/datum/sprite_accessory/mam_tails/eevee
name = "Eevee"
icon_state = "eevee"
- extra = TRUE
/datum/sprite_accessory/mam_tails_animated/eevee
name = "Eevee"
icon_state = "eevee"
- extra = TRUE
/datum/sprite_accessory/mam_tails/fennec
name = "Fennec"
@@ -703,24 +992,18 @@
/datum/sprite_accessory/mam_tails/human/fish
name = "Fish"
icon_state = "fish"
- extra = TRUE
- extra_color_src = MUTCOLORS3
/datum/sprite_accessory/mam_tails_animated/human/fish
name = "Fish"
icon_state = "fish"
- extra = TRUE
- extra_color_src = MUTCOLORS3
/datum/sprite_accessory/mam_tails/fox
name = "Fox"
icon_state = "fox"
- extra = TRUE
/datum/sprite_accessory/mam_tails_animated/fox
name = "Fox"
icon_state = "fox"
- extra = TRUE
/datum/sprite_accessory/mam_tails/hawk
name = "Hawk"
@@ -743,12 +1026,10 @@
/datum/sprite_accessory/mam_tails/husky
name = "Husky"
icon_state = "husky"
- extra = TRUE
/datum/sprite_accessory/mam_tails_animated/husky
name = "Husky"
icon_state = "husky"
- extra = TRUE
datum/sprite_accessory/mam_tails/insect
name = "Insect"
@@ -766,20 +1047,13 @@ datum/sprite_accessory/mam_tails/insect
name = "kangaroo"
icon_state = "kangaroo"
-/datum/sprite_accessory/mam_ears/jellyfish
- name = "Jellyfish"
- icon_state = "jellyfish"
- color_src = HAIR
-
/datum/sprite_accessory/mam_tails/kitsune
name = "Kitsune"
icon_state = "kitsune"
- extra = TRUE
/datum/sprite_accessory/mam_tails_animated/kitsune
name = "Kitsune"
icon_state = "kitsune"
- extra = TRUE
/datum/sprite_accessory/mam_tails/lab
name = "Lab"
@@ -792,22 +1066,10 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_tails/murid
name = "Murid"
icon_state = "murid"
- color_src = 0
/datum/sprite_accessory/mam_tails_animated/murid
name = "Murid"
icon_state = "murid"
- color_src = 0
-
-/datum/sprite_accessory/mam_tails/neko
- name = "Neko"
- icon_state = "cat"
- color_src = HAIR
-
-/datum/sprite_accessory/mam_tails_animated/neko
- name = "Neko"
- icon_state = "cat"
- color_src = HAIR
/datum/sprite_accessory/mam_tails/otie
name = "Otusian"
@@ -820,12 +1082,10 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_tails/orca
name = "Orca"
icon_state = "orca"
- extra = TRUE
/datum/sprite_accessory/mam_tails_animated/orca
name = "Orca"
icon_state = "orca"
- extra = TRUE
/datum/sprite_accessory/mam_tails/pede
name = "Scolipede"
@@ -852,38 +1112,36 @@ datum/sprite_accessory/mam_tails/insect
icon_state = "sergal"
/datum/sprite_accessory/mam_tails/skunk
- name = "skunk"
+ name = "Skunk"
icon_state = "skunk"
- color_src = 0
- extra = TRUE
/datum/sprite_accessory/mam_tails_animated/skunk
- name = "skunk"
+ name = "Skunk"
icon_state = "skunk"
- color_src = 0
- extra = TRUE
/datum/sprite_accessory/mam_tails/shark
name = "Shark"
icon_state = "shark"
- color_src = MUTCOLORS
/datum/sprite_accessory/mam_tails_animated/shark
name = "Shark"
icon_state = "shark"
- color_src = MUTCOLORS
/datum/sprite_accessory/mam_tails/shepherd
name = "Shepherd"
icon_state = "shepherd"
- extra = TRUE
- extra2 = TRUE
/datum/sprite_accessory/mam_tails_animated/shepherd
name = "Shepherd"
icon_state = "shepherd"
- extra = TRUE
- extra2 = TRUE
+
+/datum/sprite_accessory/mam_tails/straighttail
+ name = "Straight Tail"
+ icon_state = "straighttail"
+
+/datum/sprite_accessory/mam_tails_animated/straighttail
+ name = "Straight Tail"
+ icon_state = "straighttail"
/datum/sprite_accessory/mam_tails/squirrel
name = "Squirrel"
@@ -893,7 +1151,7 @@ datum/sprite_accessory/mam_tails/insect
name = "Squirrel"
icon_state = "squirrel"
-datum/sprite_accessory/mam_tails/tentacle
+/datum/sprite_accessory/mam_tails/tentacle
name = "Tentacle"
icon_state = "tentacle"
@@ -901,6 +1159,14 @@ datum/sprite_accessory/mam_tails/tentacle
name = "Tentacle"
icon_state = "tentacle"
+/datum/sprite_accessory/mam_tails/tiger
+ name = "Tiger"
+ icon_state = "tiger"
+
+/datum/sprite_accessory/mam_tails_animated/tiger
+ name = "Tiger"
+ icon_state = "tiger"
+
/datum/sprite_accessory/mam_tails/wolf
name = "Wolf"
icon_state = "wolf"
@@ -914,150 +1180,168 @@ datum/sprite_accessory/mam_tails/tentacle
*******************************************/
/datum/sprite_accessory/mam_body_markings
- extra = TRUE
- extra2 = TRUE
- icon = 'modular_citadel/icons/mob/mam_body_markings.dmi'
+ extra = FALSE
+ extra2 = FALSE
+ color_src = MATRIXED
+ gender_specific = 0
+ icon = 'modular_citadel/icons/mob/mam_markings.dmi'
/datum/sprite_accessory/mam_body_markings/none
name = "None"
icon_state = "none"
+ color_src = MUTCOLORS
+
+/datum/sprite_accessory/mam_body_markings/plain
+ name = "Plain"
+ icon_state = "plain"
/datum/sprite_accessory/mam_body_markings/ailurus
- name = "Red Panda"
- icon_state = "ailurus"
- gender_specific = 1
-
-/datum/sprite_accessory/mam_body_markings/belly
- name = "Bee"
- icon_state = "bee"
- color_src = MUTCOLORS3
- gender_specific = 1
+ name = "Redpanda"
+ icon_state = "wah"
/datum/sprite_accessory/mam_body_markings/bee
+ name = "Bee"
+ icon_state = "bee"
+
+/datum/sprite_accessory/mam_body_markings/belly
name = "Belly"
icon_state = "belly"
- gender_specific = 1
+
+/datum/sprite_accessory/mam_body_markings/bellyslim
+ name = "Bellyslim"
+ icon_state = "bellyslim"
/datum/sprite_accessory/mam_body_markings/corgi
name = "Corgi"
icon_state = "corgi"
- color_src = MUTCOLORS2
- extra_color_src = MUTCOLORS3
- gender_specific = 1
/datum/sprite_accessory/mam_body_markings/cow
- name = "Cow"
- icon_state = "cow"
- color_src = MUTCOLORS2
- extra_color_src = MUTCOLORS3
- gender_specific = 1
+ name = "Bovine"
+ icon_state = "bovine"
/datum/sprite_accessory/mam_body_markings/corvid
- name = "Crow"
+ name = "Corvid"
icon_state = "corvid"
- gender_specific = 1
+
+/datum/sprite_accessory/mam_body_markings/dalmation
+ name = "Dalmation"
+ icon_state = "dalmation"
/datum/sprite_accessory/mam_body_markings/deer
name = "Deer"
icon_state = "deer"
- color_src = MUTCOLORS2
- extra_color_src = MUTCOLORS3
- gender_specific = 1
/datum/sprite_accessory/mam_body_markings/eevee
name = "Eevee"
icon_state = "eevee"
- color_src = MUTCOLORS3
+
+/datum/sprite_accessory/mam_body_markings/hippo
+ name = "Hippo"
+ icon_state = "hippo"
/datum/sprite_accessory/mam_body_markings/fennec
name = "Fennec"
icon_state = "Fennec"
- gender_specific = 1
/datum/sprite_accessory/mam_body_markings/fox
name = "Fox"
icon_state = "fox"
- gender_specific = 1
/datum/sprite_accessory/mam_body_markings/frog
name = "Frog"
icon_state = "frog"
- gender_specific = 1
- color_src = MUTCOLORS2
+
+/datum/sprite_accessory/mam_body_markings/goat
+ name = "Goat"
+ icon_state = "goat"
+
+/datum/sprite_accessory/mam_body_markings/handsfeet
+ name = "Handsfeet"
+ icon_state = "handsfeet"
/datum/sprite_accessory/mam_body_markings/hawk
name = "Hawk"
icon_state = "hawk"
- gender_specific = 1
/datum/sprite_accessory/mam_body_markings/husky
name = "Husky"
icon_state = "husky"
- gender_specific = 1
+
+/datum/sprite_accessory/mam_body_markings/hyena
+ name = "Hyena"
+ icon_state = "hyena"
+
+/datum/sprite_accessory/mam_body_markings/lab
+ name = "Lab"
+ icon_state = "lab"
/datum/sprite_accessory/mam_body_markings/moth
name = "Moth"
icon_state = "moth"
- color_src = MUTCOLORS2
- extra_color_src = MUTCOLORS3
- gender_specific = 1
/datum/sprite_accessory/mam_body_markings/otie
name = "Otie"
icon_state = "otie"
- gender_specific = 1
+
+/datum/sprite_accessory/mam_body_markings/otter
+ name = "Otter"
+ icon_state = "otter"
/datum/sprite_accessory/mam_body_markings/orca
name = "Orca"
icon_state = "orca"
- color_src = MUTCOLORS2
- gender_specific = 1
+
+/datum/sprite_accessory/mam_body_markings/panther
+ name = "Panther"
+ icon_state = "panther"
+
+/datum/sprite_accessory/mam_body_markings/possum
+ name = "Possum"
+ icon_state = "possum"
+
+/datum/sprite_accessory/mam_body_markings/raccoon
+ name = "Raccoon"
+ icon_state = "raccoon"
/datum/sprite_accessory/mam_body_markings/pede
name = "Scolipede"
- icon_state = "pede"
- extra = TRUE
- extra_color_src = MUTCOLORS3
- color_src = MUTCOLORS2
- gender_specific = 1
+ icon_state = "scolipede"
/datum/sprite_accessory/mam_body_markings/shark
name = "Shark"
icon_state = "shark"
- color_src = MUTCOLORS2
- extra_color_src = MUTCOLORS3
- gender_specific = 1
+
+/datum/sprite_accessory/mam_body_markings/skunk
+ name = "Skunk"
+ icon_state = "skunk"
+
+/datum/sprite_accessory/mam_body_markings/sergal
+ name = "Sergal"
+ icon_state = "sergal"
/datum/sprite_accessory/mam_body_markings/shepherd
name = "Shepherd"
icon_state = "shepherd"
- gender_specific = 1
+
+/datum/sprite_accessory/mam_body_markings/tajaran
+ name = "Tajaran"
+ icon_state = "tajaran"
/datum/sprite_accessory/mam_body_markings/tiger
- name = "Tiger Stripes"
- color_src = MUTCOLORS3
+ name = "Tiger"
icon_state = "tiger"
/datum/sprite_accessory/mam_body_markings/turian
name = "Turian"
- extra = TRUE
- color_src = MUTCOLORS
- extra_color_src = MUTCOLORS2
icon_state = "turian"
- gender_specific = 1
/datum/sprite_accessory/mam_body_markings/wolf
name = "Wolf"
icon_state = "wolf"
- color_src = MUTCOLORS2
- gender_specific = 1
/datum/sprite_accessory/mam_body_markings/xeno
name = "Xeno"
icon_state = "xeno"
- color_src = MUTCOLORS2
- extra_color_src = MUTCOLORS3
- gender_specific = 1
/******************************************
@@ -1072,6 +1356,7 @@ datum/sprite_accessory/mam_tails/tentacle
center = TRUE
dimension_x = 64
var/taur_mode = NOT_TAURIC
+ color_src = MATRIXED
/datum/sprite_accessory/taur/none
name = "None"
@@ -1090,11 +1375,13 @@ datum/sprite_accessory/mam_tails/tentacle
/datum/sprite_accessory/taur/drider
name = "Drider"
icon_state = "drider"
+ color_src = MUTCOLORS
/datum/sprite_accessory/taur/eevee
name = "Eevee"
icon_state = "eevee"
taur_mode = PAW_TAURIC
+ color_src = MUTCOLORS
/datum/sprite_accessory/taur/fox
name = "Fox"
@@ -1130,6 +1417,7 @@ datum/sprite_accessory/mam_tails/tentacle
name = "Scolipede"
icon_state = "pede"
taur_mode = PAW_TAURIC
+ color_src = MUTCOLORS
/datum/sprite_accessory/taur/panther
name = "Panther"
@@ -1141,15 +1429,16 @@ datum/sprite_accessory/mam_tails/tentacle
icon_state = "shepherd"
taur_mode = PAW_TAURIC
-/datum/sprite_accessory/taur/tajaran
- name = "Tajaran"
- icon_state = "tajaran"
- taur_mode = PAW_TAURIC
-
/datum/sprite_accessory/taur/tentacle
name = "Tentacle"
icon_state = "tentacle"
taur_mode = SNEK_TAURIC
+ color_src = MUTCOLORS
+
+/datum/sprite_accessory/taur/tiger
+ name = "Tiger"
+ icon_state = "tiger"
+ taur_mode = PAW_TAURIC
/datum/sprite_accessory/taur/wolf
name = "Wolf"
@@ -1365,17 +1654,15 @@ datum/sprite_accessory/mam_tails/tentacle
/datum/sprite_accessory/body_markings/guilmon
name = "Guilmon"
icon_state = "guilmon"
- gender_specific = 1
+ color_src = MATRIXED
/datum/sprite_accessory/tails/lizard/guilmon
name = "Guilmon"
icon_state = "guilmon"
- extra = TRUE
/datum/sprite_accessory/tails_animated/lizard/guilmon
name = "Guilmon"
icon_state = "guilmon"
- extra = TRUE
/datum/sprite_accessory/horns/guilmon
name = "Guilmon"
@@ -1385,52 +1672,41 @@ datum/sprite_accessory/mam_tails/tentacle
/datum/sprite_accessory/snout/guilmon
name = "Guilmon"
icon_state = "guilmon"
+ color_src = MATRIXED
/datum/sprite_accessory/mam_tails/shark/datashark
name = "DataShark"
icon_state = "datashark"
- color_src = 0
ckeys_allowed = list("rubyflamewing")
/datum/sprite_accessory/mam_tails_animated/shark/datashark
name = "DataShark"
icon_state = "datashark"
- color_src = 0
/datum/sprite_accessory/mam_body_markings/shark/datashark
name = "DataShark"
icon_state = "datashark"
- color_src = MUTCOLORS2
ckeys_allowed = list("rubyflamewing")
-
//Sabresune
/datum/sprite_accessory/mam_ears/sabresune
name = "sabresune"
icon_state = "sabresune"
- hasinner = 1
- extra = TRUE
- extra_color_src = MUTCOLORS3
ckeys_allowed = list("poojawa")
/datum/sprite_accessory/mam_tails/sabresune
name = "sabresune"
icon_state = "sabresune"
- extra = TRUE
ckeys_allowed = list("poojawa")
/datum/sprite_accessory/mam_tails_animated/sabresune
name = "sabresune"
icon_state = "sabresune"
- extra = TRUE
/datum/sprite_accessory/mam_body_markings/sabresune
name = "Sabresune"
icon_state = "sabresune"
- color_src = MUTCOLORS2
- extra = FALSE
- extra2 = FALSE
ckeys_allowed = list("poojawa")
@@ -1438,21 +1714,16 @@ datum/sprite_accessory/mam_tails/tentacle
/datum/sprite_accessory/mam_ears/lunasune
name = "lunasune"
icon_state = "lunasune"
- hasinner = 1
- extra = TRUE
- extra_color_src = MUTCOLORS2
ckeys_allowed = list("invader4352")
/datum/sprite_accessory/mam_tails/lunasune
name = "lunasune"
icon_state = "lunasune"
- extra = TRUE
ckeys_allowed = list("invader4352")
/datum/sprite_accessory/mam_tails_animated/lunasune
name = "lunasune"
icon_state = "lunasune"
- extra = TRUE
/*************** VIRGO PORTED HAIRS ****************************/
#define VHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = "Virgo - " + #_name
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 1dd6276140..73a50dccf0 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/species.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species.dm
@@ -98,6 +98,8 @@
return GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if("mam_ears")
return GLOB.mam_ears_list[H.dna.features["mam_ears"]]
+ if("mam_snouts")
+ return GLOB.mam_snouts_list[H.dna.features["mam_snouts"]]
if("taur")
return GLOB.taur_list[H.dna.features["taur"]]
if("xenodorsal")
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 16c5460174..edc36ae3af 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
@@ -5,8 +5,8 @@
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "snout", "taur", "legs")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "snout" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs")
+ mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "legs")
+ default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs")
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -46,6 +46,7 @@
/datum/species/mammal/qualifies_for_rank(rank, list/features)
return TRUE
+
//AVIAN//
/datum/species/avian
name = "Avian"
@@ -55,8 +56,8 @@
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("snout", "wings", "taur", "mam_tail", "mam_body_markings", "taur")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "snout" = "Beak", "wings" = "None", "taur" = "None", "mam_body_markings" = "Hawk", "mam_tail" = "Hawk")
+ mutant_bodyparts = list("mam_snouts", "wings", "taur", "mam_tail", "mam_body_markings", "taur")
+ default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Beak", "mam_body_markings" = "Hawk", "wings" = "None", "taur" = "None", "mam_tail" = "Hawk")
attack_verb = "peck"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -101,8 +102,8 @@
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("mam_tail", "mam_body_markings", "mam_ears", "taur", "legs")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "Shark", "mam_body_markings" = "Shark", "mam_ears" = "None", "snout" = "Round", "taur" = "None", "legs" = "Normal Legs")
+ mutant_bodyparts = list("mam_tail", "mam_ears","mam_body_markings", "taur", "legs", "mam_snouts")
+ 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")
attack_verb = "bite"
attack_sound = 'sound/weapons/bite.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -148,8 +149,8 @@
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
- mutant_bodyparts = list("mam_body_markings", "mam_ears", "mam_tail", "taur", "moth_wings")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_body_markings" = "Moth", "mam_tail" = "None", "mam_ears" = "None", "moth_wings" = "Plain", "snout" = "None", "taur" = "None")
+ mutant_bodyparts = list("mam_ears", "mam_body_markings", "mam_tail", "taur", "moth_wings", "mam_snouts")
+ default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "moth_wings" = "Plain", "mam_snouts" = "Bug", "mam_body_markings" = "Moth", "taur" = "None")
attack_verb = "flutter" //wat?
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -196,8 +197,8 @@
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur", "mam_body_markings")
- default_features = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "Xeno")
+ mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "mam_body_markings", "taur")
+ default_features = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
diff --git a/modular_citadel/icons/mob/citadel_refs/mam_body_markings Matrixed Ref.dmi b/modular_citadel/icons/mob/citadel_refs/mam_body_markings Matrixed Ref.dmi
new file mode 100644
index 0000000000..7cf2c599ee
Binary files /dev/null and b/modular_citadel/icons/mob/citadel_refs/mam_body_markings Matrixed Ref.dmi differ
diff --git a/modular_citadel/icons/mob/mam_body_markings.dmi b/modular_citadel/icons/mob/mam_body_markings.dmi
deleted file mode 100644
index 99f4d0624c..0000000000
Binary files a/modular_citadel/icons/mob/mam_body_markings.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi
index 51ffd28bbc..b3946b546c 100644
Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ
diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi
new file mode 100644
index 0000000000..1d64bb857f
Binary files /dev/null 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 98b62f929d..0bcfab6905 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 OLD.dmi b/modular_citadel/icons/mob/mam_tails OLD.dmi
new file mode 100644
index 0000000000..7627b71b35
Binary files /dev/null and b/modular_citadel/icons/mob/mam_tails OLD.dmi differ
diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi
index 7627b71b35..8c97b869d6 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 5591636886..ebaa0123ae 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/markings_notmammals.dmi b/modular_citadel/icons/mob/markings_notmammals.dmi
new file mode 100644
index 0000000000..4161ea2cea
Binary files /dev/null and b/modular_citadel/icons/mob/markings_notmammals.dmi differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index 7dcff09747..f369f21afb 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/modular_citadel/interface/skin.dmf b/modular_citadel/interface/skin.dmf
index eca2dda112..39626ef912 100644
--- a/modular_citadel/interface/skin.dmf
+++ b/modular_citadel/interface/skin.dmf
@@ -287,3 +287,30 @@ window "statwindow"
prefix-color = #ebebeb
suffix-color = #ebebeb
+window "preferences_window"
+ elem "preferences_window"
+ type = MAIN
+ pos = 372,0
+ size = 1120x1000
+ anchor1 = none
+ anchor2 = none
+ background-color = none
+ is-visible = false
+ saved-params = "pos;size;is-minimized;is-maximized"
+ statusbar = false
+ elem "preferences_browser"
+ type = BROWSER
+ pos = -8,-8
+ size = 896x1008
+ anchor1 = 0,0
+ anchor2 = 90,100
+ background-color = none
+ saved-params = ""
+ elem "character_preview_map"
+ type = MAP
+ pos = 887,0
+ size = 313x1000
+ anchor1 = 90,0
+ anchor2 = 100,100
+ right-click = true
+ saved-params = "zoom;letterbox;zoom-mode"
\ No newline at end of file
diff --git a/tools/HumanScissors/!README.txt b/tools/HumanScissors/!README.txt
new file mode 100644
index 0000000000..d8396c8b85
--- /dev/null
+++ b/tools/HumanScissors/!README.txt
@@ -0,0 +1,7 @@
+This small Byond program takes all the icons in SpritesToSnip.dmi,
+cuts them using all the icons in CookieCutter.dmi, and produces a file save
+dialog for you to download the resulting DMI.
+
+Useful for cutting up species sprites from full body ones. Or whatever else.
+
+--Arokha/Aronai
\ No newline at end of file
diff --git a/tools/HumanScissors/CookieCutter.dmi b/tools/HumanScissors/CookieCutter.dmi
new file mode 100644
index 0000000000..f0fcf87617
Binary files /dev/null and b/tools/HumanScissors/CookieCutter.dmi differ
diff --git a/tools/HumanScissors/HumanScissors.dm b/tools/HumanScissors/HumanScissors.dm
new file mode 100644
index 0000000000..28a9f804af
--- /dev/null
+++ b/tools/HumanScissors/HumanScissors.dm
@@ -0,0 +1,56 @@
+/*
+ These are simple defaults for your project.
+ */
+
+world
+ fps = 25 // 25 frames per second
+ icon_size = 32 // 32x32 icon size by default
+
+ view = 6 // show up to 6 tiles outward from center (13x13 view)
+
+
+// Make objects move 8 pixels per tick when walking
+//usr << ftp(usr.working,"[usr.outfile].dmi")
+mob
+ step_size = 8
+
+obj
+ step_size = 8
+
+
+
+client/verb/split_sprites()
+ set name = "Begin The Decimation"
+ set desc = "Loads SpritesToSnip.dmi and cuts them with CookieCutter.dmi"
+ set category = "Here"
+
+ var/icon/SpritesToSnip = icon('SpritesToSnip.dmi')
+ var/icon/CookieCutter = icon('CookieCutter.dmi')
+
+ var/icon/RunningOutput = new ()
+
+ //For each original project
+ for(var/OriginalState in icon_states(SpritesToSnip))
+ //For each piece we're going to cut
+ for(var/CutterState in icon_states(CookieCutter))
+
+ //The fully assembled icon to cut
+ var/icon/Original = icon(SpritesToSnip,OriginalState)
+
+ //Our cookie cutter sprite
+ var/icon/Cutter = icon(CookieCutter,CutterState)
+
+ //We have to make these all black to cut with
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+
+ //Blend with AND to cut
+ Original.Blend(Cutter,ICON_AND) //AND, not ADD
+
+ //Make a useful name
+ var/good_name = "[OriginalState]_[CutterState]"
+
+ //Add to the output with the good name
+ RunningOutput.Insert(Original,good_name)
+
+ //Give the output
+ usr << ftp(RunningOutput,"CutUpPeople.dmi")
diff --git a/tools/HumanScissors/HumanScissors.dme b/tools/HumanScissors/HumanScissors.dme
new file mode 100644
index 0000000000..86377f1c57
--- /dev/null
+++ b/tools/HumanScissors/HumanScissors.dme
@@ -0,0 +1,18 @@
+// DM Environment file for HumanScissors.dme.
+// All manual changes should be made outside the BEGIN_ and END_ blocks.
+// New source code should be placed in .dm files: choose File/New --> Code File.
+
+// BEGIN_INTERNALS
+// END_INTERNALS
+
+// BEGIN_FILE_DIR
+#define FILE_DIR .
+// END_FILE_DIR
+
+// BEGIN_PREFERENCES
+// END_PREFERENCES
+
+// BEGIN_INCLUDE
+#include "HumanScissors.dm"
+// END_INCLUDE
+
diff --git a/tools/HumanScissors/SpritesToSnip.dmi b/tools/HumanScissors/SpritesToSnip.dmi
new file mode 100644
index 0000000000..f4dbfb6b81
Binary files /dev/null and b/tools/HumanScissors/SpritesToSnip.dmi differ