From 3cb3ccb6dff3cede5a1e6d8cdb6839b4fe7a6dd5 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Mon, 17 Jun 2024 17:30:05 +0200 Subject: [PATCH] natures refactoring --- include/pokemon.h | 10 +- include/pokemon_summary_screen.h | 3 - src/battle_interface.c | 2 +- src/pokemon.c | 269 +++++++++++++++++++++---------- src/pokemon_summary_screen.c | 12 +- 5 files changed, 200 insertions(+), 96 deletions(-) diff --git a/include/pokemon.h b/include/pokemon.h index 311fa4968..aa6d9b2be 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -588,6 +588,14 @@ struct Ability u8 failsOnImposter:1; // doesn't work on an Imposter mon; when can we actually use this? }; +struct NatureInfo +{ + const u8 *name; + u8 statUp; + u8 statDown; + u8 backAnim; +}; + #define SPINDA_SPOT_WIDTH 16 #define SPINDA_SPOT_HEIGHT 16 @@ -656,7 +664,7 @@ extern const struct SpriteTemplate gSpriteTemplates_Battlers[]; extern const u8 gPPUpGetMask[]; extern const u32 sExpCandyExperienceTable[]; extern const struct Ability gAbilitiesInfo[]; -extern const s8 gNatureStatTable[][5]; +extern const struct NatureInfo gNaturesInfo[]; void ZeroBoxMonData(struct BoxPokemon *boxMon); void ZeroMonData(struct Pokemon *mon); diff --git a/include/pokemon_summary_screen.h b/include/pokemon_summary_screen.h index 5326f7bd3..9fca6f45d 100644 --- a/include/pokemon_summary_screen.h +++ b/include/pokemon_summary_screen.h @@ -3,9 +3,6 @@ #include "main.h" -extern const u8 *const gMoveDescriptionPointers[]; -extern const u8 *const gNatureNamePointers[]; - void ShowSelectMovePokemonSummaryScreen(struct Pokemon *, u8, u8, MainCallback, u16); u8 GetMoveSlotToReplace(void); void SummaryScreen_SetUnknownTaskId(u8 a0); diff --git a/src/battle_interface.c b/src/battle_interface.c index 261bf4432..901209d7e 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -995,7 +995,7 @@ static void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon) barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBattlerPosition(gSprites[healthboxSpriteId].sBattlerId) * 384)]; var = 5; nature = GetNature(mon); - StringCopy(text + 6, gNatureNamePointers[nature]); + StringCopy(text + 6, gNaturesInfo[nature].name); RenderTextHandleBold(barFontGfx, 0, text); for (j = 6, i = 0; i < var; i++, j++) diff --git a/src/pokemon.c b/src/pokemon.c index 9371e173b..d6a80f3c1 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -593,62 +593,184 @@ static const struct SpindaSpot sSpindaSpotGraphics[] = {.x = 34, .y = 26, .image = INCBIN_U16("graphics/spinda_spots/spot_3.bin")} }; -const u8 *const gNatureNamePointers[NUM_NATURES] = -{ - [NATURE_HARDY] = COMPOUND_STRING("Hardy"), - [NATURE_LONELY] = COMPOUND_STRING("Lonely"), - [NATURE_BRAVE] = COMPOUND_STRING("Brave"), - [NATURE_ADAMANT] = COMPOUND_STRING("Adamant"), - [NATURE_NAUGHTY] = COMPOUND_STRING("Naughty"), - [NATURE_BOLD] = COMPOUND_STRING("Bold"), - [NATURE_DOCILE] = COMPOUND_STRING("Docile"), - [NATURE_RELAXED] = COMPOUND_STRING("Relaxed"), - [NATURE_IMPISH] = COMPOUND_STRING("Impish"), - [NATURE_LAX] = COMPOUND_STRING("Lax"), - [NATURE_TIMID] = COMPOUND_STRING("Timid"), - [NATURE_HASTY] = COMPOUND_STRING("Hasty"), - [NATURE_SERIOUS] = COMPOUND_STRING("Serious"), - [NATURE_JOLLY] = COMPOUND_STRING("Jolly"), - [NATURE_NAIVE] = COMPOUND_STRING("Naive"), - [NATURE_MODEST] = COMPOUND_STRING("Modest"), - [NATURE_MILD] = COMPOUND_STRING("Mild"), - [NATURE_QUIET] = COMPOUND_STRING("Quiet"), - [NATURE_BASHFUL] = COMPOUND_STRING("Bashful"), - [NATURE_RASH] = COMPOUND_STRING("Rash"), - [NATURE_CALM] = COMPOUND_STRING("Calm"), - [NATURE_GENTLE] = COMPOUND_STRING("Gentle"), - [NATURE_SASSY] = COMPOUND_STRING("Sassy"), - [NATURE_CAREFUL] = COMPOUND_STRING("Careful"), - [NATURE_QUIRKY] = COMPOUND_STRING("Quirky"), -}; -const s8 gNatureStatTable[NUM_NATURES][NUM_NATURE_STATS] = -{ // Attack Defense Speed Sp.Atk Sp. Def - [NATURE_HARDY] = { 0, 0, 0, 0, 0 }, - [NATURE_LONELY] = { +1, -1, 0, 0, 0 }, - [NATURE_BRAVE] = { +1, 0, -1, 0, 0 }, - [NATURE_ADAMANT] = { +1, 0, 0, -1, 0 }, - [NATURE_NAUGHTY] = { +1, 0, 0, 0, -1 }, - [NATURE_BOLD] = { -1, +1, 0, 0, 0 }, - [NATURE_DOCILE] = { 0, 0, 0, 0, 0 }, - [NATURE_RELAXED] = { 0, +1, -1, 0, 0 }, - [NATURE_IMPISH] = { 0, +1, 0, -1, 0 }, - [NATURE_LAX] = { 0, +1, 0, 0, -1 }, - [NATURE_TIMID] = { -1, 0, +1, 0, 0 }, - [NATURE_HASTY] = { 0, -1, +1, 0, 0 }, - [NATURE_SERIOUS] = { 0, 0, 0, 0, 0 }, - [NATURE_JOLLY] = { 0, 0, +1, -1, 0 }, - [NATURE_NAIVE] = { 0, 0, +1, 0, -1 }, - [NATURE_MODEST] = { -1, 0, 0, +1, 0 }, - [NATURE_MILD] = { 0, -1, 0, +1, 0 }, - [NATURE_QUIET] = { 0, 0, -1, +1, 0 }, - [NATURE_BASHFUL] = { 0, 0, 0, 0, 0 }, - [NATURE_RASH] = { 0, 0, 0, +1, -1 }, - [NATURE_CALM] = { -1, 0, 0, 0, +1 }, - [NATURE_GENTLE] = { 0, -1, 0, 0, +1 }, - [NATURE_SASSY] = { 0, 0, -1, 0, +1 }, - [NATURE_CAREFUL] = { 0, 0, 0, -1, +1 }, - [NATURE_QUIRKY] = { 0, 0, 0, 0, 0 }, +const struct NatureInfo gNaturesInfo[NUM_NATURES] = +{ + [NATURE_HARDY] = + { + .name = COMPOUND_STRING("Hardy"), + .statUp = STAT_ATK, + .statDown = STAT_ATK, + .backAnim = 0, + }, + [NATURE_LONELY] = + { + .name = COMPOUND_STRING("Lonely"), + .statUp = STAT_ATK, + .statDown = STAT_DEF, + .backAnim = 2, + }, + [NATURE_BRAVE] = + { + .name = COMPOUND_STRING("Brave"), + .statUp = STAT_ATK, + .statDown = STAT_SPEED, + .backAnim = 0, + }, + [NATURE_ADAMANT] = + { + .name = COMPOUND_STRING("Adamant"), + .statUp = STAT_ATK, + .statDown = STAT_SPATK, + .backAnim = 0, + }, + [NATURE_NAUGHTY] = + { + .name = COMPOUND_STRING("Naughty"), + .statUp = STAT_ATK, + .statDown = STAT_SPDEF, + .backAnim = 0, + }, + [NATURE_BOLD] = + { + .name = COMPOUND_STRING("Bold"), + .statUp = STAT_DEF, + .statDown = STAT_ATK, + .backAnim = 1, + }, + [NATURE_DOCILE] = + { + .name = COMPOUND_STRING("Docile"), + .statUp = STAT_DEF, + .statDown = STAT_DEF, + .backAnim = 1, + }, + [NATURE_RELAXED] = + { + .name = COMPOUND_STRING("Relaxed"), + .statUp = STAT_DEF, + .statDown = STAT_SPEED, + .backAnim = 1, + }, + [NATURE_IMPISH] = + { + .name = COMPOUND_STRING("Impish"), + .statUp = STAT_DEF, + .statDown = STAT_SPATK, + .backAnim = 0, + }, + [NATURE_LAX] = + { + .name = COMPOUND_STRING("Lax"), + .statUp = STAT_DEF, + .statDown = STAT_SPDEF, + .backAnim = 1, + }, + [NATURE_TIMID] = + { + .name = COMPOUND_STRING("Timid"), + .statUp = STAT_SPEED, + .statDown = STAT_ATK, + .backAnim = 2, + }, + [NATURE_HASTY] = + { + .name = COMPOUND_STRING("Hasty"), + .statUp = STAT_SPEED, + .statDown = STAT_DEF, + .backAnim = 0, + }, + [NATURE_SERIOUS] = + { + .name = COMPOUND_STRING("Serious"), + .statUp = STAT_SPEED, + .statDown = STAT_SPEED, + .backAnim = 1, + }, + [NATURE_JOLLY] = + { + .name = COMPOUND_STRING("Jolly"), + .statUp = STAT_SPEED, + .statDown = STAT_SPATK, + .backAnim = 0, + }, + [NATURE_NAIVE] = + { + .name = COMPOUND_STRING("Naive"), + .statUp = STAT_SPEED, + .statDown = STAT_SPDEF, + .backAnim = 0, + }, + [NATURE_MODEST] = + { + .name = COMPOUND_STRING("Modest"), + .statUp = STAT_SPATK, + .statDown = STAT_ATK, + .backAnim = 2, + }, + [NATURE_MILD] = + { + .name = COMPOUND_STRING("Mild"), + .statUp = STAT_SPATK, + .statDown = STAT_DEF, + .backAnim = 2, + }, + [NATURE_QUIET] = + { + .name = COMPOUND_STRING("Quiet"), + .statUp = STAT_SPATK, + .statDown = STAT_SPEED, + .backAnim = 2, + }, + [NATURE_BASHFUL] = + { + .name = COMPOUND_STRING("Bashful"), + .statUp = STAT_SPATK, + .statDown = STAT_SPATK, + .backAnim = 2, + }, + [NATURE_RASH] = + { + .name = COMPOUND_STRING("Rash"), + .statUp = STAT_SPATK, + .statDown = STAT_SPDEF, + .backAnim = 1, + }, + [NATURE_CALM] = + { + .name = COMPOUND_STRING("Calm"), + .statUp = STAT_SPDEF, + .statDown = STAT_ATK, + .backAnim = 1, + }, + [NATURE_GENTLE] = + { + .name = COMPOUND_STRING("Gentle"), + .statUp = STAT_SPDEF, + .statDown = STAT_DEF, + .backAnim = 2, + }, + [NATURE_SASSY] = + { + .name = COMPOUND_STRING("Sassy"), + .statUp = STAT_SPDEF, + .statDown = STAT_SPEED, + .backAnim = 1, + }, + [NATURE_CAREFUL] = + { + .name = COMPOUND_STRING("Careful"), + .statUp = STAT_SPDEF, + .statDown = STAT_SPATK, + .backAnim = 2, + }, + [NATURE_QUIRKY] = + { + .name = COMPOUND_STRING("Quirky"), + .statUp = STAT_SPDEF, + .statDown = STAT_SPDEF, + .backAnim = 1, + }, }; @@ -4606,38 +4728,15 @@ u8 GetTrainerEncounterMusicId(u16 trainerId) u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex) { -// Because this is a u16 it will be unable to store the -// result of the multiplication for any stat > 595 for a -// positive nature and > 728 for a negative nature. -// Neither occur in the base game, but this can happen if -// any Nature-affected base stat is increased to a value -// above 248. The closest by default is Shuckle at 230. -// #ifdef BUGFIX - u32 retVal; -// #else -// u16 retVal; -// #endif - // Don't modify HP, Accuracy, or Evasion by nature - if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS) + if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS || gNaturesInfo[nature].statUp == gNaturesInfo[nature].statDown) + return stat; + else if (statIndex == gNaturesInfo[nature].statUp) + return stat * 110 / 100; + else if (statIndex == gNaturesInfo[nature].statDown) + return stat * 90 / 100; + else return stat; - - switch (gNatureStatTable[nature][statIndex - 1]) - { - case 1: - retVal = stat * 110; - retVal /= 100; - break; - case -1: - retVal = stat * 90; - retVal /= 100; - break; - default: - retVal = stat; - break; - } - - return retVal; } void AdjustFriendship(struct Pokemon *mon, u8 event) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index a2532d521..cb7e2d5cf 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -2244,15 +2244,15 @@ static void ApplyNatureColor(u8 *str, u8 stat) const u8 red[] = _("{COLOR 1}"); const u8 none[] = _(""); u8 nature = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HIDDEN_NATURE); - const s8 *natureMods = gNatureStatTable[nature]; - s8 mod = natureMods[stat - 1]; u8 tmp[20]; StringCopy(tmp, str); - if (mod > 0) + if (gNaturesInfo[nature].statUp == gNaturesInfo[nature].statDown) + StringCopy(str, none); + else if (gNaturesInfo[nature].statUp == stat) StringCopy(str, red); - else if (mod < 0) + else if (gNaturesInfo[nature].statDown == stat) StringCopy(str, blue); else StringCopy(str, none); @@ -2782,7 +2782,7 @@ static void PokeSum_PrintTrainerMemo_Mon_HeldByOT(void) DynamicPlaceholderTextUtil_Reset(); nature = GetNature(&sMonSummaryScreen->currentMon); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gNatureNamePointers[nature]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gNaturesInfo[nature].name); level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL); if (level == 0) @@ -2856,7 +2856,7 @@ static void PokeSum_PrintTrainerMemo_Mon_NotHeldByOT(void) DynamicPlaceholderTextUtil_Reset(); nature = GetNature(&sMonSummaryScreen->currentMon); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gNatureNamePointers[nature]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gNaturesInfo[nature].name); level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL);