Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions code/__DEFINES/DNA.dm
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,35 @@
#define FEATURE_MUSH_CAP "caps"
#define FEATURE_POD_HAIR "pod_hair"
// DOPPLER FEATURES START
// Ears
#define FEATURE_EARS_LIZARD "ears_lizard"
#define FEATURE_EARS_FOX "ears_fox"
#define FEATURE_EARS_DOG "ears_dog"
#define FEATURE_EARS_BUNNY "ears_bunny"
#define FEATURE_EARS_BIRD "ears_bird"
#define FEATURE_EARS_MOUSE "ears_mouse"
#define FEATURE_EARS_MONKEY "ears_monkey"
#define FEATURE_EARS_DEER "ears_deer"
#define FEATURE_EARS_FISH "ears_fish"
#define FEATURE_EARS_BUG "ears_bug"
#define FEATURE_EARS_HUMANOID "ears_humanoid"
#define FEATURE_EARS_CYBERNETIC "ears_cybernetic"
#define FEATURE_EARS_ALIEN "ears_alien"
#define FEATURE_EARS_TESHARI "ears_teshari"
#define FEATURE_EARS_COLORS "ears_colors"
// Tails
#define FEATURE_TAIL_DOG "tail_dog"
#define FEATURE_TAIL_FOX "tail_fox"
#define FEATURE_TAIL_BUNNY "tail_bunny"
#define FEATURE_TAIL_MOUSE "tail_mouse"
#define FEATURE_TAIL_BIRD "tail_bird"
#define FEATURE_TAIL_DEER "tail_deer"
#define FEATURE_TAIL_BUG "tail_bug"
#define FEATURE_TAIL_CYBERNETIC "tail_cybernetic"
#define FEATURE_TAIL_HUMANOID "tail_humanoid"
#define FEATURE_TAIL_ALIEN "tail_alien"
#define FEATURE_TAIL_TESHARI "tail_teshari"
// Others
#define FEATURE_MARKINGS_COLORS "markings_colors"
#define FEATURE_FRILLS_COLORS "frills_colors"
#define FEATURE_HORNS_COLORS "horns_colors"
Expand All @@ -96,6 +124,7 @@

// Other
#define FEATURE_WINGS "wings"
#define FEATURE_WINGS_OPEN "[FEATURE_WINGS]_open"
#define FEATURE_TAIL_MONKEY "tail_monkey"
#define FEATURE_TAIL_XENO "tail_xeno"
#define FEATURE_TAILSPINES "tailspines" // Different from regular spines, these appear on tails
Expand Down
4 changes: 2 additions & 2 deletions code/_globalvars/lists/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ GLOBAL_LIST_INIT(dna_identity_blocks, init_identity_block_types())

/proc/init_identity_block_types()
. = list()
for(var/datum/dna_block/identity/block_path as anything in subtypesof(/datum/dna_block/identity))
for(var/datum/dna_block/identity/block_path as anything in valid_subtypesof(/datum/dna_block/identity))
var/datum/dna_block/identity/new_block = new block_path()
.[block_path] = new_block

Expand All @@ -179,6 +179,6 @@ GLOBAL_LIST_INIT(dna_feature_blocks, init_feature_block_types())

/proc/init_feature_block_types()
. = list()
for(var/datum/dna_block/feature/block_path as anything in subtypesof(/datum/dna_block/feature))
for(var/datum/dna_block/feature/block_path as anything in valid_subtypesof(/datum/dna_block/feature))
var/datum/dna_block/feature/new_block = new block_path()
.[block_path] = new_block
112 changes: 69 additions & 43 deletions code/controllers/subsystem/sprite_accessories.dm
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@
/// The female specific list that we get from init_sprite_accessory_subtypes()
#define FEMALE_SPRITE_LIST "female_sprites"

/// Use this to init a sprite accessory list for a feature where mobs are required to have one selected
#define INIT_ACCESSORY(sprite_accessory) init_sprite_accessory_subtypes(sprite_accessory, add_blank = FALSE)[DEFAULT_SPRITE_LIST]
/// Use this to init a sprite accessory list for a feature where mobs can opt to not have one selected
#define INIT_OPTIONAL_ACCESSORY(sprite_accessory) init_sprite_accessory_subtypes(sprite_accessory, add_blank = TRUE)[DEFAULT_SPRITE_LIST]

/// subsystem that just holds lists of sprite accessories for accession in generating said sprites.
/// A sprite accessory is something that we add to a human sprite to make them look different. This is hair, facial hair, underwear, mutant bits, etc.
SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
Expand Down Expand Up @@ -36,30 +41,10 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
//Socks
var/list/socks_list //! stores /datum/sprite_accessory/socks indexed by name

//Lizard Bits (all datum lists indexed by name)
var/list/lizard_markings_list
var/list/snouts_list
var/list/horns_list
var/list/frills_list
var/list/spines_list
var/list/tail_spines_list

