added mint functionality and nature mod color

This commit is contained in:
cawtds
2024-05-30 14:29:40 +02:00
parent 5b1cae6ebd
commit 48013b0879
8 changed files with 188 additions and 43 deletions

View File

@@ -127,6 +127,10 @@ ViridianCity_Mart_Items::
.2byte ITEM_Z_POWER_RING
.2byte ITEM_NORMALIUM_Z
.2byte ITEM_ULTRANECROZIUM_Z
.2byte ITEM_MODEST_MINT
.2byte ITEM_BOLD_MINT
.2byte ITEM_ADAMANT_MINT
.2byte ITEM_SERIOUS_MINT
.2byte ITEM_NONE
release
end

View File

@@ -20,6 +20,7 @@ void ItemUseOutOfBattle_FameChecker(u8 taskId);
void ItemUseOutOfBattle_Itemfinder(u8 taskId);
void ItemUseOutOfBattle_Mail(u8 taskId);
void ItemUseOutOfBattle_Medicine(u8 taskId);
void ItemUseOutOfBattle_Mint(u8 taskId);
void ItemUseOutOfBattle_PokeFlute(u8 taskId);
void ItemUseOutOfBattle_PowderJar(u8 taskId);
void ItemUseOutOfBattle_PPRecovery(u8 taskId);

View File

@@ -55,6 +55,7 @@ void ItemUseCB_AbilityCapsule(u8 taskId, TaskFunc task);
void ItemUseCB_AbilityPatch(u8 taskId, TaskFunc task);
void ItemUseCB_BattleScript(u8 taskId, TaskFunc task);
void ItemUseCB_Medicine(u8 taskId, TaskFunc func);
void ItemUseCB_Mint(u8 taskId, TaskFunc task);
void ItemUseCB_ReduceEV(u8 taskId, TaskFunc task);
void ItemUseCB_ResetEVs(u8 taskId, TaskFunc task);
void ItemUseCB_PPRecovery(u8 taskId, TaskFunc func);

View File

@@ -660,6 +660,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];
void ZeroBoxMonData(struct BoxPokemon *boxMon);
void ZeroMonData(struct Pokemon *mon);

View File

@@ -1387,7 +1387,7 @@ const struct Item gItemsInfo[] =
"reduces Defense."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_LONELY,
.flingPower = 10,
},
@@ -1402,7 +1402,7 @@ const struct Item gItemsInfo[] =
"reduces Sp. Atk."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_ADAMANT,
.flingPower = 10,
},
@@ -1417,7 +1417,7 @@ const struct Item gItemsInfo[] =
"reduces Sp. Def."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_NAUGHTY,
.flingPower = 10,
},
@@ -1432,7 +1432,7 @@ const struct Item gItemsInfo[] =
"reduces Speed."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_BRAVE,
.flingPower = 10,
},
@@ -1447,7 +1447,7 @@ const struct Item gItemsInfo[] =
"reduces Attack."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_BOLD,
.flingPower = 10,
},
@@ -1462,7 +1462,7 @@ const struct Item gItemsInfo[] =
"reduces Sp. Atk."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_IMPISH,
.flingPower = 10,
},
@@ -1477,7 +1477,7 @@ const struct Item gItemsInfo[] =
"reduces Sp. Def."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_LAX,
.flingPower = 10,
},
@@ -1492,7 +1492,7 @@ const struct Item gItemsInfo[] =
"reduces Speed."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_RELAXED,
.flingPower = 10,
},
@@ -1507,7 +1507,7 @@ const struct Item gItemsInfo[] =
"reduces Attack."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_MODEST,
.flingPower = 10,
},
@@ -1522,7 +1522,7 @@ const struct Item gItemsInfo[] =
"reduces Defense."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_MILD,
.flingPower = 10,
},
@@ -1537,7 +1537,7 @@ const struct Item gItemsInfo[] =
"reduces Sp. Def."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_RASH,
.flingPower = 10,
},
@@ -1552,7 +1552,7 @@ const struct Item gItemsInfo[] =
"reduces Speed."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_QUIET,
.flingPower = 10,
},
@@ -1567,7 +1567,7 @@ const struct Item gItemsInfo[] =
"reduces Attack."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_CALM,
.flingPower = 10,
},
@@ -1582,7 +1582,7 @@ const struct Item gItemsInfo[] =
"reduces Defense."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_GENTLE,
.flingPower = 10,
},
@@ -1597,7 +1597,7 @@ const struct Item gItemsInfo[] =
"reduces Sp. Atk."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_CAREFUL,
.flingPower = 10,
},
@@ -1612,7 +1612,7 @@ const struct Item gItemsInfo[] =
"reduces Speed."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_SASSY,
.flingPower = 10,
},
@@ -1627,7 +1627,7 @@ const struct Item gItemsInfo[] =
"reduces Attack."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_TIMID,
.flingPower = 10,
},
@@ -1642,7 +1642,7 @@ const struct Item gItemsInfo[] =
"reduces Defense."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_HASTY,
.flingPower = 10,
},
@@ -1657,7 +1657,7 @@ const struct Item gItemsInfo[] =
"reduces Sp. Atk."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_JOLLY,
.flingPower = 10,
},
@@ -1672,7 +1672,7 @@ const struct Item gItemsInfo[] =
"reduces Sp. Def."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_NAIVE,
.flingPower = 10,
},
@@ -1687,7 +1687,7 @@ const struct Item gItemsInfo[] =
"grow equally."),
.pocket = POCKET_ITEMS,
.type = ITEM_TYPE_PARTY_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.fieldUseFunc = ItemUseOutOfBattle_Mint,
.secondaryId = NATURE_SERIOUS,
.flingPower = 10,
},

