Skip to content

Commit 2694031

Browse files
authored
[CHERRY-PICK] Repaths sprite accessory lists to be on a subsystem instead of global (#757)
1 parent 80e74db commit 2694031

51 files changed

Lines changed: 389 additions & 364 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

code/__HELPERS/global_lists.dm

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,6 @@
22
/////Initial Building/////
33
//////////////////////////
44

5-
/proc/init_sprite_accessories()
6-
//hair
7-
init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, GLOB.hairstyles_list, GLOB.hairstyles_male_list, GLOB.hairstyles_female_list)
8-
//facial hair
9-
init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_hair, GLOB.facial_hairstyles_list, GLOB.facial_hairstyles_male_list, GLOB.facial_hairstyles_female_list)
10-
//underwear
11-
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear, GLOB.underwear_list, GLOB.underwear_m, GLOB.underwear_f)
12-
//undershirt
13-
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, GLOB.undershirt_list, GLOB.undershirt_m, GLOB.undershirt_f)
14-
//socks
15-
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list)
16-
//bodypart accessories (blizzard intensifies)
17-
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
18-
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human, add_blank = TRUE)
19-
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard, add_blank = TRUE)
20-
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey, add_blank = FALSE)
21-
init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, GLOB.snouts_list)
22-
init_sprite_accessory_subtypes(/datum/sprite_accessory/horns,GLOB.horns_list)
23-
init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, GLOB.ears_list)
24-
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list)
25-
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open, GLOB.wings_open_list)
26-
init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, GLOB.frills_list)
27-
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list)
28-
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, GLOB.animated_spines_list)
29-
init_sprite_accessory_subtypes(/datum/sprite_accessory/tail_spines, GLOB.tail_spines_list)
30-
init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list)
31-
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list)
32-
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae, GLOB.moth_antennae_list)
33-
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list)
34-
init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list)
35-
init_sprite_accessory_subtypes(/datum/sprite_accessory/head_tentacles, GLOB.head_tentacles_list) //NON-MODULE CHANGE
36-
init_sprite_accessory_subtypes(/datum/sprite_accessory/arm_wings, GLOB.arm_wings_list) //NON-MODULE CHANGE
37-
init_sprite_accessory_subtypes(/datum/sprite_accessory/arm_wingsopen, GLOB.arm_wingsopen_list) //NON-MODULE CHANGE
38-
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/avian, GLOB.tails_list_avian) //NON-MODULE CHANGE
39-
init_sprite_accessory_subtypes(/datum/sprite_accessory/plumage, GLOB.avian_ears_list) //NON-MODULE CHANGE
40-
init_sprite_accessory_subtypes(/datum/sprite_accessory/synth_head_cover, GLOB.synth_head_cover_list) //NON-MODULE CHANGE
41-
425
/// Inits GLOB.surgeries
436
/proc/init_surgeries()
447
var/surgeries = list()
@@ -47,21 +10,10 @@
4710
sort_list(surgeries, GLOBAL_PROC_REF(cmp_typepaths_asc))
4811
return surgeries
4912

50-
/// Hair Gradients - Initialise all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name
51-
/proc/init_hair_gradients()
52-
for(var/path in subtypesof(/datum/sprite_accessory/gradient))
53-
var/datum/sprite_accessory/gradient/gradient = new path()
54-
if(gradient.gradient_category & GRADIENT_APPLIES_TO_HAIR)
55-
GLOB.hair_gradients_list[gradient.name] = gradient
56-
if(gradient.gradient_category & GRADIENT_APPLIES_TO_FACIAL_HAIR)
57-
GLOB.facial_hair_gradients_list[gradient.name] = gradient
58-
5913
/// Legacy procs that really should be replaced with proper _INIT macros
6014
/proc/make_datum_reference_lists()
6115
// I tried to eliminate this proc but I couldn't untangle their init-order interdependencies -Dominion/Cyberboss
62-
init_sprite_accessories()
6316
init_species_list()
64-
init_hair_gradients()
6517
init_keybindings()
6618
GLOB.emote_list = init_emote_list() // WHY DOES THIS NEED TO GO HERE? IT JUST INITS DATUMS
6719
init_crafting_recipes()