//Mutant Human bits
var/list/tails_list_felinid
var/list/tails_list_lizard
var/list/tails_list_monkey
var/list/tails_list_xeno
var/list/tails_list_fish
var/list/ears_list
var/list/wings_list
var/list/wings_open_list
var/list/moth_wings_list
var/list/moth_antennae_list
var/list/moth_markings_list
var/list/caps_list
var/list/pod_hair_list
var/list/cached_mutant_icon_files = list() // DOPPLER ADDITION - caches files for the mutant parts system
//All features, indexed by feature key, then name of the sprite accessory to the datum iteslf
var/list/list/feature_list

var/list/cached_mutant_icon_files = list() // DOPPLER ADDITION - caches files for the mutant parts system
/datum/controller/subsystem/accessories/PreInit() // this stuff NEEDS to be set up before GLOB for preferences and stuff to work so this must go here. sorry
setup_lists()
init_hair_gradients()
Expand Down Expand Up @@ -92,26 +77,64 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity

socks_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/socks)[DEFAULT_SPRITE_LIST]

lizard_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/lizard_markings)[DEFAULT_SPRITE_LIST]
tails_list_felinid = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human)[DEFAULT_SPRITE_LIST] //DOPPLER EDIT, we remove the blank - old code: tails_list_felinid = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
tails_list_lizard = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard)[DEFAULT_SPRITE_LIST]
tails_list_monkey = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey)[DEFAULT_SPRITE_LIST]
tails_list_xeno = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/xeno)[DEFAULT_SPRITE_LIST]
//tails fo fish organ infusions, not for prefs.
tails_list_fish = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/fish)[DEFAULT_SPRITE_LIST]
snouts_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts)[DEFAULT_SPRITE_LIST]
horns_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
ears_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
wings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
wings_open_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open)[DEFAULT_SPRITE_LIST]
frills_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
spines_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
tail_spines_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/tail_spines, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
caps_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/caps)[DEFAULT_SPRITE_LIST]
moth_wings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings)[DEFAULT_SPRITE_LIST]
moth_antennae_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae)[DEFAULT_SPRITE_LIST]
moth_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
pod_hair_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair)[DEFAULT_SPRITE_LIST]
feature_list = list()
// felinids
feature_list[FEATURE_TAIL_CAT] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/felinid)
feature_list[FEATURE_EARS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears)
// lizards
feature_list[FEATURE_FRILLS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/frills)
feature_list[FEATURE_HORNS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/horns)
feature_list[FEATURE_LIZARD_MARKINGS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/lizard_markings)
feature_list[FEATURE_SNOUT] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/snouts) // DOPPLER EDIT - OPTIONAL ACCESSORY - ORIGINAL: feature_list[FEATURE_SNOUT] = INIT_ACCESSORY(/datum/sprite_accessory/snouts)
feature_list[FEATURE_SPINES] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/spines)
feature_list[FEATURE_TAILSPINES] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tail_spines)
feature_list[FEATURE_TAIL_LIZARD] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/lizard) // DOPPLER EDIT - OPTIONAL ACCESSORY - ORIGINAL: feature_list[FEATURE_TAIL_LIZARD] = INIT_ACCESSORY(/datum/sprite_accessory/tails/lizard)
// moths
feature_list[FEATURE_MOTH_WINGS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/moth_wings) // DOPPLER EDIT - OPTIONAL ACCESSORY - ORIGINAL: feature_list[FEATURE_MOTH_WINGS] = INIT_ACCESSORY(/datum/sprite_accessory/moth_wings)
feature_list[FEATURE_MOTH_ANTENNAE] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/moth_antennae) // DOPPLER EDIT - OPTIONAL ACCESSORY - ORIGINAL: feature_list[FEATURE_MOTH_ANTENNAE] = INIT_ACCESSORY(/datum/sprite_accessory/moth_antennae)
feature_list[FEATURE_MOTH_MARKINGS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/moth_markings)
// generic wings
feature_list[FEATURE_WINGS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/wings)
feature_list[FEATURE_WINGS_OPEN] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/wings_open)
// generic features
feature_list[FEATURE_MUSH_CAP] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/caps) // DOPPLER EDIT - OPTIONAL ACCESSORY - ORIGINAL: feature_list[FEATURE_MUSH_CAP] = INIT_ACCESSORY(/datum/sprite_accessory/caps)
feature_list[FEATURE_POD_HAIR] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/pod_hair) // DOPPLER EDIT - OPTIONAL ACCESSORY - ORIGINAL: feature_list[FEATURE_POD_HAIR] = INIT_ACCESSORY(/datum/sprite_accessory/pod_hair)
feature_list[FEATURE_TAIL_FISH] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/fish) // DOPPLER EDIT - OPTIONAL ACCESSORY - ORIGINAL: feature_list[FEATURE_TAIL_FISH] = INIT_ACCESSORY(/datum/sprite_accessory/tails/fish)
feature_list[FEATURE_TAIL_MONKEY] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/monkey) // DOPPLER EDIT - OPTIONAL ACCESSORY - ORIGINAL: feature_list[FEATURE_TAIL_MONKEY] = INIT_ACCESSORY(/datum/sprite_accessory/tails/monkey)
feature_list[FEATURE_TAIL_XENO] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/xeno) // DOPPLER EDIT - OPTIONAL ACCESSORY - ORIGINAL: feature_list[FEATURE_TAIL_XENO] = INIT_ACCESSORY(/datum/sprite_accessory/tails/xeno)
// DOPPLER ADDITION BEGIN - Modular accessories
feature_list[FEATURE_BREASTS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/breasts)
feature_list[FEATURE_WINGS] |= INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/wings_more)
feature_list[FEATURE_FLUFF] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/fluff)
feature_list[FEATURE_TAUR] = INIT_ACCESSORY(/datum/sprite_accessory/taur)
// Ear variations
feature_list[FEATURE_EARS_LIZARD] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/lizard)
feature_list[FEATURE_EARS_DOG] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/dog)
feature_list[FEATURE_EARS_FOX] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/fox)
feature_list[FEATURE_EARS_BUNNY] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/bunny)
feature_list[FEATURE_EARS_MOUSE] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/mouse)
feature_list[FEATURE_EARS_BIRD] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/bird)
feature_list[FEATURE_EARS_MONKEY] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/monkey)
feature_list[FEATURE_EARS_DEER] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/deer)
feature_list[FEATURE_EARS_FISH] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/fish)
feature_list[FEATURE_EARS_BUG] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/bug)
feature_list[FEATURE_EARS_HUMANOID] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/humanoid)
feature_list[FEATURE_EARS_CYBERNETIC] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/cybernetic)
feature_list[FEATURE_EARS_ALIEN] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears_more/alien)
feature_list[FEATURE_EARS_TESHARI] = INIT_ACCESSORY(/datum/sprite_accessory/ears_more/teshari)
// Tail variations
feature_list[FEATURE_TAIL_DOG] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/dog)
feature_list[FEATURE_TAIL_FOX] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/fox)
feature_list[FEATURE_TAIL_BUNNY] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/bunny)
feature_list[FEATURE_TAIL_MOUSE] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/mouse)
feature_list[FEATURE_TAIL_BIRD] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/bird)
feature_list[FEATURE_TAIL_DEER] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/deer)
feature_list[FEATURE_TAIL_BUG] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/bug)
feature_list[FEATURE_TAIL_CYBERNETIC] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/cybernetic)
feature_list[FEATURE_TAIL_HUMANOID] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/humanoid)
feature_list[FEATURE_TAIL_ALIEN] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/alien)
feature_list[FEATURE_TAIL_TESHARI] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/teshari)
// DOPPLER ADDITION END