View File

@@ -447,6 +447,12 @@ void ItemUseOutOfBattle_Medicine(u8 taskId)
DoSetUpItemUseCallback(taskId);
}
void ItemUseOutOfBattle_Mint(u8 taskId)
{
gItemUseCB = ItemUseCB_Mint;
SetUpItemUseCallback(taskId);
}
void ItemUseOutOfBattle_PPRecovery(u8 taskId)
{
gItemUseCB = ItemUseCB_PPRecovery;

View File

@@ -4595,6 +4595,104 @@ void ItemUseCB_AbilityPatch(u8 taskId, TaskFunc task)
#undef tMonId
#undef tOldFunc
#define tState data[0]
#define tMonId data[1]
#define tOldNature data[2]
#define tNewNature data[3]
#define tOldFunc 4
void Task_Mint(u8 taskId)
{
static const u8 askText[] = _("It might affect {STR_VAR_1}'s stats.\nAre you sure you want to use it?");
static const u8 doneText[] = _("{STR_VAR_1}'s stats may have changed due\nto the effects of the {STR_VAR_2}!{PAUSE_UNTIL_PRESS}");
s16 *data = gTasks[taskId].data;
switch (tState)
{
case 0:
// Can't use.
if (tOldNature == tNewNature)
{
gPartyMenuUseExitCallback = FALSE;
PlaySE(SE_SELECT);
DisplayPartyMenuMessage(gText_WontHaveEffect, 1);
ScheduleBgCopyTilemapToVram(2);
gTasks[taskId].func = Task_ClosePartyMenuAfterText;
return;
}
gPartyMenuUseExitCallback = TRUE;
GetMonNickname(&gPlayerParty[tMonId], gStringVar1);
CopyItemName(gSpecialVar_ItemId, gStringVar2);
StringExpandPlaceholders(gStringVar4, askText);
PlaySE(SE_SELECT);
DisplayPartyMenuMessage(gStringVar4, 1);
ScheduleBgCopyTilemapToVram(2);
tState++;
break;
case 1:
if (!IsPartyMenuTextPrinterActive())
{
PartyMenuDisplayYesNoMenu();
tState++;
}
break;
case 2:
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
case 0:
tState++;
break;
case 1:
case MENU_B_PRESSED:
gPartyMenuUseExitCallback = FALSE;
PlaySE(SE_SELECT);
ScheduleBgCopyTilemapToVram(2);
// Don't exit party selections screen, return to choosing a mon.
ClearStdWindowAndFrameToTransparent(6, 0);
ClearWindowTilemap(6);
DisplayPartyMenuStdMessage(5);
gTasks[taskId].func = (void *)GetWordTaskArg(taskId, tOldFunc);
return;
}
break;
case 3:
PlaySE(SE_USE_ITEM);
StringExpandPlaceholders(gStringVar4, doneText);
DisplayPartyMenuMessage(gStringVar4, 1);
ScheduleBgCopyTilemapToVram(2);
tState++;
break;
case 4:
if (!IsPartyMenuTextPrinterActive())
tState++;
break;
case 5:
SetMonData(&gPlayerParty[tMonId], MON_DATA_HIDDEN_NATURE, &tNewNature);
CalculateMonStats(&gPlayerParty[tMonId]);
RemoveBagItem(gSpecialVar_ItemId, 1);
gTasks[taskId].func = Task_ClosePartyMenu;
break;
}
}
void ItemUseCB_Mint(u8 taskId, TaskFunc task)
{
s16 *data = gTasks[taskId].data;
tState = 0;
tMonId = gPartyMenu.slotId;
tOldNature = GetMonData(&gPlayerParty[tMonId], MON_DATA_HIDDEN_NATURE);
tNewNature = ItemId_GetSecondaryId(gSpecialVar_ItemId);
SetWordTaskArg(taskId, tOldFunc, (uintptr_t)(gTasks[taskId].func));
gTasks[taskId].func = Task_Mint;
}
#undef tState
#undef tMonId
#undef tOldNature
#undef tNewNature
#undef tOldFunc
static bool32 CannotUsePartyBattleItem(u16 itemId, struct Pokemon* mon)
{
u8 i;

View File

@@ -173,7 +173,7 @@ struct PokemonSummaryScreenData
u8 ALIGNED(4) genderSymbolStrBuf[3];
u8 ALIGNED(4) levelStrBuf[7];
u8 ALIGNED(4) curHpStrBuf[9];
u8 ALIGNED(4) statValueStrBufs[5][5];
u8 ALIGNED(4) statValueStrBufs[5][20];
u8 ALIGNED(4) moveCurPpStrBufs[5][11];
u8 ALIGNED(4) moveMaxPpStrBufs[5][11];
@@ -2143,12 +2143,52 @@ static void BufferMonInfo(void)
CopyItemName(heldItem, sMonSummaryScreen->summary.itemNameStrBuf);
}
#define GetNumberRightAlign63(x) (63 - StringLength((x)) * 6)
#define GetNumberRightAlign27(x) (27 - StringLength((x)) * 6)
static void ColorNatureString(u8 stat, u8 statValue, u8 nature, u8 *dst)
{
u8 temp[20];
const u8 blue[] = _("{COLOR 7}");
const u8 red[] = _("{COLOR 1}");
const u8 none[] = _("");
const s8 *natureMods = gNatureStatTable[nature];
s8 mod = natureMods[stat - 1];
if (mod > 0)
{
StringCopy(dst, red);
}
else if (mod < 0)
{
StringCopy(dst, blue);
}
else
{
StringCopy(dst, none);
}
ConvertIntToDecimalStringN(temp, statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
StringAppend(dst, temp);
switch (stat)
{
case STAT_ATK:
sMonSkillsPrinterXpos->atkStr = GetNumberRightAlign27(temp);
case STAT_DEF:
sMonSkillsPrinterXpos->defStr = GetNumberRightAlign27(temp);
case STAT_SPATK:
sMonSkillsPrinterXpos->spAStr = GetNumberRightAlign27(temp);
case STAT_SPDEF:
sMonSkillsPrinterXpos->spDStr = GetNumberRightAlign27(temp);
case STAT_SPEED:
sMonSkillsPrinterXpos->speStr = GetNumberRightAlign27(temp);
}
}
static void BufferMonSkills(void)
{
u8 tempStr[20];
u8 tempStr[20], tempStr2[20];
u8 level;
u16 type;
u16 species;
@@ -2156,6 +2196,7 @@ static void BufferMonSkills(void)
u16 statValue;
u32 exp;
u32 expToNextLevel;
u8 nature;
hp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.curHpStrBuf, hp, STR_CONV_MODE_LEFT_ALIGN, 3);
@@ -2166,50 +2207,43 @@ static void BufferMonSkills(void)
StringAppend(sMonSummaryScreen->summary.curHpStrBuf, tempStr);
sMonSkillsPrinterXpos->curHpStr = GetNumberRightAlign63(sMonSummaryScreen->summary.curHpStrBuf);
nature = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HIDDEN_NATURE);
if (!nature)
nature = GetNature(&sMonSummaryScreen->currentMon);
if (sMonSummaryScreen->savedCallback == CB2_ReturnToTradeMenuFromSummary && sMonSummaryScreen->isEnemyParty == TRUE)
{
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ATK2);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK], statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
sMonSkillsPrinterXpos->atkStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]);
ColorNatureString(STAT_ATK, statValue, nature, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]);
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_DEF2);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF], statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
sMonSkillsPrinterXpos->defStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]);
ColorNatureString(STAT_DEF, statValue, nature, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]);
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPATK2);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA], statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
sMonSkillsPrinterXpos->spAStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]);
ColorNatureString(STAT_SPATK, statValue, nature, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]);
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPDEF2);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD], statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
sMonSkillsPrinterXpos->spDStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]);
ColorNatureString(STAT_SPDEF, statValue, nature, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]);
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPEED2);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE], statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
sMonSkillsPrinterXpos->speStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]);
ColorNatureString(STAT_SPEED, statValue, nature, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]);
}
else
{
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ATK);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK], statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
sMonSkillsPrinterXpos->atkStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]);
ColorNatureString(STAT_ATK, statValue, nature, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]);
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_DEF);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF], statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
sMonSkillsPrinterXpos->defStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]);
ColorNatureString(STAT_DEF, statValue, nature, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]);
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPATK);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA], statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
sMonSkillsPrinterXpos->spAStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]);
ColorNatureString(STAT_SPATK, statValue, nature, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]);
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPDEF);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD], statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
sMonSkillsPrinterXpos->spDStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]);
ColorNatureString(STAT_SPDEF, statValue, nature, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]);
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPEED);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE], statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
sMonSkillsPrinterXpos->speStr = GetNumberRightAlign27(sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]);
ColorNatureString(STAT_SPEED, statValue, nature, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]);
}
exp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EXP);