code/__HELPERS/mobs.dm

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -56,52 +56,52 @@
5656
return pick(natural_hair_colors)
5757

5858
/proc/random_underwear(gender)
59-
if(!GLOB.underwear_list.len)
60-
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear, GLOB.underwear_list, GLOB.underwear_m, GLOB.underwear_f)
59+
if(length(SSaccessories.underwear_list) == 0)
60+
CRASH("No underwear to choose from!")
6161
switch(gender)
6262
if(MALE)
63-
return pick(GLOB.underwear_m)
63+
return pick(SSaccessories.underwear_m)
6464
if(FEMALE)
65-
return pick(GLOB.underwear_f)
65+
return pick(SSaccessories.underwear_f)
6666
else
67-
return pick(GLOB.underwear_list)
67+
return pick(SSaccessories.underwear_list)
6868

6969
/proc/random_undershirt(gender)
70-
if(!GLOB.undershirt_list.len)
71-
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, GLOB.undershirt_list, GLOB.undershirt_m, GLOB.undershirt_f)
70+
if(length(SSaccessories.undershirt_list) == 0)
71+
CRASH("No undershirts to choose from!")
7272
switch(gender)
7373
if(MALE)
74-
return pick(GLOB.undershirt_m)
74+
return pick(SSaccessories.undershirt_m)
7575
if(FEMALE)
76-
return pick(GLOB.undershirt_f)
76+
return pick(SSaccessories.undershirt_f)
7777
else
78-
return pick(GLOB.undershirt_list)
78+
return pick(SSaccessories.undershirt_list)
7979

8080
/proc/random_socks()
81-
if(!GLOB.socks_list.len)
82-
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list)
83-
return pick(GLOB.socks_list)
81+
if(length(SSaccessories.socks_list) == 0)
82+
CRASH("No socks to choose from!")
83+
return pick(SSaccessories.socks_list)
8484

8585
/proc/random_backpack()
8686
return pick(GLOB.backpacklist)
8787

8888
/proc/random_hairstyle(gender)
8989
switch(gender)
9090
if(MALE)
91-
return pick(GLOB.hairstyles_male_list)
91+
return pick(SSaccessories.hairstyles_male_list)
9292
if(FEMALE)
93-
return pick(GLOB.hairstyles_female_list)
93+
return pick(SSaccessories.hairstyles_female_list)
9494
else
95-
return pick(GLOB.hairstyles_list)
95+
return pick(SSaccessories.hairstyles_list)
9696

9797
/proc/random_facial_hairstyle(gender)
9898
switch(gender)
9999
if(MALE)
100-
return pick(GLOB.facial_hairstyles_male_list)
100+
return pick(SSaccessories.facial_hairstyles_male_list)
101101
if(FEMALE)
102-
return pick(GLOB.facial_hairstyles_female_list)
102+
return pick(SSaccessories.facial_hairstyles_female_list)
103103
else
104-
return pick(GLOB.facial_hairstyles_list)
104+
return pick(SSaccessories.facial_hairstyles_list)
105105

