Deletes monkey tail DNA block, minor sprite accessory cleanup, monkeys (and lizardpeople) will no longer random spawn without tails (#85112)

## About The Pull Request

- Deletes monkey tail DNA block
- This is not something DNA blocks should be used for. If your only
options are "exists" or "doesn't exist", it doesn't need a DNA block,
you should just remove the tail!

- Minor sprite accessory cleanup
- Replaces a lot of blank SAs with `add_blank` usage. Tested in game and
it works.
- No reason to copy-paste blanks when we have a designated function for
it.

- Randomizing features can no longer select locked features
   - Bugfix, though it doesn't affect us at the moment.

- Monkeys (and lizard people) will no longer random into being tailless
- Felinids can still random into tailless (though that function is
broken ATM)

## Why It's Good For The Game

For the tailless change: 

It's a bit weird for these species to spawn without tails. They're kinda
a huge part of their identity.
I left in the tailless Sprite Accessory, however, so you can still
select them in the prefs menu.

## Changelog

🆑 Melbert
qol: All randomly spawned monkeys (and lizardpeople) will spawn with
tails. You can still select to be tailless.
code: Cleaned up some code relating to species features (like tails,
markings, etc). Report any oddities
/🆑
This commit is contained in:
MrMelbert
2024-07-26 07:55:05 +02:00
committed by GitHub
parent 49b45ee51a
commit 8df2c4bee1
7 changed files with 38 additions and 55 deletions
+8 -2
View File
@@ -60,9 +60,15 @@
#define DNA_MOTH_MARKINGS_BLOCK 13
#define DNA_MUSHROOM_CAPS_BLOCK 14
#define DNA_POD_HAIR_BLOCK 15
#define DNA_MONKEY_TAIL_BLOCK 16
#define DNA_FEATURE_BLOCKS 16
// Hey! Listen up if you're here because you're adding a species feature!
//
// You don't need to add a DNA block for EVERY species feature!
// You ONLY need DNA blocks if you intend to allow players to change it via GENETICS!
// (Which means having a DNA block for a feature tied to a mob without DNA is entirely pointless.)
/// Total amount of DNA blocks, must be equal to the highest DNA block number
#define DNA_FEATURE_BLOCKS 15
#define DNA_SEQUENCE_LENGTH 4
#define DNA_MUTATION_BLOCKS 8
@@ -87,23 +87,23 @@ 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]
lizard_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/lizard_markings, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
tails_list_human = 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, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
tails_list_monkey = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, 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]
snouts_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts)[DEFAULT_SPRITE_LIST]
horns_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/horns)[DEFAULT_SPRITE_LIST]
ears_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears)[DEFAULT_SPRITE_LIST]
wings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/wings)[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)[DEFAULT_SPRITE_LIST]
spines_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/spines)[DEFAULT_SPRITE_LIST]
tail_spines_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/tail_spines)[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]
legs_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/legs)[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)[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]
/// This proc just intializes all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name
@@ -28,13 +28,16 @@
sprite_datum = get_random_appearance()
///Grab a random appearance datum (thats not locked)
/datum/bodypart_overlay/mutant/proc/get_random_appearance()
/datum/bodypart_overlay/mutant/proc/get_random_appearance() as /datum/sprite_accessory
RETURN_TYPE(/datum/sprite_accessory)
var/list/valid_restyles = list()
var/list/feature_list = get_global_feature_list()
for(var/accessory in feature_list)
var/datum/sprite_accessory/accessory_datum = feature_list[accessory]
if(initial(accessory_datum.locked)) //locked is for stuff that shouldn't appear here
continue
if(!initial(accessory_datum.natural_spawn))
continue
valid_restyles += accessory_datum
return pick(valid_restyles)
-6
View File
@@ -216,8 +216,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
L[DNA_TAIL_BLOCK] = construct_block(SSaccessories.tails_list_human.Find(features["tail_cat"]), length(SSaccessories.tails_list_human))
if(features["tail_lizard"])
L[DNA_LIZARD_TAIL_BLOCK] = construct_block(SSaccessories.tails_list_lizard.Find(features["tail_lizard"]), length(SSaccessories.tails_list_lizard))
if(features["tail_monkey"])
L[DNA_MONKEY_TAIL_BLOCK] = construct_block(SSaccessories.tails_list_monkey.Find(features["tail_monkey"]), length(SSaccessories.tails_list_monkey))
if(features["snout"])
L[DNA_SNOUT_BLOCK] = construct_block(SSaccessories.snouts_list.Find(features["snout"]), length(SSaccessories.snouts_list))
if(features["horns"])
@@ -362,8 +360,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
set_uni_feature_block(blocknumber, construct_block(SSaccessories.tails_list_human.Find(features["tail_cat"]), length(SSaccessories.tails_list_human)))
if(DNA_LIZARD_TAIL_BLOCK)
set_uni_feature_block(blocknumber, construct_block(SSaccessories.tails_list_lizard.Find(features["tail_lizard"]), length(SSaccessories.tails_list_lizard)))
if(DNA_MONKEY_TAIL_BLOCK)
set_uni_feature_block(blocknumber, construct_block(SSaccessories.tails_list_monkey.Find(features["tail_monkey"]), length(SSaccessories.tails_list_monkey)))
if(DNA_SNOUT_BLOCK)
set_uni_feature_block(blocknumber, construct_block(SSaccessories.snouts_list.Find(features["snout"]), length(SSaccessories.snouts_list)))
if(DNA_HORNS_BLOCK)
@@ -669,8 +665,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
dna.features["tail_cat"] = SSaccessories.tails_list_human[deconstruct_block(get_uni_feature_block(features, DNA_TAIL_BLOCK), length(SSaccessories.tails_list_human))]
if(dna.features["tail_lizard"])
dna.features["tail_lizard"] = SSaccessories.tails_list_lizard[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_TAIL_BLOCK), length(SSaccessories.tails_list_lizard))]
if(dna.features["tail_monkey"])
dna.features["tail_monkey"] = SSaccessories.tails_list_monkey[deconstruct_block(get_uni_feature_block(features, DNA_MONKEY_TAIL_BLOCK), length(SSaccessories.tails_list_monkey))]
if(dna.features["ears"])
dna.features["ears"] = SSaccessories.ears_list[deconstruct_block(get_uni_feature_block(features, DNA_EARS_BLOCK), length(SSaccessories.ears_list))]
if(dna.features["moth_wings"])
+14 -34
View File
@@ -51,7 +51,7 @@
var/natural_spawn = TRUE
/datum/sprite_accessory/blank
name = "None"
name = SPRITE_ACCESSORY_NONE
icon_state = "None"
//////////////////////
@@ -835,7 +835,7 @@
var/gradient_category = GRADIENT_APPLIES_TO_HAIR|GRADIENT_APPLIES_TO_FACIAL_HAIR
/datum/sprite_accessory/gradient/none
name = "None"
name = SPRITE_ACCESSORY_NONE
icon_state = "none"
/datum/sprite_accessory/gradient/full
@@ -1726,10 +1726,6 @@
/datum/sprite_accessory/lizard_markings
icon = 'icons/mob/human/species/lizard/lizard_markings.dmi'
/datum/sprite_accessory/lizard_markings/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/lizard_markings/dtiger
name = "Dark Tiger Body"
icon_state = "dtiger"
@@ -1754,6 +1750,11 @@
icon = 'icons/mob/human/species/lizard/lizard_tails.dmi'
spine_key = SPINE_KEY_LIZARD
/datum/sprite_accessory/tails/lizard/none
name = SPRITE_ACCESSORY_NONE
icon_state = "none"
natural_spawn = FALSE
/datum/sprite_accessory/tails/lizard/smooth
name = "Smooth"
icon_state = "smooth"
@@ -1781,6 +1782,13 @@
icon_state = "default"
color_src = HAIR_COLOR
/datum/sprite_accessory/tails/monkey
/datum/sprite_accessory/tails/monkey/none
name = SPRITE_ACCESSORY_NONE
icon_state = "none"
natural_spawn = FALSE
/datum/sprite_accessory/tails/monkey/default
name = "Monkey"
icon = 'icons/mob/human/species/monkey/monkey_tail.dmi'
@@ -1855,10 +1863,6 @@
icon = 'icons/mob/human/species/lizard/lizard_misc.dmi'
em_block = TRUE
/datum/sprite_accessory/horns/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/horns/simple
name = "Simple"
icon_state = "simple"
@@ -1883,10 +1887,6 @@
icon = 'icons/mob/human/cat_features.dmi'
em_block = TRUE
/datum/sprite_accessory/ears/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/ears/cat
name = "Cat"
icon_state = "cat"
@@ -1921,10 +1921,6 @@
color_src = HAIR_COLOR
locked = TRUE
/datum/sprite_accessory/wings/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/wings
icon = 'icons/mob/human/species/wings.dmi'
em_block = TRUE
@@ -2068,10 +2064,6 @@
/datum/sprite_accessory/frills
icon = 'icons/mob/human/species/lizard/lizard_misc.dmi'
/datum/sprite_accessory/frills/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/frills/simple
name = "Simple"
icon_state = "simple"
@@ -2092,14 +2084,6 @@
icon = 'icons/mob/human/species/lizard/lizard_spines.dmi'
em_block = TRUE
/datum/sprite_accessory/spines/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/tail_spines/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/spines/short
name = "Short"
icon_state = "short"
@@ -2360,10 +2344,6 @@
icon = 'icons/mob/human/species/moth/moth_markings.dmi'
color_src = null
/datum/sprite_accessory/moth_markings/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/moth_markings/reddish
name = "Reddish"
icon_state = "reddish"
@@ -744,7 +744,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
sample_overlay = new overlay_path()
organs_to_randomize[overlay_path] = sample_overlay
new_features["[sample_overlay.feature_key]"] = pick(sample_overlay.get_global_feature_list())
new_features["[sample_overlay.feature_key]"] = sample_overlay.get_random_appearance().name
return new_features
+1 -1
View File
@@ -175,7 +175,7 @@
bodypart_overlay = /datum/bodypart_overlay/mutant/tail/monkey
dna_block = DNA_MONKEY_TAIL_BLOCK
dna_block = null
///Monkey tail bodypart overlay
/datum/bodypart_overlay/mutant/tail/monkey