Skip to content

Commit eba4b5d

Browse files
authored
Lza donut options (UI only) (#912)
* donut berries option * donut options test program * wip flavor table * filled out power table * string check log
1 parent 46942f7 commit eba4b5d

File tree

8 files changed

+854
-0
lines changed

8 files changed

+854
-0
lines changed
Lines changed: 383 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,383 @@
1+
/* Donut Berries Option
2+
*
3+
* From: https://github.com/PokemonAutomation/
4+
*
5+
*/
6+
7+
#include "CommonFramework/Logging/Logger.h"
8+
#include "PokemonLZA/Resources/PokemonLZA_DonutBerries.h"
9+
#include "PokemonLZA_DonutBerriesOption.h"
10+
11+
namespace PokemonAutomation{
12+
namespace NintendoSwitch{
13+
namespace PokemonLZA{
14+
15+
const EnumDropdownDatabase<Flavor_Powers>& flavor_power_enum_database(){
16+
static EnumDropdownDatabase<Flavor_Powers> database{
17+
{Flavor_Powers::alpha, "alpha", "Alpha"},
18+
{Flavor_Powers::humungo, "humungo", "Humungo"},
19+
{Flavor_Powers::teensy, "teensy", "Teensy"},
20+
{Flavor_Powers::sparkling, "sparkling", "Sparkling"},
21+
{Flavor_Powers::atk, "atk", "Attack"},
22+
{Flavor_Powers::spatk, "spatk", "Sp. Atk"},
23+
{Flavor_Powers::move, "move", "Move"},
24+
{Flavor_Powers::speed, "speed", "Speed"},
25+
{Flavor_Powers::bighaul, "bighaul", "Big Haul"},
26+
{Flavor_Powers::item, "item", "Item"},
27+
{Flavor_Powers::megacharge, "megacharge", "Mega Charge"},
28+
{Flavor_Powers::megaconserve,"megaconserve","Mega Conserve"},
29+
{Flavor_Powers::def, "def", "Defense"},
30+
{Flavor_Powers::spdef, "spdef", "Sp. Def"},
31+
{Flavor_Powers::resistance, "resistance", "Resistance"},
32+
{Flavor_Powers::encounter, "encounter", "Encounter"},
33+
{Flavor_Powers::catching, "catching", "Catching"},
34+
};
35+
return database;
36+
}
37+
const EnumDropdownDatabase<Power_Pokemon_Types>& pokemon_power_enum_database(){
38+
static EnumDropdownDatabase<Power_Pokemon_Types> database{
39+
{Power_Pokemon_Types::all, "all", "All Types"},
40+
{Power_Pokemon_Types::normal, "normal", "Normal"},
41+
{Power_Pokemon_Types::fire, "fire", "Fire"},
42+
{Power_Pokemon_Types::water, "water", "Water"},
43+
{Power_Pokemon_Types::electric, "electric", "Electric"},
44+
{Power_Pokemon_Types::grass, "grass", "Grass"},
45+
{Power_Pokemon_Types::ice, "ice", "Ice"},
46+
{Power_Pokemon_Types::fighting, "fighting", "Fighting"},
47+
{Power_Pokemon_Types::poison, "poison", "Poison"},
48+
{Power_Pokemon_Types::ground, "ground", "Ground"},
49+
{Power_Pokemon_Types::flying, "flying", "Flying"},
50+
{Power_Pokemon_Types::psychic, "psychic", "Psychic"},
51+
{Power_Pokemon_Types::bug, "bug", "Bug"},
52+
{Power_Pokemon_Types::rock, "rock", "Rock"},
53+
{Power_Pokemon_Types::ghost, "ghost", "Ghost"},
54+
{Power_Pokemon_Types::dragon, "dragon", "Dragon"},
55+
{Power_Pokemon_Types::dark, "dark", "Dark"},
56+
{Power_Pokemon_Types::steel, "steel", "Steel"},
57+
{Power_Pokemon_Types::fairy, "fairy", "Fairy"},
58+
};
59+
return database;
60+
}
61+
const EnumDropdownDatabase<Power_Item_Types>& item_power_enum_database(){
62+
static EnumDropdownDatabase<Power_Item_Types> database{
63+
{Power_Item_Types::berries, "berries", "Berries"},
64+
{Power_Item_Types::candies, "candies", "Candies"},
65+
{Power_Item_Types::treasure, "treasure", "Treasure"},
66+
{Power_Item_Types::pokeballs, "pokeballs", "Poke Balls"},
67+
{Power_Item_Types::special, "special", "Special"},
68+
{Power_Item_Types::coins, "coins", "Coins"},
69+
};
70+
return database;
71+
}
72+
const EnumDropdownDatabase<Power_Level>& power_level_enum_database(){
73+
static EnumDropdownDatabase<Power_Level> database{
74+
{Power_Level::one, "one", "Lv. 1"},
75+
{Power_Level::two, "two", "Lv. 2"},
76+
{Power_Level::three, "three", "Lv. 3"},
77+
};
78+
return database;
79+
}
80+
81+
std::string FlavorPowerTableEntry::to_str() const{
82+
std::string selected_power;
83+
84+
switch (power){
85+
case Flavor_Powers::alpha:
86+
selected_power += "alpha-power-";
87+
break;
88+
case Flavor_Powers::humungo:
89+
selected_power += "humungo-power-";
90+
break;
91+
case Flavor_Powers::teensy:
92+
selected_power += "teensy-power-";
93+
break;
94+
case Flavor_Powers::sparkling:
95+
selected_power += "sparkling-power-";
96+
break;
97+
case Flavor_Powers::atk:
98+
selected_power += "attack-power-";
99+
break;
100+
case Flavor_Powers::spatk:
101+
selected_power += "sp-atk-power-";
102+
break;
103+
case Flavor_Powers::move:
104+
selected_power += "move-power-";
105+
break;
106+
case Flavor_Powers::speed:
107+
selected_power += "speed-power-";
108+
break;
109+
case Flavor_Powers::bighaul:
110+
selected_power += "big-haul-power-";
111+
break;
112+
case Flavor_Powers::item:
113+
selected_power += "item-power-";
114+
break;
115+
case Flavor_Powers::megacharge:
116+
selected_power += "mega-power-charging-";
117+
break;
118+
case Flavor_Powers::megaconserve:
119+
selected_power += "mega-power-conservation-";
120+
break;
121+
case Flavor_Powers::def:
122+
selected_power += "defense-power-";
123+
break;
124+
case Flavor_Powers::spdef:
125+
selected_power += "sp-def-power-";
126+
break;
127+
case Flavor_Powers::resistance:
128+
selected_power += "resistance-power-";
129+
break;
130+
case Flavor_Powers::encounter:
131+
selected_power += "encounter-power-";
132+
break;
133+
case Flavor_Powers::catching:
134+
selected_power += "catching-power-";
135+
break;
136+
}
137+
138+
if (power == Flavor_Powers::catching || power == Flavor_Powers::sparkling) {
139+
switch (pokemon_type) {
140+
case Power_Pokemon_Types::all:
141+
selected_power += "all-types-";
142+
break;
143+
case Power_Pokemon_Types::normal:
144+
selected_power += "normal-";
145+
break;
146+
case Power_Pokemon_Types::fire:
147+
selected_power += "fire-";
148+
break;
149+
case Power_Pokemon_Types::water:
150+
selected_power += "water-";
151+
break;
152+
case Power_Pokemon_Types::electric:
153+
selected_power += "electric-";
154+
break;
155+
case Power_Pokemon_Types::grass:
156+
selected_power += "grass-";
157+
break;
158+
case Power_Pokemon_Types::ice:
159+
selected_power += "ice-";
160+
break;
161+
case Power_Pokemon_Types::fighting:
162+
selected_power += "fighting-";
163+
break;
164+
case Power_Pokemon_Types::poison:
165+
selected_power += "poison-";
166+
break;
167+
case Power_Pokemon_Types::ground:
168+
selected_power += "ground-";
169+
break;
170+
case Power_Pokemon_Types::flying:
171+
selected_power += "flying-";
172+
break;
173+
case Power_Pokemon_Types::psychic:
174+
selected_power += "psychic-";
175+
break;
176+
case Power_Pokemon_Types::bug:
177+
selected_power += "bug-";
178+
break;
179+
case Power_Pokemon_Types::rock:
180+
selected_power += "rock-";
181+
break;
182+
case Power_Pokemon_Types::ghost:
183+
selected_power += "ghost-";
184+
break;
185+
case Power_Pokemon_Types::dragon:
186+
selected_power += "dragon-";
187+
break;
188+
case Power_Pokemon_Types::dark:
189+
selected_power += "dark-";
190+
break;
191+
case Power_Pokemon_Types::steel:
192+
selected_power += "steel-";
193+
break;
194+
case Power_Pokemon_Types::fairy:
195+
selected_power += "fairy-";
196+
break;
197+
}
198+
}
199+
else if (power == Flavor_Powers::move || power == Flavor_Powers::resistance) {
200+
switch (item_type) {
201+
case Power_Item_Types::berries:
202+
selected_power += "berries-";
203+
break;
204+
case Power_Item_Types::candies:
205+
selected_power += "candies-";
206+
break;
207+
case Power_Item_Types::treasure:
208+
selected_power += "treasure-";
209+
break;
210+
case Power_Item_Types::pokeballs:
211+
selected_power += "poke-balls-";
212+
break;
213+
case Power_Item_Types::special:
214+
selected_power += "special-";
215+
break;
216+
case Power_Item_Types::coins:
217+
selected_power += "coins-";
218+
break;
219+
}
220+
}
221+
222+
switch (level) {
223+
case Power_Level::one:
224+
selected_power += "1";
225+
case Power_Level::two:
226+
selected_power += "2";
227+
case Power_Level::three:
228+
selected_power += "3";
229+
}
230+
231+
return selected_power;
232+
}
233+
234+
StringSelectDatabase make_donut_berries_database(){
235+
StringSelectDatabase ret;
236+
for (const auto& slug : DONUT_BERRIES_SLUGS()){
237+
const DonutBerries& data = get_berry_name(slug);
238+
const SpriteDatabase::Sprite* sprite = DONUT_BERRIES_DATABASE().get_nothrow(slug);
239+
if (sprite == nullptr){
240+
ret.add_entry(StringSelectEntry(slug, data.display_name()));
241+
global_logger_tagged().log("Missing sprite for: " + slug, COLOR_RED);
242+
}else{
243+
ret.add_entry(StringSelectEntry(slug, data.display_name(), sprite->icon));
244+
}
245+
}
246+
return ret;
247+
}
248+
const StringSelectDatabase& DONUT_BERRY_DATABASE(){
249+
static StringSelectDatabase database = make_donut_berries_database();
250+
return database;
251+
}
252+
253+
254+
DonutBerriesTableCell::DonutBerriesTableCell(
255+
const std::string& default_slug
256+
)
257+
: StringSelectCell(
258+
DONUT_BERRY_DATABASE(),
259+
LockMode::LOCK_WHILE_RUNNING,
260+
default_slug
261+
)
262+
{}
263+
264+
DonutBerriesTableRow::DonutBerriesTableRow(EditableTableOption& parent_table)
265+
: EditableTableRow(parent_table)
266+
, berry("hyper-cheri-berry")
267+
{
268+
PA_ADD_OPTION(berry);
269+
}
270+
std::unique_ptr<EditableTableRow> DonutBerriesTableRow::clone() const{
271+
std::unique_ptr<DonutBerriesTableRow> ret(new DonutBerriesTableRow(parent()));
272+
ret->berry.set_by_index(berry.index());
273+
return ret;
274+
}
275+
276+
DonutBerriesTable::DonutBerriesTable(std::string label)
277+
: EditableTableOption_t<DonutBerriesTableRow>(
278+
std::move(label),
279+
LockMode::LOCK_WHILE_RUNNING,
280+
make_defaults()
281+
)
282+
{}
283+
284+
285+
std::vector<std::string> DonutBerriesTable::make_header() const{
286+
return std::vector<std::string>{
287+
"Berry",
288+
};
289+
}
290+
291+
std::vector<std::unique_ptr<EditableTableRow>> DonutBerriesTable::make_defaults(){
292+
std::vector<std::unique_ptr<EditableTableRow>> ret;
293+
ret.emplace_back(std::make_unique<DonutBerriesTableRow>(*this));
294+
return ret;
295+
}
296+
297+
298+
299+
300+
FlavorPowerTableRow::~FlavorPowerTableRow(){
301+
power.remove_listener(*this);
302+
}
303+
FlavorPowerTableRow::FlavorPowerTableRow(EditableTableOption& parent_table)
304+
: EditableTableRow(parent_table)
305+
, power(flavor_power_enum_database(), LockMode::LOCK_WHILE_RUNNING, Flavor_Powers::alpha)
306+
, type_pokemon(pokemon_power_enum_database(), LockMode::LOCK_WHILE_RUNNING, Power_Pokemon_Types::all)
307+
, type_item(item_power_enum_database(), LockMode::LOCK_WHILE_RUNNING, Power_Item_Types::berries)
308+
, level(power_level_enum_database(), LockMode::LOCK_WHILE_RUNNING, Power_Level::three)
309+
{
310+
PA_ADD_OPTION(power);
311+
PA_ADD_OPTION(type_pokemon);
312+
PA_ADD_OPTION(type_item);
313+
PA_ADD_OPTION(level);
314+
315+
FlavorPowerTableRow::on_config_value_changed(this);
316+
power.add_listener(*this);
317+
}
318+
std::unique_ptr<EditableTableRow> FlavorPowerTableRow::clone() const{
319+
std::unique_ptr<FlavorPowerTableRow> ret(new FlavorPowerTableRow(parent()));
320+
ret->power.set(power);
321+
ret->type_pokemon.set(type_pokemon);
322+
ret->type_item.set(type_item);
323+
ret->level.set(level);
324+
return ret;
325+
}
326+
FlavorPowerTableEntry FlavorPowerTableRow::snapshot() const{
327+
return FlavorPowerTableEntry{power, type_pokemon, type_item, level};
328+
}
329+
void FlavorPowerTableRow::on_config_value_changed(void* object){
330+
Flavor_Powers power = this->power;
331+
332+
type_item.set_visibility(
333+
power == Flavor_Powers::item
334+
? ConfigOptionState::ENABLED
335+
: ConfigOptionState::HIDDEN
336+
);
337+
338+
bool req_poke_types =
339+
power == Flavor_Powers::sparkling ||
340+
power == Flavor_Powers::catching ||
341+
power == Flavor_Powers::move ||
342+
power == Flavor_Powers::resistance;
343+
344+
type_pokemon.set_visibility(
345+
req_poke_types
346+
? ConfigOptionState::ENABLED
347+
: ConfigOptionState::HIDDEN
348+
);
349+
}
350+
351+
FlavorPowerTable::FlavorPowerTable()
352+
: EditableTableOption_t<FlavorPowerTableRow>(
353+
"<b>Flavor Powers Table:</b><br>"
354+
"Add all desired flavor powers to this table. "
355+
"The program will check the powers of any baked donut and compare them against the selected items in the table. "
356+
"Be sure to set the correct Number of Powers to Match above."
357+
"<br>Note: \"All Types\" means the All Types Power in-game.",
358+
LockMode::LOCK_WHILE_RUNNING,
359+
make_defaults()
360+
)
361+
{}
362+
std::vector<FlavorPowerTableEntry> FlavorPowerTable::snapshot(){
363+
return EditableTableOption_t<FlavorPowerTableRow>::snapshot<FlavorPowerTableEntry>();
364+
}
365+
std::vector<std::string> FlavorPowerTable::make_header() const{
366+
return {
367+
"Flavor Power ",
368+
"Pokemon Type ",
369+
"Item Type ",
370+
"Level ",
371+
};
372+
}
373+
std::vector<std::unique_ptr<EditableTableRow>> FlavorPowerTable::make_defaults(){
374+
std::vector<std::unique_ptr<EditableTableRow>> ret;
375+
ret.emplace_back(new FlavorPowerTableRow(*this));
376+
return ret;
377+
}
378+
379+
380+
381+
}
382+
}
383+
}

0 commit comments

Comments
 (0)