From 62be650076d6ea83e9822be56eaa59ab4195202c Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Fri, 29 Sep 2017 18:39:52 -0400 Subject: Extractor now gets ribbons --- gba/source/savestructs.h | 14 +++++----- gba/source/serialize.c | 20 +++++++++++++++ include/pokemon.h | 19 ++++++++++++++ source/deserialize.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 7 deletions(-) diff --git a/gba/source/savestructs.h b/gba/source/savestructs.h index fb8ef36..a5aff4e 100644 --- a/gba/source/savestructs.h +++ b/gba/source/savestructs.h @@ -342,13 +342,13 @@ struct PokemonSubstruct3 /* 0x0A */ u32 victoryRibbon:1; /* 0x0A */ u32 artistRibbon:1; /* 0x0A */ u32 effortRibbon:1; - /* 0x0A */ u32 giftRibbon1:1; - /* 0x0A */ u32 giftRibbon2:1; - /* 0x0A */ u32 giftRibbon3:1; - /* 0x0A */ u32 giftRibbon4:1; - /* 0x0B */ u32 giftRibbon5:1; - /* 0x0B */ u32 giftRibbon6:1; - /* 0x0B */ u32 giftRibbon7:1; + /* 0x0A */ u32 marineRibbon:1; + /* 0x0A */ u32 landRibbon:1; + /* 0x0A */ u32 skyRibbon:1; + /* 0x0A */ u32 countryRibbon:1; + /* 0x0B */ u32 nationalRibbon:1; + /* 0x0B */ u32 earthRibbon:1; + /* 0x0B */ u32 worldRibbon:1; /* 0x0B */ u32 fatefulEncounter:5; // unused in Ruby/Sapphire, but the high bit must be set for Mew/Deoxys to obey in FR/LG/Emerald }; diff --git a/gba/source/serialize.c b/gba/source/serialize.c index 5c4ff8d..4cb95ac 100644 --- a/gba/source/serialize.c +++ b/gba/source/serialize.c @@ -101,6 +101,26 @@ void PokemonIntermediateInit( pki->language = bpkm->language & 7; pki->orre = (sub3->metGame == 15); + pki->coolRibbons = sub3->coolRibbon; + pki->beautyRibbons = sub3->beautyRibbon; + pki->cuteRibbons = sub3->cuteRibbon; + pki->smartRibbons = sub3->smartRibbon; + pki->toughRibbons = sub3->toughRibbon; + + pki->miscRibbons = + (CHAMPION_RIBBON * sub3->championRibbon) + | (WINNING_RIBBON * sub3->winningRibbon) + | (VICTORY_RIBBON * sub3->victoryRibbon) + | (ARTIST_RIBBON * sub3->artistRibbon) + | (EFFORT_RIBBON * sub3->effortRibbon) + | (MARINE_RIBBON * sub3->marineRibbon) + | (LAND_RIBBON * sub3->landRibbon) + | (SKY_RIBBON * sub3->skyRibbon) + | (COUNTRY_RIBBON * sub3->countryRibbon) + | (NATIONAL_RIBBON * sub3->nationalRibbon) + | (EARTH_RIBBON * sub3->earthRibbon) + | (WORLD_RIBBON * sub3->worldRibbon); + // Derive nature from the personality value. pki->nature = (bpkm->personality % 25); diff --git a/include/pokemon.h b/include/pokemon.h index dbf0d41..ce961ed 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -20,6 +20,19 @@ enum PokemonLanguage { Spanish = 7 }; +#define CHAMPION_RIBBON (1 << 0) +#define WINNING_RIBBON (1 << 1) +#define VICTORY_RIBBON (1 << 2) +#define ARTIST_RIBBON (1 << 3) +#define EFFORT_RIBBON (1 << 4) +#define MARINE_RIBBON (1 << 5) +#define LAND_RIBBON (1 << 6) +#define SKY_RIBBON (1 << 7) +#define COUNTRY_RIBBON (1 << 8) +#define NATIONAL_RIBBON (1 << 9) +#define EARTH_RIBBON (1 << 10) +#define WORLD_RIBBON (1 << 11) + struct __attribute__((aligned(4))) PokemonIntermediate { // a hash that can be used to identify the Pokémon. because the games do not // naturally generate unique identifiers for Pokémon, this hash is generated @@ -59,7 +72,13 @@ struct __attribute__((aligned(4))) PokemonIntermediate { u16 heldItem; u16 moves[4]; u16 otId; // only the lower 2 bytes, because the upper 2 are secret + u16 miscRibbons; + u8 coolRibbons; + u8 beautyRibbons; + u8 cuteRibbons; + u8 smartRibbons; + u8 toughRibbons; u8 ppBonuses; u8 otGender; u8 metLevel; diff --git a/source/deserialize.c b/source/deserialize.c index da2d919..b37cb72 100644 --- a/source/deserialize.c +++ b/source/deserialize.c @@ -211,5 +211,72 @@ cJSON* pokemonToJson(const struct PokemonIntermediate* pki) pki->unownLetter); } + cJSON_AddNumberToObject(jPoke, "coolRibbons", pki->coolRibbons); + cJSON_AddNumberToObject(jPoke, "beautyRibbons", pki->beautyRibbons); + cJSON_AddNumberToObject(jPoke, "cuteRibbons", pki->cuteRibbons); + cJSON_AddNumberToObject(jPoke, "smartRibbons", pki->smartRibbons); + cJSON_AddNumberToObject(jPoke, "toughRibbons", pki->toughRibbons); + + u16 miscRibbons = __builtin_bswap16(pki->miscRibbons); + if (miscRibbons & CHAMPION_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "championRibbon", true); + } + + if (miscRibbons & WINNING_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "winningRibbon", true); + } + + if (miscRibbons & VICTORY_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "victoryRibbon", true); + } + + if (miscRibbons & ARTIST_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "artistRibbon", true); + } + + if (miscRibbons & EFFORT_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "effortRibbon", true); + } + + if (miscRibbons & MARINE_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "marineRibbon", true); + } + + if (miscRibbons & LAND_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "landRibbon", true); + } + + if (miscRibbons & SKY_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "skyRibbon", true); + } + + if (miscRibbons & COUNTRY_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "countryRibbon", true); + } + + if (miscRibbons & NATIONAL_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "nationalRibbon", true); + } + + if (miscRibbons & EARTH_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "earthRibbon", true); + } + + if (miscRibbons & WORLD_RIBBON) + { + cJSON_AddBoolToObject(jPoke, "worldRibbon", true); + } + return jPoke; } -- cgit 1.4.1