natures refactoring

This commit is contained in:
cawtds 2024-06-17 17:30:05 +02:00
parent e9661be94a
commit 3cb3ccb6df
5 changed files with 200 additions and 96 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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++)

View File

@ -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)

View File

@ -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);