106106
GLOBAL_LIST_INIT(skin_tones, sort_list(list(
107107
"albino",

code/_globalvars/lists/flavor_misc.dm

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,3 @@
1-
//Preferences stuff
2-
//Hairstyles
3-
GLOBAL_LIST_EMPTY(hairstyles_list) //stores /datum/sprite_accessory/hair indexed by name
4-
GLOBAL_LIST_EMPTY(hairstyles_male_list) //stores only hair names
5-
GLOBAL_LIST_EMPTY(hairstyles_female_list) //stores only hair names
6-
GLOBAL_LIST_EMPTY(facial_hairstyles_list) //stores /datum/sprite_accessory/facial_hair indexed by name
7-
GLOBAL_LIST_EMPTY(facial_hairstyles_male_list) //stores only hair names
8-
GLOBAL_LIST_EMPTY(facial_hairstyles_female_list) //stores only hair names
9-
GLOBAL_LIST_EMPTY(hair_gradients_list) //stores /datum/sprite_accessory/hair_gradient indexed by name
10-
GLOBAL_LIST_EMPTY(facial_hair_gradients_list) //stores /datum/sprite_accessory/facial_hair_gradient indexed by name
11-
//Underwear
12-
GLOBAL_LIST_EMPTY(underwear_list) //stores /datum/sprite_accessory/underwear indexed by name
13-
GLOBAL_LIST_EMPTY(underwear_m) //stores only underwear name
14-
GLOBAL_LIST_EMPTY(underwear_f) //stores only underwear name
15-
//Undershirts
16-
GLOBAL_LIST_EMPTY(undershirt_list) //stores /datum/sprite_accessory/undershirt indexed by name
17-
GLOBAL_LIST_EMPTY(undershirt_m) //stores only undershirt name
18-
GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name
19-
//Socks
20-
GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/socks indexed by name
21-
//Lizard Bits (all datum lists indexed by name)
22-
GLOBAL_LIST_EMPTY(body_markings_list)
23-
GLOBAL_LIST_EMPTY(snouts_list)
24-
GLOBAL_LIST_EMPTY(horns_list)
25-
GLOBAL_LIST_EMPTY(frills_list)
26-
GLOBAL_LIST_EMPTY(spines_list)
27-
GLOBAL_LIST_EMPTY(tail_spines_list)
28-
GLOBAL_LIST_EMPTY(legs_list)
29-
GLOBAL_LIST_EMPTY(animated_spines_list)
30-
31-
//Mutant Human bits
32-
GLOBAL_LIST_EMPTY(tails_list_human)
33-
GLOBAL_LIST_EMPTY(tails_list_lizard)
34-
GLOBAL_LIST_EMPTY(tails_list_monkey)
35-
GLOBAL_LIST_EMPTY(ears_list)
36-
GLOBAL_LIST_EMPTY(wings_list)
37-
GLOBAL_LIST_EMPTY(wings_open_list)
38-
GLOBAL_LIST_EMPTY(moth_wings_list)
39-
GLOBAL_LIST_EMPTY(moth_antennae_list)
40-
GLOBAL_LIST_EMPTY(moth_markings_list)
41-
GLOBAL_LIST_EMPTY(caps_list)
42-
GLOBAL_LIST_EMPTY(pod_hair_list)
43-
441
GLOBAL_LIST_INIT(color_list_ethereal, list(
452
"Blue" = "#3399ff",
463
"Bright Yellow" = "#ffff99",
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
/// The non gender specific list that we get from init_sprite_accessory_subtypes()
2+
#define DEFAULT_SPRITE_LIST "default_sprites"
3+
/// The male specific list that we get from init_sprite_accessory_subtypes()
4+
#define MALE_SPRITE_LIST "male_sprites"
5+
/// The female specific list that we get from init_sprite_accessory_subtypes()
6+
#define FEMALE_SPRITE_LIST "female_sprites"
7+
8+
/// subsystem that just holds lists of sprite accessories for accession in generating said sprites.
9+
/// 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.
10+
SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
11+
name = "Sprite Accessories"
12+
flags = SS_NO_FIRE | SS_NO_INIT
13+
14+
//Hairstyles
15+
var/list/hairstyles_list //! stores /datum/sprite_accessory/hair indexed by name
16+
var/list/hairstyles_male_list //! stores only hair names
17+
var/list/hairstyles_female_list //! stores only hair names
18+
var/list/facial_hairstyles_list //! stores /datum/sprite_accessory/facial_hair indexed by name
19+
var/list/facial_hairstyles_male_list //! stores only hair names
20+
var/list/facial_hairstyles_female_list //! stores only hair names
21+
var/list/hair_gradients_list //! stores /datum/sprite_accessory/hair_gradient indexed by name
22+
var/list/facial_hair_gradients_list //! stores /datum/sprite_accessory/facial_hair_gradient indexed by name
23+
24+
//Underwear
25+
var/list/underwear_list //! stores /datum/sprite_accessory/underwear indexed by name
26+
var/list/underwear_m //! stores only underwear name
27+
var/list/underwear_f //! stores only underwear name
28+
29+
//Undershirts
30+
var/list/undershirt_list //! stores /datum/sprite_accessory/undershirt indexed by name
31+
var/list/undershirt_m //! stores only undershirt name
32+
var/list/undershirt_f //! stores only undershirt name
33+
34+
//Socks
35+
var/list/socks_list //! stores /datum/sprite_accessory/socks indexed by name
36+
37+
//Lizard Bits (all datum lists indexed by name)
38+
var/list/body_markings_list
39+
var/list/snouts_list
40+
var/list/horns_list
41+
var/list/frills_list
42+
var/list/spines_list
43+
var/list/legs_list
44+
var/list/tail_spines_list
45+
46+
//Mutant Human bits
47+
var/list/tails_list_human
48+
var/list/tails_list_lizard
49+
var/list/tails_list_monkey
50+
var/list/ears_list
51+
var/list/wings_list
52+
var/list/wings_open_list
53+
var/list/moth_wings_list
54+
var/list/moth_antennae_list
55+
var/list/moth_markings_list
56+
var/list/caps_list
57+
var/list/pod_hair_list
58+
var/list/head_tentacles_list // NON-MODULE CHANGE
59+
var/list/arm_wings_list // NON-MODULE CHANGE
60+
var/list/arm_wingsopen_list // NON-MODULE CHANGE
61+
var/list/tails_list_avian // NON-MODULE CHANGE
62+
var/list/avian_ears_list // NON-MODULE CHANGE
63+
var/list/synth_head_cover_list // NON-MODULE CHANGE
64+
65+
/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
66+
setup_lists()
67+
init_hair_gradients()
68+
69+
/// Sets up all of the lists for later utilization in the round and building sprites.
70+
/// In an ideal world we could tack everything that just needed `DEFAULT_SPRITE_LIST` into static variables on the top, but due to the initialization order
71+
/// where this subsystem will initialize BEFORE statics, it's just not feasible since this all needs to be ready for actual subsystems to use.
72+
/// Sorry.
73+
/datum/controller/subsystem/accessories/proc/setup_lists()
74+
var/hair_lists = init_sprite_accessory_subtypes(/datum/sprite_accessory/hair)
75+
hairstyles_list = hair_lists[DEFAULT_SPRITE_LIST]
76+
hairstyles_male_list = hair_lists[MALE_SPRITE_LIST]
77+
hairstyles_female_list = hair_lists[FEMALE_SPRITE_LIST]
78+
79+
var/facial_hair_lists = init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_hair)
80+
facial_hairstyles_list = facial_hair_lists[DEFAULT_SPRITE_LIST]
81+
facial_hairstyles_male_list = facial_hair_lists[MALE_SPRITE_LIST]
82+
facial_hairstyles_female_list = facial_hair_lists[FEMALE_SPRITE_LIST]
83+
84+
var/underwear_lists = init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear)
85+
underwear_list = underwear_lists[DEFAULT_SPRITE_LIST]
86+
underwear_m = underwear_lists[MALE_SPRITE_LIST]
87+
underwear_f = underwear_lists[FEMALE_SPRITE_LIST]
88+
89+
var/undershirt_lists = init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt)
90+
undershirt_list = undershirt_lists[DEFAULT_SPRITE_LIST]
91+
undershirt_m = undershirt_lists[MALE_SPRITE_LIST]
92+
undershirt_f = undershirt_lists[FEMALE_SPRITE_LIST]
93+
94+
socks_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/socks)[DEFAULT_SPRITE_LIST]
95+
96+
body_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings)[DEFAULT_SPRITE_LIST]
97+
tails_list_human = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
98+
tails_list_lizard = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
99+
tails_list_monkey = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey)[DEFAULT_SPRITE_LIST]
100+
snouts_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts)[DEFAULT_SPRITE_LIST]
101+
horns_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/horns)[DEFAULT_SPRITE_LIST]
102+
ears_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears)[DEFAULT_SPRITE_LIST]
103+
wings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/wings)[DEFAULT_SPRITE_LIST]
104+
wings_open_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open)[DEFAULT_SPRITE_LIST]
105+
frills_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/frills)[DEFAULT_SPRITE_LIST]
106+
spines_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/spines)[DEFAULT_SPRITE_LIST]
107+
tail_spines_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/tail_spines)[DEFAULT_SPRITE_LIST]
108+
caps_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/caps)[DEFAULT_SPRITE_LIST]
109+
moth_wings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings)[DEFAULT_SPRITE_LIST]
110+
moth_antennae_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae)[DEFAULT_SPRITE_LIST]
111+
moth_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings)[DEFAULT_SPRITE_LIST]
112+
pod_hair_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair)[DEFAULT_SPRITE_LIST]
113+
head_tentacles_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/head_tentacles)[DEFAULT_SPRITE_LIST] // NON-MODULE CHANGE
114+
arm_wings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/arm_wings)[DEFAULT_SPRITE_LIST] // NON-MODULE CHANGE
115+
arm_wingsopen_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/arm_wingsopen)[DEFAULT_SPRITE_LIST] // NON-MODULE CHANGE
116+
tails_list_avian = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/avian/)[DEFAULT_SPRITE_LIST] // NON-MODULE CHANGE
117+
avian_ears_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/plumage)[DEFAULT_SPRITE_LIST] // NON-MODULE CHANGE
118+
synth_head_cover_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/synth_head_cover)[DEFAULT_SPRITE_LIST] // NON-MODULE CHANGE
119+
120+
/// This proc just intializes all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name
121+
/datum/controller/subsystem/accessories/proc/init_hair_gradients()
122+
hair_gradients_list = list()
123+
facial_hair_gradients_list = list()
124+
for(var/path in subtypesof(/datum/sprite_accessory/gradient))
125+
var/datum/sprite_accessory/gradient/gradient = new path
126+
if(gradient.gradient_category & GRADIENT_APPLIES_TO_HAIR)
127+
hair_gradients_list[gradient.name] = gradient
128+
if(gradient.gradient_category & GRADIENT_APPLIES_TO_FACIAL_HAIR)
129+
facial_hair_gradients_list[gradient.name] = gradient
130+
131+
/// This reads the applicable sprite accessory datum's subtypes and adds it to the subsystem's list of sprite accessories.
132+
/// The boolean `add_blank` argument just adds a "None" option to the list of sprite accessories, like if a felinid doesn't want a tail or something, typically good for gated-off things.
133+
/datum/controller/subsystem/accessories/proc/init_sprite_accessory_subtypes(prototype, add_blank = FALSE)
134+
RETURN_TYPE(/list)
135+
var/returnable_list = list(
136+
DEFAULT_SPRITE_LIST = list(),
137+
MALE_SPRITE_LIST = list(),
138+
FEMALE_SPRITE_LIST = list(),
139+
)
140+
141+
for(var/path in subtypesof(prototype))
142+
var/datum/sprite_accessory/accessory = new path
143+
144+
if(accessory.icon_state)
145+
returnable_list[DEFAULT_SPRITE_LIST][accessory.name] = accessory
146+
else
147+
returnable_list[DEFAULT_SPRITE_LIST] += accessory.name
148+
149+
switch(accessory.gender)
150+
if(MALE)
151+
returnable_list[MALE_SPRITE_LIST] += accessory.name
152+
if(FEMALE)
153+
returnable_list[FEMALE_SPRITE_LIST] += accessory.name
154+
else
155+
returnable_list[MALE_SPRITE_LIST] += accessory.name
156+
returnable_list[FEMALE_SPRITE_LIST] += accessory.name
157+
158+
if(add_blank)
159+
returnable_list[DEFAULT_SPRITE_LIST][SPRITE_ACCESSORY_NONE] = new /datum/sprite_accessory/blank
160+
161+
return returnable_list
162+
163+
#undef DEFAULT_SPRITE_LIST
164+
#undef MALE_SPRITE_LIST
165+
#undef FEMALE_SPRITE_LIST

0 commit comments

Comments
 (0)