/// This proc just initializes all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name
/datum/controller/subsystem/accessories/proc/init_hair_gradients()
Expand Down Expand Up @@ -166,6 +189,9 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity

return returnable_list

#undef INIT_ACCESSORY
#undef INIT_OPTIONAL_ACCESSORY

#undef DEFAULT_SPRITE_LIST
#undef MALE_SPRITE_LIST
#undef FEMALE_SPRITE_LIST
9 changes: 3 additions & 6 deletions code/datums/bodypart_overlays/markings_bodypart_overlay.dm
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,12 @@
var/gender_string = (use_gender && limb.is_dimorphic) ? (limb.gender == MALE ? MALE : FEMALE + "_") : "" //we only got male and female sprites
return image(icon, gender_string + icon_state + "_" + limb.body_zone, layer = layer)

/datum/bodypart_overlay/simple/body_marking/get_accessory(name)
return SSaccessories.feature_list[dna_feature_key][name]

/datum/bodypart_overlay/simple/body_marking/moth
dna_feature_key = FEATURE_MOTH_MARKINGS

/datum/bodypart_overlay/simple/body_marking/moth/get_accessory(name)
return SSaccessories.moth_markings_list[name]

/datum/bodypart_overlay/simple/body_marking/lizard
dna_feature_key = FEATURE_LIZARD_MARKINGS
applies_to = list(/obj/item/bodypart/chest)

/datum/bodypart_overlay/simple/body_marking/lizard/get_accessory(name)
return SSaccessories.lizard_markings_list[name]
6 changes: 5 additions & 1 deletion code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,11 @@

///Return a dumb glob list for this specific feature (called from parse_sprite)
/datum/bodypart_overlay/mutant/proc/get_global_feature_list()
CRASH("External organ has no feature list, it will render invisible")
var/list/feature_list = SSaccessories.feature_list[feature_key]
if(isnull(feature_list))
stack_trace("External organ has no feature list, it will render invisible")
return list()
return feature_list

///Give the organ its color. Force will override the existing one.
/datum/bodypart_overlay/mutant/proc/inherit_color(obj/item/bodypart/bodypart_owner, force)
Expand Down
Loading
Loading