Skip to content

Commit

Permalink
pokemon_shiny: Split out attribute handling, does not belong in scene
Browse files Browse the repository at this point in the history
Signed-off-by: Kris Bahnsen <Kris@KBEmbedded.com>
  • Loading branch information
kbembedded committed Aug 6, 2024
1 parent 5eebf2d commit 2f9f536
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 66 deletions.
10 changes: 10 additions & 0 deletions src/include/pokemon_shiny.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#ifndef POKEMON_SHINY_H
#define POKEMON_SHINY_H

#pragma once

bool pokemon_is_shiny(PokemonData* pdata);

void pokemon_set_shiny(PokemonData *pdata, bool shiny);

#endif // POKEMON_SHINY_H
61 changes: 61 additions & 0 deletions src/pokemon_shiny.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#include <src/include/pokemon_data.h>

/* This just assumes gen ii for now */
/* For a Gen II pokemon to be shiny, the following must be met:
* Spd, Def, and Spc must all be 10
* Atk must be 2, 3, 6, 7, 10, 11, 14, or 15
*/
bool pokemon_is_shiny(PokemonData* pdata) {
uint8_t atk_iv = pokemon_stat_get(pdata, STAT_ATK_IV, NONE);
uint8_t def_iv = pokemon_stat_get(pdata, STAT_DEF_IV, NONE);
uint8_t spd_iv = pokemon_stat_get(pdata, STAT_SPD_IV, NONE);
uint8_t spc_iv = pokemon_stat_get(pdata, STAT_SPC_IV, NONE);
bool rc = 1;

if(spd_iv != 10) rc = 0;
if(def_iv != 10) rc = 0;
if(spc_iv != 10) rc = 0;
switch(atk_iv) {
case 0:
case 1:
case 4:
case 5:
case 8:
case 9:
case 12:
case 13:
rc = 0;
break;
default:
break;
}

return rc;
}

void pokemon_set_shiny(PokemonData* pdata, bool shiny) {

if(!shiny) {
do {
/* First, reset the IV to the selected stat */
pokemon_stat_set(pdata, STAT_SEL, NONE, pokemon_stat_get(pdata, STAT_SEL, NONE));

/* XXX: This may not be right? */
/* Next, ensure the current IVs wouldn't make the pokemon shiny */
} while(pokemon_is_shiny(pdata));
} else {
/* Set Def, Spd, Spc to 10 */
pokemon_stat_set(pdata, STAT_DEF_IV, NONE, 10);
pokemon_stat_set(pdata, STAT_SPD_IV, NONE, 10);
pokemon_stat_set(pdata, STAT_SPC_IV, NONE, 10);

/* Increase ATK IV until we hit a shiny number. Note that, this only
* affects IVs that are randomly generated, max IV will already be set
* at 15 which will make it shiny.
*/
while(!pokemon_is_shiny(pdata)) {
pokemon_stat_set(
pdata, STAT_ATK_IV, NONE, pokemon_stat_get(pdata, STAT_ATK_IV, NONE) + 1);
}
}
}
8 changes: 0 additions & 8 deletions src/scenes/include/pokemon_shiny.h

This file was deleted.

4 changes: 2 additions & 2 deletions src/scenes/pokemon_gen.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <src/scenes/include/pokemon_scene.h>

#include <src/scenes/include/pokemon_menu.h>
#include <src/scenes/include/pokemon_shiny.h>
#include <src/include/pokemon_shiny.h>
#include <src/include/pokemon_gender.h>
#include <src/scenes/include/pokemon_pokerus.h>
#include <src/include/unown_form.h>
Expand Down Expand Up @@ -180,7 +180,7 @@ void pokemon_scene_gen_on_enter(void* context) {
buf,
sizeof(buf),
"Shiny: %s",
select_shiny_is_shiny(pokemon_fap->pdata) ? "Yes" : "No");
pokemon_is_shiny(pokemon_fap->pdata) ? "Yes" : "No");
submenu_add_item(
pokemon_fap->submenu, buf, PokemonSceneShiny, scene_change_from_main_cb, pokemon_fap);

Expand Down
58 changes: 2 additions & 56 deletions src/scenes/pokemon_shiny.c
Original file line number Diff line number Diff line change
@@ -1,68 +1,14 @@
#include <gui/modules/submenu.h>

#include <src/include/pokemon_app.h>
#include <src/include/pokemon_shiny.h>

#include <src/scenes/include/pokemon_scene.h>

/* This just assumes gen ii for now */
/* For a Gen II pokemon to be shiny, the following must be met:
* Spd, Def, and Spc must all be 10
* Atk must be 2, 3, 6, 7, 10, 11, 14, or 15
*/
bool select_shiny_is_shiny(PokemonData* pdata) {
uint8_t atk_iv = pokemon_stat_get(pdata, STAT_ATK_IV, NONE);
uint8_t def_iv = pokemon_stat_get(pdata, STAT_DEF_IV, NONE);
uint8_t spd_iv = pokemon_stat_get(pdata, STAT_SPD_IV, NONE);
uint8_t spc_iv = pokemon_stat_get(pdata, STAT_SPC_IV, NONE);
bool rc = 1;

if(spd_iv != 10) rc = 0;
if(def_iv != 10) rc = 0;
if(spc_iv != 10) rc = 0;
switch(atk_iv) {
case 0:
case 1:
case 4:
case 5:
case 8:
case 9:
case 12:
case 13:
rc = 0;
break;
default:
break;
}

return rc;
}

static void select_shiny_selected_callback(void* context, uint32_t index) {
PokemonFap* pokemon_fap = (PokemonFap*)context;
PokemonData* pdata = pokemon_fap->pdata;

if(!index) {
do {
/* First, reset the IV to the selected stat */
pokemon_stat_set(pdata, STAT_SEL, NONE, pokemon_stat_get(pdata, STAT_SEL, NONE));

/* Next, ensure the current IVs wouldn't make the pokemon shiny */
} while(select_shiny_is_shiny(pdata));
} else {
/* Set Def, Spd, Spc to 10 */
pokemon_stat_set(pdata, STAT_DEF_IV, NONE, 10);
pokemon_stat_set(pdata, STAT_SPD_IV, NONE, 10);
pokemon_stat_set(pdata, STAT_SPC_IV, NONE, 10);

/* Increase ATK IV until we hit a shiny number. Note that, this only
* affects IVs that are randomly generated, max IV will already be set
* at 15 which will make it shiny.
*/
while(!select_shiny_is_shiny(pdata)) {
pokemon_stat_set(
pdata, STAT_ATK_IV, NONE, pokemon_stat_get(pdata, STAT_ATK_IV, NONE) + 1);
}
}
pokemon_set_shiny(pokemon_fap->pdata, (bool)index);

scene_manager_previous_scene(pokemon_fap->scene_manager);
}
Expand Down

0 comments on commit 2f9f536

Please sign in to comment.