|
|
@@ -2,92 +2,14 @@
|
|
|
|
|
|
#include <src/include/pokemon_app.h>
|
|
|
#include <src/include/pokemon_data.h>
|
|
|
+#include <src/include/pokemon_gender.h>
|
|
|
|
|
|
#include <src/scenes/include/pokemon_scene.h>
|
|
|
|
|
|
-static const char* gender_str[] = {
|
|
|
- "Unknown",
|
|
|
- "Female",
|
|
|
- "Male",
|
|
|
-};
|
|
|
-
|
|
|
-/* This returns a string pointer if the gender is static, NULL if it is not and
|
|
|
- * the gender needs to be calculated.
|
|
|
- */
|
|
|
-const char* select_gender_is_static(PokemonData* pdata, uint8_t ratio) {
|
|
|
- switch(ratio) {
|
|
|
- case 0xFF:
|
|
|
- return gender_str[0];
|
|
|
- case 0xFE:
|
|
|
- return gender_str[1];
|
|
|
- case 0x00:
|
|
|
- if(pokemon_stat_get(pdata, STAT_NUM, NONE) != 0xEB) { // Tyrogue can be either gender
|
|
|
- return gender_str[2];
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
-const char* select_gender_get(PokemonData* pdata) {
|
|
|
- uint8_t ratio = table_stat_base_get(
|
|
|
- pdata->pokemon_table,
|
|
|
- pokemon_stat_get(pdata, STAT_NUM, NONE),
|
|
|
- STAT_BASE_GENDER_RATIO,
|
|
|
- NONE);
|
|
|
- uint8_t atk_iv;
|
|
|
- const char* rc;
|
|
|
-
|
|
|
- rc = select_gender_is_static(pdata, ratio);
|
|
|
- if(rc) return rc;
|
|
|
-
|
|
|
- /* Falling through here means now we need to calculate the gender from
|
|
|
- * its ratio and ATK_IV.
|
|
|
- */
|
|
|
- atk_iv = pokemon_stat_get(pdata, STAT_ATK_IV, NONE);
|
|
|
- if(atk_iv * 17 <= ratio)
|
|
|
- return gender_str[1];
|
|
|
- else
|
|
|
- return gender_str[2];
|
|
|
-}
|
|
|
-
|
|
|
static void select_gender_selected_callback(void* context, uint32_t index) {
|
|
|
PokemonFap* pokemon_fap = (PokemonFap*)context;
|
|
|
- PokemonData* pdata = pokemon_fap->pdata;
|
|
|
- uint8_t ratio = table_stat_base_get(
|
|
|
- pdata->pokemon_table,
|
|
|
- pokemon_stat_get(pdata, STAT_NUM, NONE),
|
|
|
- STAT_BASE_GENDER_RATIO,
|
|
|
- NONE);
|
|
|
- uint8_t atk_iv = pokemon_stat_get(pdata, STAT_ATK_IV, NONE);
|
|
|
-
|
|
|
- /* If we need to make the pokemon a male, increase atk IV until it exceeds
|
|
|
- * the gender ratio.
|
|
|
- *
|
|
|
- * Note that, there is no checking here for impossible situations as the
|
|
|
- * scene enter function will immediately quit if its not possible to change
|
|
|
- * the gender (the extremes of gender_ratio value).
|
|
|
- *
|
|
|
- * The check for gender is a percentage, if ATK_IV*(255/15) <= the ratio,
|
|
|
- * then the pokemon is a female. The gender ratio values end up being:
|
|
|
- * DEF GENDER_F0 EQU 0 percent
|
|
|
- * DEF GENDER_F12_5 EQU 12 percent + 1
|
|
|
- * DEF GENDER_F25 EQU 25 percent
|
|
|
- * DEF GENDER_F50 EQU 50 percent
|
|
|
- * DEF GENDER_F75 EQU 75 percent
|
|
|
- * DEF GENDER_F100 EQU 100 percent - 1
|
|
|
- * Where percent is (255/100)
|
|
|
- */
|
|
|
- if(index) {
|
|
|
- while((atk_iv * 17) <= ratio) atk_iv++;
|
|
|
- } else {
|
|
|
- while((atk_iv * 17) > ratio) atk_iv--;
|
|
|
- }
|
|
|
|
|
|
- pokemon_stat_set(pdata, STAT_ATK_IV, NONE, atk_iv);
|
|
|
+ pokemon_gender_set(pokemon_fap->pdata, index);
|
|
|
|
|
|
scene_manager_previous_scene(pokemon_fap->scene_manager);
|
|
|
}
|
|
|
@@ -98,10 +20,10 @@ void pokemon_scene_select_gender_on_enter(void* context) {
|
|
|
submenu_reset(pokemon_fap->submenu);
|
|
|
|
|
|
submenu_add_item(
|
|
|
- pokemon_fap->submenu, "Female", 0, select_gender_selected_callback, pokemon_fap);
|
|
|
+ pokemon_fap->submenu, "Female", GENDER_FEMALE, select_gender_selected_callback, pokemon_fap);
|
|
|
|
|
|
submenu_add_item(
|
|
|
- pokemon_fap->submenu, "Male", 1, select_gender_selected_callback, pokemon_fap);
|
|
|
+ pokemon_fap->submenu, "Male", GENDER_MALE, select_gender_selected_callback, pokemon_fap);
|
|
|
}
|
|
|
|
|
|
bool pokemon_scene_select_gender_on_event(void* context, SceneManagerEvent event)
|