Merge branch 'master' into slot_machine
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
#include "window.h"
|
||||
#include "text_window.h"
|
||||
#include "menu_helpers.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "menu.h"
|
||||
#include "money.h"
|
||||
#include "bag.h"
|
||||
@@ -210,16 +211,16 @@ void sub_810B858(void)
|
||||
else
|
||||
InitWindows(gUnknown_84530E4);
|
||||
DeactivateAllTextPrinters();
|
||||
sub_815001C(0, 0x64, 0xE0);
|
||||
sub_814FEAC(0, 0x6D, 0xD0);
|
||||
sub_814FF2C(0, 0x81, 0xC0);
|
||||
TextWindow_SetUserSelectedFrame(0, 0x64, 0xE0);
|
||||
TextWindow_LoadResourcesStdFrame0(0, 0x6D, 0xD0);
|
||||
TextWindow_SetStdFrame0_WithPal(0, 0x81, 0xC0);
|
||||
LoadPalette(gUnknown_8453098, 0xF0, 0x20);
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
FillWindowPixelBuffer(i, 0x00);
|
||||
PutWindowTilemap(i);
|
||||
}
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
for (i = 0; i < 11; i++)
|
||||
{
|
||||
gUnknown_203AD34[i] = 0xFF;
|
||||
@@ -228,19 +229,19 @@ void sub_810B858(void)
|
||||
|
||||
void sub_810B8F0(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, s8 speed, u8 colorIdx)
|
||||
{
|
||||
AddTextPrinterParametrized2(windowId, fontId, x, y, letterSpacing, lineSpacing, &gUnknown_84530B8[colorIdx], speed, str);
|
||||
AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, &gUnknown_84530B8[colorIdx], speed, str);
|
||||
}
|
||||
|
||||
void sub_810B958(const u8 * str)
|
||||
{
|
||||
u32 x = 0x48 - GetStringWidth(1, str, 0);
|
||||
box_print(2, 1, x / 2, 1, &gUnknown_84530B8[0], 0, str);
|
||||
AddTextPrinterParameterized3(2, 1, x / 2, 1, &gUnknown_84530B8[0], 0, str);
|
||||
}
|
||||
|
||||
void sub_810B994(void)
|
||||
{
|
||||
u32 x;
|
||||
SetWindowBorderStyle(2, FALSE, 0x081, 0x0C);
|
||||
DrawStdFrameWithCustomTileAndPalette(2, FALSE, 0x081, 0x0C);
|
||||
x = 0x40 - GetStringWidth(0, gText_DepositItem, 0);
|
||||
AddTextPrinterParameterized(2, 0, gText_DepositItem, x / 2, 1, 0, NULL);
|
||||
}
|
||||
@@ -252,23 +253,23 @@ u8 sub_810B9DC(u8 a0, u8 a1)
|
||||
gUnknown_203AD34[a0] = AddWindow(&gUnknown_8453104[a0 + a1]);
|
||||
if (a0 != 6)
|
||||
{
|
||||
SetWindowBorderStyle(gUnknown_203AD34[a0], FALSE, 0x064, 0x0E);
|
||||
DrawStdFrameWithCustomTileAndPalette(gUnknown_203AD34[a0], FALSE, 0x064, 0x0E);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetWindowBorderStyle(gUnknown_203AD34[a0], FALSE, 0x081, 0x0C);
|
||||
DrawStdFrameWithCustomTileAndPalette(gUnknown_203AD34[a0], FALSE, 0x081, 0x0C);
|
||||
}
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
}
|
||||
return gUnknown_203AD34[a0];
|
||||
}
|
||||
|
||||
void sub_810BA3C(u8 a0)
|
||||
{
|
||||
sub_810F4D8(gUnknown_203AD34[a0], FALSE);
|
||||
ClearStdWindowAndFrameToTransparent(gUnknown_203AD34[a0], FALSE);
|
||||
ClearWindowTilemap(gUnknown_203AD34[a0]);
|
||||
RemoveWindow(gUnknown_203AD34[a0]);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
gUnknown_203AD34[a0] = 0xFF;
|
||||
}
|
||||
|
||||
@@ -285,11 +286,11 @@ void sub_810BA9C(u8 a0)
|
||||
{
|
||||
if (gUnknown_203AD34[a0] != 0xFF)
|
||||
{
|
||||
sub_810F260(gUnknown_203AD34[a0], FALSE);
|
||||
ClearDialogWindowAndFrameToTransparent(gUnknown_203AD34[a0], FALSE);
|
||||
ClearWindowTilemap(gUnknown_203AD34[a0]);
|
||||
RemoveWindow(gUnknown_203AD34[a0]);
|
||||
PutWindowTilemap(1);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
gUnknown_203AD34[a0] = 0xFF;
|
||||
|
||||
}
|
||||
|
||||
+38
-302
@@ -6,6 +6,7 @@
|
||||
#include "constants/abilities.h"
|
||||
#include "constants/battle_ai.h"
|
||||
#include "constants/battle_move_effects.h"
|
||||
#include "constants/moves.h"
|
||||
|
||||
extern u16 Random(void);
|
||||
extern void sub_80C7164(void);
|
||||
@@ -230,10 +231,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] =
|
||||
BattleAICmd_if_not_taunted, // 0x5D
|
||||
};
|
||||
|
||||
#ifdef NONMATCHING
|
||||
static
|
||||
#endif
|
||||
const u16 sDiscouragedPowerfulMoveEffects[] =
|
||||
static const u16 sDiscouragedPowerfulMoveEffects[] =
|
||||
{
|
||||
EFFECT_EXPLOSION,
|
||||
EFFECT_DREAM_EATER,
|
||||
@@ -970,331 +968,69 @@ static void BattleAICmd_get_move_power(void)
|
||||
gAIScriptPtr += 1;
|
||||
}
|
||||
|
||||
// still a nonmatching
|
||||
#ifdef NONMATCHING
|
||||
static void BattleAICmd_is_most_powerful_move(void)
|
||||
{
|
||||
int i, j;
|
||||
s32 damages[MAX_MON_MOVES];
|
||||
s32 i, checkedMove;
|
||||
s32 moveDmgs[4];
|
||||
|
||||
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
|
||||
{
|
||||
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i])
|
||||
break;
|
||||
}
|
||||
|
||||
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1
|
||||
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
|
||||
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
|
||||
{
|
||||
gDynamicBasePower = 0;
|
||||
eDynamicMoveType = 0;
|
||||
eDmgMultiplier = 1;
|
||||
gBattleStruct->dynamicMoveType = 0;
|
||||
gBattleScripting.dmgMultiplier = 1;
|
||||
gMoveResultFlags = 0;
|
||||
gCritMultiplier = 1;
|
||||
|
||||
for (i = 0; i < MAX_MON_MOVES; i++)
|
||||
for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
|
||||
{
|
||||
for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++)
|
||||
{ // _08108276
|
||||
if (gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j])
|
||||
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
|
||||
{
|
||||
if (gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
|
||||
break;
|
||||
}
|
||||
|
||||
// _081082BA
|
||||
if (gBattleMons[gBankAttacker].moves[i]
|
||||
&& sDiscouragedPowerfulMoveEffects[j] == 0xFFFF
|
||||
&& gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power > 1)
|
||||
if (gBattleMons[sBattler_AI].moves[checkedMove] != MOVE_NONE
|
||||
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF
|
||||
&& gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power > 1)
|
||||
{
|
||||
gCurrentMove = gBattleMons[gBankAttacker].moves[i];
|
||||
AI_CalcDmg(gBankAttacker, gBankTarget);
|
||||
TypeCalc(gCurrentMove, gBankAttacker, gBankTarget);
|
||||
damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100;
|
||||
|
||||
if (damages[i] == 0) // moves always do at least 1 damage.
|
||||
damages[i] = 1;
|
||||
gCurrentMove = gBattleMons[sBattler_AI].moves[checkedMove];
|
||||
AI_CalcDmg(sBattler_AI, gBattlerTarget);
|
||||
TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
|
||||
moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100;
|
||||
if (moveDmgs[checkedMove] == 0)
|
||||
moveDmgs[checkedMove] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
damages[i] = 0;
|
||||
moveDmgs[checkedMove] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_MON_MOVES; i++)
|
||||
if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex])
|
||||
for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
|
||||
{
|
||||
if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex])
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == MAX_MON_MOVES)
|
||||
AI_THINKING_STRUCT->funcResult = 2;
|
||||
if (checkedMove == MAX_MON_MOVES)
|
||||
AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful.
|
||||
else
|
||||
AI_THINKING_STRUCT->funcResult = 1;
|
||||
AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful.
|
||||
}
|
||||
else
|
||||
{
|
||||
AI_THINKING_STRUCT->funcResult = 0;
|
||||
AI_THINKING_STRUCT->funcResult = MOVE_POWER_DISCOURAGED; // Highly discouraged in terms of power.
|
||||
}
|
||||
|
||||
gAIScriptPtr += 1;
|
||||
gAIScriptPtr++;
|
||||
}
|
||||
#else
|
||||
NAKED
|
||||
static void BattleAICmd_is_most_powerful_move(void)
|
||||
{
|
||||
asm(".syntax unified\n\
|
||||
push {r4-r7,lr}\n\
|
||||
mov r7, r10\n\
|
||||
mov r6, r9\n\
|
||||
mov r5, r8\n\
|
||||
push {r5-r7}\n\
|
||||
sub sp, 0x14\n\
|
||||
movs r3, 0\n\
|
||||
ldr r0, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
ldrh r1, [r0]\n\
|
||||
ldr r5, _080C80A8 @ =0x0000ffff\n\
|
||||
ldr r6, _080C80AC @ =gBattleMoves\n\
|
||||
ldr r2, _080C80B0 @ =gBattleResources\n\
|
||||
cmp r1, r5\n\
|
||||
beq _080C7FA2\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r0, [r0, 0x14]\n\
|
||||
ldrh r1, [r0, 0x2]\n\
|
||||
lsls r0, r1, 1\n\
|
||||
adds r0, r1\n\
|
||||
lsls r0, 2\n\
|
||||
adds r0, r6\n\
|
||||
ldrb r4, [r0]\n\
|
||||
ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
_080C7F92:\n\
|
||||
ldrh r0, [r1]\n\
|
||||
cmp r4, r0\n\
|
||||
beq _080C7FA2\n\
|
||||
adds r1, 0x2\n\
|
||||
adds r3, 0x1\n\
|
||||
ldrh r0, [r1]\n\
|
||||
cmp r0, r5\n\
|
||||
bne _080C7F92\n\
|
||||
_080C7FA2:\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r0, [r0, 0x14]\n\
|
||||
ldrh r1, [r0, 0x2]\n\
|
||||
lsls r0, r1, 1\n\
|
||||
adds r0, r1\n\
|
||||
lsls r0, 2\n\
|
||||
adds r0, r6\n\
|
||||
ldrb r0, [r0, 0x1]\n\
|
||||
cmp r0, 0x1\n\
|
||||
bhi _080C7FB8\n\
|
||||
b _080C8142\n\
|
||||
_080C7FB8:\n\
|
||||
lsls r0, r3, 1\n\
|
||||
ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
adds r0, r1\n\
|
||||
ldrh r3, [r0]\n\
|
||||
ldr r0, _080C80A8 @ =0x0000ffff\n\
|
||||
cmp r3, r0\n\
|
||||
beq _080C7FC8\n\
|
||||
b _080C8142\n\
|
||||
_080C7FC8:\n\
|
||||
ldr r0, _080C80B4 @ =gDynamicBasePower\n\
|
||||
movs r1, 0\n\
|
||||
strh r1, [r0]\n\
|
||||
ldr r0, _080C80B8 @ =gBattleStruct\n\
|
||||
ldr r0, [r0]\n\
|
||||
strb r1, [r0, 0x13]\n\
|
||||
ldr r0, _080C80BC @ =gBattleScripting\n\
|
||||
movs r2, 0x1\n\
|
||||
strb r2, [r0, 0xE]\n\
|
||||
ldr r0, _080C80C0 @ =gMoveResultFlags\n\
|
||||
strb r1, [r0]\n\
|
||||
ldr r0, _080C80C4 @ =gCritMultiplier\n\
|
||||
strb r2, [r0]\n\
|
||||
movs r6, 0\n\
|
||||
mov r9, r3\n\
|
||||
ldr r2, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
ldrh r2, [r2]\n\
|
||||
str r2, [sp, 0x10]\n\
|
||||
_080C7FEC:\n\
|
||||
movs r3, 0\n\
|
||||
ldr r5, _080C80C8 @ =gBattleMons\n\
|
||||
lsls r4, r6, 1\n\
|
||||
ldr r7, _080C80CC @ =sBattler_AI\n\
|
||||
lsls r0, r6, 2\n\
|
||||
mov r8, r0\n\
|
||||
adds r1, r6, 0x1\n\
|
||||
mov r10, r1\n\
|
||||
ldr r2, [sp, 0x10]\n\
|
||||
cmp r2, r9\n\
|
||||
beq _080C8030\n\
|
||||
ldr r2, _080C80AC @ =gBattleMoves\n\
|
||||
ldrb r1, [r7]\n\
|
||||
movs r0, 0x58\n\
|
||||
muls r0, r1\n\
|
||||
adds r0, r4, r0\n\
|
||||
adds r1, r5, 0\n\
|
||||
adds r1, 0xC\n\
|
||||
adds r0, r1\n\
|
||||
ldrh r1, [r0]\n\
|
||||
lsls r0, r1, 1\n\
|
||||
adds r0, r1\n\
|
||||
lsls r0, 2\n\
|
||||
adds r0, r2\n\
|
||||
ldrb r2, [r0]\n\
|
||||
ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
_080C8020:\n\
|
||||
ldrh r0, [r1]\n\
|
||||
cmp r2, r0\n\
|
||||
beq _080C8030\n\
|
||||
adds r1, 0x2\n\
|
||||
adds r3, 0x1\n\
|
||||
ldrh r0, [r1]\n\
|
||||
cmp r0, r9\n\
|
||||
bne _080C8020\n\
|
||||
_080C8030:\n\
|
||||
ldrb r1, [r7]\n\
|
||||
movs r0, 0x58\n\
|
||||
muls r0, r1\n\
|
||||
adds r0, r4, r0\n\
|
||||
adds r1, r5, 0\n\
|
||||
adds r1, 0xC\n\
|
||||
adds r1, r0, r1\n\
|
||||
ldrh r0, [r1]\n\
|
||||
cmp r0, 0\n\
|
||||
beq _080C80DC\n\
|
||||
lsls r0, r3, 1\n\
|
||||
ldr r2, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
|
||||
adds r0, r2\n\
|
||||
ldrh r0, [r0]\n\
|
||||
cmp r0, r9\n\
|
||||
bne _080C80DC\n\
|
||||
ldr r0, _080C80AC @ =gBattleMoves\n\
|
||||
ldrh r2, [r1]\n\
|
||||
lsls r1, r2, 1\n\
|
||||
adds r1, r2\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r0\n\
|
||||
ldrb r0, [r1, 0x1]\n\
|
||||
cmp r0, 0x1\n\
|
||||
bls _080C80DC\n\
|
||||
ldr r5, _080C80D0 @ =gCurrentMove\n\
|
||||
strh r2, [r5]\n\
|
||||
ldrb r0, [r7]\n\
|
||||
ldr r4, _080C80D4 @ =gBattlerTarget\n\
|
||||
ldrb r1, [r4]\n\
|
||||
bl AI_CalcDmg\n\
|
||||
ldrh r0, [r5]\n\
|
||||
ldrb r1, [r7]\n\
|
||||
ldrb r2, [r4]\n\
|
||||
bl TypeCalc\n\
|
||||
mov r4, sp\n\
|
||||
add r4, r8\n\
|
||||
ldr r2, _080C80D8 @ =gBattleMoveDamage\n\
|
||||
ldr r0, _080C80B0 @ =gBattleResources\n\
|
||||
ldr r0, [r0]\n\
|
||||
ldr r0, [r0, 0x14]\n\
|
||||
adds r0, 0x18\n\
|
||||
adds r0, r6\n\
|
||||
ldrb r1, [r0]\n\
|
||||
ldr r0, [r2]\n\
|
||||
muls r0, r1\n\
|
||||
movs r1, 0x64\n\
|
||||
bl __divsi3\n\
|
||||
str r0, [r4]\n\
|
||||
cmp r0, 0\n\
|
||||
bne _080C80E4\n\
|
||||
movs r0, 0x1\n\
|
||||
str r0, [r4]\n\
|
||||
b _080C80E4\n\
|
||||
.align 2, 0\n\
|
||||
_080C80A4: .4byte sDiscouragedPowerfulMoveEffects\n\
|
||||
_080C80A8: .4byte 0x0000ffff\n\
|
||||
_080C80AC: .4byte gBattleMoves\n\
|
||||
_080C80B0: .4byte gBattleResources\n\
|
||||
_080C80B4: .4byte gDynamicBasePower\n\
|
||||
_080C80B8: .4byte gBattleStruct\n\
|
||||
_080C80BC: .4byte gBattleScripting\n\
|
||||
_080C80C0: .4byte gMoveResultFlags\n\
|
||||
_080C80C4: .4byte gCritMultiplier\n\
|
||||
_080C80C8: .4byte gBattleMons\n\
|
||||
_080C80CC: .4byte sBattler_AI\n\
|
||||
_080C80D0: .4byte gCurrentMove\n\
|
||||
_080C80D4: .4byte gBattlerTarget\n\
|
||||
_080C80D8: .4byte gBattleMoveDamage\n\
|
||||
_080C80DC:\n\
|
||||
mov r1, sp\n\
|
||||
add r1, r8\n\
|
||||
movs r0, 0\n\
|
||||
str r0, [r1]\n\
|
||||
_080C80E4:\n\
|
||||
mov r6, r10\n\
|
||||
cmp r6, 0x3\n\
|
||||
bgt _080C80EC\n\
|
||||
b _080C7FEC\n\
|
||||
_080C80EC:\n\
|
||||
movs r6, 0\n\
|
||||
ldr r2, _080C8130 @ =gBattleResources\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r0, [r0, 0x14]\n\
|
||||
ldrb r0, [r0, 0x1]\n\
|
||||
lsls r0, 2\n\
|
||||
add r0, sp\n\
|
||||
ldr r1, [sp]\n\
|
||||
ldr r0, [r0]\n\
|
||||
ldr r5, _080C8134 @ =gAIScriptPtr\n\
|
||||
cmp r1, r0\n\
|
||||
bgt _080C8122\n\
|
||||
adds r4, r2, 0\n\
|
||||
mov r3, sp\n\
|
||||
_080C8108:\n\
|
||||
adds r3, 0x4\n\
|
||||
adds r6, 0x1\n\
|
||||
cmp r6, 0x3\n\
|
||||
bgt _080C8122\n\
|
||||
ldr r0, [r4]\n\
|
||||
ldr r0, [r0, 0x14]\n\
|
||||
ldrb r0, [r0, 0x1]\n\
|
||||
lsls r0, 2\n\
|
||||
add r0, sp\n\
|
||||
ldr r1, [r3]\n\
|
||||
ldr r0, [r0]\n\
|
||||
cmp r1, r0\n\
|
||||
ble _080C8108\n\
|
||||
_080C8122:\n\
|
||||
cmp r6, 0x4\n\
|
||||
bne _080C8138\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r1, [r0, 0x14]\n\
|
||||
movs r0, 0x2\n\
|
||||
str r0, [r1, 0x8]\n\
|
||||
b _080C814C\n\
|
||||
.align 2, 0\n\
|
||||
_080C8130: .4byte gBattleResources\n\
|
||||
_080C8134: .4byte gAIScriptPtr\n\
|
||||
_080C8138:\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r1, [r0, 0x14]\n\
|
||||
movs r0, 0x1\n\
|
||||
str r0, [r1, 0x8]\n\
|
||||
b _080C814C\n\
|
||||
_080C8142:\n\
|
||||
ldr r0, [r2]\n\
|
||||
ldr r1, [r0, 0x14]\n\
|
||||
movs r0, 0\n\
|
||||
str r0, [r1, 0x8]\n\
|
||||
ldr r5, _080C8164 @ =gAIScriptPtr\n\
|
||||
_080C814C:\n\
|
||||
ldr r0, [r5]\n\
|
||||
adds r0, 0x1\n\
|
||||
str r0, [r5]\n\
|
||||
add sp, 0x14\n\
|
||||
pop {r3-r5}\n\
|
||||
mov r8, r3\n\
|
||||
mov r9, r4\n\
|
||||
mov r10, r5\n\
|
||||
pop {r4-r7}\n\
|
||||
pop {r0}\n\
|
||||
bx r0\n\
|
||||
.align 2, 0\n\
|
||||
_080C8164: .4byte gAIScriptPtr\n\
|
||||
.syntax divided\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
static void BattleAICmd_get_move(void)
|
||||
{
|
||||
@@ -1434,28 +1170,28 @@ static void BattleAICmd_get_ability(void)
|
||||
return;
|
||||
}
|
||||
|
||||
if (gBaseStats[gBattleMons[index].species].ability1 != ABILITY_NONE)
|
||||
if (gBaseStats[gBattleMons[index].species].abilities[0] != ABILITY_NONE)
|
||||
{
|
||||
if (gBaseStats[gBattleMons[index].species].ability2 != ABILITY_NONE)
|
||||
if (gBaseStats[gBattleMons[index].species].abilities[1] != ABILITY_NONE)
|
||||
{
|
||||
// AI has no knowledge of opponent, so it guesses which ability.
|
||||
if (Random() % 2)
|
||||
{
|
||||
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1;
|
||||
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2;
|
||||
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[1];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1; // it's definitely ability 1.
|
||||
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[0]; // it's definitely ability 1.
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
|
||||
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[1]; // AI cant actually reach this part since every mon has at least 1 ability.
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -0,0 +1,809 @@
|
||||
#include "global.h"
|
||||
#include "battle.h"
|
||||
#include "battle_anim.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
|
||||
#define abs(x) ((x) < 0 ? -(x) : (x))
|
||||
|
||||
void sub_8098A6C(u8 taskId);
|
||||
void sub_8098C08(u8 taskId);
|
||||
void sub_8098D54(u8 taskId);
|
||||
void sub_8098EF0(u8 taskId);
|
||||
void sub_8099004(u8 taskId);
|
||||
void sub_80990AC(struct Sprite * sprite);
|
||||
void sub_8099120(struct Sprite * sprite);
|
||||
void sub_8099144(struct Sprite * sprite);
|
||||
void sub_8099190(struct Sprite * sprite);
|
||||
void sub_80991B4(struct Sprite * sprite);
|
||||
void sub_8099270(struct Sprite * sprite);
|
||||
void sub_80992E0(struct Sprite * sprite);
|
||||
void sub_8099394(struct Sprite * sprite);
|
||||
void sub_809946C(struct Sprite * sprite);
|
||||
void sub_8099530(u8 taskId);
|
||||
void sub_8099594(u8 taskId);
|
||||
void sub_80996B8(u8 taskId);
|
||||
void sub_8099788(u8 taskId);
|
||||
void sub_8099908(u8 taskId);
|
||||
void sub_8099B54(u8 taskId);
|
||||
void sub_8099CB8(u8 taskId);
|
||||
|
||||
const struct SpriteTemplate gUnknown_83D4E4C[] = {
|
||||
{
|
||||
0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80990AC
|
||||
}, {
|
||||
0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_8099144
|
||||
}, {
|
||||
0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80991B4
|
||||
}, {
|
||||
0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80992E0
|
||||
}, {
|
||||
0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_8099394
|
||||
}
|
||||
};
|
||||
|
||||
void sub_80989F8(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
if (spriteId == 0xFF)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
else
|
||||
{
|
||||
gSprites[spriteId].pos2.x = gBattleAnimArgs[1];
|
||||
gSprites[spriteId].pos2.y = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].func = sub_8098A6C;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8098A6C(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
if (gSprites[gTasks[taskId].data[0]].pos2.x == 0)
|
||||
gSprites[gTasks[taskId].data[0]].pos2.x = gTasks[taskId].data[4];
|
||||
else
|
||||
gSprites[gTasks[taskId].data[0]].pos2.x = 0;
|
||||
if (gSprites[gTasks[taskId].data[0]].pos2.y == 0)
|
||||
gSprites[gTasks[taskId].data[0]].pos2.y = gTasks[taskId].data[5];
|
||||
else
|
||||
gSprites[gTasks[taskId].data[0]].pos2.y = 0;
|
||||
gTasks[taskId].data[3] = gTasks[taskId].data[2];
|
||||
if (--gTasks[taskId].data[1] == 0)
|
||||
{
|
||||
gSprites[gTasks[taskId].data[0]].pos2.x = 0;
|
||||
gSprites[gTasks[taskId].data[0]].pos2.y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else
|
||||
gTasks[taskId].data[3]--;
|
||||
}
|
||||
|
||||
void sub_8098B1C(u8 taskId)
|
||||
{
|
||||
bool8 abort = FALSE;
|
||||
u8 spriteId;
|
||||
u8 battlerId;
|
||||
|
||||
if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT)
|
||||
{
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
if (spriteId == 0xFF)
|
||||
abort = TRUE;
|
||||
}
|
||||
else if (gBattleAnimArgs[0] != 8)
|
||||
{
|
||||
switch (gBattleAnimArgs[0])
|
||||
{
|
||||
case 4:
|
||||
battlerId = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
|
||||
break;
|
||||
case 5:
|
||||
battlerId = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
|
||||
break;
|
||||
case 6:
|
||||
battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
|
||||
break;
|
||||
default:
|
||||
battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
|
||||
break;
|
||||
}
|
||||
if (!sub_8072DF0(battlerId))
|
||||
abort = TRUE;
|
||||
spriteId = gBattlerSpriteIds[battlerId];
|
||||
}
|
||||
else
|
||||
spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
|
||||
if (abort)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
else
|
||||
{
|
||||
gSprites[spriteId].pos2.x = gBattleAnimArgs[1];
|
||||
gSprites[spriteId].pos2.y = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].func = sub_8098C08;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8098C08(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
if (gSprites[gTasks[taskId].data[0]].pos2.x == gTasks[taskId].data[4])
|
||||
gSprites[gTasks[taskId].data[0]].pos2.x = -gTasks[taskId].data[4];
|
||||
else
|
||||
gSprites[gTasks[taskId].data[0]].pos2.x = gTasks[taskId].data[4];
|
||||
if (gSprites[gTasks[taskId].data[0]].pos2.y == gTasks[taskId].data[5])
|
||||
gSprites[gTasks[taskId].data[0]].pos2.y = -gTasks[taskId].data[5];
|
||||
else
|
||||
gSprites[gTasks[taskId].data[0]].pos2.y = gTasks[taskId].data[5];
|
||||
gTasks[taskId].data[3] = gTasks[taskId].data[2];
|
||||
if (--gTasks[taskId].data[1] == 0)
|
||||
{
|
||||
gSprites[gTasks[taskId].data[0]].pos2.x = 0;
|
||||
gSprites[gTasks[taskId].data[0]].pos2.y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else
|
||||
gTasks[taskId].data[3]--;
|
||||
}
|
||||
|
||||
void sub_8098CD0(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
if (spriteId == 0xFF)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
else
|
||||
{
|
||||
gSprites[spriteId].pos2.x += gBattleAnimArgs[1];
|
||||
gSprites[spriteId].pos2.y += gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[3] = 0;
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[1] * 2;
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[2] * 2;
|
||||
gTasks[taskId].func = sub_8098D54;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8098D54(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
if (gTasks[taskId].data[1] & 1)
|
||||
{
|
||||
gSprites[gTasks[taskId].data[0]].pos2.x += gTasks[taskId].data[5];
|
||||
gSprites[gTasks[taskId].data[0]].pos2.y += gTasks[taskId].data[6];
|
||||
}
|
||||
else
|
||||
{
|
||||
gSprites[gTasks[taskId].data[0]].pos2.x -= gTasks[taskId].data[5];
|
||||
gSprites[gTasks[taskId].data[0]].pos2.y -= gTasks[taskId].data[6];
|
||||
}
|
||||
gTasks[taskId].data[3] = gTasks[taskId].data[4];
|
||||
if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])
|
||||
{
|
||||
if (gTasks[taskId].data[1] & 1)
|
||||
{
|
||||
gSprites[gTasks[taskId].data[0]].pos2.x += gTasks[taskId].data[5] / 2;
|
||||
gSprites[gTasks[taskId].data[0]].pos2.y += gTasks[taskId].data[6] / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
gSprites[gTasks[taskId].data[0]].pos2.x -= gTasks[taskId].data[5] / 2;
|
||||
gSprites[gTasks[taskId].data[0]].pos2.y -= gTasks[taskId].data[6] / 2;
|
||||
}
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else
|
||||
gTasks[taskId].data[3]--;
|
||||
}
|
||||
|
||||
void sub_8098E90(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
gSprites[spriteId].pos2.x = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].func = sub_8098EF0;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
|
||||
void sub_8098EF0(u8 taskId)
|
||||
{
|
||||
u8 spriteId = gTasks[taskId].data[0];
|
||||
s16 data1 = gTasks[taskId].data[1];
|
||||
if (gTasks[taskId].data[2] == gTasks[taskId].data[8]++)
|
||||
{
|
||||
gTasks[taskId].data[8] = 0;
|
||||
if (gSprites[spriteId].pos2.x == data1)
|
||||
data1 = -data1;
|
||||
gSprites[spriteId].pos2.x += data1;
|
||||
}
|
||||
gTasks[taskId].data[1] = data1;
|
||||
gTasks[taskId].data[9] += gTasks[taskId].data[3];
|
||||
gSprites[spriteId].pos2.y = gTasks[taskId].data[9] >> 8;
|
||||
if (--gTasks[taskId].data[4] == 0)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_8098F84(u8 taskId)
|
||||
{
|
||||
u8 r6 = 1;
|
||||
u8 i;
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
if (gBattleAnimArgs[4] > 5)
|
||||
gBattleAnimArgs[4] = 5;
|
||||
for (i = 0; i < gBattleAnimArgs[4]; i++)
|
||||
r6 *= 2;
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = r6;
|
||||
gTasks[taskId].func = sub_8099004;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
|
||||
void sub_8099004(u8 taskId)
|
||||
{
|
||||
u8 spriteId = gTasks[taskId].data[0];
|
||||
gSprites[spriteId].pos2.x = Sin(gTasks[taskId].data[5], gTasks[taskId].data[1]);
|
||||
gSprites[spriteId].pos2.y = -Cos(gTasks[taskId].data[5], gTasks[taskId].data[2]);
|
||||
gSprites[spriteId].pos2.y += gTasks[taskId].data[2];
|
||||
gTasks[taskId].data[5] += gTasks[taskId].data[4];
|
||||
gTasks[taskId].data[5] &= 0xFF;
|
||||
if (gTasks[taskId].data[5] == 0)
|
||||
gTasks[taskId].data[3]--;
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
gSprites[spriteId].pos2.x = 0;
|
||||
gSprites[spriteId].pos2.y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_809907C(u8 taskId)
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
sub_8098F84(taskId);
|
||||
}
|
||||
|
||||
void sub_80990AC(struct Sprite * sprite)
|
||||
{
|
||||
sprite->invisible = TRUE;
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
sprite->data[1] = -gBattleAnimArgs[1];
|
||||
else
|
||||
sprite->data[1] = gBattleAnimArgs[1];
|
||||
sprite->data[0] = gBattleAnimArgs[0];
|
||||
sprite->data[2] = 0;
|
||||
sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
|
||||
sprite->data[4] = gBattleAnimArgs[0];
|
||||
StoreSpriteCallbackInData6(sprite, sub_8099120);
|
||||
sprite->callback = sub_8074DC4;
|
||||
}
|
||||
|
||||
void sub_8099120(struct Sprite * sprite)
|
||||
{
|
||||
sprite->data[0] = sprite->data[4];
|
||||
sprite->data[1] = -sprite->data[1];
|
||||
sprite->callback = sub_8074DC4;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
void sub_8099144(struct Sprite * sprite)
|
||||
{
|
||||
u8 spriteId;
|
||||
sprite->invisible = TRUE;
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
sprite->data[0] = gBattleAnimArgs[0];
|
||||
sprite->data[1] = 0;
|
||||
sprite->data[2] = gBattleAnimArgs[1];
|
||||
sprite->data[3] = spriteId;
|
||||
sprite->data[4] = gBattleAnimArgs[0];
|
||||
StoreSpriteCallbackInData6(sprite, sub_8099190);
|
||||
sprite->callback = sub_8074DC4;
|
||||
}
|
||||
|
||||
void sub_8099190(struct Sprite * sprite)
|
||||
{
|
||||
sprite->data[0] = sprite->data[4];
|
||||
sprite->data[2] = -sprite->data[2];
|
||||
sprite->callback = sub_8074DC4;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
void sub_80991B4(struct Sprite * sprite)
|
||||
{
|
||||
u8 spriteId;
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
|
||||
else
|
||||
spriteId = gBattlerSpriteIds[gBattleAnimTarget];
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
sprite->data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
|
||||
sprite->data[2] = gSprites[spriteId].pos1.x;
|
||||
sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
|
||||
sprite->data[4] = gSprites[spriteId].pos1.y;
|
||||
sub_80754B8(sprite);
|
||||
sprite->data[3] = 0;
|
||||
sprite->data[4] = 0;
|
||||
sprite->data[5] = gSprites[spriteId].pos2.x;
|
||||
sprite->data[6] = gSprites[spriteId].pos2.y;
|
||||
sprite->invisible = TRUE;
|
||||
if (gBattleAnimArgs[1] == 1)
|
||||
sprite->data[2] = 0;
|
||||
else if (gBattleAnimArgs[1] == 2)
|
||||
sprite->data[1] = 0;
|
||||
sprite->data[7] = gBattleAnimArgs[1];
|
||||
sprite->data[7] |= spriteId << 8;
|
||||
sprite->callback = sub_8099270;
|
||||
}
|
||||
|
||||
void sub_8099270(struct Sprite * sprite)
|
||||
{
|
||||
u8 data7 = sprite->data[7];
|
||||
struct Sprite *otherSprite = &gSprites[sprite->data[7] >> 8];
|
||||
if (sprite->data[0] == 0)
|
||||
{
|
||||
if (data7 == 1 || data7 == 0)
|
||||
otherSprite->pos2.x = 0;
|
||||
if (data7 == 2 || data7 == 0)
|
||||
otherSprite->pos2.y = 0;
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[0]--;
|
||||
sprite->data[3] += sprite->data[1];
|
||||
sprite->data[4] += sprite->data[2];
|
||||
otherSprite->pos2.x = (sprite->data[3] >> 8) + sprite->data[5];
|
||||
otherSprite->pos2.y = (sprite->data[4] >> 8) + sprite->data[6];
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80992E0(struct Sprite * sprite)
|
||||
{
|
||||
u8 battlerId;
|
||||
u8 spriteId;
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
battlerId = gBattleAnimAttacker;
|
||||
else
|
||||
battlerId = gBattleAnimTarget;
|
||||
spriteId = gBattlerSpriteIds[battlerId];
|
||||
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
|
||||
{
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
if (gBattleAnimArgs[3] == 1)
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
}
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[1] = gSprites[spriteId].pos1.x;
|
||||
sprite->data[2] = gSprites[spriteId].pos1.x + gBattleAnimArgs[1];
|
||||
sprite->data[3] = gSprites[spriteId].pos1.y;
|
||||
sprite->data[4] = gSprites[spriteId].pos1.y + gBattleAnimArgs[2];
|
||||
sub_80754B8(sprite);
|
||||
sprite->data[3] = 0;
|
||||
sprite->data[4] = 0;
|
||||
sprite->data[5] = spriteId;
|
||||
sprite->invisible = TRUE;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
sprite->callback = sub_8074E14;
|
||||
}
|
||||
|
||||
void sub_8099394(struct Sprite * sprite)
|
||||
{
|
||||
u8 battlerId;
|
||||
u8 spriteId;
|
||||
sprite->invisible = TRUE;
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
battlerId = gBattleAnimAttacker;
|
||||
else
|
||||
battlerId = gBattleAnimTarget;
|
||||
spriteId = gBattlerSpriteIds[battlerId];
|
||||
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
|
||||
{
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
if (gBattleAnimArgs[3] == 1)
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
}
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
|
||||
sprite->data[2] = sprite->data[1] + gBattleAnimArgs[1];
|
||||
sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
|
||||
sprite->data[4] = sprite->data[3] + gBattleAnimArgs[2];
|
||||
sub_80754B8(sprite);
|
||||
sprite->data[3] = gSprites[spriteId].pos2.x << 8;
|
||||
sprite->data[4] = gSprites[spriteId].pos2.y << 8;
|
||||
sprite->data[5] = spriteId;
|
||||
sprite->data[6] = gBattleAnimArgs[5];
|
||||
if (gBattleAnimArgs[5] == 0)
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
else
|
||||
StoreSpriteCallbackInData6(sprite, sub_809946C);
|
||||
sprite->callback = sub_8074E14;
|
||||
}
|
||||
|
||||
void sub_809946C(struct Sprite * sprite)
|
||||
{
|
||||
gSprites[sprite->data[5]].pos2.x = 0;
|
||||
gSprites[sprite->data[5]].pos2.y = 0;
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
void sub_809949C(u8 taskId)
|
||||
{
|
||||
u16 r7 = 0x8000 / gBattleAnimArgs[3];
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
gBattleAnimArgs[5] = -gBattleAnimArgs[5];
|
||||
}
|
||||
gTasks[taskId].data[0] = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1] * 256 / gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6];
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[6];
|
||||
gTasks[taskId].data[7] = r7;
|
||||
gTasks[taskId].func = sub_8099530;
|
||||
}
|
||||
|
||||
void sub_8099530(u8 taskId)
|
||||
{
|
||||
u8 spriteId = gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[11] += gTasks[taskId].data[1];
|
||||
gSprites[spriteId].pos2.x = gTasks[taskId].data[11] >> 8;
|
||||
gSprites[spriteId].pos2.y = Sin((u8)(gTasks[taskId].data[10] >> 8), gTasks[taskId].data[2]);
|
||||
gTasks[taskId].data[10] += gTasks[taskId].data[7];
|
||||
if (--gTasks[taskId].data[3] == 0)
|
||||
gTasks[taskId].func = sub_8099594;
|
||||
}
|
||||
|
||||
void sub_8099594(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
|
||||
if (gTasks[taskId].data[4] > 0)
|
||||
gTasks[taskId].data[4]--;
|
||||
else
|
||||
{
|
||||
spriteId = gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[12] += gTasks[taskId].data[5];
|
||||
gSprites[spriteId].pos2.x = (gTasks[taskId].data[12] >> 8) + (gTasks[taskId].data[11] >> 8);
|
||||
if (--gTasks[taskId].data[6] == 0)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80995FC(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
|
||||
switch (gBattleAnimArgs[0])
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
break;
|
||||
case 2:
|
||||
if (!sub_8072DF0(gBattleAnimAttacker ^ BIT_FLANK))
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
return;
|
||||
}
|
||||
spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK];
|
||||
break;
|
||||
case 3:
|
||||
if (!sub_8072DF0(gBattleAnimTarget ^ BIT_FLANK))
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
return;
|
||||
}
|
||||
spriteId = gBattlerSpriteIds[gBattleAnimTarget ^ BIT_FLANK];
|
||||
break;
|
||||
default:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
return;
|
||||
}
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
else
|
||||
gTasks[taskId].data[1] = -gBattleAnimArgs[1];
|
||||
gTasks[taskId].func = sub_80996B8;
|
||||
}
|
||||
|
||||
void sub_80996B8(u8 taskId)
|
||||
{
|
||||
u8 spriteId = gTasks[taskId].data[0];
|
||||
gSprites[spriteId].pos2.x += gTasks[taskId].data[1];
|
||||
if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x < -0x20 || gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x > 0x110)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_8099704(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]);
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = spriteId;
|
||||
if (gBattleAnimArgs[4] == 0)
|
||||
gTasks[taskId].data[5] = gBattleAnimAttacker;
|
||||
else
|
||||
gTasks[taskId].data[5] = gBattleAnimTarget;
|
||||
gTasks[taskId].data[12] = 1;
|
||||
gTasks[taskId].func = sub_8099788;
|
||||
}
|
||||
|
||||
void sub_8099788(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
u32 r8;
|
||||
s16 r5;
|
||||
u16 tmp;
|
||||
|
||||
spriteId = gTasks[taskId].data[4];
|
||||
tmp = gTasks[taskId].data[10] + gTasks[taskId].data[2];
|
||||
gTasks[taskId].data[10] = tmp;
|
||||
r8 = tmp >> 8;
|
||||
r5 = Sin(r8, gTasks[taskId].data[1]);
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
{
|
||||
gSprites[spriteId].pos2.x = r5;
|
||||
}
|
||||
else if (GetBattlerSide(gTasks[taskId].data[5]) == B_SIDE_PLAYER)
|
||||
{
|
||||
gSprites[spriteId].pos2.y = abs(r5);
|
||||
}
|
||||
else
|
||||
gSprites[spriteId].pos2.y = -abs(r5);
|
||||
if ((r8 > 0x7F && gTasks[taskId].data[11] == 0 && gTasks[taskId].data[12] == 1) || (r8 < 0x7F && gTasks[taskId].data[11] == 1 && gTasks[taskId].data[12] == 0))
|
||||
{
|
||||
gTasks[taskId].data[11] ^= 1;
|
||||
gTasks[taskId].data[12] ^= 1;
|
||||
if (--gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
gSprites[spriteId].pos2.x = 0;
|
||||
gSprites[spriteId].pos2.y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80998B0(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]);
|
||||
sub_80758E0(spriteId, gBattleAnimArgs[4]);
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[4] = spriteId;
|
||||
gTasks[taskId].data[10] = 0x100;
|
||||
gTasks[taskId].data[11] = 0x100;
|
||||
gTasks[taskId].func = sub_8099908;
|
||||
}
|
||||
|
||||
void sub_8099908(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
gTasks[taskId].data[10] += gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[11] += gTasks[taskId].data[1];
|
||||
spriteId = gTasks[taskId].data[4];
|
||||
obj_id_set_rotscale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[11], 0);
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
if (gTasks[taskId].data[3] > 0)
|
||||
{
|
||||
gTasks[taskId].data[0] = -gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[1] = -gTasks[taskId].data[1];
|
||||
gTasks[taskId].data[2] = gTasks[taskId].data[3];
|
||||
gTasks[taskId].data[3] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_8075980(spriteId);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8099980(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
sub_80758E0(spriteId, 0);
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[0];
|
||||
if (gBattleAnimArgs[3] != 1)
|
||||
gTasks[taskId].data[3] = 0;
|
||||
else
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[5] = spriteId;
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[3];
|
||||
if (sub_8073788())
|
||||
gTasks[taskId].data[7] = 1;
|
||||
else
|
||||
{
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : 0;
|
||||
else
|
||||
gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER ? 1 : 0;
|
||||
}
|
||||
if (gTasks[taskId].data[7] && !sub_8073788())
|
||||
{
|
||||
s16 tmp;
|
||||
tmp = gTasks[taskId].data[3];
|
||||
gTasks[taskId].data[3] = -tmp;
|
||||
tmp = gTasks[taskId].data[4];
|
||||
gTasks[taskId].data[4] = -tmp;
|
||||
}
|
||||
gTasks[taskId].func = sub_8099B54;
|
||||
}
|
||||
|
||||
void sub_8099A78(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
sub_80758E0(spriteId, 0);
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[0];
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
}
|
||||
if (gBattleAnimArgs[3] != 1)
|
||||
gTasks[taskId].data[3] = 0;
|
||||
else
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[5] = spriteId;
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[7] = 1;
|
||||
if (gTasks[taskId].data[7] )
|
||||
{
|
||||
s16 tmp;
|
||||
tmp = gTasks[taskId].data[3];
|
||||
gTasks[taskId].data[3] = -tmp;
|
||||
tmp = gTasks[taskId].data[4];
|
||||
gTasks[taskId].data[4] = -tmp;
|
||||
}
|
||||
gTasks[taskId].func = sub_8099B54;
|
||||
}
|
||||
|
||||
void sub_8099B54(u8 taskId)
|
||||
{
|
||||
s16 tmp;
|
||||
gTasks[taskId].data[3] += gTasks[taskId].data[4];
|
||||
obj_id_set_rotscale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]);
|
||||
if (gTasks[taskId].data[7])
|
||||
sub_80759DC(gTasks[taskId].data[5]);
|
||||
if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])
|
||||
{
|
||||
switch (gTasks[taskId].data[6])
|
||||
{
|
||||
case 1:
|
||||
sub_8075980(gTasks[taskId].data[5]);
|
||||
// fallthrough
|
||||
case 0:
|
||||
default:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
case 2:
|
||||
gTasks[taskId].data[1] = 0;
|
||||
tmp = gTasks[taskId].data[4];
|
||||
gTasks[taskId].data[4] = -tmp;
|
||||
gTasks[taskId].data[6] = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8099BD4(u8 taskId)
|
||||
{
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
{
|
||||
gTasks[taskId].data[15] = gUnknown_2037EEC / 12;
|
||||
if (gTasks[taskId].data[15] < 1)
|
||||
gTasks[taskId].data[15] = 1;
|
||||
if (gTasks[taskId].data[15] > 16)
|
||||
gTasks[taskId].data[15] = 16;
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[15] = gUnknown_2037EE8 / 12;
|
||||
if (gTasks[taskId].data[15] < 1)
|
||||
gTasks[taskId].data[15] = 1;
|
||||
if (gTasks[taskId].data[15] > 16)
|
||||
gTasks[taskId].data[15] = 16;
|
||||
}
|
||||
gTasks[taskId].data[14] = gTasks[taskId].data[15] / 2;
|
||||
gTasks[taskId].data[13] = gTasks[taskId].data[14] + (gTasks[taskId].data[15] & 1);
|
||||
gTasks[taskId].data[12] = 0;
|
||||
gTasks[taskId].data[10] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[11] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[7] = GetAnimBankSpriteId(1);
|
||||
gTasks[taskId].data[8] = gSprites[gTasks[taskId].data[7]].pos2.x;
|
||||
gTasks[taskId].data[9] = gSprites[gTasks[taskId].data[7]].pos2.y;
|
||||
gTasks[taskId].data[0] = 0;
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].func = sub_8099CB8;
|
||||
}
|
||||
|
||||
void sub_8099CB8(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
if (++task->data[0] > task->data[1])
|
||||
{
|
||||
task->data[0] = 0;
|
||||
task->data[12] = (task->data[12] + 1) & 1;
|
||||
if (task->data[10])
|
||||
{
|
||||
if (task->data[12])
|
||||
{
|
||||
gSprites[task->data[7]].pos2.x = task->data[8] + task->data[13];
|
||||
}
|
||||
else
|
||||
{
|
||||
gSprites[task->data[7]].pos2.x = task->data[8] - task->data[14];
|
||||
}
|
||||
}
|
||||
if (task->data[11])
|
||||
{
|
||||
if (task->data[12])
|
||||
{
|
||||
gSprites[task->data[7]].pos2.y = task->data[15];
|
||||
}
|
||||
else
|
||||
{
|
||||
gSprites[task->data[7]].pos2.y = 0;
|
||||
}
|
||||
}
|
||||
if (!--task->data[2])
|
||||
{
|
||||
gSprites[task->data[7]].pos2.x = 0;
|
||||
gSprites[task->data[7]].pos2.y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,576 @@
|
||||
#include "global.h"
|
||||
#include "malloc.h"
|
||||
#include "main.h"
|
||||
#include "bg.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "event_data.h"
|
||||
#include "palette.h"
|
||||
#include "task.h"
|
||||
#include "text.h"
|
||||
#include "window.h"
|
||||
#include "text_window.h"
|
||||
#include "battle.h"
|
||||
#include "trainer_tower.h"
|
||||
#include "trainer_pokemon_sprites.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "sound.h"
|
||||
#include "string_util.h"
|
||||
#include "link.h"
|
||||
#include "menu.h"
|
||||
#include "overworld.h"
|
||||
#include "strings.h"
|
||||
#include "trainer_card.h"
|
||||
#include "constants/battle.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/maps.h"
|
||||
|
||||
static EWRAM_DATA u16 * sBg3TilemapBuffer_p = NULL;
|
||||
|
||||
static void MainCB2_SetUp(void);
|
||||
static void VBlankCB(void);
|
||||
static void MainCB2(void);
|
||||
static void Task_WaitFadeIn(u8 taskId);
|
||||
static void Task_WaitButton(u8 taskId);
|
||||
static void Task_FadeOut(u8 taskId);
|
||||
static void Task_DestroyAndReturnToField(u8 taskId);
|
||||
static void ClearWindowCommitAndRemove(u8 winddowId);
|
||||
static void ResetGpu(void);
|
||||
static void StopAllRunningTasks(void);
|
||||
static void EnableDisplay(void);
|
||||
static void ResetBGPos(void);
|
||||
static void PrintBattleRecords(void);
|
||||
static void CommitWindow(u8 windowId);
|
||||
static void LoadFrameGfxOnBg(u8 bgId);
|
||||
|
||||
static const u16 sTiles[] = INCBIN_U16("graphics/battle_records/bg_tiles.4bpp");
|
||||
static const u16 sPalette[] = INCBIN_U16("graphics/battle_records/palette.gbapal");
|
||||
static const u16 sTilemap[] = INCBIN_U16("graphics/battle_records/tilemap.bin");
|
||||
|
||||
static const struct WindowTemplate sWindowTemplates[] = {
|
||||
{
|
||||
.bg = 0,
|
||||
.tilemapLeft = 2,
|
||||
.tilemapTop = 1,
|
||||
.width = 27,
|
||||
.height = 18,
|
||||
.paletteNum = 0xF,
|
||||
.baseBlock = 0x014
|
||||
}, DUMMY_WIN_TEMPLATE
|
||||
};
|
||||
|
||||
static const struct TextColor sTextColor = {
|
||||
0, 2, 3
|
||||
};
|
||||
|
||||
static const struct BgTemplate sBgTemplates[2] = {
|
||||
{
|
||||
.bg = 0,
|
||||
.charBaseIndex = 0,
|
||||
.mapBaseIndex = 31,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0, // 4bpp
|
||||
.priority = 0,
|
||||
.baseTile = 0x000
|
||||
}, {
|
||||
.bg = 3,
|
||||
.charBaseIndex = 1,
|
||||
.mapBaseIndex = 30,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0, // 4bpp
|
||||
.priority = 3,
|
||||
.baseTile = 0x000
|
||||
}
|
||||
};
|
||||
|
||||
static u8 *const sStringVars[3] = {
|
||||
gStringVar1,
|
||||
gStringVar2,
|
||||
gStringVar3
|
||||
};
|
||||
|
||||
void Special_BattleRecords(void)
|
||||
{
|
||||
SetVBlankCallback(NULL);
|
||||
SetMainCallback2(MainCB2_SetUp);
|
||||
}
|
||||
|
||||
static void MainCB2_SetUp(void)
|
||||
{
|
||||
switch (gMain.state)
|
||||
{
|
||||
case 0:
|
||||
SetVBlankCallback(NULL);
|
||||
ResetGpu();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 1:
|
||||
StopAllRunningTasks();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 2:
|
||||
sBg3TilemapBuffer_p = AllocZeroed(0x800);
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));
|
||||
SetBgTilemapBuffer(3, sBg3TilemapBuffer_p);
|
||||
ResetBGPos();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 3:
|
||||
LoadFrameGfxOnBg(3);
|
||||
LoadPalette(stdpal_get(0), 0xF0, 0x20);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 4:
|
||||
if (IsDma3ManagerBusyWithBgCopy() != TRUE)
|
||||
{
|
||||
ShowBg(0);
|
||||
ShowBg(3);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
gMain.state++;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
InitWindows(sWindowTemplates);
|
||||
DeactivateAllTextPrinters();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 6:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 7:
|
||||
EnableDisplay();
|
||||
SetVBlankCallback(VBlankCB);
|
||||
if (gSpecialVar_0x8004)
|
||||
PrintTrainerTowerRecords();
|
||||
else
|
||||
PrintBattleRecords();
|
||||
CreateTask(Task_WaitFadeIn, 8);
|
||||
SetMainCallback2(MainCB2);
|
||||
gMain.state = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void VBlankCB(void)
|
||||
{
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
}
|
||||
|
||||
static void MainCB2(void)
|
||||
{
|
||||
RunTasks();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
static void Task_WaitFadeIn(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
gTasks[taskId].func = Task_WaitButton;
|
||||
}
|
||||
|
||||
static void Task_WaitButton(u8 taskId)
|
||||
{
|
||||
struct Task * task = &gTasks[taskId];
|
||||
|
||||
if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
task->func = Task_FadeOut;
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_FadeOut(u8 taskId)
|
||||
{
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
|
||||
gTasks[taskId].func = Task_DestroyAndReturnToField;
|
||||
}
|
||||
|
||||
static void Task_DestroyAndReturnToField(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
|
||||
Free(sBg3TilemapBuffer_p);
|
||||
ClearWindowCommitAndRemove(0);
|
||||
FreeAllWindowBuffers();
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void ClearWindowCommitAndRemove(u8 windowId)
|
||||
{
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
||||
ClearWindowTilemap(windowId);
|
||||
CopyWindowToVram(windowId, 2);
|
||||
RemoveWindow(windowId);
|
||||
}
|
||||
|
||||
static void ResetGpu(void)
|
||||
{
|
||||
{
|
||||
void * dest = (void *)VRAM;
|
||||
u32 size = VRAM_SIZE;
|
||||
DmaClearLarge16(3, dest, size, 0x1000);
|
||||
}
|
||||
|
||||
{
|
||||
void * dest = (void *)OAM;
|
||||
u32 size = OAM_SIZE;
|
||||
DmaClear32(3, dest, size);
|
||||
}
|
||||
|
||||
{
|
||||
void * dest = (void *)PLTT;
|
||||
u32 size = PLTT_SIZE;
|
||||
DmaClear16(3, dest, size);
|
||||
}
|
||||
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BG0CNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BG0HOFS, 0);
|
||||
SetGpuReg(REG_OFFSET_BG0VOFS, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1VOFS, 0);
|
||||
SetGpuReg(REG_OFFSET_BG2CNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BG2HOFS, 0);
|
||||
SetGpuReg(REG_OFFSET_BG2VOFS, 0);
|
||||
SetGpuReg(REG_OFFSET_BG3CNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BG3HOFS, 0);
|
||||
SetGpuReg(REG_OFFSET_BG3VOFS, 0);
|
||||
SetGpuReg(REG_OFFSET_WIN0H, 0);
|
||||
SetGpuReg(REG_OFFSET_WIN0V, 0);
|
||||
SetGpuReg(REG_OFFSET_WININ, 0);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||||
}
|
||||
|
||||
static void StopAllRunningTasks(void)
|
||||
{
|
||||
ScanlineEffect_Stop();
|
||||
ResetTasks();
|
||||
ResetSpriteData();
|
||||
ResetAllPicSprites();
|
||||
ResetPaletteFade();
|
||||
FreeAllSpritePalettes();
|
||||
}
|
||||
|
||||
static void EnableDisplay(void)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON);
|
||||
}
|
||||
|
||||
static void ResetBGPos(void)
|
||||
{
|
||||
ChangeBgX(0, 0, 0);
|
||||
ChangeBgY(0, 0, 0);
|
||||
ChangeBgX(1, 0, 0);
|
||||
ChangeBgY(1, 0, 0);
|
||||
ChangeBgX(2, 0, 0);
|
||||
ChangeBgY(2, 0, 0);
|
||||
ChangeBgX(3, 0, 0);
|
||||
ChangeBgY(3, 0, 0);
|
||||
}
|
||||
|
||||
static void InitLinkBattleRecord(struct LinkBattleRecord * record)
|
||||
{
|
||||
CpuFill16(0, record, sizeof(*record));
|
||||
record->name[0] = EOS;
|
||||
record->trainerId = 0;
|
||||
record->wins = 0;
|
||||
record->losses = 0;
|
||||
record->draws = 0;
|
||||
}
|
||||
|
||||
static void InitLinkBattleRecords_(struct LinkBattleRecords * records)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < LINK_B_RECORDS_COUNT; i++)
|
||||
InitLinkBattleRecord(&records->entries[i]);
|
||||
SetGameStat(GAME_STAT_LINK_BATTLE_WINS, 0);
|
||||
SetGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 0);
|
||||
SetGameStat(GAME_STAT_LINK_BATTLE_DRAWS, 0);
|
||||
}
|
||||
|
||||
static s32 GetLinkBattleRecordTotalBattles(struct LinkBattleRecord * record)
|
||||
{
|
||||
return record->wins + record->losses + record->draws;
|
||||
}
|
||||
|
||||
static s32 IndexOfOpponentLinkBattleRecord(struct LinkBattleRecords * records, const u8 * name, u16 trainerId)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < LINK_B_RECORDS_COUNT; i++)
|
||||
{
|
||||
if (StringCompareN(records->entries[i].name, name, OT_NAME_LENGTH) == 0 && records->entries[i].trainerId == trainerId)
|
||||
return i;
|
||||
}
|
||||
|
||||
return LINK_B_RECORDS_COUNT;
|
||||
}
|
||||
|
||||
static void SortLinkBattleRecords(struct LinkBattleRecords * records)
|
||||
{
|
||||
struct LinkBattleRecord tmp;
|
||||
s32 i;
|
||||
s32 j;
|
||||
|
||||
for (i = LINK_B_RECORDS_COUNT - 1; i > 0; i--)
|
||||
{
|
||||
for (j = i - 1; j >= 0; j--)
|
||||
{
|
||||
if (GetLinkBattleRecordTotalBattles(&records->entries[i]) > GetLinkBattleRecordTotalBattles(&records->entries[j]))
|
||||
{
|
||||
tmp = records->entries[i];
|
||||
records->entries[i] = records->entries[j];
|
||||
records->entries[j] = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void UpdateLinkBattleRecord(struct LinkBattleRecord * record, s32 outcome)
|
||||
{
|
||||
switch (outcome)
|
||||
{
|
||||
case B_OUTCOME_WON:
|
||||
record->wins++;
|
||||
if (record->wins > 9999)
|
||||
record->wins = 9999;
|
||||
break;
|
||||
case B_OUTCOME_LOST:
|
||||
record->losses++;
|
||||
if (record->losses > 9999)
|
||||
record->losses = 9999;
|
||||
break;
|
||||
case B_OUTCOME_DREW:
|
||||
record->draws++;
|
||||
if (record->draws > 9999)
|
||||
record->draws = 9999;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void UpdateLinkBattleGameStats(s32 outcome)
|
||||
{
|
||||
u8 statId;
|
||||
|
||||
switch (outcome)
|
||||
{
|
||||
case B_OUTCOME_WON:
|
||||
statId = GAME_STAT_LINK_BATTLE_WINS;
|
||||
break;
|
||||
case B_OUTCOME_LOST:
|
||||
statId = GAME_STAT_LINK_BATTLE_LOSSES;
|
||||
break;
|
||||
case B_OUTCOME_DREW:
|
||||
statId = GAME_STAT_LINK_BATTLE_DRAWS;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (GetGameStat(statId) < 9999)
|
||||
IncrementGameStat(statId);
|
||||
}
|
||||
|
||||
static void AddOpponentLinkBattleRecord(struct LinkBattleRecords * records, const u8 * name, u16 trainerId, s32 outcome, u32 language)
|
||||
{
|
||||
u8 namebuf[OT_NAME_LENGTH + 1];
|
||||
s32 i;
|
||||
struct LinkBattleRecord * record;
|
||||
|
||||
if (language == LANGUAGE_JAPANESE)
|
||||
{
|
||||
namebuf[0] = EXT_CTRL_CODE_BEGIN;
|
||||
namebuf[1] = EXT_CTRL_CODE_JPN;
|
||||
StringCopy(&namebuf[2], name);
|
||||
}
|
||||
else
|
||||
StringCopy(namebuf, name);
|
||||
UpdateLinkBattleGameStats(outcome);
|
||||
SortLinkBattleRecords(records);
|
||||
i = IndexOfOpponentLinkBattleRecord(records, namebuf, trainerId);
|
||||
if (i == LINK_B_RECORDS_COUNT)
|
||||
{
|
||||
i = LINK_B_RECORDS_COUNT - 1;
|
||||
record = &records->entries[LINK_B_RECORDS_COUNT - 1];
|
||||
InitLinkBattleRecord(record);
|
||||
StringCopyN(record->name, namebuf, OT_NAME_LENGTH);
|
||||
record->trainerId = trainerId;
|
||||
}
|
||||
UpdateLinkBattleRecord(&records->entries[i], outcome);
|
||||
SortLinkBattleRecords(records);
|
||||
}
|
||||
|
||||
void InitLinkBattleRecords(void)
|
||||
{
|
||||
InitLinkBattleRecords_(&gSaveBlock2Ptr->linkBattleRecords);
|
||||
}
|
||||
|
||||
static void IncTrainerCardWinCount(s32 battlerId)
|
||||
{
|
||||
u16 *wins = &gTrainerCards[battlerId].linkBattleWins;
|
||||
(*wins)++;
|
||||
if (*wins > 9999)
|
||||
*wins = 9999;
|
||||
}
|
||||
|
||||
static void IncTrainerCardLossCount(s32 battlerId)
|
||||
{
|
||||
u16 *losses = &gTrainerCards[battlerId].linkBattleLosses;
|
||||
(*losses)++;
|
||||
if (*losses > 9999)
|
||||
*losses = 9999;
|
||||
}
|
||||
|
||||
static void UpdateBattleOutcomeOnTrainerCards(s32 battlerId)
|
||||
{
|
||||
switch (gBattleOutcome)
|
||||
{
|
||||
case B_OUTCOME_WON:
|
||||
IncTrainerCardWinCount(battlerId ^ 1);
|
||||
IncTrainerCardLossCount(battlerId);
|
||||
break;
|
||||
case B_OUTCOME_LOST:
|
||||
IncTrainerCardLossCount(battlerId ^ 1);
|
||||
IncTrainerCardWinCount(battlerId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void TryRecordLinkBattleOutcome(s32 battlerId)
|
||||
{
|
||||
if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(UNKNOWN_MAP_00_04) || gSaveBlock1Ptr->location.mapNum != MAP_NUM(UNKNOWN_MAP_00_04))
|
||||
{
|
||||
UpdateBattleOutcomeOnTrainerCards(battlerId);
|
||||
AddOpponentLinkBattleRecord(&gSaveBlock2Ptr->linkBattleRecords, gTrainerCards[battlerId].playerName, gTrainerCards[battlerId].trainerId, gBattleOutcome, gLinkPlayers[battlerId].language);
|
||||
}
|
||||
}
|
||||
|
||||
static void PrintTotalRecord(struct LinkBattleRecords * records)
|
||||
{
|
||||
u32 nwins = GetGameStat(GAME_STAT_LINK_BATTLE_WINS);
|
||||
u32 nlosses = GetGameStat(GAME_STAT_LINK_BATTLE_LOSSES);
|
||||
u32 ndraws = GetGameStat(GAME_STAT_LINK_BATTLE_DRAWS);
|
||||
s32 i;
|
||||
s32 j;
|
||||
bool32 foundEnd;
|
||||
u8 * strvar;
|
||||
|
||||
if (nwins > 9999)
|
||||
nwins = 9999;
|
||||
if (nlosses > 9999)
|
||||
nlosses = 9999;
|
||||
if (ndraws > 9999)
|
||||
ndraws = 9999;
|
||||
|
||||
ConvertIntToDecimalStringN(gStringVar1, nwins, STR_CONV_MODE_LEFT_ALIGN, 4);
|
||||
ConvertIntToDecimalStringN(gStringVar2, nlosses, STR_CONV_MODE_LEFT_ALIGN, 4);
|
||||
ConvertIntToDecimalStringN(gStringVar3, ndraws, STR_CONV_MODE_LEFT_ALIGN, 4);
|
||||
|
||||
for (i = 0; i < NELEMS(sStringVars); i++)
|
||||
{
|
||||
strvar = sStringVars[i];
|
||||
foundEnd = FALSE;
|
||||
for (j = 0; j < 4; j++)
|
||||
{
|
||||
if (!foundEnd && *strvar == EOS)
|
||||
foundEnd = TRUE;
|
||||
if (foundEnd)
|
||||
*strvar = CHAR_SPACE;
|
||||
strvar++;
|
||||
}
|
||||
*strvar = 0xFF;
|
||||
}
|
||||
|
||||
StringExpandPlaceholders(gStringVar4, gString_BattleRecords_TotalRecord);
|
||||
AddTextPrinterParameterized4(0, 2, 12, 24, 0, 2, &sTextColor, 0, gStringVar4);
|
||||
}
|
||||
|
||||
static void PrintOpponentBattleRecord(struct LinkBattleRecord * record, u8 y)
|
||||
{
|
||||
u8 i = 0;
|
||||
s32 x;
|
||||
|
||||
if (record->wins == 0 && record->losses == 0 && record->draws == 0)
|
||||
{
|
||||
AddTextPrinterParameterized4(0, 2, 0, y, 0, 2, &sTextColor, 0, gString_BattleRecords_7Dashes);
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
if (i == 0)
|
||||
x = 0x54;
|
||||
else if (i == 1)
|
||||
x = 0x84;
|
||||
else
|
||||
x = 0xB4;
|
||||
AddTextPrinterParameterized4(0, 2, x, y, 0, 2, &sTextColor, 0, gString_BattleRecords_4Dashes);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (i == 0)
|
||||
{
|
||||
x = 0;
|
||||
StringFillWithTerminator(gStringVar1, OT_NAME_LENGTH + 1);
|
||||
StringCopyN(gStringVar1, record->name, OT_NAME_LENGTH);
|
||||
}
|
||||
else if (i == 1)
|
||||
{
|
||||
x = 0x54;
|
||||
ConvertIntToDecimalStringN(gStringVar1, record->wins, STR_CONV_MODE_RIGHT_ALIGN, 4);
|
||||
}
|
||||
else if (i == 2)
|
||||
{
|
||||
x = 0x84;
|
||||
ConvertIntToDecimalStringN(gStringVar1, record->losses, STR_CONV_MODE_RIGHT_ALIGN, 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
x = 0xB4;
|
||||
ConvertIntToDecimalStringN(gStringVar1, record->draws, STR_CONV_MODE_RIGHT_ALIGN, 4);
|
||||
}
|
||||
AddTextPrinterParameterized4(0, 2, x, y, 0, 2, &sTextColor, 0, gStringVar1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void PrintBattleRecords(void)
|
||||
{
|
||||
u32 left;
|
||||
s32 i;
|
||||
|
||||
FillWindowPixelRect(0, PIXEL_FILL(0), 0, 0, 0xD8, 0x90);
|
||||
StringExpandPlaceholders(gStringVar4, gString_BattleRecords_PlayersBattleResults);
|
||||
left = 0xD0 - GetStringWidth(2, gStringVar4, -1);
|
||||
AddTextPrinterParameterized4(0, 2, left / 2, 4, 0, 2, &sTextColor, 0, gStringVar4);
|
||||
PrintTotalRecord(&gSaveBlock2Ptr->linkBattleRecords);
|
||||
AddTextPrinterParameterized4(0, 2, 0x54, 0x30, 0, 2, &sTextColor, 0, gString_BattleRecords_ColumnHeaders);
|
||||
for (i = 0; i < LINK_B_RECORDS_COUNT; i++)
|
||||
PrintOpponentBattleRecord(&gSaveBlock2Ptr->linkBattleRecords.entries[i], 0x3D + 14 * i);
|
||||
CommitWindow(0);
|
||||
}
|
||||
|
||||
static void CommitWindow(u8 windowId)
|
||||
{
|
||||
PutWindowTilemap(windowId);
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
static void LoadFrameGfxOnBg(u8 bg)
|
||||
{
|
||||
LoadBgTiles(bg, sTiles, 0xC0, 0);
|
||||
CopyToBgTilemapBufferRect(bg, sTilemap, 0, 0, 32, 32);
|
||||
LoadPalette(sPalette, 0, 0x20);
|
||||
}
|
||||
+8
-8
@@ -5,7 +5,7 @@
|
||||
|
||||
extern const struct Berry sBerries[];
|
||||
|
||||
#define ENIGMA_BERRY_STRUCT ({const struct Berry2 *berries = (const struct Berry2 *)sBerries;berries[ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY];})
|
||||
#define ENIGMA_BERRY_STRUCT ({const struct Berry2 *berries = (const struct Berry2 *)sBerries;berries[ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX];})
|
||||
|
||||
void sub_809C718(void)
|
||||
{
|
||||
@@ -136,10 +136,10 @@ bool32 IsEnigmaBerryValid(void)
|
||||
|
||||
const struct Berry * sub_809C8A0(u8 berryIdx)
|
||||
{
|
||||
if (berryIdx == ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY + 1 && IsEnigmaBerryValid())
|
||||
if (berryIdx == ITEM_TO_BERRY(ITEM_ENIGMA_BERRY) && IsEnigmaBerryValid())
|
||||
return (struct Berry *)&gSaveBlock1Ptr->enigmaBerry.berry;
|
||||
|
||||
if (berryIdx == 0 || berryIdx > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY + 1)
|
||||
if (berryIdx == 0 || berryIdx > ITEM_TO_BERRY(ITEM_ENIGMA_BERRY))
|
||||
berryIdx = 1;
|
||||
|
||||
return &sBerries[berryIdx - 1];
|
||||
@@ -147,18 +147,18 @@ const struct Berry * sub_809C8A0(u8 berryIdx)
|
||||
|
||||
u8 ItemIdToBerryType(u16 itemId)
|
||||
{
|
||||
if (itemId - ITEM_CHERI_BERRY < 0 || itemId - ITEM_CHERI_BERRY > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY)
|
||||
if (itemId - FIRST_BERRY_INDEX < 0 || itemId - FIRST_BERRY_INDEX > ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX)
|
||||
return 1;
|
||||
|
||||
return itemId - ITEM_CHERI_BERRY + 1;
|
||||
return ITEM_TO_BERRY(itemId);
|
||||
}
|
||||
|
||||
u16 BerryTypeToItemId(u16 berryType)
|
||||
{
|
||||
if (berryType - 1 < 0 || berryType - 1 > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY)
|
||||
return ITEM_CHERI_BERRY;
|
||||
if (berryType - 1 < 0 || berryType - 1 > ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX)
|
||||
return FIRST_BERRY_INDEX;
|
||||
|
||||
return berryType + ITEM_CHERI_BERRY - 1;
|
||||
return berryType + FIRST_BERRY_INDEX - 1;
|
||||
}
|
||||
|
||||
void GetBerryNameByBerryType(u8 berryType, u8 * dest)
|
||||
|
||||
@@ -0,0 +1,191 @@
|
||||
#include "global.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "multiboot.h"
|
||||
#include "malloc.h"
|
||||
#include "bg.h"
|
||||
#include "graphics.h"
|
||||
#include "main.h"
|
||||
#include "sprite.h"
|
||||
#include "task.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "window.h"
|
||||
#include "text.h"
|
||||
#include "help_system.h"
|
||||
#include "menu.h"
|
||||
#include "m4a.h"
|
||||
|
||||
// Static type declarations
|
||||
|
||||
typedef struct {
|
||||
u8 state;
|
||||
u8 unk1;
|
||||
u16 unk2;
|
||||
struct MultiBootParam mb;
|
||||
} berryfix_t;
|
||||
|
||||
// Static RAM declarations
|
||||
|
||||
const void * gUnknown_3005EF0;
|
||||
int gUnknown_3005EF4;
|
||||
size_t gUnknown_3005EF8;
|
||||
struct MultiBootParam gUnknown_3005F00;
|
||||
|
||||
// Static ROM declarations
|
||||
|
||||
static void mb_berry_fix_maincb(void);
|
||||
static void mb_berry_fix_task(u8 taskId);
|
||||
|
||||
// .rodata
|
||||
|
||||
static const void *const gUnknown_847A890[][3] = {
|
||||
{
|
||||
gBerryFixGameboy_Gfx,
|
||||
gBerryFixGameboy_Tilemap,
|
||||
gBerryFixGameboy_Pal
|
||||
}, {
|
||||
gBerryFixGameboyLogo_Gfx,
|
||||
gBerryFixGameboyLogo_Tilemap,
|
||||
gBerryFixGameboyLogo_Pal
|
||||
}, {
|
||||
gBerryFixGbaTransfer_Gfx,
|
||||
gBerryFixGbaTransfer_Tilemap,
|
||||
gBerryFixGbaTransfer_Pal
|
||||
}, {
|
||||
gBerryFixGbaTransferHighlight_Gfx,
|
||||
gBerryFixGbaTransferHighlight_Tilemap,
|
||||
gBerryFixGbaTransferHighlight_Pal
|
||||
}, {
|
||||
gBerryFixGbaTransferError_Gfx,
|
||||
gBerryFixGbaTransferError_Tilemap,
|
||||
gBerryFixGbaTransferError_Pal
|
||||
}, {
|
||||
gBerryFixWindow_Gfx,
|
||||
gBerryFixWindow_Tilemap,
|
||||
gBerryFixWindow_Pal
|
||||
},
|
||||
};
|
||||
|
||||
extern const u8 gMultiBootProgram_BerryGlitchFix_Start[0x3BF4];
|
||||
extern const u8 gMultiBootProgram_BerryGlitchFix_End[];
|
||||
|
||||
// .text
|
||||
|
||||
static void mb_berry_fix_print(int scene)
|
||||
{
|
||||
REG_DISPCNT = 0;
|
||||
REG_BG0HOFS = 0;
|
||||
REG_BG0VOFS = 0;
|
||||
REG_BLDCNT = 0;
|
||||
LZ77UnCompVram(gUnknown_847A890[scene][0], (void *)BG_CHAR_ADDR(0));
|
||||
LZ77UnCompVram(gUnknown_847A890[scene][1], (void *)BG_SCREEN_ADDR(31));
|
||||
CpuCopy16(gUnknown_847A890[scene][2], (void *)BG_PLTT, 0x200);
|
||||
REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(31) | BGCNT_TXT256x256;
|
||||
REG_DISPCNT = DISPCNT_BG0_ON;
|
||||
}
|
||||
|
||||
void mb_berry_fix_serve(void) // noreturn
|
||||
{
|
||||
u8 taskId;
|
||||
DisableInterrupts(0xFFFF);
|
||||
EnableInterrupts(INTR_FLAG_VBLANK);
|
||||
m4aSoundVSyncOff();
|
||||
SetVBlankCallback(NULL);
|
||||
DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE);
|
||||
DmaFill32(3, 0, (void *)PLTT, PLTT_SIZE);
|
||||
ResetSpriteData();
|
||||
ResetTasks();
|
||||
ScanlineEffect_Stop();
|
||||
gUnknown_3005ECC = 0;
|
||||
taskId = CreateTask(mb_berry_fix_task, 0);
|
||||
gTasks[taskId].data[0] = 0;
|
||||
SetMainCallback2(mb_berry_fix_maincb);
|
||||
}
|
||||
|
||||
static void mb_berry_fix_maincb(void)
|
||||
{
|
||||
RunTasks();
|
||||
}
|
||||
|
||||
static void mb_berry_fix_task(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
switch (data[0])
|
||||
{
|
||||
case 0:
|
||||
mb_berry_fix_print(5);
|
||||
data[0] = 1;
|
||||
break;
|
||||
case 1:
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
mb_berry_fix_print(0);
|
||||
data[0] = 2;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
mb_berry_fix_print(1);
|
||||
data[0] = 4;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
gUnknown_3005EF0 = gMultiBootProgram_BerryGlitchFix_Start;
|
||||
gUnknown_3005EF8 = gMultiBootProgram_BerryGlitchFix_End - gMultiBootProgram_BerryGlitchFix_Start;
|
||||
gUnknown_3005F00.masterp = (void *)gMultiBootProgram_BerryGlitchFix_Start;
|
||||
gUnknown_3005F00.server_type = MULTIBOOT_SERVER_TYPE_NORMAL;
|
||||
MultiBootInit(&gUnknown_3005F00);
|
||||
data[1] = 0;
|
||||
data[0] = 5;
|
||||
break;
|
||||
case 5:
|
||||
if (gUnknown_3005F00.probe_count == 0 && gUnknown_3005F00.response_bit & 0x2 && gUnknown_3005F00.client_bit & 0x2)
|
||||
{
|
||||
data[1]++;
|
||||
if (data[1] > 180)
|
||||
{
|
||||
mb_berry_fix_print(2);
|
||||
MultiBootStartMaster(&gUnknown_3005F00, gUnknown_3005EF0 + MULTIBOOT_HEADER_SIZE, gUnknown_3005EF8 - MULTIBOOT_HEADER_SIZE, 4, 1);
|
||||
data[1] = 0;
|
||||
data[0] = 6;
|
||||
}
|
||||
else
|
||||
gUnknown_3005EF4 = MultiBootMain(&gUnknown_3005F00);
|
||||
}
|
||||
else
|
||||
{
|
||||
data[1] = 0;
|
||||
gUnknown_3005EF4 = MultiBootMain(&gUnknown_3005F00);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
gUnknown_3005EF4 = MultiBootMain(&gUnknown_3005F00);
|
||||
if (MultiBootCheckComplete(&gUnknown_3005F00))
|
||||
{
|
||||
mb_berry_fix_print(3);
|
||||
data[0] = 7;
|
||||
}
|
||||
else if (!(gUnknown_3005F00.client_bit & 2))
|
||||
data[0] = 9;
|
||||
break;
|
||||
case 7:
|
||||
data[0] = 8;
|
||||
break;
|
||||
case 8:
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
DestroyTask(taskId);
|
||||
DoSoftReset();
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
mb_berry_fix_print(4);
|
||||
data[0] = 10;
|
||||
break;
|
||||
case 10:
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
data[0] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
#include "global.h"
|
||||
#include "event_data.h"
|
||||
#include "load_save.h"
|
||||
#include "menu.h"
|
||||
#include "quest_log.h"
|
||||
#include "script_menu.h"
|
||||
#include "string_util.h"
|
||||
#include "strings.h"
|
||||
#include "text.h"
|
||||
#include "text_window.h"
|
||||
|
||||
EWRAM_DATA u8 gUnknown_203F464 = 0;
|
||||
|
||||
u32 sub_815EE3C(u32 * a0)
|
||||
{
|
||||
return *a0 ^ gSaveBlock2Ptr->encryptionKey;
|
||||
}
|
||||
|
||||
void sub_815EE54(u32 * a0, u32 a1)
|
||||
{
|
||||
*a0 = gSaveBlock2Ptr->encryptionKey ^ a1;
|
||||
}
|
||||
|
||||
void sub_815EE6C(u32 a0)
|
||||
{
|
||||
ApplyNewEncryptionKeyToWord(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, a0);
|
||||
}
|
||||
|
||||
bool8 sub_815EE88(u32 a0)
|
||||
{
|
||||
if (sub_815EE3C(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < a0)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_815EEB0(void)
|
||||
{
|
||||
if (sub_815EE3C(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < gSpecialVar_0x8004)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_815EEE0(u32 a0)
|
||||
{
|
||||
u32 * ptr = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
|
||||
u32 amount = sub_815EE3C(ptr) + a0;
|
||||
if (amount > 99999)
|
||||
{
|
||||
sub_815EE54(ptr, 99999);
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_815EE54(ptr, amount);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool8 sub_815EF20(u32 a0)
|
||||
{
|
||||
u32 * ptr = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
|
||||
if (!sub_815EE88(a0))
|
||||
return FALSE;
|
||||
else
|
||||
{
|
||||
u32 amount = sub_815EE3C(ptr);
|
||||
sub_815EE54(ptr, amount - a0);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool8 sub_815EF5C(void)
|
||||
{
|
||||
u32 * ptr = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
|
||||
if (!sub_815EE88(gSpecialVar_0x8004))
|
||||
return FALSE;
|
||||
else
|
||||
{
|
||||
u32 amount = sub_815EE3C(ptr);
|
||||
sub_815EE54(ptr, amount - gSpecialVar_0x8004);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
u32 GetBerryPowder(void)
|
||||
{
|
||||
return sub_815EE3C(&gSaveBlock2Ptr->berryCrush.berryPowderAmount);
|
||||
}
|
||||
|
||||
void sub_815EFBC(u8 windowId, u32 powder, u8 x, u8 y, u8 speed)
|
||||
{
|
||||
ConvertIntToDecimalStringN(gStringVar1, powder, STR_CONV_MODE_RIGHT_ALIGN, 5);
|
||||
AddTextPrinterParameterized(windowId, 0, gStringVar1, x, y, speed, NULL);
|
||||
}
|
||||
|
||||
void sub_815F014(u8 windowId, u16 baseBlock, u8 palette, u32 powder)
|
||||
{
|
||||
DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, baseBlock, palette);
|
||||
AddTextPrinterParameterized(windowId, 0, gOtherText_Powder, 0, 0, -1, NULL);
|
||||
sub_815EFBC(windowId, powder, 39, 12, 0);
|
||||
}
|
||||
|
||||
void sub_815F070(void)
|
||||
{
|
||||
sub_815EFBC(gUnknown_203F464, GetBerryPowder(), 39, 12, 0);
|
||||
}
|
||||
|
||||
void sub_815F094(void)
|
||||
{
|
||||
struct WindowTemplate template;
|
||||
|
||||
if (sub_81119D4(sub_809D6D4) != TRUE)
|
||||
{
|
||||
template = SetWindowTemplateFields(0, 1, 1, 8, 3, 15, 32);
|
||||
gUnknown_203F464 = AddWindow(&template);
|
||||
FillWindowPixelBuffer(gUnknown_203F464, 0);
|
||||
PutWindowTilemap(gUnknown_203F464);
|
||||
TextWindow_SetStdFrame0_WithPal(gUnknown_203F464, 0x21D, 0xD0);
|
||||
sub_815F014(gUnknown_203F464, 0x21D, 0xD, GetBerryPowder());
|
||||
}
|
||||
}
|
||||
|
||||
void sub_815F114(void)
|
||||
{
|
||||
ClearWindowTilemap(gUnknown_203F464);
|
||||
ClearStdWindowAndFrameToTransparent(gUnknown_203F464, 1);
|
||||
RemoveWindow(gUnknown_203F464);
|
||||
}
|
||||
@@ -605,88 +605,25 @@ u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset)
|
||||
return (u8)cursor;
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING // Matches everything but r5 and r6 are flipped, rrr
|
||||
bool8 IsDma3ManagerBusyWithBgCopy(void)
|
||||
{
|
||||
u8 mod;
|
||||
u8 div;
|
||||
s8 reqSpace;
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 0x80; i++)
|
||||
{
|
||||
div = i / 0x20;
|
||||
mod = i % 0x20;
|
||||
u8 div = i / 0x20;
|
||||
u8 mod = i % 0x20;
|
||||
|
||||
if ((sDmaBusyBitfield[div] & (1 << mod)) != FALSE)
|
||||
if ((sDmaBusyBitfield[div] & (1 << mod)))
|
||||
{
|
||||
reqSpace = CheckForSpaceForDma3Request(i);
|
||||
s8 reqSpace = CheckForSpaceForDma3Request(i);
|
||||
if (reqSpace == -1)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
sDmaBusyBitfield[div] &= ~(1 << mod);
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
#else
|
||||
NAKED
|
||||
bool8 IsDma3ManagerBusyWithBgCopy(void)
|
||||
{
|
||||
asm("push {r4-r7,lr}\n\
|
||||
mov r5, #0\n\
|
||||
mov r7, #0x1\n\
|
||||
neg r7, r7\n\
|
||||
_08001ADC:\n\
|
||||
add r0, r5, #0\n\
|
||||
cmp r5, #0\n\
|
||||
bge _08001AE4\n\
|
||||
add r0, #0x1F\n\
|
||||
_08001AE4:\n\
|
||||
asr r0, #5\n\
|
||||
lsl r2, r0, #24\n\
|
||||
lsl r0, #5\n\
|
||||
sub r0, r5, r0\n\
|
||||
lsl r0, #24\n\
|
||||
lsr r0, #24\n\
|
||||
ldr r1, =sDmaBusyBitfield\n\
|
||||
lsr r2, #22\n\
|
||||
add r4, r2, r1\n\
|
||||
mov r6, #0x1\n\
|
||||
lsl r6, r0\n\
|
||||
ldr r0, [r4]\n\
|
||||
and r0, r6\n\
|
||||
cmp r0, #0\n\
|
||||
beq _08001B22\n\
|
||||
lsl r0, r5, #16\n\
|
||||
asr r0, #16\n\
|
||||
bl CheckForSpaceForDma3Request\n\
|
||||
lsl r0, #24\n\
|
||||
asr r0, #24\n\
|
||||
cmp r0, r7\n\
|
||||
bne _08001B1C\n\
|
||||
mov r0, #0x1\n\
|
||||
b _08001B2A\n\
|
||||
.pool\n\
|
||||
_08001B1C:\n\
|
||||
ldr r0, [r4]\n\
|
||||
bic r0, r6\n\
|
||||
str r0, [r4]\n\
|
||||
_08001B22:\n\
|
||||
add r5, #0x1\n\
|
||||
cmp r5, #0x7F\n\
|
||||
ble _08001ADC\n\
|
||||
mov r0, #0\n\
|
||||
_08001B2A:\n\
|
||||
pop {r4-r7}\n\
|
||||
pop {r1}\n\
|
||||
bx r1\n");
|
||||
}
|
||||
#endif // NONMATCHING
|
||||
|
||||
void ShowBg(u8 bg)
|
||||
{
|
||||
@@ -928,79 +865,58 @@ void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dis
|
||||
SetBgAffineInternal(bg, srcCenterX, srcCenterY, dispCenterX, dispCenterY, scaleX, scaleY, rotationAngle);
|
||||
}
|
||||
|
||||
u8 Unused_AdjustBgMosaic(u8 a1, u8 a2)
|
||||
u8 AdjustBgMosaic(u8 value, u8 mode)
|
||||
{
|
||||
u16 result;
|
||||
s16 test1;
|
||||
s16 test2;
|
||||
u16 mosaicSize;
|
||||
s16 bgMosaicH;
|
||||
s16 bgMosaicV;
|
||||
mosaicSize = GetGpuReg(REG_OFFSET_MOSAIC);
|
||||
bgMosaicH = mosaicSize & 0xF;
|
||||
bgMosaicV = (mosaicSize >> 4) & 0xF;
|
||||
mosaicSize &= 0xFF00;
|
||||
|
||||
result = GetGpuReg(REG_OFFSET_MOSAIC);
|
||||
|
||||
test1 = result & 0xF;
|
||||
test2 = (result >> 4) & 0xF;
|
||||
result &= 0xFF00;
|
||||
|
||||
switch (a2)
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
test1 = a1 & 0xF;
|
||||
test2 = a1 >> 0x4;
|
||||
break;
|
||||
case 1:
|
||||
test1 = a1 & 0xF;
|
||||
break;
|
||||
case 2:
|
||||
if ((test1 + a1) > 0xF)
|
||||
{
|
||||
test1 = 0xF;
|
||||
}
|
||||
else
|
||||
{
|
||||
test1 += a1;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if ((test1 - a1) < 0)
|
||||
{
|
||||
test1 = 0x0;
|
||||
}
|
||||
else
|
||||
{
|
||||
test1 -= a1;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
test2 = a1 & 0xF;
|
||||
break;
|
||||
case 5:
|
||||
if ((test2 + a1) > 0xF)
|
||||
{
|
||||
test2 = 0xF;
|
||||
}
|
||||
else
|
||||
{
|
||||
test2 += a1;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if ((test2 - a1) < 0)
|
||||
{
|
||||
test2 = 0x0;
|
||||
}
|
||||
else
|
||||
{
|
||||
test2 -= a1;
|
||||
}
|
||||
break;
|
||||
case BG_MOSAIC_SET:
|
||||
default:
|
||||
bgMosaicH = value & 0xF;
|
||||
bgMosaicV = value >> 0x4;
|
||||
break;
|
||||
case BG_MOSAIC_SET_H:
|
||||
bgMosaicH = value & 0xF;
|
||||
break;
|
||||
case BG_MOSAIC_INC_H:
|
||||
if ((bgMosaicH + value) > 0xF)
|
||||
bgMosaicH = 0xF;
|
||||
else
|
||||
bgMosaicH += value;
|
||||
break;
|
||||
case BG_MOSAIC_DEC_H:
|
||||
if ((bgMosaicH - value) < 0)
|
||||
bgMosaicH = 0x0;
|
||||
else
|
||||
bgMosaicH -= value;
|
||||
break;
|
||||
case BG_MOSAIC_SET_V:
|
||||
bgMosaicV = value & 0xF;
|
||||
break;
|
||||
case BG_MOSAIC_INC_V:
|
||||
if ((bgMosaicV + value) > 0xF)
|
||||
bgMosaicV = 0xF;
|
||||
else
|
||||
bgMosaicV += value;
|
||||
break;
|
||||
case BG_MOSAIC_DEC_V:
|
||||
if ((bgMosaicV - value) < 0)
|
||||
bgMosaicV = 0x0;
|
||||
else
|
||||
bgMosaicV -= value;
|
||||
break;
|
||||
}
|
||||
|
||||
result |= ((test2 << 0x4) & 0xF0);
|
||||
result |= (test1 & 0xF);
|
||||
|
||||
SetGpuReg(REG_OFFSET_MOSAIC, result);
|
||||
|
||||
return result;
|
||||
mosaicSize |= ((bgMosaicV << 0x4) & 0xF0);
|
||||
mosaicSize |= (bgMosaicH & 0xF);
|
||||
SetGpuReg(REG_OFFSET_MOSAIC, mosaicSize);
|
||||
return mosaicSize;
|
||||
}
|
||||
|
||||
void SetBgTilemapBuffer(u8 bg, void *tilemap)
|
||||
|
||||
@@ -0,0 +1,216 @@
|
||||
#include "global.h"
|
||||
#include "task.h"
|
||||
#include "text.h"
|
||||
#include "window.h"
|
||||
#include "text_window.h"
|
||||
#include "money.h"
|
||||
#include "menu_helpers.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "menu.h"
|
||||
#include "shop.h"
|
||||
|
||||
static const struct WindowTemplate sShopBuyMenuWindowTemplatesNormal[] =
|
||||
{
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x1,
|
||||
.tilemapTop = 0x1,
|
||||
.width = 0x8,
|
||||
.height = 0x3,
|
||||
.paletteNum = 0xF,
|
||||
.baseBlock = 0x27,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x1,
|
||||
.tilemapTop = 0xB,
|
||||
.width = 0xD,
|
||||
.height = 0x2,
|
||||
.paletteNum = 0xF,
|
||||
.baseBlock = 0x3F,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x2,
|
||||
.tilemapTop = 0xF,
|
||||
.width = 0x1A,
|
||||
.height = 0x4,
|
||||
.paletteNum = 0xE,
|
||||
.baseBlock = 0x59,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x11,
|
||||
.tilemapTop = 0x9,
|
||||
.width = 0xC,
|
||||
.height = 0x4,
|
||||
.paletteNum = 0xE,
|
||||
.baseBlock = 0xC1,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0xB,
|
||||
.tilemapTop = 0x1,
|
||||
.width = 0x11,
|
||||
.height = 0xC,
|
||||
.paletteNum = 0xE,
|
||||
.baseBlock = 0xF1,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x5,
|
||||
.tilemapTop = 0xE,
|
||||
.width = 0x19,
|
||||
.height = 0x6,
|
||||
.paletteNum = 0xF,
|
||||
.baseBlock = 0x1BD,
|
||||
},
|
||||
DUMMY_WIN_TEMPLATE,
|
||||
};
|
||||
|
||||
// firered uses different layout when selling TMs
|
||||
static const struct WindowTemplate sShopBuyMenuWindowTemplatesTM[] =
|
||||
{
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x1,
|
||||
.tilemapTop = 0x1,
|
||||
.width = 0x8,
|
||||
.height = 0x3,
|
||||
.paletteNum = 0xF,
|
||||
.baseBlock = 0x27,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x1,
|
||||
.tilemapTop = 0xB,
|
||||
.width = 0xD,
|
||||
.height = 0x2,
|
||||
.paletteNum = 0xF,
|
||||
.baseBlock = 0x3F,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x2,
|
||||
.tilemapTop = 0xF,
|
||||
.width = 0x1A,
|
||||
.height = 0x4,
|
||||
.paletteNum = 0xE,
|
||||
.baseBlock = 0x59,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x11,
|
||||
.tilemapTop = 0x9,
|
||||
.width = 0xC,
|
||||
.height = 0x4,
|
||||
.paletteNum = 0xE,
|
||||
.baseBlock = 0xC1,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0xB,
|
||||
.tilemapTop = 0x1,
|
||||
.width = 0x11,
|
||||
.height = 0xA,
|
||||
.paletteNum = 0xE,
|
||||
.baseBlock = 0xF1,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0xC,
|
||||
.tilemapTop = 0xC,
|
||||
.width = 0x12,
|
||||
.height = 0x8,
|
||||
.paletteNum = 0xE,
|
||||
.baseBlock = 0x19B,
|
||||
},
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x1,
|
||||
.tilemapTop = 0xE,
|
||||
.width = 0xA,
|
||||
.height = 0x4,
|
||||
.paletteNum = 0xE,
|
||||
.baseBlock = 0x22B,
|
||||
},
|
||||
DUMMY_WIN_TEMPLATE,
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sShopBuyMenuYesNoWindowTemplate =
|
||||
{
|
||||
.bg = 0x0,
|
||||
.tilemapLeft = 0x15,
|
||||
.tilemapTop = 0x9,
|
||||
.width = 0x6,
|
||||
.height = 0x4,
|
||||
.paletteNum = 0xE,
|
||||
.baseBlock = 0xC1,
|
||||
};
|
||||
|
||||
static const struct TextColor sShopBuyMenuTextColors[] =
|
||||
{
|
||||
{
|
||||
.fgColor = 0,
|
||||
.bgColor = 1,
|
||||
.shadowColor = 2,
|
||||
},
|
||||
{
|
||||
.fgColor = 0,
|
||||
.bgColor = 2,
|
||||
.shadowColor = 3,
|
||||
},
|
||||
{
|
||||
.fgColor = 0,
|
||||
.bgColor = 3,
|
||||
.shadowColor = 2,
|
||||
},
|
||||
};
|
||||
|
||||
void BuyMenuInitWindows(bool32 isSellingTM)
|
||||
{
|
||||
if (isSellingTM != TRUE)
|
||||
InitWindows(sShopBuyMenuWindowTemplatesNormal);
|
||||
else
|
||||
InitWindows(sShopBuyMenuWindowTemplatesTM);
|
||||
DeactivateAllTextPrinters();
|
||||
TextWindow_SetUserSelectedFrame(0, 0x1, 0xD0);
|
||||
TextWindow_LoadResourcesStdFrame0(0, 0x13, 0xE0);
|
||||
TextWindow_SetStdFrame0_WithPal(0, 0xA, 0xF0);
|
||||
PutWindowTilemap(0);
|
||||
PutWindowTilemap(4);
|
||||
PutWindowTilemap(5);
|
||||
if (isSellingTM == TRUE)
|
||||
PutWindowTilemap(6);
|
||||
}
|
||||
|
||||
void BuyMenuDrawMoneyBox(void)
|
||||
{
|
||||
PrintMoneyAmountInMoneyBoxWithBorder(0, 0xA, 0xF, GetMoney(&gSaveBlock1Ptr->money));
|
||||
}
|
||||
|
||||
void BuyMenuPrint(u8 windowId, u8 font, const u8 *text, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, s8 speed, u8 color)
|
||||
{
|
||||
AddTextPrinterParameterized4(windowId, font, x, y, letterSpacing, lineSpacing, &sShopBuyMenuTextColors[color], speed, text);
|
||||
}
|
||||
|
||||
void BuyMenuDisplayMessage(u8 taskId, const u8 *text, TaskFunc callback)
|
||||
{
|
||||
DisplayMessageAndContinueTask(taskId, 2, 0x13, 0xE, sub_809B56C(), GetTextSpeedSetting(), text, callback);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
}
|
||||
|
||||
void BuyMenuQuantityBoxNormalBorder(u8 windowId, bool8 copyToVram)
|
||||
{
|
||||
DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, 0x1, 0xD);
|
||||
}
|
||||
|
||||
void BuyMenuQuantityBoxThinBorder(u8 windowId, bool8 copyToVram)
|
||||
{
|
||||
DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, 0xA, 0xF);
|
||||
}
|
||||
|
||||
void BuyMenuConfirmPurchase(u8 taskId, const struct YesNoFuncTable *yesNo)
|
||||
{
|
||||
CreateYesNoMenuWithCallbacks(taskId, &sShopBuyMenuYesNoWindowTemplate, 2, 0, 2, 1, 0xD, yesNo);
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
#include "global.h"
|
||||
|
||||
static void CableCarUtil_FillWrapped(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height)
|
||||
{
|
||||
u8 i;
|
||||
u8 j;
|
||||
u8 x;
|
||||
u8 y;
|
||||
|
||||
for (i = 0, y = top; i < height; i++)
|
||||
{
|
||||
for (x = left, j = 0; j < width; j++)
|
||||
{
|
||||
*(u16 *)&((u8 *)dest)[y * 64 + x * 2] = value;
|
||||
x = (x + 1) % 32;
|
||||
}
|
||||
y = (y + 1) % 32;
|
||||
}
|
||||
}
|
||||
|
||||
static void CableCarUtil_CopyWrapped(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height)
|
||||
{
|
||||
u8 i;
|
||||
u8 j;
|
||||
u8 x;
|
||||
u8 y;
|
||||
const u16 *_src;
|
||||
|
||||
for (i = 0, _src = src, y = top; i < height; i++)
|
||||
{
|
||||
for (x = left, j = 0; j < width; j++)
|
||||
{
|
||||
*(u16 *)&((u8 *)dest)[y * 64 + x * 2] = *_src++;
|
||||
x = (x + 1) % 32;
|
||||
}
|
||||
y = (y + 1) % 32;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
#include "global.h"
|
||||
#include "util.h"
|
||||
#include "save.h"
|
||||
#include "malloc.h"
|
||||
#include "cereader_tool.h"
|
||||
|
||||
u8 sub_815D654(void)
|
||||
{
|
||||
return (gSaveBlock1Ptr->unkArray[0].unk9 + 1) % 256;
|
||||
}
|
||||
|
||||
static bool32 ValidateTrainerTowerTrainer(struct TrainerTowerTrainer * trainer)
|
||||
{
|
||||
if (trainer->unk_001 < 1 || trainer->unk_001 > 8)
|
||||
return FALSE;
|
||||
if (trainer->unk_002 > 2)
|
||||
return FALSE;
|
||||
if (CalcByteArraySum((const u8 *)trainer, offsetof(typeof(*trainer), checksum)) != trainer->checksum)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 ValidateTrainerTowerData(struct TrainerTowerData * ttdata)
|
||||
{
|
||||
u32 count = ttdata->count;
|
||||
s32 i;
|
||||
if (count < 1 || count > 8)
|
||||
return FALSE;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if (!ValidateTrainerTowerTrainer(&ttdata->trainers[i]))
|
||||
return FALSE;
|
||||
}
|
||||
if (CalcByteArraySum((const u8 *)ttdata->trainers, count * sizeof(ttdata->trainers[0])) != ttdata->checksum)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#define SEC30_SIZE (offsetof(struct TrainerTowerData, trainers[4]))
|
||||
#define SEC31_SIZE (sizeof(struct TrainerTowerData) - SEC30_SIZE)
|
||||
|
||||
static bool32 CEReaderTool_SaveTrainerTower_r(struct TrainerTowerData * ttdata, u8 * buffer)
|
||||
{
|
||||
AGB_ASSERT_EX(ttdata->dummy == 0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/cereader_tool.c", 198);
|
||||
AGB_ASSERT_EX(ttdata->id == 0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/cereader_tool.c", 199)
|
||||
|
||||
memset(buffer, 0, 0x1000);
|
||||
memcpy(buffer, ttdata, SEC30_SIZE);
|
||||
buffer[1] = sub_815D654();
|
||||
if (TryWriteSpecialSaveSection(30, buffer) != TRUE)
|
||||
return FALSE;
|
||||
memset(buffer, 0, 0x1000);
|
||||
memcpy(buffer, (u8 *)ttdata + SEC30_SIZE, SEC31_SIZE);
|
||||
if (TryWriteSpecialSaveSection(31, buffer) != TRUE)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 CEReaderTool_SaveTrainerTower(struct TrainerTowerData * ttdata)
|
||||
{
|
||||
u8 * buffer = AllocZeroed(0x1000);
|
||||
bool32 result = CEReaderTool_SaveTrainerTower_r(ttdata, buffer);
|
||||
Free(buffer);
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool32 CEReaderTool_LoadTrainerTower_r(struct TrainerTowerData * ttdata, void * buffer)
|
||||
{
|
||||
if (TryCopySpecialSaveSection(30, buffer) != 1)
|
||||
return FALSE;
|
||||
memcpy(ttdata + 0x000, buffer, SEC30_SIZE);
|
||||
|
||||
if (TryCopySpecialSaveSection(31, buffer) != 1)
|
||||
return FALSE;
|
||||
memcpy((u8 *)ttdata + SEC30_SIZE, buffer, SEC31_SIZE);
|
||||
|
||||
if (!ValidateTrainerTowerData(ttdata))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 CEReaderTool_LoadTrainerTower(struct TrainerTowerData * ttdata)
|
||||
{
|
||||
void * buffer = AllocZeroed(0x1000);
|
||||
bool32 success = CEReaderTool_LoadTrainerTower_r(ttdata, buffer);
|
||||
Free(buffer);
|
||||
return success;
|
||||
}
|
||||
+8
-9
@@ -3,8 +3,8 @@
|
||||
#include "text.h"
|
||||
#include "menu.h"
|
||||
#include "text_window.h"
|
||||
#include "strings.h"
|
||||
|
||||
extern const u8 gText_Coins[];
|
||||
extern const u8 gUnknown_8417C2D[];
|
||||
|
||||
EWRAM_DATA static u8 sCoinsWindowId = 0;
|
||||
@@ -61,7 +61,7 @@ void PrintCoinsString_Parameterized(u8 windowId, u32 coinAmount, u8 x, u8 y, u8
|
||||
|
||||
void sub_80D0674(u8 windowId, u16 tileStart, u8 palette, u32 coinAmount)
|
||||
{
|
||||
SetWindowBorderStyle(windowId, FALSE, tileStart, palette);
|
||||
DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, tileStart, palette);
|
||||
AddTextPrinterParameterized(windowId, 2, gUnknown_8417C2D, 0, 0, 0xFF, 0);
|
||||
PrintCoinsString_Parameterized(windowId, coinAmount, 0x10, 0xC, 0);
|
||||
}
|
||||
@@ -80,15 +80,14 @@ void PrintCoinsString(u32 coinAmount)
|
||||
|
||||
void ShowCoinsWindow(u32 coinAmount, u8 x, u8 y)
|
||||
{
|
||||
struct WindowTemplate template, template2;
|
||||
struct WindowTemplate template;
|
||||
|
||||
SetWindowTemplateFields(&template, 0, x + 1, y + 1, 8, 3, 0xF, 0x20);
|
||||
template2 = template; // again, why...
|
||||
sCoinsWindowId = AddWindow(&template2);
|
||||
template = SetWindowTemplateFields(0, x + 1, y + 1, 8, 3, 0xF, 0x20);
|
||||
sCoinsWindowId = AddWindow(&template);
|
||||
FillWindowPixelBuffer(sCoinsWindowId, 0);
|
||||
PutWindowTilemap(sCoinsWindowId);
|
||||
sub_814FF2C(sCoinsWindowId, 0x21D, 0xD0);
|
||||
SetWindowBorderStyle(sCoinsWindowId, FALSE, 0x21D, 0xD);
|
||||
TextWindow_SetStdFrame0_WithPal(sCoinsWindowId, 0x21D, 0xD0);
|
||||
DrawStdFrameWithCustomTileAndPalette(sCoinsWindowId, FALSE, 0x21D, 0xD);
|
||||
AddTextPrinterParameterized(sCoinsWindowId, 2, gUnknown_8417C2D, 0, 0, 0xFF, 0);
|
||||
PrintCoinsString(coinAmount);
|
||||
}
|
||||
@@ -96,6 +95,6 @@ void ShowCoinsWindow(u32 coinAmount, u8 x, u8 y)
|
||||
void HideCoinsWindow(void)
|
||||
{
|
||||
ClearWindowTilemap(sCoinsWindowId);
|
||||
sub_810F4D8(sCoinsWindowId, TRUE);
|
||||
ClearStdWindowAndFrameToTransparent(sCoinsWindowId, TRUE);
|
||||
RemoveWindow(sCoinsWindowId);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+6062
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,31 @@
|
||||
{{ doNotModifyHeader }}
|
||||
## for item in items
|
||||
## if item.pocket == "POCKET_TM_CASE"
|
||||
extern const u8 gMoveDescription_{{ item.moveId }}[];
|
||||
## endif
|
||||
{% if item.itemId != "ITEM_NONE" %}const u8 gItemDescription_{{ item.itemId }}[] = _("{{ item.description_english }}");{% endif %}
|
||||
## endfor
|
||||
const u8 gItemDescription_ITEM_NONE[] = _("?????");
|
||||
|
||||
const struct Item gItems[] = {
|
||||
{% for item in items %}{
|
||||
.name = _("{{ item.english }}"),
|
||||
.itemId = {{ item.itemId }},
|
||||
.price = {{ item.price }},
|
||||
.holdEffect = {{ item.holdEffect }},
|
||||
.holdEffectParam = {{ item.holdEffectParam }},
|
||||
## if item.pocket == "POCKET_TM_CASE"
|
||||
.description = gMoveDescription_{{ item.moveId }},
|
||||
## else
|
||||
.description = gItemDescription_{{ item.itemId }},
|
||||
## endif
|
||||
.importance = {{ item.importance }},
|
||||
.exitsBagOnUse = {{ item.exitsBagOnUse }},
|
||||
.pocket = {{ item.pocket }},
|
||||
.type = {{ item.type }},
|
||||
.fieldUseFunc = {{ item.fieldUseFunc }},
|
||||
.battleUsage = {{ item.battleUsage }},
|
||||
.battleUseFunc = {{ item.battleUseFunc }},
|
||||
.secondaryId = {{ item.secondaryId }}
|
||||
}, {% endfor %}
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,140 @@
|
||||
#define HOENN_MON_SPECIES_START 277
|
||||
|
||||
static const u16 sHoennSpeciesIdToCryId[] =
|
||||
{
|
||||
[SPECIES_TREECKO - HOENN_MON_SPECIES_START] = CRY_TREECKO,
|
||||
[SPECIES_GROVYLE - HOENN_MON_SPECIES_START] = CRY_GROVYLE,
|
||||
[SPECIES_SCEPTILE - HOENN_MON_SPECIES_START] = CRY_SCEPTILE,
|
||||
[SPECIES_TORCHIC - HOENN_MON_SPECIES_START] = CRY_TORCHIC,
|
||||
[SPECIES_COMBUSKEN - HOENN_MON_SPECIES_START] = CRY_COMBUSKEN,
|
||||
[SPECIES_BLAZIKEN - HOENN_MON_SPECIES_START] = CRY_BLAZIKEN,
|
||||
[SPECIES_MUDKIP - HOENN_MON_SPECIES_START] = CRY_MUDKIP,
|
||||
[SPECIES_MARSHTOMP - HOENN_MON_SPECIES_START] = CRY_MARSHTOMP,
|
||||
[SPECIES_SWAMPERT - HOENN_MON_SPECIES_START] = CRY_SWAMPERT,
|
||||
[SPECIES_POOCHYENA - HOENN_MON_SPECIES_START] = CRY_POOCHYENA,
|
||||
[SPECIES_MIGHTYENA - HOENN_MON_SPECIES_START] = CRY_MIGHTYENA,
|
||||
[SPECIES_ZIGZAGOON - HOENN_MON_SPECIES_START] = CRY_ZIGZAGOON,
|
||||
[SPECIES_LINOONE - HOENN_MON_SPECIES_START] = CRY_LINOONE,
|
||||
[SPECIES_WURMPLE - HOENN_MON_SPECIES_START] = CRY_WURMPLE,
|
||||
[SPECIES_SILCOON - HOENN_MON_SPECIES_START] = CRY_SILCOON,
|
||||
[SPECIES_BEAUTIFLY - HOENN_MON_SPECIES_START] = CRY_BEAUTIFLY,
|
||||
[SPECIES_CASCOON - HOENN_MON_SPECIES_START] = CRY_CASCOON,
|
||||
[SPECIES_DUSTOX - HOENN_MON_SPECIES_START] = CRY_DUSTOX,
|
||||
[SPECIES_LOTAD - HOENN_MON_SPECIES_START] = CRY_LOTAD,
|
||||
[SPECIES_LOMBRE - HOENN_MON_SPECIES_START] = CRY_LOMBRE,
|
||||
[SPECIES_LUDICOLO - HOENN_MON_SPECIES_START] = CRY_LUDICOLO,
|
||||
[SPECIES_SEEDOT - HOENN_MON_SPECIES_START] = CRY_SEEDOT,
|
||||
[SPECIES_NUZLEAF - HOENN_MON_SPECIES_START] = CRY_NUZLEAF,
|
||||
[SPECIES_SHIFTRY - HOENN_MON_SPECIES_START] = CRY_SHIFTRY,
|
||||
[SPECIES_NINCADA - HOENN_MON_SPECIES_START] = CRY_NINCADA,
|
||||
[SPECIES_NINJASK - HOENN_MON_SPECIES_START] = CRY_NINJASK,
|
||||
[SPECIES_SHEDINJA - HOENN_MON_SPECIES_START] = CRY_SHEDINJA,
|
||||
[SPECIES_TAILLOW - HOENN_MON_SPECIES_START] = CRY_TAILLOW,
|
||||
[SPECIES_SWELLOW - HOENN_MON_SPECIES_START] = CRY_SWELLOW,
|
||||
[SPECIES_SHROOMISH - HOENN_MON_SPECIES_START] = CRY_SHROOMISH,
|
||||
[SPECIES_BRELOOM - HOENN_MON_SPECIES_START] = CRY_BRELOOM,
|
||||
[SPECIES_SPINDA - HOENN_MON_SPECIES_START] = CRY_SPINDA,
|
||||
[SPECIES_WINGULL - HOENN_MON_SPECIES_START] = CRY_WINGULL,
|
||||
[SPECIES_PELIPPER - HOENN_MON_SPECIES_START] = CRY_PELIPPER,
|
||||
[SPECIES_SURSKIT - HOENN_MON_SPECIES_START] = CRY_SURSKIT,
|
||||
[SPECIES_MASQUERAIN - HOENN_MON_SPECIES_START] = CRY_MASQUERAIN,
|
||||
[SPECIES_WAILMER - HOENN_MON_SPECIES_START] = CRY_WAILMER,
|
||||
[SPECIES_WAILORD - HOENN_MON_SPECIES_START] = CRY_WAILORD,
|
||||
[SPECIES_SKITTY - HOENN_MON_SPECIES_START] = CRY_SKITTY,
|
||||
[SPECIES_DELCATTY - HOENN_MON_SPECIES_START] = CRY_DELCATTY,
|
||||
[SPECIES_KECLEON - HOENN_MON_SPECIES_START] = CRY_KECLEON,
|
||||
[SPECIES_BALTOY - HOENN_MON_SPECIES_START] = CRY_BALTOY,
|
||||
[SPECIES_CLAYDOL - HOENN_MON_SPECIES_START] = CRY_CLAYDOL,
|
||||
[SPECIES_NOSEPASS - HOENN_MON_SPECIES_START] = CRY_NOSEPASS,
|
||||
[SPECIES_TORKOAL - HOENN_MON_SPECIES_START] = CRY_TORKOAL,
|
||||
[SPECIES_SABLEYE - HOENN_MON_SPECIES_START] = CRY_SABLEYE,
|
||||
[SPECIES_BARBOACH - HOENN_MON_SPECIES_START] = CRY_BARBOACH,
|
||||
[SPECIES_WHISCASH - HOENN_MON_SPECIES_START] = CRY_WHISCASH,
|
||||
[SPECIES_LUVDISC - HOENN_MON_SPECIES_START] = CRY_LUVDISC,
|
||||
[SPECIES_CORPHISH - HOENN_MON_SPECIES_START] = CRY_CORPHISH,
|
||||
[SPECIES_CRAWDAUNT - HOENN_MON_SPECIES_START] = CRY_CRAWDAUNT,
|
||||
[SPECIES_FEEBAS - HOENN_MON_SPECIES_START] = CRY_FEEBAS,
|
||||
[SPECIES_MILOTIC - HOENN_MON_SPECIES_START] = CRY_MILOTIC,
|
||||
[SPECIES_CARVANHA - HOENN_MON_SPECIES_START] = CRY_CARVANHA,
|
||||
[SPECIES_SHARPEDO - HOENN_MON_SPECIES_START] = CRY_SHARPEDO,
|
||||
[SPECIES_TRAPINCH - HOENN_MON_SPECIES_START] = CRY_TRAPINCH,
|
||||
[SPECIES_VIBRAVA - HOENN_MON_SPECIES_START] = CRY_VIBRAVA,
|
||||
[SPECIES_FLYGON - HOENN_MON_SPECIES_START] = CRY_FLYGON,
|
||||
[SPECIES_MAKUHITA - HOENN_MON_SPECIES_START] = CRY_MAKUHITA,
|
||||
[SPECIES_HARIYAMA - HOENN_MON_SPECIES_START] = CRY_HARIYAMA,
|
||||
[SPECIES_ELECTRIKE - HOENN_MON_SPECIES_START] = CRY_ELECTRIKE,
|
||||
[SPECIES_MANECTRIC - HOENN_MON_SPECIES_START] = CRY_MANECTRIC,
|
||||
[SPECIES_NUMEL - HOENN_MON_SPECIES_START] = CRY_NUMEL,
|
||||
[SPECIES_CAMERUPT - HOENN_MON_SPECIES_START] = CRY_CAMERUPT,
|
||||
[SPECIES_SPHEAL - HOENN_MON_SPECIES_START] = CRY_SPHEAL,
|
||||
[SPECIES_SEALEO - HOENN_MON_SPECIES_START] = CRY_SEALEO,
|
||||
[SPECIES_WALREIN - HOENN_MON_SPECIES_START] = CRY_WALREIN,
|
||||
[SPECIES_CACNEA - HOENN_MON_SPECIES_START] = CRY_CACNEA,
|
||||
[SPECIES_CACTURNE - HOENN_MON_SPECIES_START] = CRY_CACTURNE,
|
||||
[SPECIES_SNORUNT - HOENN_MON_SPECIES_START] = CRY_SNORUNT,
|
||||
[SPECIES_GLALIE - HOENN_MON_SPECIES_START] = CRY_GLALIE,
|
||||
[SPECIES_LUNATONE - HOENN_MON_SPECIES_START] = CRY_LUNATONE,
|
||||
[SPECIES_SOLROCK - HOENN_MON_SPECIES_START] = CRY_SOLROCK,
|
||||
[SPECIES_AZURILL - HOENN_MON_SPECIES_START] = CRY_AZURILL,
|
||||
[SPECIES_SPOINK - HOENN_MON_SPECIES_START] = CRY_SPOINK,
|
||||
[SPECIES_GRUMPIG - HOENN_MON_SPECIES_START] = CRY_GRUMPIG,
|
||||
[SPECIES_PLUSLE - HOENN_MON_SPECIES_START] = CRY_PLUSLE,
|
||||
[SPECIES_MINUN - HOENN_MON_SPECIES_START] = CRY_MINUN,
|
||||
[SPECIES_MAWILE - HOENN_MON_SPECIES_START] = CRY_MAWILE,
|
||||
[SPECIES_MEDITITE - HOENN_MON_SPECIES_START] = CRY_MEDITITE,
|
||||
[SPECIES_MEDICHAM - HOENN_MON_SPECIES_START] = CRY_MEDICHAM,
|
||||
[SPECIES_SWABLU - HOENN_MON_SPECIES_START] = CRY_SWABLU,
|
||||
[SPECIES_ALTARIA - HOENN_MON_SPECIES_START] = CRY_ALTARIA,
|
||||
[SPECIES_WYNAUT - HOENN_MON_SPECIES_START] = CRY_WYNAUT,
|
||||
[SPECIES_DUSKULL - HOENN_MON_SPECIES_START] = CRY_DUSKULL,
|
||||
[SPECIES_DUSCLOPS - HOENN_MON_SPECIES_START] = CRY_DUSCLOPS,
|
||||
[SPECIES_ROSELIA - HOENN_MON_SPECIES_START] = CRY_ROSELIA,
|
||||
[SPECIES_SLAKOTH - HOENN_MON_SPECIES_START] = CRY_SLAKOTH,
|
||||
[SPECIES_VIGOROTH - HOENN_MON_SPECIES_START] = CRY_VIGOROTH,
|
||||
[SPECIES_SLAKING - HOENN_MON_SPECIES_START] = CRY_SLAKING,
|
||||
[SPECIES_GULPIN - HOENN_MON_SPECIES_START] = CRY_GULPIN,
|
||||
[SPECIES_SWALOT - HOENN_MON_SPECIES_START] = CRY_SWALOT,
|
||||
[SPECIES_TROPIUS - HOENN_MON_SPECIES_START] = CRY_TROPIUS,
|
||||
[SPECIES_WHISMUR - HOENN_MON_SPECIES_START] = CRY_WHISMUR,
|
||||
[SPECIES_LOUDRED - HOENN_MON_SPECIES_START] = CRY_LOUDRED,
|
||||
[SPECIES_EXPLOUD - HOENN_MON_SPECIES_START] = CRY_EXPLOUD,
|
||||
[SPECIES_CLAMPERL - HOENN_MON_SPECIES_START] = CRY_CLAMPERL,
|
||||
[SPECIES_HUNTAIL - HOENN_MON_SPECIES_START] = CRY_HUNTAIL,
|
||||
[SPECIES_GOREBYSS - HOENN_MON_SPECIES_START] = CRY_GOREBYSS,
|
||||
[SPECIES_ABSOL - HOENN_MON_SPECIES_START] = CRY_ABSOL,
|
||||
[SPECIES_SHUPPET - HOENN_MON_SPECIES_START] = CRY_SHUPPET,
|
||||
[SPECIES_BANETTE - HOENN_MON_SPECIES_START] = CRY_BANETTE,
|
||||
[SPECIES_SEVIPER - HOENN_MON_SPECIES_START] = CRY_SEVIPER,
|
||||
[SPECIES_ZANGOOSE - HOENN_MON_SPECIES_START] = CRY_ZANGOOSE,
|
||||
[SPECIES_RELICANTH - HOENN_MON_SPECIES_START] = CRY_RELICANTH,
|
||||
[SPECIES_ARON - HOENN_MON_SPECIES_START] = CRY_ARON,
|
||||
[SPECIES_LAIRON - HOENN_MON_SPECIES_START] = CRY_LAIRON,
|
||||
[SPECIES_AGGRON - HOENN_MON_SPECIES_START] = CRY_AGGRON,
|
||||
[SPECIES_CASTFORM - HOENN_MON_SPECIES_START] = CRY_CASTFORM,
|
||||
[SPECIES_VOLBEAT - HOENN_MON_SPECIES_START] = CRY_VOLBEAT,
|
||||
[SPECIES_ILLUMISE - HOENN_MON_SPECIES_START] = CRY_ILLUMISE,
|
||||
[SPECIES_LILEEP - HOENN_MON_SPECIES_START] = CRY_LILEEP,
|
||||
[SPECIES_CRADILY - HOENN_MON_SPECIES_START] = CRY_CRADILY,
|
||||
[SPECIES_ANORITH - HOENN_MON_SPECIES_START] = CRY_ANORITH,
|
||||
[SPECIES_ARMALDO - HOENN_MON_SPECIES_START] = CRY_ARMALDO,
|
||||
[SPECIES_RALTS - HOENN_MON_SPECIES_START] = CRY_RALTS,
|
||||
[SPECIES_KIRLIA - HOENN_MON_SPECIES_START] = CRY_KIRLIA,
|
||||
[SPECIES_GARDEVOIR - HOENN_MON_SPECIES_START] = CRY_GARDEVOIR,
|
||||
[SPECIES_BAGON - HOENN_MON_SPECIES_START] = CRY_BAGON,
|
||||
[SPECIES_SHELGON - HOENN_MON_SPECIES_START] = CRY_SHELGON,
|
||||
[SPECIES_SALAMENCE - HOENN_MON_SPECIES_START] = CRY_SALAMENCE,
|
||||
[SPECIES_BELDUM - HOENN_MON_SPECIES_START] = CRY_BELDUM,
|
||||
[SPECIES_METANG - HOENN_MON_SPECIES_START] = CRY_METANG,
|
||||
[SPECIES_METAGROSS - HOENN_MON_SPECIES_START] = CRY_METAGROSS,
|
||||
[SPECIES_REGIROCK - HOENN_MON_SPECIES_START] = CRY_REGIROCK,
|
||||
[SPECIES_REGICE - HOENN_MON_SPECIES_START] = CRY_REGICE,
|
||||
[SPECIES_REGISTEEL - HOENN_MON_SPECIES_START] = CRY_REGISTEEL,
|
||||
[SPECIES_KYOGRE - HOENN_MON_SPECIES_START] = CRY_KYOGRE,
|
||||
[SPECIES_GROUDON - HOENN_MON_SPECIES_START] = CRY_GROUDON,
|
||||
[SPECIES_RAYQUAZA - HOENN_MON_SPECIES_START] = CRY_RAYQUAZA,
|
||||
[SPECIES_LATIAS - HOENN_MON_SPECIES_START] = CRY_LATIAS,
|
||||
[SPECIES_LATIOS - HOENN_MON_SPECIES_START] = CRY_LATIOS,
|
||||
[SPECIES_JIRACHI - HOENN_MON_SPECIES_START] = CRY_JIRACHI,
|
||||
[SPECIES_DEOXYS - HOENN_MON_SPECIES_START] = CRY_DEOXYS,
|
||||
[SPECIES_CHIMECHO - HOENN_MON_SPECIES_START] = CRY_CHIMECHO,
|
||||
};
|
||||
@@ -0,0 +1,187 @@
|
||||
const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] =
|
||||
{
|
||||
[SPECIES_BULBASAUR] = {{EVO_LEVEL, 16, SPECIES_IVYSAUR}},
|
||||
[SPECIES_IVYSAUR] = {{EVO_LEVEL, 32, SPECIES_VENUSAUR}},
|
||||
[SPECIES_CHARMANDER] = {{EVO_LEVEL, 16, SPECIES_CHARMELEON}},
|
||||
[SPECIES_CHARMELEON] = {{EVO_LEVEL, 36, SPECIES_CHARIZARD}},
|
||||
[SPECIES_SQUIRTLE] = {{EVO_LEVEL, 16, SPECIES_WARTORTLE}},
|
||||
[SPECIES_WARTORTLE] = {{EVO_LEVEL, 36, SPECIES_BLASTOISE}},
|
||||
[SPECIES_CATERPIE] = {{EVO_LEVEL, 7, SPECIES_METAPOD}},
|
||||
[SPECIES_METAPOD] = {{EVO_LEVEL, 10, SPECIES_BUTTERFREE}},
|
||||
[SPECIES_WEEDLE] = {{EVO_LEVEL, 7, SPECIES_KAKUNA}},
|
||||
[SPECIES_KAKUNA] = {{EVO_LEVEL, 10, SPECIES_BEEDRILL}},
|
||||
[SPECIES_PIDGEY] = {{EVO_LEVEL, 18, SPECIES_PIDGEOTTO}},
|
||||
[SPECIES_PIDGEOTTO] = {{EVO_LEVEL, 36, SPECIES_PIDGEOT}},
|
||||
[SPECIES_RATTATA] = {{EVO_LEVEL, 20, SPECIES_RATICATE}},
|
||||
[SPECIES_SPEAROW] = {{EVO_LEVEL, 20, SPECIES_FEAROW}},
|
||||
[SPECIES_EKANS] = {{EVO_LEVEL, 22, SPECIES_ARBOK}},
|
||||
[SPECIES_PIKACHU] = {{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}},
|
||||
[SPECIES_SANDSHREW] = {{EVO_LEVEL, 22, SPECIES_SANDSLASH}},
|
||||
[SPECIES_NIDORAN_F] = {{EVO_LEVEL, 16, SPECIES_NIDORINA}},
|
||||
[SPECIES_NIDORINA] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOQUEEN}},
|
||||
[SPECIES_NIDORAN_M] = {{EVO_LEVEL, 16, SPECIES_NIDORINO}},
|
||||
[SPECIES_NIDORINO] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOKING}},
|
||||
[SPECIES_CLEFAIRY] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_CLEFABLE}},
|
||||
[SPECIES_VULPIX] = {{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_NINETALES}},
|
||||
[SPECIES_JIGGLYPUFF] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_WIGGLYTUFF}},
|
||||
[SPECIES_ZUBAT] = {{EVO_LEVEL, 22, SPECIES_GOLBAT}},
|
||||
[SPECIES_GOLBAT] = {{EVO_FRIENDSHIP, 0, SPECIES_CROBAT}},
|
||||
[SPECIES_ODDISH] = {{EVO_LEVEL, 21, SPECIES_GLOOM}},
|
||||
[SPECIES_GLOOM] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME},
|
||||
{EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM}},
|
||||
[SPECIES_PARAS] = {{EVO_LEVEL, 24, SPECIES_PARASECT}},
|
||||
[SPECIES_VENONAT] = {{EVO_LEVEL, 31, SPECIES_VENOMOTH}},
|
||||
[SPECIES_DIGLETT] = {{EVO_LEVEL, 26, SPECIES_DUGTRIO}},
|
||||
[SPECIES_MEOWTH] = {{EVO_LEVEL, 28, SPECIES_PERSIAN}},
|
||||
[SPECIES_PSYDUCK] = {{EVO_LEVEL, 33, SPECIES_GOLDUCK}},
|
||||
[SPECIES_MANKEY] = {{EVO_LEVEL, 28, SPECIES_PRIMEAPE}},
|
||||
[SPECIES_GROWLITHE] = {{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_ARCANINE}},
|
||||
[SPECIES_POLIWAG] = {{EVO_LEVEL, 25, SPECIES_POLIWHIRL}},
|
||||
[SPECIES_POLIWHIRL] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH},
|
||||
{EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED}},
|
||||
[SPECIES_ABRA] = {{EVO_LEVEL, 16, SPECIES_KADABRA}},
|
||||
[SPECIES_KADABRA] = {{EVO_TRADE, 0, SPECIES_ALAKAZAM}},
|
||||
[SPECIES_MACHOP] = {{EVO_LEVEL, 28, SPECIES_MACHOKE}},
|
||||
[SPECIES_MACHOKE] = {{EVO_TRADE, 0, SPECIES_MACHAMP}},
|
||||
[SPECIES_BELLSPROUT] = {{EVO_LEVEL, 21, SPECIES_WEEPINBELL}},
|
||||
[SPECIES_WEEPINBELL] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VICTREEBEL}},
|
||||
[SPECIES_TENTACOOL] = {{EVO_LEVEL, 30, SPECIES_TENTACRUEL}},
|
||||
[SPECIES_GEODUDE] = {{EVO_LEVEL, 25, SPECIES_GRAVELER}},
|
||||
[SPECIES_GRAVELER] = {{EVO_TRADE, 0, SPECIES_GOLEM}},
|
||||
[SPECIES_PONYTA] = {{EVO_LEVEL, 40, SPECIES_RAPIDASH}},
|
||||
[SPECIES_SLOWPOKE] = {{EVO_LEVEL, 37, SPECIES_SLOWBRO},
|
||||
{EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING}},
|
||||
[SPECIES_MAGNEMITE] = {{EVO_LEVEL, 30, SPECIES_MAGNETON}},
|
||||
[SPECIES_DODUO] = {{EVO_LEVEL, 31, SPECIES_DODRIO}},
|
||||
[SPECIES_SEEL] = {{EVO_LEVEL, 34, SPECIES_DEWGONG}},
|
||||
[SPECIES_GRIMER] = {{EVO_LEVEL, 38, SPECIES_MUK}},
|
||||
[SPECIES_SHELLDER] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_CLOYSTER}},
|
||||
[SPECIES_GASTLY] = {{EVO_LEVEL, 25, SPECIES_HAUNTER}},
|
||||
[SPECIES_HAUNTER] = {{EVO_TRADE, 0, SPECIES_GENGAR}},
|
||||
[SPECIES_ONIX] = {{EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX}},
|
||||
[SPECIES_DROWZEE] = {{EVO_LEVEL, 26, SPECIES_HYPNO}},
|
||||
[SPECIES_KRABBY] = {{EVO_LEVEL, 28, SPECIES_KINGLER}},
|
||||
[SPECIES_VOLTORB] = {{EVO_LEVEL, 30, SPECIES_ELECTRODE}},
|
||||
[SPECIES_EXEGGCUTE] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR}},
|
||||
[SPECIES_CUBONE] = {{EVO_LEVEL, 28, SPECIES_MAROWAK}},
|
||||
[SPECIES_KOFFING] = {{EVO_LEVEL, 35, SPECIES_WEEZING}},
|
||||
[SPECIES_RHYHORN] = {{EVO_LEVEL, 42, SPECIES_RHYDON}},
|
||||
[SPECIES_CHANSEY] = {{EVO_FRIENDSHIP, 0, SPECIES_BLISSEY}},
|
||||
[SPECIES_HORSEA] = {{EVO_LEVEL, 32, SPECIES_SEADRA}},
|
||||
[SPECIES_SEADRA] = {{EVO_TRADE_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA}},
|
||||
[SPECIES_GOLDEEN] = {{EVO_LEVEL, 33, SPECIES_SEAKING}},
|
||||
[SPECIES_STARYU] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_STARMIE}},
|
||||
[SPECIES_SCYTHER] = {{EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR}},
|
||||
[SPECIES_MAGIKARP] = {{EVO_LEVEL, 20, SPECIES_GYARADOS}},
|
||||
[SPECIES_EEVEE] = {{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_JOLTEON},
|
||||
{EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON},
|
||||
{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON},
|
||||
{EVO_FRIENDSHIP_DAY, 0, SPECIES_ESPEON},
|
||||
{EVO_FRIENDSHIP_NIGHT, 0, SPECIES_UMBREON}},
|
||||
[SPECIES_PORYGON] = {{EVO_TRADE_ITEM, ITEM_UP_GRADE, SPECIES_PORYGON2}},
|
||||
[SPECIES_OMANYTE] = {{EVO_LEVEL, 40, SPECIES_OMASTAR}},
|
||||
[SPECIES_KABUTO] = {{EVO_LEVEL, 40, SPECIES_KABUTOPS}},
|
||||
[SPECIES_DRATINI] = {{EVO_LEVEL, 30, SPECIES_DRAGONAIR}},
|
||||
[SPECIES_DRAGONAIR] = {{EVO_LEVEL, 55, SPECIES_DRAGONITE}},
|
||||
[SPECIES_CHIKORITA] = {{EVO_LEVEL, 16, SPECIES_BAYLEEF}},
|
||||
[SPECIES_BAYLEEF] = {{EVO_LEVEL, 32, SPECIES_MEGANIUM}},
|
||||
[SPECIES_CYNDAQUIL] = {{EVO_LEVEL, 14, SPECIES_QUILAVA}},
|
||||
[SPECIES_QUILAVA] = {{EVO_LEVEL, 36, SPECIES_TYPHLOSION}},
|
||||
[SPECIES_TOTODILE] = {{EVO_LEVEL, 18, SPECIES_CROCONAW}},
|
||||
[SPECIES_CROCONAW] = {{EVO_LEVEL, 30, SPECIES_FERALIGATR}},
|
||||
[SPECIES_SENTRET] = {{EVO_LEVEL, 15, SPECIES_FURRET}},
|
||||
[SPECIES_HOOTHOOT] = {{EVO_LEVEL, 20, SPECIES_NOCTOWL}},
|
||||
[SPECIES_LEDYBA] = {{EVO_LEVEL, 18, SPECIES_LEDIAN}},
|
||||
[SPECIES_SPINARAK] = {{EVO_LEVEL, 22, SPECIES_ARIADOS}},
|
||||
[SPECIES_CHINCHOU] = {{EVO_LEVEL, 27, SPECIES_LANTURN}},
|
||||
[SPECIES_PICHU] = {{EVO_FRIENDSHIP, 0, SPECIES_PIKACHU}},
|
||||
[SPECIES_CLEFFA] = {{EVO_FRIENDSHIP, 0, SPECIES_CLEFAIRY}},
|
||||
[SPECIES_IGGLYBUFF] = {{EVO_FRIENDSHIP, 0, SPECIES_JIGGLYPUFF}},
|
||||
[SPECIES_TOGEPI] = {{EVO_FRIENDSHIP, 0, SPECIES_TOGETIC}},
|
||||
[SPECIES_NATU] = {{EVO_LEVEL, 25, SPECIES_XATU}},
|
||||
[SPECIES_MAREEP] = {{EVO_LEVEL, 15, SPECIES_FLAAFFY}},
|
||||
[SPECIES_FLAAFFY] = {{EVO_LEVEL, 30, SPECIES_AMPHAROS}},
|
||||
[SPECIES_MARILL] = {{EVO_LEVEL, 18, SPECIES_AZUMARILL}},
|
||||
[SPECIES_HOPPIP] = {{EVO_LEVEL, 18, SPECIES_SKIPLOOM}},
|
||||
[SPECIES_SKIPLOOM] = {{EVO_LEVEL, 27, SPECIES_JUMPLUFF}},
|
||||
[SPECIES_SUNKERN] = {{EVO_ITEM, ITEM_SUN_STONE, SPECIES_SUNFLORA}},
|
||||
[SPECIES_WOOPER] = {{EVO_LEVEL, 20, SPECIES_QUAGSIRE}},
|
||||
[SPECIES_PINECO] = {{EVO_LEVEL, 31, SPECIES_FORRETRESS}},
|
||||
[SPECIES_SNUBBULL] = {{EVO_LEVEL, 23, SPECIES_GRANBULL}},
|
||||
[SPECIES_TEDDIURSA] = {{EVO_LEVEL, 30, SPECIES_URSARING}},
|
||||
[SPECIES_SLUGMA] = {{EVO_LEVEL, 38, SPECIES_MAGCARGO}},
|
||||
[SPECIES_SWINUB] = {{EVO_LEVEL, 33, SPECIES_PILOSWINE}},
|
||||
[SPECIES_REMORAID] = {{EVO_LEVEL, 25, SPECIES_OCTILLERY}},
|
||||
[SPECIES_HOUNDOUR] = {{EVO_LEVEL, 24, SPECIES_HOUNDOOM}},
|
||||
[SPECIES_PHANPY] = {{EVO_LEVEL, 25, SPECIES_DONPHAN}},
|
||||
[SPECIES_TYROGUE] = {{EVO_LEVEL_ATK_LT_DEF, 20, SPECIES_HITMONCHAN},
|
||||
{EVO_LEVEL_ATK_GT_DEF, 20, SPECIES_HITMONLEE},
|
||||
{EVO_LEVEL_ATK_EQ_DEF, 20, SPECIES_HITMONTOP}},
|
||||
[SPECIES_SMOOCHUM] = {{EVO_LEVEL, 30, SPECIES_JYNX}},
|
||||
[SPECIES_ELEKID] = {{EVO_LEVEL, 30, SPECIES_ELECTABUZZ}},
|
||||
[SPECIES_MAGBY] = {{EVO_LEVEL, 30, SPECIES_MAGMAR}},
|
||||
[SPECIES_LARVITAR] = {{EVO_LEVEL, 30, SPECIES_PUPITAR}},
|
||||
[SPECIES_PUPITAR] = {{EVO_LEVEL, 55, SPECIES_TYRANITAR}},
|
||||
[SPECIES_TREECKO] = {{EVO_LEVEL, 16, SPECIES_GROVYLE}},
|
||||
[SPECIES_GROVYLE] = {{EVO_LEVEL, 36, SPECIES_SCEPTILE}},
|
||||
[SPECIES_TORCHIC] = {{EVO_LEVEL, 16, SPECIES_COMBUSKEN}},
|
||||
[SPECIES_COMBUSKEN] = {{EVO_LEVEL, 36, SPECIES_BLAZIKEN}},
|
||||
[SPECIES_MUDKIP] = {{EVO_LEVEL, 16, SPECIES_MARSHTOMP}},
|
||||
[SPECIES_MARSHTOMP] = {{EVO_LEVEL, 36, SPECIES_SWAMPERT}},
|
||||
[SPECIES_POOCHYENA] = {{EVO_LEVEL, 18, SPECIES_MIGHTYENA}},
|
||||
[SPECIES_ZIGZAGOON] = {{EVO_LEVEL, 20, SPECIES_LINOONE}},
|
||||
[SPECIES_WURMPLE] = {{EVO_LEVEL_SILCOON, 7, SPECIES_SILCOON},
|
||||
{EVO_LEVEL_CASCOON, 7, SPECIES_CASCOON}},
|
||||
[SPECIES_SILCOON] = {{EVO_LEVEL, 10, SPECIES_BEAUTIFLY}},
|
||||
[SPECIES_CASCOON] = {{EVO_LEVEL, 10, SPECIES_DUSTOX}},
|
||||
[SPECIES_LOTAD] = {{EVO_LEVEL, 14, SPECIES_LOMBRE}},
|
||||
[SPECIES_LOMBRE] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_LUDICOLO}},
|
||||
[SPECIES_SEEDOT] = {{EVO_LEVEL, 14, SPECIES_NUZLEAF}},
|
||||
[SPECIES_NUZLEAF] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_SHIFTRY}},
|
||||
[SPECIES_NINCADA] = {{EVO_LEVEL_NINJASK, 20, SPECIES_NINJASK},
|
||||
{EVO_LEVEL_SHEDINJA, 20, SPECIES_SHEDINJA}},
|
||||
[SPECIES_TAILLOW] = {{EVO_LEVEL, 22, SPECIES_SWELLOW}},
|
||||
[SPECIES_SHROOMISH] = {{EVO_LEVEL, 23, SPECIES_BRELOOM}},
|
||||
[SPECIES_WINGULL] = {{EVO_LEVEL, 25, SPECIES_PELIPPER}},
|
||||
[SPECIES_SURSKIT] = {{EVO_LEVEL, 22, SPECIES_MASQUERAIN}},
|
||||
[SPECIES_WAILMER] = {{EVO_LEVEL, 40, SPECIES_WAILORD}},
|
||||
[SPECIES_SKITTY] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_DELCATTY}},
|
||||
[SPECIES_BALTOY] = {{EVO_LEVEL, 36, SPECIES_CLAYDOL}},
|
||||
[SPECIES_BARBOACH] = {{EVO_LEVEL, 30, SPECIES_WHISCASH}},
|
||||
[SPECIES_CORPHISH] = {{EVO_LEVEL, 30, SPECIES_CRAWDAUNT}},
|
||||
[SPECIES_FEEBAS] = {{EVO_BEAUTY, 170, SPECIES_MILOTIC}},
|
||||
[SPECIES_CARVANHA] = {{EVO_LEVEL, 30, SPECIES_SHARPEDO}},
|
||||
[SPECIES_TRAPINCH] = {{EVO_LEVEL, 35, SPECIES_VIBRAVA}},
|
||||
[SPECIES_VIBRAVA] = {{EVO_LEVEL, 45, SPECIES_FLYGON}},
|
||||
[SPECIES_MAKUHITA] = {{EVO_LEVEL, 24, SPECIES_HARIYAMA}},
|
||||
[SPECIES_ELECTRIKE] = {{EVO_LEVEL, 26, SPECIES_MANECTRIC}},
|
||||
[SPECIES_NUMEL] = {{EVO_LEVEL, 33, SPECIES_CAMERUPT}},
|
||||
[SPECIES_SPHEAL] = {{EVO_LEVEL, 32, SPECIES_SEALEO}},
|
||||
[SPECIES_SEALEO] = {{EVO_LEVEL, 44, SPECIES_WALREIN}},
|
||||
[SPECIES_CACNEA] = {{EVO_LEVEL, 32, SPECIES_CACTURNE}},
|
||||
[SPECIES_SNORUNT] = {{EVO_LEVEL, 42, SPECIES_GLALIE}},
|
||||
[SPECIES_AZURILL] = {{EVO_FRIENDSHIP, 0, SPECIES_MARILL}},
|
||||
[SPECIES_SPOINK] = {{EVO_LEVEL, 32, SPECIES_GRUMPIG}},
|
||||
[SPECIES_MEDITITE] = {{EVO_LEVEL, 37, SPECIES_MEDICHAM}},
|
||||
[SPECIES_SWABLU] = {{EVO_LEVEL, 35, SPECIES_ALTARIA}},
|
||||
[SPECIES_WYNAUT] = {{EVO_LEVEL, 15, SPECIES_WOBBUFFET}},
|
||||
[SPECIES_DUSKULL] = {{EVO_LEVEL, 37, SPECIES_DUSCLOPS}},
|
||||
[SPECIES_SLAKOTH] = {{EVO_LEVEL, 18, SPECIES_VIGOROTH}},
|
||||
[SPECIES_VIGOROTH] = {{EVO_LEVEL, 36, SPECIES_SLAKING}},
|
||||
[SPECIES_GULPIN] = {{EVO_LEVEL, 26, SPECIES_SWALOT}},
|
||||
[SPECIES_WHISMUR] = {{EVO_LEVEL, 20, SPECIES_LOUDRED}},
|
||||
[SPECIES_LOUDRED] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD}},
|
||||
[SPECIES_CLAMPERL] = {{EVO_TRADE_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL},
|
||||
{EVO_TRADE_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS}},
|
||||
[SPECIES_SHUPPET] = {{EVO_LEVEL, 37, SPECIES_BANETTE}},
|
||||
[SPECIES_ARON] = {{EVO_LEVEL, 32, SPECIES_LAIRON}},
|
||||
[SPECIES_LAIRON] = {{EVO_LEVEL, 42, SPECIES_AGGRON}},
|
||||
[SPECIES_LILEEP] = {{EVO_LEVEL, 40, SPECIES_CRADILY}},
|
||||
[SPECIES_ANORITH] = {{EVO_LEVEL, 40, SPECIES_ARMALDO}},
|
||||
[SPECIES_RALTS] = {{EVO_LEVEL, 20, SPECIES_KIRLIA}},
|
||||
[SPECIES_KIRLIA] = {{EVO_LEVEL, 30, SPECIES_GARDEVOIR}},
|
||||
[SPECIES_BAGON] = {{EVO_LEVEL, 30, SPECIES_SHELGON}},
|
||||
[SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE}},
|
||||
[SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG}},
|
||||
[SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS}},
|
||||
};
|
||||
@@ -0,0 +1,844 @@
|
||||
#define SQUARE(n)(n * n)
|
||||
#define CUBE(n)(n * n * n)
|
||||
|
||||
#define EXP_SLOW(n)((5 * CUBE(n)) / 4) // (5 * (n)^3) / 4
|
||||
#define EXP_FAST(n)((4 * CUBE(n)) / 5) // (4 * (n)^3) / 5
|
||||
#define EXP_MEDIUM_FAST(n)(CUBE(n)) // (n)^3
|
||||
#define EXP_MEDIUM_SLOW(n)((6 * CUBE(n)) / 5 - (15 * SQUARE(n)) + (100 * n) - 140) // (6 * (n)^3) / 5 - (15 * (n)^2) + (100 * n) - 140
|
||||
#define EXP_ERRATIC(n) \
|
||||
(n <= 50) ? ((100 - n) * CUBE(n) / 50) \
|
||||
:(n <= 68) ? ((150 - n) * CUBE(n) / 100) \
|
||||
:(n <= 98) ? (((1911 - 10 * n) / 3) * CUBE(n) / 500) \
|
||||
: ((160 - n) * CUBE(n) / 100)
|
||||
#define EXP_FLUCTUATING(n) \
|
||||
(n <= 15) ? (((n + 1) / 3 + 24) * CUBE(n) / 50) \
|
||||
:(n <= 36) ? ((n + 14) * CUBE(n) / 50) \
|
||||
: (((n / 2) + 32) * CUBE(n) / 50)
|
||||
|
||||
const u32 gExperienceTables[][MAX_MON_LEVEL + 1] =
|
||||
{
|
||||
{ // Medium Fast
|
||||
0, // 0
|
||||
1, // 1
|
||||
EXP_MEDIUM_FAST(2),
|
||||
EXP_MEDIUM_FAST(3),
|
||||
EXP_MEDIUM_FAST(4),
|
||||
EXP_MEDIUM_FAST(5),
|
||||
EXP_MEDIUM_FAST(6),
|
||||
EXP_MEDIUM_FAST(7),
|
||||
EXP_MEDIUM_FAST(8),
|
||||
EXP_MEDIUM_FAST(9),
|
||||
EXP_MEDIUM_FAST(10),
|
||||
EXP_MEDIUM_FAST(11),
|
||||
EXP_MEDIUM_FAST(12),
|
||||
EXP_MEDIUM_FAST(13),
|
||||
EXP_MEDIUM_FAST(14),
|
||||
EXP_MEDIUM_FAST(15),
|
||||
EXP_MEDIUM_FAST(16),
|
||||
EXP_MEDIUM_FAST(17),
|
||||
EXP_MEDIUM_FAST(18),
|
||||
EXP_MEDIUM_FAST(19),
|
||||
EXP_MEDIUM_FAST(20),
|
||||
EXP_MEDIUM_FAST(21),
|
||||
EXP_MEDIUM_FAST(22),
|
||||
EXP_MEDIUM_FAST(23),
|
||||
EXP_MEDIUM_FAST(24),
|
||||
EXP_MEDIUM_FAST(25),
|
||||
EXP_MEDIUM_FAST(26),
|
||||
EXP_MEDIUM_FAST(27),
|
||||
EXP_MEDIUM_FAST(28),
|
||||
EXP_MEDIUM_FAST(29),
|
||||
EXP_MEDIUM_FAST(30),
|
||||
EXP_MEDIUM_FAST(31),
|
||||
EXP_MEDIUM_FAST(32),
|
||||
EXP_MEDIUM_FAST(33),
|
||||
EXP_MEDIUM_FAST(34),
|
||||
EXP_MEDIUM_FAST(35),
|
||||
EXP_MEDIUM_FAST(36),
|
||||
EXP_MEDIUM_FAST(37),
|
||||
EXP_MEDIUM_FAST(38),
|
||||
EXP_MEDIUM_FAST(39),
|
||||
EXP_MEDIUM_FAST(40),
|
||||
EXP_MEDIUM_FAST(41),
|
||||
EXP_MEDIUM_FAST(42),
|
||||
EXP_MEDIUM_FAST(43),
|
||||
EXP_MEDIUM_FAST(44),
|
||||
EXP_MEDIUM_FAST(45),
|
||||
EXP_MEDIUM_FAST(46),
|
||||
EXP_MEDIUM_FAST(47),
|
||||
EXP_MEDIUM_FAST(48),
|
||||
EXP_MEDIUM_FAST(49),
|
||||
EXP_MEDIUM_FAST(50),
|
||||
EXP_MEDIUM_FAST(51),
|
||||
EXP_MEDIUM_FAST(52),
|
||||
EXP_MEDIUM_FAST(53),
|
||||
EXP_MEDIUM_FAST(54),
|
||||
EXP_MEDIUM_FAST(55),
|
||||
EXP_MEDIUM_FAST(56),
|
||||
EXP_MEDIUM_FAST(57),
|
||||
EXP_MEDIUM_FAST(58),
|
||||
EXP_MEDIUM_FAST(59),
|
||||
EXP_MEDIUM_FAST(60),
|
||||
EXP_MEDIUM_FAST(61),
|
||||
EXP_MEDIUM_FAST(62),
|
||||
EXP_MEDIUM_FAST(63),
|
||||
EXP_MEDIUM_FAST(64),
|
||||
EXP_MEDIUM_FAST(65),
|
||||
EXP_MEDIUM_FAST(66),
|
||||
EXP_MEDIUM_FAST(67),
|
||||
EXP_MEDIUM_FAST(68),
|
||||
EXP_MEDIUM_FAST(69),
|
||||
EXP_MEDIUM_FAST(70),
|
||||
EXP_MEDIUM_FAST(71),
|
||||
EXP_MEDIUM_FAST(72),
|
||||
EXP_MEDIUM_FAST(73),
|
||||
EXP_MEDIUM_FAST(74),
|
||||
EXP_MEDIUM_FAST(75),
|
||||
EXP_MEDIUM_FAST(76),
|
||||
EXP_MEDIUM_FAST(77),
|
||||
EXP_MEDIUM_FAST(78),
|
||||
EXP_MEDIUM_FAST(79),
|
||||
EXP_MEDIUM_FAST(80),
|
||||
EXP_MEDIUM_FAST(81),
|
||||
EXP_MEDIUM_FAST(82),
|
||||
EXP_MEDIUM_FAST(83),
|
||||
EXP_MEDIUM_FAST(84),
|
||||
EXP_MEDIUM_FAST(85),
|
||||
EXP_MEDIUM_FAST(86),
|
||||
EXP_MEDIUM_FAST(87),
|
||||
EXP_MEDIUM_FAST(88),
|
||||
EXP_MEDIUM_FAST(89),
|
||||
EXP_MEDIUM_FAST(90),
|
||||
EXP_MEDIUM_FAST(91),
|
||||
EXP_MEDIUM_FAST(92),
|
||||
EXP_MEDIUM_FAST(93),
|
||||
EXP_MEDIUM_FAST(94),
|
||||
EXP_MEDIUM_FAST(95),
|
||||
EXP_MEDIUM_FAST(96),
|
||||
EXP_MEDIUM_FAST(97),
|
||||
EXP_MEDIUM_FAST(98),
|
||||
EXP_MEDIUM_FAST(99),
|
||||
EXP_MEDIUM_FAST(100),
|
||||
},
|
||||
{ // Erratic
|
||||
0, // 0
|
||||
1, // 1
|
||||
EXP_ERRATIC(2),
|
||||
EXP_ERRATIC(3),
|
||||
EXP_ERRATIC(4),
|
||||
EXP_ERRATIC(5),
|
||||
EXP_ERRATIC(6),
|
||||
EXP_ERRATIC(7),
|
||||
EXP_ERRATIC(8),
|
||||
EXP_ERRATIC(9),
|
||||
EXP_ERRATIC(10),
|
||||
EXP_ERRATIC(11),
|
||||
EXP_ERRATIC(12),
|
||||
EXP_ERRATIC(13),
|
||||
EXP_ERRATIC(14),
|
||||
EXP_ERRATIC(15),
|
||||
EXP_ERRATIC(16),
|
||||
EXP_ERRATIC(17),
|
||||
EXP_ERRATIC(18),
|
||||
EXP_ERRATIC(19),
|
||||
EXP_ERRATIC(20),
|
||||
EXP_ERRATIC(21),
|
||||
EXP_ERRATIC(22),
|
||||
EXP_ERRATIC(23),
|
||||
EXP_ERRATIC(24),
|
||||
EXP_ERRATIC(25),
|
||||
EXP_ERRATIC(26),
|
||||
EXP_ERRATIC(27),
|
||||
EXP_ERRATIC(28),
|
||||
EXP_ERRATIC(29),
|
||||
EXP_ERRATIC(30),
|
||||
EXP_ERRATIC(31),
|
||||
EXP_ERRATIC(32),
|
||||
EXP_ERRATIC(33),
|
||||
EXP_ERRATIC(34),
|
||||
EXP_ERRATIC(35),
|
||||
EXP_ERRATIC(36),
|
||||
EXP_ERRATIC(37),
|
||||
EXP_ERRATIC(38),
|
||||
EXP_ERRATIC(39),
|
||||
EXP_ERRATIC(40),
|
||||
EXP_ERRATIC(41),
|
||||
EXP_ERRATIC(42),
|
||||
EXP_ERRATIC(43),
|
||||
EXP_ERRATIC(44),
|
||||
EXP_ERRATIC(45),
|
||||
EXP_ERRATIC(46),
|
||||
EXP_ERRATIC(47),
|
||||
EXP_ERRATIC(48),
|
||||
EXP_ERRATIC(49),
|
||||
EXP_ERRATIC(50),
|
||||
EXP_ERRATIC(51),
|
||||
EXP_ERRATIC(52),
|
||||
EXP_ERRATIC(53),
|
||||
EXP_ERRATIC(54),
|
||||
EXP_ERRATIC(55),
|
||||
EXP_ERRATIC(56),
|
||||
EXP_ERRATIC(57),
|
||||
EXP_ERRATIC(58),
|
||||
EXP_ERRATIC(59),
|
||||
EXP_ERRATIC(60),
|
||||
EXP_ERRATIC(61),
|
||||
EXP_ERRATIC(62),
|
||||
EXP_ERRATIC(63),
|
||||
EXP_ERRATIC(64),
|
||||
EXP_ERRATIC(65),
|
||||
EXP_ERRATIC(66),
|
||||
EXP_ERRATIC(67),
|
||||
EXP_ERRATIC(68),
|
||||
EXP_ERRATIC(69),
|
||||
EXP_ERRATIC(70),
|
||||
EXP_ERRATIC(71),
|
||||
EXP_ERRATIC(72),
|
||||
EXP_ERRATIC(73),
|
||||
EXP_ERRATIC(74),
|
||||
EXP_ERRATIC(75),
|
||||
EXP_ERRATIC(76),
|
||||
EXP_ERRATIC(77),
|
||||
EXP_ERRATIC(78),
|
||||
EXP_ERRATIC(79),
|
||||
EXP_ERRATIC(80),
|
||||
EXP_ERRATIC(81),
|
||||
EXP_ERRATIC(82),
|
||||
EXP_ERRATIC(83),
|
||||
EXP_ERRATIC(84),
|
||||
EXP_ERRATIC(85),
|
||||
EXP_ERRATIC(86),
|
||||
EXP_ERRATIC(87),
|
||||
EXP_ERRATIC(88),
|
||||
EXP_ERRATIC(89),
|
||||
EXP_ERRATIC(90),
|
||||
EXP_ERRATIC(91),
|
||||
EXP_ERRATIC(92),
|
||||
EXP_ERRATIC(93),
|
||||
EXP_ERRATIC(94),
|
||||
EXP_ERRATIC(95),
|
||||
EXP_ERRATIC(96),
|
||||
EXP_ERRATIC(97),
|
||||
EXP_ERRATIC(98),
|
||||
EXP_ERRATIC(99),
|
||||
EXP_ERRATIC(100),
|
||||
},
|
||||
{ // Fluctuating
|
||||
0, // 0
|
||||
1, // 1
|
||||
EXP_FLUCTUATING(2),
|
||||
EXP_FLUCTUATING(3),
|
||||
EXP_FLUCTUATING(4),
|
||||
EXP_FLUCTUATING(5),
|
||||
EXP_FLUCTUATING(6),
|
||||
EXP_FLUCTUATING(7),
|
||||
EXP_FLUCTUATING(8),
|
||||
EXP_FLUCTUATING(9),
|
||||
EXP_FLUCTUATING(10),
|
||||
EXP_FLUCTUATING(11),
|
||||
EXP_FLUCTUATING(12),
|
||||
EXP_FLUCTUATING(13),
|
||||
EXP_FLUCTUATING(14),
|
||||
EXP_FLUCTUATING(15),
|
||||
EXP_FLUCTUATING(16),
|
||||
EXP_FLUCTUATING(17),
|
||||
EXP_FLUCTUATING(18),
|
||||
EXP_FLUCTUATING(19),
|
||||
EXP_FLUCTUATING(20),
|
||||
EXP_FLUCTUATING(21),
|
||||
EXP_FLUCTUATING(22),
|
||||
EXP_FLUCTUATING(23),
|
||||
EXP_FLUCTUATING(24),
|
||||
EXP_FLUCTUATING(25),
|
||||
EXP_FLUCTUATING(26),
|
||||
EXP_FLUCTUATING(27),
|
||||
EXP_FLUCTUATING(28),
|
||||
EXP_FLUCTUATING(29),
|
||||
EXP_FLUCTUATING(30),
|
||||
EXP_FLUCTUATING(31),
|
||||
EXP_FLUCTUATING(32),
|
||||
EXP_FLUCTUATING(33),
|
||||
EXP_FLUCTUATING(34),
|
||||
EXP_FLUCTUATING(35),
|
||||
EXP_FLUCTUATING(36),
|
||||
EXP_FLUCTUATING(37),
|
||||
EXP_FLUCTUATING(38),
|
||||
EXP_FLUCTUATING(39),
|
||||
EXP_FLUCTUATING(40),
|
||||
EXP_FLUCTUATING(41),
|
||||
EXP_FLUCTUATING(42),
|
||||
EXP_FLUCTUATING(43),
|
||||
EXP_FLUCTUATING(44),
|
||||
EXP_FLUCTUATING(45),
|
||||
EXP_FLUCTUATING(46),
|
||||
EXP_FLUCTUATING(47),
|
||||
EXP_FLUCTUATING(48),
|
||||
EXP_FLUCTUATING(49),
|
||||
EXP_FLUCTUATING(50),
|
||||
EXP_FLUCTUATING(51),
|
||||
EXP_FLUCTUATING(52),
|
||||
EXP_FLUCTUATING(53),
|
||||
EXP_FLUCTUATING(54),
|
||||
EXP_FLUCTUATING(55),
|
||||
EXP_FLUCTUATING(56),
|
||||
EXP_FLUCTUATING(57),
|
||||
EXP_FLUCTUATING(58),
|
||||
EXP_FLUCTUATING(59),
|
||||
EXP_FLUCTUATING(60),
|
||||
EXP_FLUCTUATING(61),
|
||||
EXP_FLUCTUATING(62),
|
||||
EXP_FLUCTUATING(63),
|
||||
EXP_FLUCTUATING(64),
|
||||
EXP_FLUCTUATING(65),
|
||||
EXP_FLUCTUATING(66),
|
||||
EXP_FLUCTUATING(67),
|
||||
EXP_FLUCTUATING(68),
|
||||
EXP_FLUCTUATING(69),
|
||||
EXP_FLUCTUATING(70),
|
||||
EXP_FLUCTUATING(71),
|
||||
EXP_FLUCTUATING(72),
|
||||
EXP_FLUCTUATING(73),
|
||||
EXP_FLUCTUATING(74),
|
||||
EXP_FLUCTUATING(75),
|
||||
EXP_FLUCTUATING(76),
|
||||
EXP_FLUCTUATING(77),
|
||||
EXP_FLUCTUATING(78),
|
||||
EXP_FLUCTUATING(79),
|
||||
EXP_FLUCTUATING(80),
|
||||
EXP_FLUCTUATING(81),
|
||||
EXP_FLUCTUATING(82),
|
||||
EXP_FLUCTUATING(83),
|
||||
EXP_FLUCTUATING(84),
|
||||
EXP_FLUCTUATING(85),
|
||||
EXP_FLUCTUATING(86),
|
||||
EXP_FLUCTUATING(87),
|
||||
EXP_FLUCTUATING(88),
|
||||
EXP_FLUCTUATING(89),
|
||||
EXP_FLUCTUATING(90),
|
||||
EXP_FLUCTUATING(91),
|
||||
EXP_FLUCTUATING(92),
|
||||
EXP_FLUCTUATING(93),
|
||||
EXP_FLUCTUATING(94),
|
||||
EXP_FLUCTUATING(95),
|
||||
EXP_FLUCTUATING(96),
|
||||
EXP_FLUCTUATING(97),
|
||||
EXP_FLUCTUATING(98),
|
||||
EXP_FLUCTUATING(99),
|
||||
EXP_FLUCTUATING(100),
|
||||
},
|
||||
{ // Medium Slow
|
||||
0, // 0
|
||||
1, // 1
|
||||
EXP_MEDIUM_SLOW(2),
|
||||
EXP_MEDIUM_SLOW(3),
|
||||
EXP_MEDIUM_SLOW(4),
|
||||
EXP_MEDIUM_SLOW(5),
|
||||
EXP_MEDIUM_SLOW(6),
|
||||
EXP_MEDIUM_SLOW(7),
|
||||
EXP_MEDIUM_SLOW(8),
|
||||
EXP_MEDIUM_SLOW(9),
|
||||
EXP_MEDIUM_SLOW(10),
|
||||
EXP_MEDIUM_SLOW(11),
|
||||
EXP_MEDIUM_SLOW(12),
|
||||
EXP_MEDIUM_SLOW(13),
|
||||
EXP_MEDIUM_SLOW(14),
|
||||
EXP_MEDIUM_SLOW(15),
|
||||
EXP_MEDIUM_SLOW(16),
|
||||
EXP_MEDIUM_SLOW(17),
|
||||
EXP_MEDIUM_SLOW(18),
|
||||
EXP_MEDIUM_SLOW(19),
|
||||
EXP_MEDIUM_SLOW(20),
|
||||
EXP_MEDIUM_SLOW(21),
|
||||
EXP_MEDIUM_SLOW(22),
|
||||
EXP_MEDIUM_SLOW(23),
|
||||
EXP_MEDIUM_SLOW(24),
|
||||
EXP_MEDIUM_SLOW(25),
|
||||
EXP_MEDIUM_SLOW(26),
|
||||
EXP_MEDIUM_SLOW(27),
|
||||
EXP_MEDIUM_SLOW(28),
|
||||
EXP_MEDIUM_SLOW(29),
|
||||
EXP_MEDIUM_SLOW(30),
|
||||
EXP_MEDIUM_SLOW(31),
|
||||
EXP_MEDIUM_SLOW(32),
|
||||
EXP_MEDIUM_SLOW(33),
|
||||
EXP_MEDIUM_SLOW(34),
|
||||
EXP_MEDIUM_SLOW(35),
|
||||
EXP_MEDIUM_SLOW(36),
|
||||
EXP_MEDIUM_SLOW(37),
|
||||
EXP_MEDIUM_SLOW(38),
|
||||
EXP_MEDIUM_SLOW(39),
|
||||
EXP_MEDIUM_SLOW(40),
|
||||
EXP_MEDIUM_SLOW(41),
|
||||
EXP_MEDIUM_SLOW(42),
|
||||
EXP_MEDIUM_SLOW(43),
|
||||
EXP_MEDIUM_SLOW(44),
|
||||
EXP_MEDIUM_SLOW(45),
|
||||
EXP_MEDIUM_SLOW(46),
|
||||
EXP_MEDIUM_SLOW(47),
|
||||
EXP_MEDIUM_SLOW(48),
|
||||
EXP_MEDIUM_SLOW(49),
|
||||
EXP_MEDIUM_SLOW(50),
|
||||
EXP_MEDIUM_SLOW(51),
|
||||
EXP_MEDIUM_SLOW(52),
|
||||
EXP_MEDIUM_SLOW(53),
|
||||
EXP_MEDIUM_SLOW(54),
|
||||
EXP_MEDIUM_SLOW(55),
|
||||
EXP_MEDIUM_SLOW(56),
|
||||
EXP_MEDIUM_SLOW(57),
|
||||
EXP_MEDIUM_SLOW(58),
|
||||
EXP_MEDIUM_SLOW(59),
|
||||
EXP_MEDIUM_SLOW(60),
|
||||
EXP_MEDIUM_SLOW(61),
|
||||
EXP_MEDIUM_SLOW(62),
|
||||
EXP_MEDIUM_SLOW(63),
|
||||
EXP_MEDIUM_SLOW(64),
|
||||
EXP_MEDIUM_SLOW(65),
|
||||
EXP_MEDIUM_SLOW(66),
|
||||
EXP_MEDIUM_SLOW(67),
|
||||
EXP_MEDIUM_SLOW(68),
|
||||
EXP_MEDIUM_SLOW(69),
|
||||
EXP_MEDIUM_SLOW(70),
|
||||
EXP_MEDIUM_SLOW(71),
|
||||
EXP_MEDIUM_SLOW(72),
|
||||
EXP_MEDIUM_SLOW(73),
|
||||
EXP_MEDIUM_SLOW(74),
|
||||
EXP_MEDIUM_SLOW(75),
|
||||
EXP_MEDIUM_SLOW(76),
|
||||
EXP_MEDIUM_SLOW(77),
|
||||
EXP_MEDIUM_SLOW(78),
|
||||
EXP_MEDIUM_SLOW(79),
|
||||
EXP_MEDIUM_SLOW(80),
|
||||
EXP_MEDIUM_SLOW(81),
|
||||
EXP_MEDIUM_SLOW(82),
|
||||
EXP_MEDIUM_SLOW(83),
|
||||
EXP_MEDIUM_SLOW(84),
|
||||
EXP_MEDIUM_SLOW(85),
|
||||
EXP_MEDIUM_SLOW(86),
|
||||
EXP_MEDIUM_SLOW(87),
|
||||
EXP_MEDIUM_SLOW(88),
|
||||
EXP_MEDIUM_SLOW(89),
|
||||
EXP_MEDIUM_SLOW(90),
|
||||
EXP_MEDIUM_SLOW(91),
|
||||
EXP_MEDIUM_SLOW(92),
|
||||
EXP_MEDIUM_SLOW(93),
|
||||
EXP_MEDIUM_SLOW(94),
|
||||
EXP_MEDIUM_SLOW(95),
|
||||
EXP_MEDIUM_SLOW(96),
|
||||
EXP_MEDIUM_SLOW(97),
|
||||
EXP_MEDIUM_SLOW(98),
|
||||
EXP_MEDIUM_SLOW(99),
|
||||
EXP_MEDIUM_SLOW(100),
|
||||
},
|
||||
{ // Fast
|
||||
0, // 0
|
||||
1, // 1
|
||||
EXP_FAST(2),
|
||||
EXP_FAST(3),
|
||||
EXP_FAST(4),
|
||||
EXP_FAST(5),
|
||||
EXP_FAST(6),
|
||||
EXP_FAST(7),
|
||||
EXP_FAST(8),
|
||||
EXP_FAST(9),
|
||||
EXP_FAST(10),
|
||||
EXP_FAST(11),
|
||||
EXP_FAST(12),
|
||||
EXP_FAST(13),
|
||||
EXP_FAST(14),
|
||||
EXP_FAST(15),
|
||||
EXP_FAST(16),
|
||||
EXP_FAST(17),
|
||||
EXP_FAST(18),
|
||||
EXP_FAST(19),
|
||||
EXP_FAST(20),
|
||||
EXP_FAST(21),
|
||||
EXP_FAST(22),
|
||||
EXP_FAST(23),
|
||||
EXP_FAST(24),
|
||||
EXP_FAST(25),
|
||||
EXP_FAST(26),
|
||||
EXP_FAST(27),
|
||||
EXP_FAST(28),
|
||||
EXP_FAST(29),
|
||||
EXP_FAST(30),
|
||||
EXP_FAST(31),
|
||||
EXP_FAST(32),
|
||||
EXP_FAST(33),
|
||||
EXP_FAST(34),
|
||||
EXP_FAST(35),
|
||||
EXP_FAST(36),
|
||||
EXP_FAST(37),
|
||||
EXP_FAST(38),
|
||||
EXP_FAST(39),
|
||||
EXP_FAST(40),
|
||||
EXP_FAST(41),
|
||||
EXP_FAST(42),
|
||||
EXP_FAST(43),
|
||||
EXP_FAST(44),
|
||||
EXP_FAST(45),
|
||||
EXP_FAST(46),
|
||||
EXP_FAST(47),
|
||||
EXP_FAST(48),
|
||||
EXP_FAST(49),
|
||||
EXP_FAST(50),
|
||||
EXP_FAST(51),
|
||||
EXP_FAST(52),
|
||||
EXP_FAST(53),
|
||||
EXP_FAST(54),
|
||||
EXP_FAST(55),
|
||||
EXP_FAST(56),
|
||||
EXP_FAST(57),
|
||||
EXP_FAST(58),
|
||||
EXP_FAST(59),
|
||||
EXP_FAST(60),
|
||||
EXP_FAST(61),
|
||||
EXP_FAST(62),
|
||||
EXP_FAST(63),
|
||||
EXP_FAST(64),
|
||||
EXP_FAST(65),
|
||||
EXP_FAST(66),
|
||||
EXP_FAST(67),
|
||||
EXP_FAST(68),
|
||||
EXP_FAST(69),
|
||||
EXP_FAST(70),
|
||||
EXP_FAST(71),
|
||||
EXP_FAST(72),
|
||||
EXP_FAST(73),
|
||||
EXP_FAST(74),
|
||||
EXP_FAST(75),
|
||||
EXP_FAST(76),
|
||||
EXP_FAST(77),
|
||||
EXP_FAST(78),
|
||||
EXP_FAST(79),
|
||||
EXP_FAST(80),
|
||||
EXP_FAST(81),
|
||||
EXP_FAST(82),
|
||||
EXP_FAST(83),
|
||||
EXP_FAST(84),
|
||||
EXP_FAST(85),
|
||||
EXP_FAST(86),
|
||||
EXP_FAST(87),
|
||||
EXP_FAST(88),
|
||||
EXP_FAST(89),
|
||||
EXP_FAST(90),
|
||||
EXP_FAST(91),
|
||||
EXP_FAST(92),
|
||||
EXP_FAST(93),
|
||||
EXP_FAST(94),
|
||||
EXP_FAST(95),
|
||||
EXP_FAST(96),
|
||||
EXP_FAST(97),
|
||||
EXP_FAST(98),
|
||||
EXP_FAST(99),
|
||||
EXP_FAST(100),
|
||||
},
|
||||
{ // Slow
|
||||
0, // 0
|
||||
1, // 1
|
||||
EXP_SLOW(2),
|
||||
EXP_SLOW(3),
|
||||
EXP_SLOW(4),
|
||||
EXP_SLOW(5),
|
||||
EXP_SLOW(6),
|
||||
EXP_SLOW(7),
|
||||
EXP_SLOW(8),
|
||||
EXP_SLOW(9),
|
||||
EXP_SLOW(10),
|
||||
EXP_SLOW(11),
|
||||
EXP_SLOW(12),
|
||||
EXP_SLOW(13),
|
||||
EXP_SLOW(14),
|
||||
EXP_SLOW(15),
|
||||
EXP_SLOW(16),
|
||||
EXP_SLOW(17),
|
||||
EXP_SLOW(18),
|
||||
EXP_SLOW(19),
|
||||
EXP_SLOW(20),
|
||||
EXP_SLOW(21),
|
||||
EXP_SLOW(22),
|
||||
EXP_SLOW(23),
|
||||
EXP_SLOW(24),
|
||||
EXP_SLOW(25),
|
||||
EXP_SLOW(26),
|
||||
EXP_SLOW(27),
|
||||
EXP_SLOW(28),
|
||||
EXP_SLOW(29),
|
||||
EXP_SLOW(30),
|
||||
EXP_SLOW(31),
|
||||
EXP_SLOW(32),
|
||||
EXP_SLOW(33),
|
||||
EXP_SLOW(34),
|
||||
EXP_SLOW(35),
|
||||
EXP_SLOW(36),
|
||||
EXP_SLOW(37),
|
||||
EXP_SLOW(38),
|
||||
EXP_SLOW(39),
|
||||
EXP_SLOW(40),
|
||||
EXP_SLOW(41),
|
||||
EXP_SLOW(42),
|
||||
EXP_SLOW(43),
|
||||
EXP_SLOW(44),
|
||||
EXP_SLOW(45),
|
||||
EXP_SLOW(46),
|
||||
EXP_SLOW(47),
|
||||
EXP_SLOW(48),
|
||||
EXP_SLOW(49),
|
||||
EXP_SLOW(50),
|
||||
EXP_SLOW(51),
|
||||
EXP_SLOW(52),
|
||||
EXP_SLOW(53),
|
||||
EXP_SLOW(54),
|
||||
EXP_SLOW(55),
|
||||
EXP_SLOW(56),
|
||||
EXP_SLOW(57),
|
||||
EXP_SLOW(58),
|
||||
EXP_SLOW(59),
|
||||
EXP_SLOW(60),
|
||||
EXP_SLOW(61),
|
||||
EXP_SLOW(62),
|
||||
EXP_SLOW(63),
|
||||
EXP_SLOW(64),
|
||||
EXP_SLOW(65),
|
||||
EXP_SLOW(66),
|
||||
EXP_SLOW(67),
|
||||
EXP_SLOW(68),
|
||||
EXP_SLOW(69),
|
||||
EXP_SLOW(70),
|
||||
EXP_SLOW(71),
|
||||
EXP_SLOW(72),
|
||||
EXP_SLOW(73),
|
||||
EXP_SLOW(74),
|
||||
EXP_SLOW(75),
|
||||
EXP_SLOW(76),
|
||||
EXP_SLOW(77),
|
||||
EXP_SLOW(78),
|
||||
EXP_SLOW(79),
|
||||
EXP_SLOW(80),
|
||||
EXP_SLOW(81),
|
||||
EXP_SLOW(82),
|
||||
EXP_SLOW(83),
|
||||
EXP_SLOW(84),
|
||||
EXP_SLOW(85),
|
||||
EXP_SLOW(86),
|
||||
EXP_SLOW(87),
|
||||
EXP_SLOW(88),
|
||||
EXP_SLOW(89),
|
||||
EXP_SLOW(90),
|
||||
EXP_SLOW(91),
|
||||
EXP_SLOW(92),
|
||||
EXP_SLOW(93),
|
||||
EXP_SLOW(94),
|
||||
EXP_SLOW(95),
|
||||
EXP_SLOW(96),
|
||||
EXP_SLOW(97),
|
||||
EXP_SLOW(98),
|
||||
EXP_SLOW(99),
|
||||
EXP_SLOW(100),
|
||||
},
|
||||
{ // Medium Fast copy 2 (unused? to-do: investigate)
|
||||
0, // 0
|
||||
1, // 1
|
||||
EXP_MEDIUM_FAST(2),
|
||||
EXP_MEDIUM_FAST(3),
|
||||
EXP_MEDIUM_FAST(4),
|
||||
EXP_MEDIUM_FAST(5),
|
||||
EXP_MEDIUM_FAST(6),
|
||||
EXP_MEDIUM_FAST(7),
|
||||
EXP_MEDIUM_FAST(8),
|
||||
EXP_MEDIUM_FAST(9),
|
||||
EXP_MEDIUM_FAST(10),
|
||||
EXP_MEDIUM_FAST(11),
|
||||
EXP_MEDIUM_FAST(12),
|
||||
EXP_MEDIUM_FAST(13),
|
||||
EXP_MEDIUM_FAST(14),
|
||||
EXP_MEDIUM_FAST(15),
|
||||
EXP_MEDIUM_FAST(16),
|
||||
EXP_MEDIUM_FAST(17),
|
||||
EXP_MEDIUM_FAST(18),
|
||||
EXP_MEDIUM_FAST(19),
|
||||
EXP_MEDIUM_FAST(20),
|
||||
EXP_MEDIUM_FAST(21),
|
||||
EXP_MEDIUM_FAST(22),
|
||||
EXP_MEDIUM_FAST(23),
|
||||
EXP_MEDIUM_FAST(24),
|
||||
EXP_MEDIUM_FAST(25),
|
||||
EXP_MEDIUM_FAST(26),
|
||||
EXP_MEDIUM_FAST(27),
|
||||
EXP_MEDIUM_FAST(28),
|
||||
EXP_MEDIUM_FAST(29),
|
||||
EXP_MEDIUM_FAST(30),
|
||||
EXP_MEDIUM_FAST(31),
|
||||
EXP_MEDIUM_FAST(32),
|
||||
EXP_MEDIUM_FAST(33),
|
||||
EXP_MEDIUM_FAST(34),
|
||||
EXP_MEDIUM_FAST(35),
|
||||
EXP_MEDIUM_FAST(36),
|
||||
EXP_MEDIUM_FAST(37),
|
||||
EXP_MEDIUM_FAST(38),
|
||||
EXP_MEDIUM_FAST(39),
|
||||
EXP_MEDIUM_FAST(40),
|
||||
EXP_MEDIUM_FAST(41),
|
||||
EXP_MEDIUM_FAST(42),
|
||||
EXP_MEDIUM_FAST(43),
|
||||
EXP_MEDIUM_FAST(44),
|
||||
EXP_MEDIUM_FAST(45),
|
||||
EXP_MEDIUM_FAST(46),
|
||||
EXP_MEDIUM_FAST(47),
|
||||
EXP_MEDIUM_FAST(48),
|
||||
EXP_MEDIUM_FAST(49),
|
||||
EXP_MEDIUM_FAST(50),
|
||||
EXP_MEDIUM_FAST(51),
|
||||
EXP_MEDIUM_FAST(52),
|
||||
EXP_MEDIUM_FAST(53),
|
||||
EXP_MEDIUM_FAST(54),
|
||||
EXP_MEDIUM_FAST(55),
|
||||
EXP_MEDIUM_FAST(56),
|
||||
EXP_MEDIUM_FAST(57),
|
||||
EXP_MEDIUM_FAST(58),
|
||||
EXP_MEDIUM_FAST(59),
|
||||
EXP_MEDIUM_FAST(60),
|
||||
EXP_MEDIUM_FAST(61),
|
||||
EXP_MEDIUM_FAST(62),
|
||||
EXP_MEDIUM_FAST(63),
|
||||
EXP_MEDIUM_FAST(64),
|
||||
EXP_MEDIUM_FAST(65),
|
||||
EXP_MEDIUM_FAST(66),
|
||||
EXP_MEDIUM_FAST(67),
|
||||
EXP_MEDIUM_FAST(68),
|
||||
EXP_MEDIUM_FAST(69),
|
||||
EXP_MEDIUM_FAST(70),
|
||||
EXP_MEDIUM_FAST(71),
|
||||
EXP_MEDIUM_FAST(72),
|
||||
EXP_MEDIUM_FAST(73),
|
||||
EXP_MEDIUM_FAST(74),
|
||||
EXP_MEDIUM_FAST(75),
|
||||
EXP_MEDIUM_FAST(76),
|
||||
EXP_MEDIUM_FAST(77),
|
||||
EXP_MEDIUM_FAST(78),
|
||||
EXP_MEDIUM_FAST(79),
|
||||
EXP_MEDIUM_FAST(80),
|
||||
EXP_MEDIUM_FAST(81),
|
||||
EXP_MEDIUM_FAST(82),
|
||||
EXP_MEDIUM_FAST(83),
|
||||
EXP_MEDIUM_FAST(84),
|
||||
EXP_MEDIUM_FAST(85),
|
||||
EXP_MEDIUM_FAST(86),
|
||||
EXP_MEDIUM_FAST(87),
|
||||
EXP_MEDIUM_FAST(88),
|
||||
EXP_MEDIUM_FAST(89),
|
||||
EXP_MEDIUM_FAST(90),
|
||||
EXP_MEDIUM_FAST(91),
|
||||
EXP_MEDIUM_FAST(92),
|
||||
EXP_MEDIUM_FAST(93),
|
||||
EXP_MEDIUM_FAST(94),
|
||||
EXP_MEDIUM_FAST(95),
|
||||
EXP_MEDIUM_FAST(96),
|
||||
EXP_MEDIUM_FAST(97),
|
||||
EXP_MEDIUM_FAST(98),
|
||||
EXP_MEDIUM_FAST(99),
|
||||
EXP_MEDIUM_FAST(100),
|
||||
},
|
||||
{ // Medium Fast copy 3 (unused? to-do: investigate)
|
||||
0, // 0
|
||||
1, // 1
|
||||
EXP_MEDIUM_FAST(2),
|
||||
EXP_MEDIUM_FAST(3),
|
||||
EXP_MEDIUM_FAST(4),
|
||||
EXP_MEDIUM_FAST(5),
|
||||
EXP_MEDIUM_FAST(6),
|
||||
EXP_MEDIUM_FAST(7),
|
||||
EXP_MEDIUM_FAST(8),
|
||||
EXP_MEDIUM_FAST(9),
|
||||
EXP_MEDIUM_FAST(10),
|
||||
EXP_MEDIUM_FAST(11),
|
||||
EXP_MEDIUM_FAST(12),
|
||||
EXP_MEDIUM_FAST(13),
|
||||
EXP_MEDIUM_FAST(14),
|
||||
EXP_MEDIUM_FAST(15),
|
||||
EXP_MEDIUM_FAST(16),
|
||||
EXP_MEDIUM_FAST(17),
|
||||
EXP_MEDIUM_FAST(18),
|
||||
EXP_MEDIUM_FAST(19),
|
||||
EXP_MEDIUM_FAST(20),
|
||||
EXP_MEDIUM_FAST(21),
|
||||
EXP_MEDIUM_FAST(22),
|
||||
EXP_MEDIUM_FAST(23),
|
||||
EXP_MEDIUM_FAST(24),
|
||||
EXP_MEDIUM_FAST(25),
|
||||
EXP_MEDIUM_FAST(26),
|
||||
EXP_MEDIUM_FAST(27),
|
||||
EXP_MEDIUM_FAST(28),
|
||||
EXP_MEDIUM_FAST(29),
|
||||
EXP_MEDIUM_FAST(30),
|
||||
EXP_MEDIUM_FAST(31),
|
||||
EXP_MEDIUM_FAST(32),
|
||||
EXP_MEDIUM_FAST(33),
|
||||
EXP_MEDIUM_FAST(34),
|
||||
EXP_MEDIUM_FAST(35),
|
||||
EXP_MEDIUM_FAST(36),
|
||||
EXP_MEDIUM_FAST(37),
|
||||
EXP_MEDIUM_FAST(38),
|
||||
EXP_MEDIUM_FAST(39),
|
||||
EXP_MEDIUM_FAST(40),
|
||||
EXP_MEDIUM_FAST(41),
|
||||
EXP_MEDIUM_FAST(42),
|
||||
EXP_MEDIUM_FAST(43),
|
||||
EXP_MEDIUM_FAST(44),
|
||||
EXP_MEDIUM_FAST(45),
|
||||
EXP_MEDIUM_FAST(46),
|
||||
EXP_MEDIUM_FAST(47),
|
||||
EXP_MEDIUM_FAST(48),
|
||||
EXP_MEDIUM_FAST(49),
|
||||
EXP_MEDIUM_FAST(50),
|
||||
EXP_MEDIUM_FAST(51),
|
||||
EXP_MEDIUM_FAST(52),
|
||||
EXP_MEDIUM_FAST(53),
|
||||
EXP_MEDIUM_FAST(54),
|
||||
EXP_MEDIUM_FAST(55),
|
||||
EXP_MEDIUM_FAST(56),
|
||||
EXP_MEDIUM_FAST(57),
|
||||
EXP_MEDIUM_FAST(58),
|
||||
EXP_MEDIUM_FAST(59),
|
||||
EXP_MEDIUM_FAST(60),
|
||||
EXP_MEDIUM_FAST(61),
|
||||
EXP_MEDIUM_FAST(62),
|
||||
EXP_MEDIUM_FAST(63),
|
||||
EXP_MEDIUM_FAST(64),
|
||||
EXP_MEDIUM_FAST(65),
|
||||
EXP_MEDIUM_FAST(66),
|
||||
EXP_MEDIUM_FAST(67),
|
||||
EXP_MEDIUM_FAST(68),
|
||||
EXP_MEDIUM_FAST(69),
|
||||
EXP_MEDIUM_FAST(70),
|
||||
EXP_MEDIUM_FAST(71),
|
||||
EXP_MEDIUM_FAST(72),
|
||||
EXP_MEDIUM_FAST(73),
|
||||
EXP_MEDIUM_FAST(74),
|
||||
EXP_MEDIUM_FAST(75),
|
||||
EXP_MEDIUM_FAST(76),
|
||||
EXP_MEDIUM_FAST(77),
|
||||
EXP_MEDIUM_FAST(78),
|
||||
EXP_MEDIUM_FAST(79),
|
||||
EXP_MEDIUM_FAST(80),
|
||||
EXP_MEDIUM_FAST(81),
|
||||
EXP_MEDIUM_FAST(82),
|
||||
EXP_MEDIUM_FAST(83),
|
||||
EXP_MEDIUM_FAST(84),
|
||||
EXP_MEDIUM_FAST(85),
|
||||
EXP_MEDIUM_FAST(86),
|
||||
EXP_MEDIUM_FAST(87),
|
||||
EXP_MEDIUM_FAST(88),
|
||||
EXP_MEDIUM_FAST(89),
|
||||
EXP_MEDIUM_FAST(90),
|
||||
EXP_MEDIUM_FAST(91),
|
||||
EXP_MEDIUM_FAST(92),
|
||||
EXP_MEDIUM_FAST(93),
|
||||
EXP_MEDIUM_FAST(94),
|
||||
EXP_MEDIUM_FAST(95),
|
||||
EXP_MEDIUM_FAST(96),
|
||||
EXP_MEDIUM_FAST(97),
|
||||
EXP_MEDIUM_FAST(98),
|
||||
EXP_MEDIUM_FAST(99),
|
||||
EXP_MEDIUM_FAST(100),
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,420 @@
|
||||
static const u8 sItemEffect_Potion[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = 20,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Antidote[6] = {
|
||||
[3] = ITEM3_POISON,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_BurnHeal[6] = {
|
||||
[3] = ITEM3_BURN,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_IceHeal[6] = {
|
||||
[3] = ITEM3_FREEZE,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Awakening[6] = {
|
||||
[3] = ITEM3_SLEEP,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_ParalyzeHeal[6] = {
|
||||
[3] = ITEM3_PARALYSIS,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_FullRestore[7] = {
|
||||
[3] = ITEM3_STATUS_ALL,
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = -1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_MaxPotion[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = -1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_HyperPotion[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = 200,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_SuperPotion[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = 50,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_FullHeal[6] = {
|
||||
[3] = ITEM3_STATUS_ALL,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Revive[7] = {
|
||||
[4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
|
||||
[6] = -2,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_MaxRevive[7] = {
|
||||
[4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
|
||||
[6] = -1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_FreshWater[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = 50,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_SodaPop[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = 60,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Lemonade[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = 80,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_MoomooMilk[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = 100,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_EnergyPowder[10] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[5] = ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 50,
|
||||
[7] = -5,
|
||||
[8] = -5,
|
||||
[9] = -10,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_EnergyRoot[10] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[5] = ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 200,
|
||||
[7] = -10,
|
||||
[8] = -10,
|
||||
[9] = -15,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_HealPowder[9] = {
|
||||
[3] = ITEM3_STATUS_ALL,
|
||||
[5] = ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = -5,
|
||||
[7] = -5,
|
||||
[8] = -10,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_RevivalHerb[10] = {
|
||||
[4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
|
||||
[5] = ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = -1,
|
||||
[7] = -15,
|
||||
[8] = -15,
|
||||
[9] = -20,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Ether[7] = {
|
||||
[4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,
|
||||
[6] = 10,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_MaxEther[7] = {
|
||||
[4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,
|
||||
[6] = 0x7F,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Elixir[7] = {
|
||||
[4] = ITEM4_HEAL_PP_ALL,
|
||||
[6] = 10,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_MaxElixir[7] = {
|
||||
[4] = ITEM4_HEAL_PP_ALL,
|
||||
[6] = 0x7F,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_LavaCookie[6] = {
|
||||
[3] = ITEM3_STATUS_ALL,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_BlueFlute[6] = {
|
||||
[3] = ITEM3_SLEEP,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_YellowFlute[6] = {
|
||||
[3] = ITEM3_CONFUSION,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_RedFlute[6] = {
|
||||
[0] = ITEM0_INFATUATION,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_BerryJuice[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = 20,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_SacredAsh[7] = {
|
||||
[0] = ITEM0_SACRED_ASH,
|
||||
[4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
|
||||
[6] = -1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_HPUp[10] = {
|
||||
[4] = ITEM4_EV_HP,
|
||||
[5] = ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 10,
|
||||
[7] = 5,
|
||||
[8] = 3,
|
||||
[9] = 2,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Protein[10] = {
|
||||
[4] = ITEM4_EV_ATK,
|
||||
[5] = ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 10,
|
||||
[7] = 5,
|
||||
[8] = 3,
|
||||
[9] = 2,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Iron[10] = {
|
||||
[5] = ITEM5_EV_DEF | ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 10,
|
||||
[7] = 5,
|
||||
[8] = 3,
|
||||
[9] = 2,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Carbos[10] = {
|
||||
[5] = ITEM5_EV_SPEED | ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 10,
|
||||
[7] = 5,
|
||||
[8] = 3,
|
||||
[9] = 2,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Calcium[10] = {
|
||||
[5] = ITEM5_EV_SPATK | ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 10,
|
||||
[7] = 5,
|
||||
[8] = 3,
|
||||
[9] = 2,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_RareCandy[10] = {
|
||||
[3] = ITEM3_LEVEL_UP,
|
||||
[4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
|
||||
[5] = ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 0xFD,
|
||||
[7] = 5,
|
||||
[8] = 3,
|
||||
[9] = 2,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_PPUp[9] = {
|
||||
[4] = ITEM4_PP_UP,
|
||||
[5] = ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 5,
|
||||
[7] = 3,
|
||||
[8] = 2,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_Zinc[10] = {
|
||||
[5] = ITEM5_EV_SPDEF | ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 10,
|
||||
[7] = 5,
|
||||
[8] = 3,
|
||||
[9] = 2,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_PPMax[9] = {
|
||||
[5] = ITEM5_PP_MAX | ITEM5_FRIENDSHIP_ALL,
|
||||
[6] = 5,
|
||||
[7] = 3,
|
||||
[8] = 2,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_GuardSpec[8] = {
|
||||
[3] = ITEM3_MIST,
|
||||
[5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
|
||||
[6] = 1,
|
||||
[7] = 1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_DireHit[8] = {
|
||||
[0] = 2 << 4,
|
||||
[5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
|
||||
[6] = 1,
|
||||
[7] = 1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_XAttack[8] = {
|
||||
[0] = 1,
|
||||
[5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
|
||||
[6] = 1,
|
||||
[7] = 1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_XDefend[8] = {
|
||||
[1] = 1 << 4,
|
||||
[5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
|
||||
[6] = 1,
|
||||
[7] = 1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_XSpeed[8] = {
|
||||
[1] = 1,
|
||||
[5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
|
||||
[6] = 1,
|
||||
[7] = 1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_XAccuracy[8] = {
|
||||
[2] = 1 << 4,
|
||||
[5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
|
||||
[6] = 1,
|
||||
[7] = 1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_XSpecial[8] = {
|
||||
[2] = 1,
|
||||
[5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
|
||||
[6] = 1,
|
||||
[7] = 1,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_SunStone[6] = {
|
||||
[4] = ITEM4_EVO_STONE,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_MoonStone[6] = {
|
||||
[4] = ITEM4_EVO_STONE,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_FireStone[6] = {
|
||||
[4] = ITEM4_EVO_STONE,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_ThunderStone[6] = {
|
||||
[4] = ITEM4_EVO_STONE,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_WaterStone[6] = {
|
||||
[4] = ITEM4_EVO_STONE,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_LeafStone[6] = {
|
||||
[4] = ITEM4_EVO_STONE,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_CheriBerry[6] = {
|
||||
[3] = ITEM3_PARALYSIS,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_ChestoBerry[6] = {
|
||||
[3] = ITEM3_SLEEP,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_PechaBerry[6] = {
|
||||
[3] = ITEM3_POISON,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_RawstBerry[6] = {
|
||||
[3] = ITEM3_BURN,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_AspearBerry[6] = {
|
||||
[3] = ITEM3_FREEZE,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_LeppaBerry[7] = {
|
||||
[4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,
|
||||
[6] = 10,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_OranBerry[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = 10,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_PersimBerry[6] = {
|
||||
[3] = ITEM3_CONFUSION,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_LumBerry[6] = {
|
||||
[3] = ITEM3_STATUS_ALL,
|
||||
};
|
||||
|
||||
static const u8 sItemEffect_SitrusBerry[7] = {
|
||||
[4] = ITEM4_HEAL_HP,
|
||||
[6] = 30,
|
||||
};
|
||||
|
||||
const u8 *const gItemEffectTable[] =
|
||||
{
|
||||
[ITEM_POTION - ITEM_POTION] = sItemEffect_Potion,
|
||||
[ITEM_ANTIDOTE - ITEM_POTION] = sItemEffect_Antidote,
|
||||
[ITEM_BURN_HEAL - ITEM_POTION] = sItemEffect_BurnHeal,
|
||||
[ITEM_ICE_HEAL - ITEM_POTION] = sItemEffect_IceHeal,
|
||||
[ITEM_AWAKENING - ITEM_POTION] = sItemEffect_Awakening,
|
||||
[ITEM_PARALYZE_HEAL - ITEM_POTION] = sItemEffect_ParalyzeHeal,
|
||||
[ITEM_FULL_RESTORE - ITEM_POTION] = sItemEffect_FullRestore,
|
||||
[ITEM_MAX_POTION - ITEM_POTION] = sItemEffect_MaxPotion,
|
||||
[ITEM_HYPER_POTION - ITEM_POTION] = sItemEffect_HyperPotion,
|
||||
[ITEM_SUPER_POTION - ITEM_POTION] = sItemEffect_SuperPotion,
|
||||
[ITEM_FULL_HEAL - ITEM_POTION] = sItemEffect_FullHeal,
|
||||
[ITEM_REVIVE - ITEM_POTION] = sItemEffect_Revive,
|
||||
[ITEM_MAX_REVIVE - ITEM_POTION] = sItemEffect_MaxRevive,
|
||||
[ITEM_FRESH_WATER - ITEM_POTION] = sItemEffect_FreshWater,
|
||||
[ITEM_SODA_POP - ITEM_POTION] = sItemEffect_SodaPop,
|
||||
[ITEM_LEMONADE - ITEM_POTION] = sItemEffect_Lemonade,
|
||||
[ITEM_MOOMOO_MILK - ITEM_POTION] = sItemEffect_MoomooMilk,
|
||||
[ITEM_ENERGY_POWDER - ITEM_POTION] = sItemEffect_EnergyPowder,
|
||||
[ITEM_ENERGY_ROOT - ITEM_POTION] = sItemEffect_EnergyRoot,
|
||||
[ITEM_HEAL_POWDER - ITEM_POTION] = sItemEffect_HealPowder,
|
||||
[ITEM_REVIVAL_HERB - ITEM_POTION] = sItemEffect_RevivalHerb,
|
||||
[ITEM_ETHER - ITEM_POTION] = sItemEffect_Ether,
|
||||
[ITEM_MAX_ETHER - ITEM_POTION] = sItemEffect_MaxEther,
|
||||
[ITEM_ELIXIR - ITEM_POTION] = sItemEffect_Elixir,
|
||||
[ITEM_MAX_ELIXIR - ITEM_POTION] = sItemEffect_MaxElixir,
|
||||
[ITEM_LAVA_COOKIE - ITEM_POTION] = sItemEffect_LavaCookie,
|
||||
[ITEM_BLUE_FLUTE - ITEM_POTION] = sItemEffect_BlueFlute,
|
||||
[ITEM_YELLOW_FLUTE - ITEM_POTION] = sItemEffect_YellowFlute,
|
||||
[ITEM_RED_FLUTE - ITEM_POTION] = sItemEffect_RedFlute,
|
||||
[ITEM_BERRY_JUICE - ITEM_POTION] = sItemEffect_BerryJuice,
|
||||
[ITEM_SACRED_ASH - ITEM_POTION] = sItemEffect_SacredAsh,
|
||||
[ITEM_HP_UP - ITEM_POTION] = sItemEffect_HPUp,
|
||||
[ITEM_PROTEIN - ITEM_POTION] = sItemEffect_Protein,
|
||||
[ITEM_IRON - ITEM_POTION] = sItemEffect_Iron,
|
||||
[ITEM_CARBOS - ITEM_POTION] = sItemEffect_Carbos,
|
||||
[ITEM_CALCIUM - ITEM_POTION] = sItemEffect_Calcium,
|
||||
[ITEM_RARE_CANDY - ITEM_POTION] = sItemEffect_RareCandy,
|
||||
[ITEM_PP_UP - ITEM_POTION] = sItemEffect_PPUp,
|
||||
[ITEM_ZINC - ITEM_POTION] = sItemEffect_Zinc,
|
||||
[ITEM_PP_MAX - ITEM_POTION] = sItemEffect_PPMax,
|
||||
[ITEM_GUARD_SPEC - ITEM_POTION] = sItemEffect_GuardSpec,
|
||||
[ITEM_DIRE_HIT - ITEM_POTION] = sItemEffect_DireHit,
|
||||
[ITEM_X_ATTACK - ITEM_POTION] = sItemEffect_XAttack,
|
||||
[ITEM_X_DEFEND - ITEM_POTION] = sItemEffect_XDefend,
|
||||
[ITEM_X_SPEED - ITEM_POTION] = sItemEffect_XSpeed,
|
||||
[ITEM_X_ACCURACY - ITEM_POTION] = sItemEffect_XAccuracy,
|
||||
[ITEM_X_SPECIAL - ITEM_POTION] = sItemEffect_XSpecial,
|
||||
[ITEM_SUN_STONE - ITEM_POTION] = sItemEffect_SunStone,
|
||||
[ITEM_MOON_STONE - ITEM_POTION] = sItemEffect_MoonStone,
|
||||
[ITEM_FIRE_STONE - ITEM_POTION] = sItemEffect_FireStone,
|
||||
[ITEM_THUNDER_STONE - ITEM_POTION] = sItemEffect_ThunderStone,
|
||||
[ITEM_WATER_STONE - ITEM_POTION] = sItemEffect_WaterStone,
|
||||
[ITEM_LEAF_STONE - ITEM_POTION] = sItemEffect_LeafStone,
|
||||
[ITEM_CHERI_BERRY - ITEM_POTION] = sItemEffect_CheriBerry,
|
||||
[ITEM_CHESTO_BERRY - ITEM_POTION] = sItemEffect_ChestoBerry,
|
||||
[ITEM_PECHA_BERRY - ITEM_POTION] = sItemEffect_PechaBerry,
|
||||
[ITEM_RAWST_BERRY - ITEM_POTION] = sItemEffect_RawstBerry,
|
||||
[ITEM_ASPEAR_BERRY - ITEM_POTION] = sItemEffect_AspearBerry,
|
||||
[ITEM_LEPPA_BERRY - ITEM_POTION] = sItemEffect_LeppaBerry,
|
||||
[ITEM_ORAN_BERRY - ITEM_POTION] = sItemEffect_OranBerry,
|
||||
[ITEM_PERSIM_BERRY - ITEM_POTION] = sItemEffect_PersimBerry,
|
||||
[ITEM_LUM_BERRY - ITEM_POTION] = sItemEffect_LumBerry,
|
||||
[ITEM_SITRUS_BERRY - ITEM_POTION] = sItemEffect_SitrusBerry,
|
||||
[LAST_BERRY_INDEX - ITEM_POTION] = NULL,
|
||||
};
|
||||
@@ -0,0 +1,415 @@
|
||||
const u16 *const gLevelUpLearnsets[NUM_SPECIES] =
|
||||
{
|
||||
[SPECIES_NONE] = sBulbasaurLevelUpLearnset,
|
||||
[SPECIES_BULBASAUR] = sBulbasaurLevelUpLearnset,
|
||||
[SPECIES_IVYSAUR] = sIvysaurLevelUpLearnset,
|
||||
[SPECIES_VENUSAUR] = sVenusaurLevelUpLearnset,
|
||||
[SPECIES_CHARMANDER] = sCharmanderLevelUpLearnset,
|
||||
[SPECIES_CHARMELEON] = sCharmeleonLevelUpLearnset,
|
||||
[SPECIES_CHARIZARD] = sCharizardLevelUpLearnset,
|
||||
[SPECIES_SQUIRTLE] = sSquirtleLevelUpLearnset,
|
||||
[SPECIES_WARTORTLE] = sWartortleLevelUpLearnset,
|
||||
[SPECIES_BLASTOISE] = sBlastoiseLevelUpLearnset,
|
||||
[SPECIES_CATERPIE] = sCaterpieLevelUpLearnset,
|
||||
[SPECIES_METAPOD] = sMetapodLevelUpLearnset,
|
||||
[SPECIES_BUTTERFREE] = sButterfreeLevelUpLearnset,
|
||||
[SPECIES_WEEDLE] = sWeedleLevelUpLearnset,
|
||||
[SPECIES_KAKUNA] = sKakunaLevelUpLearnset,
|
||||
[SPECIES_BEEDRILL] = sBeedrillLevelUpLearnset,
|
||||
[SPECIES_PIDGEY] = sPidgeyLevelUpLearnset,
|
||||
[SPECIES_PIDGEOTTO] = sPidgeottoLevelUpLearnset,
|
||||
[SPECIES_PIDGEOT] = sPidgeotLevelUpLearnset,
|
||||
[SPECIES_RATTATA] = sRattataLevelUpLearnset,
|
||||
[SPECIES_RATICATE] = sRaticateLevelUpLearnset,
|
||||
[SPECIES_SPEAROW] = sSpearowLevelUpLearnset,
|
||||
[SPECIES_FEAROW] = sFearowLevelUpLearnset,
|
||||
[SPECIES_EKANS] = sEkansLevelUpLearnset,
|
||||
[SPECIES_ARBOK] = sArbokLevelUpLearnset,
|
||||
[SPECIES_PIKACHU] = sPikachuLevelUpLearnset,
|
||||
[SPECIES_RAICHU] = sRaichuLevelUpLearnset,
|
||||
[SPECIES_SANDSHREW] = sSandshrewLevelUpLearnset,
|
||||
[SPECIES_SANDSLASH] = sSandslashLevelUpLearnset,
|
||||
[SPECIES_NIDORAN_F] = sNidoranFLevelUpLearnset,
|
||||
[SPECIES_NIDORINA] = sNidorinaLevelUpLearnset,
|
||||
[SPECIES_NIDOQUEEN] = sNidoqueenLevelUpLearnset,
|
||||
[SPECIES_NIDORAN_M] = sNidoranMLevelUpLearnset,
|
||||
[SPECIES_NIDORINO] = sNidorinoLevelUpLearnset,
|
||||
[SPECIES_NIDOKING] = sNidokingLevelUpLearnset,
|
||||
[SPECIES_CLEFAIRY] = sClefairyLevelUpLearnset,
|
||||
[SPECIES_CLEFABLE] = sClefableLevelUpLearnset,
|
||||
[SPECIES_VULPIX] = sVulpixLevelUpLearnset,
|
||||
[SPECIES_NINETALES] = sNinetalesLevelUpLearnset,
|
||||
[SPECIES_JIGGLYPUFF] = sJigglypuffLevelUpLearnset,
|
||||
[SPECIES_WIGGLYTUFF] = sWigglytuffLevelUpLearnset,
|
||||
[SPECIES_ZUBAT] = sZubatLevelUpLearnset,
|
||||
[SPECIES_GOLBAT] = sGolbatLevelUpLearnset,
|
||||
[SPECIES_ODDISH] = sOddishLevelUpLearnset,
|
||||
[SPECIES_GLOOM] = sGloomLevelUpLearnset,
|
||||
[SPECIES_VILEPLUME] = sVileplumeLevelUpLearnset,
|
||||
[SPECIES_PARAS] = sParasLevelUpLearnset,
|
||||
[SPECIES_PARASECT] = sParasectLevelUpLearnset,
|
||||
[SPECIES_VENONAT] = sVenonatLevelUpLearnset,
|
||||
[SPECIES_VENOMOTH] = sVenomothLevelUpLearnset,
|
||||
[SPECIES_DIGLETT] = sDiglettLevelUpLearnset,
|
||||
[SPECIES_DUGTRIO] = sDugtrioLevelUpLearnset,
|
||||
[SPECIES_MEOWTH] = sMeowthLevelUpLearnset,
|
||||
[SPECIES_PERSIAN] = sPersianLevelUpLearnset,
|
||||
[SPECIES_PSYDUCK] = sPsyduckLevelUpLearnset,
|
||||
[SPECIES_GOLDUCK] = sGolduckLevelUpLearnset,
|
||||
[SPECIES_MANKEY] = sMankeyLevelUpLearnset,
|
||||
[SPECIES_PRIMEAPE] = sPrimeapeLevelUpLearnset,
|
||||
[SPECIES_GROWLITHE] = sGrowlitheLevelUpLearnset,
|
||||
[SPECIES_ARCANINE] = sArcanineLevelUpLearnset,
|
||||
[SPECIES_POLIWAG] = sPoliwagLevelUpLearnset,
|
||||
[SPECIES_POLIWHIRL] = sPoliwhirlLevelUpLearnset,
|
||||
[SPECIES_POLIWRATH] = sPoliwrathLevelUpLearnset,
|
||||
[SPECIES_ABRA] = sAbraLevelUpLearnset,
|
||||
[SPECIES_KADABRA] = sKadabraLevelUpLearnset,
|
||||
[SPECIES_ALAKAZAM] = sAlakazamLevelUpLearnset,
|
||||
[SPECIES_MACHOP] = sMachopLevelUpLearnset,
|
||||
[SPECIES_MACHOKE] = sMachokeLevelUpLearnset,
|
||||
[SPECIES_MACHAMP] = sMachampLevelUpLearnset,
|
||||
[SPECIES_BELLSPROUT] = sBellsproutLevelUpLearnset,
|
||||
[SPECIES_WEEPINBELL] = sWeepinbellLevelUpLearnset,
|
||||
[SPECIES_VICTREEBEL] = sVictreebelLevelUpLearnset,
|
||||
[SPECIES_TENTACOOL] = sTentacoolLevelUpLearnset,
|
||||
[SPECIES_TENTACRUEL] = sTentacruelLevelUpLearnset,
|
||||
[SPECIES_GEODUDE] = sGeodudeLevelUpLearnset,
|
||||
[SPECIES_GRAVELER] = sGravelerLevelUpLearnset,
|
||||
[SPECIES_GOLEM] = sGolemLevelUpLearnset,
|
||||
[SPECIES_PONYTA] = sPonytaLevelUpLearnset,
|
||||
[SPECIES_RAPIDASH] = sRapidashLevelUpLearnset,
|
||||
[SPECIES_SLOWPOKE] = sSlowpokeLevelUpLearnset,
|
||||
[SPECIES_SLOWBRO] = sSlowbroLevelUpLearnset,
|
||||
[SPECIES_MAGNEMITE] = sMagnemiteLevelUpLearnset,
|
||||
[SPECIES_MAGNETON] = sMagnetonLevelUpLearnset,
|
||||
[SPECIES_FARFETCHD] = sFarfetchdLevelUpLearnset,
|
||||
[SPECIES_DODUO] = sDoduoLevelUpLearnset,
|
||||
[SPECIES_DODRIO] = sDodrioLevelUpLearnset,
|
||||
[SPECIES_SEEL] = sSeelLevelUpLearnset,
|
||||
[SPECIES_DEWGONG] = sDewgongLevelUpLearnset,
|
||||
[SPECIES_GRIMER] = sGrimerLevelUpLearnset,
|
||||
[SPECIES_MUK] = sMukLevelUpLearnset,
|
||||
[SPECIES_SHELLDER] = sShellderLevelUpLearnset,
|
||||
[SPECIES_CLOYSTER] = sCloysterLevelUpLearnset,
|
||||
[SPECIES_GASTLY] = sGastlyLevelUpLearnset,
|
||||
[SPECIES_HAUNTER] = sHaunterLevelUpLearnset,
|
||||
[SPECIES_GENGAR] = sGengarLevelUpLearnset,
|
||||
[SPECIES_ONIX] = sOnixLevelUpLearnset,
|
||||
[SPECIES_DROWZEE] = sDrowzeeLevelUpLearnset,
|
||||
[SPECIES_HYPNO] = sHypnoLevelUpLearnset,
|
||||
[SPECIES_KRABBY] = sKrabbyLevelUpLearnset,
|
||||
[SPECIES_KINGLER] = sKinglerLevelUpLearnset,
|
||||
[SPECIES_VOLTORB] = sVoltorbLevelUpLearnset,
|
||||
[SPECIES_ELECTRODE] = sElectrodeLevelUpLearnset,
|
||||
[SPECIES_EXEGGCUTE] = sExeggcuteLevelUpLearnset,
|
||||
[SPECIES_EXEGGUTOR] = sExeggutorLevelUpLearnset,
|
||||
[SPECIES_CUBONE] = sCuboneLevelUpLearnset,
|
||||
[SPECIES_MAROWAK] = sMarowakLevelUpLearnset,
|
||||
[SPECIES_HITMONLEE] = sHitmonleeLevelUpLearnset,
|
||||
[SPECIES_HITMONCHAN] = sHitmonchanLevelUpLearnset,
|
||||
[SPECIES_LICKITUNG] = sLickitungLevelUpLearnset,
|
||||
[SPECIES_KOFFING] = sKoffingLevelUpLearnset,
|
||||
[SPECIES_WEEZING] = sWeezingLevelUpLearnset,
|
||||
[SPECIES_RHYHORN] = sRhyhornLevelUpLearnset,
|
||||
[SPECIES_RHYDON] = sRhydonLevelUpLearnset,
|
||||
[SPECIES_CHANSEY] = sChanseyLevelUpLearnset,
|
||||
[SPECIES_TANGELA] = sTangelaLevelUpLearnset,
|
||||
[SPECIES_KANGASKHAN] = sKangaskhanLevelUpLearnset,
|
||||
[SPECIES_HORSEA] = sHorseaLevelUpLearnset,
|
||||
[SPECIES_SEADRA] = sSeadraLevelUpLearnset,
|
||||
[SPECIES_GOLDEEN] = sGoldeenLevelUpLearnset,
|
||||
[SPECIES_SEAKING] = sSeakingLevelUpLearnset,
|
||||
[SPECIES_STARYU] = sStaryuLevelUpLearnset,
|
||||
[SPECIES_STARMIE] = sStarmieLevelUpLearnset,
|
||||
[SPECIES_MR_MIME] = sMrMimeLevelUpLearnset,
|
||||
[SPECIES_SCYTHER] = sScytherLevelUpLearnset,
|
||||
[SPECIES_JYNX] = sJynxLevelUpLearnset,
|
||||
[SPECIES_ELECTABUZZ] = sElectabuzzLevelUpLearnset,
|
||||
[SPECIES_MAGMAR] = sMagmarLevelUpLearnset,
|
||||
[SPECIES_PINSIR] = sPinsirLevelUpLearnset,
|
||||
[SPECIES_TAUROS] = sTaurosLevelUpLearnset,
|
||||
[SPECIES_MAGIKARP] = sMagikarpLevelUpLearnset,
|
||||
[SPECIES_GYARADOS] = sGyaradosLevelUpLearnset,
|
||||
[SPECIES_LAPRAS] = sLaprasLevelUpLearnset,
|
||||
[SPECIES_DITTO] = sDittoLevelUpLearnset,
|
||||
[SPECIES_EEVEE] = sEeveeLevelUpLearnset,
|
||||
[SPECIES_VAPOREON] = sVaporeonLevelUpLearnset,
|
||||
[SPECIES_JOLTEON] = sJolteonLevelUpLearnset,
|
||||
[SPECIES_FLAREON] = sFlareonLevelUpLearnset,
|
||||
[SPECIES_PORYGON] = sPorygonLevelUpLearnset,
|
||||
[SPECIES_OMANYTE] = sOmanyteLevelUpLearnset,
|
||||
[SPECIES_OMASTAR] = sOmastarLevelUpLearnset,
|
||||
[SPECIES_KABUTO] = sKabutoLevelUpLearnset,
|
||||
[SPECIES_KABUTOPS] = sKabutopsLevelUpLearnset,
|
||||
[SPECIES_AERODACTYL] = sAerodactylLevelUpLearnset,
|
||||
[SPECIES_SNORLAX] = sSnorlaxLevelUpLearnset,
|
||||
[SPECIES_ARTICUNO] = sArticunoLevelUpLearnset,
|
||||
[SPECIES_ZAPDOS] = sZapdosLevelUpLearnset,
|
||||
[SPECIES_MOLTRES] = sMoltresLevelUpLearnset,
|
||||
[SPECIES_DRATINI] = sDratiniLevelUpLearnset,
|
||||
[SPECIES_DRAGONAIR] = sDragonairLevelUpLearnset,
|
||||
[SPECIES_DRAGONITE] = sDragoniteLevelUpLearnset,
|
||||
[SPECIES_MEWTWO] = sMewtwoLevelUpLearnset,
|
||||
[SPECIES_MEW] = sMewLevelUpLearnset,
|
||||
[SPECIES_CHIKORITA] = sChikoritaLevelUpLearnset,
|
||||
[SPECIES_BAYLEEF] = sBayleefLevelUpLearnset,
|
||||
[SPECIES_MEGANIUM] = sMeganiumLevelUpLearnset,
|
||||
[SPECIES_CYNDAQUIL] = sCyndaquilLevelUpLearnset,
|
||||
[SPECIES_QUILAVA] = sQuilavaLevelUpLearnset,
|
||||
[SPECIES_TYPHLOSION] = sTyphlosionLevelUpLearnset,
|
||||
[SPECIES_TOTODILE] = sTotodileLevelUpLearnset,
|
||||
[SPECIES_CROCONAW] = sCroconawLevelUpLearnset,
|
||||
[SPECIES_FERALIGATR] = sFeraligatrLevelUpLearnset,
|
||||
[SPECIES_SENTRET] = sSentretLevelUpLearnset,
|
||||
[SPECIES_FURRET] = sFurretLevelUpLearnset,
|
||||
[SPECIES_HOOTHOOT] = sHoothootLevelUpLearnset,
|
||||
[SPECIES_NOCTOWL] = sNoctowlLevelUpLearnset,
|
||||
[SPECIES_LEDYBA] = sLedybaLevelUpLearnset,
|
||||
[SPECIES_LEDIAN] = sLedianLevelUpLearnset,
|
||||
[SPECIES_SPINARAK] = sSpinarakLevelUpLearnset,
|
||||
[SPECIES_ARIADOS] = sAriadosLevelUpLearnset,
|
||||
[SPECIES_CROBAT] = sCrobatLevelUpLearnset,
|
||||
[SPECIES_CHINCHOU] = sChinchouLevelUpLearnset,
|
||||
[SPECIES_LANTURN] = sLanturnLevelUpLearnset,
|
||||
[SPECIES_PICHU] = sPichuLevelUpLearnset,
|
||||
[SPECIES_CLEFFA] = sCleffaLevelUpLearnset,
|
||||
[SPECIES_IGGLYBUFF] = sIgglybuffLevelUpLearnset,
|
||||
[SPECIES_TOGEPI] = sTogepiLevelUpLearnset,
|
||||
[SPECIES_TOGETIC] = sTogeticLevelUpLearnset,
|
||||
[SPECIES_NATU] = sNatuLevelUpLearnset,
|
||||
[SPECIES_XATU] = sXatuLevelUpLearnset,
|
||||
[SPECIES_MAREEP] = sMareepLevelUpLearnset,
|
||||
[SPECIES_FLAAFFY] = sFlaaffyLevelUpLearnset,
|
||||
[SPECIES_AMPHAROS] = sAmpharosLevelUpLearnset,
|
||||
[SPECIES_BELLOSSOM] = sBellossomLevelUpLearnset,
|
||||
[SPECIES_MARILL] = sMarillLevelUpLearnset,
|
||||
[SPECIES_AZUMARILL] = sAzumarillLevelUpLearnset,
|
||||
[SPECIES_SUDOWOODO] = sSudowoodoLevelUpLearnset,
|
||||
[SPECIES_POLITOED] = sPolitoedLevelUpLearnset,
|
||||
[SPECIES_HOPPIP] = sHoppipLevelUpLearnset,
|
||||
[SPECIES_SKIPLOOM] = sSkiploomLevelUpLearnset,
|
||||
[SPECIES_JUMPLUFF] = sJumpluffLevelUpLearnset,
|
||||
[SPECIES_AIPOM] = sAipomLevelUpLearnset,
|
||||
[SPECIES_SUNKERN] = sSunkernLevelUpLearnset,
|
||||
[SPECIES_SUNFLORA] = sSunfloraLevelUpLearnset,
|
||||
[SPECIES_YANMA] = sYanmaLevelUpLearnset,
|
||||
[SPECIES_WOOPER] = sWooperLevelUpLearnset,
|
||||
[SPECIES_QUAGSIRE] = sQuagsireLevelUpLearnset,
|
||||
[SPECIES_ESPEON] = sEspeonLevelUpLearnset,
|
||||
[SPECIES_UMBREON] = sUmbreonLevelUpLearnset,
|
||||
[SPECIES_MURKROW] = sMurkrowLevelUpLearnset,
|
||||
[SPECIES_SLOWKING] = sSlowkingLevelUpLearnset,
|
||||
[SPECIES_MISDREAVUS] = sMisdreavusLevelUpLearnset,
|
||||
[SPECIES_UNOWN] = sUnownLevelUpLearnset,
|
||||
[SPECIES_WOBBUFFET] = sWobbuffetLevelUpLearnset,
|
||||
[SPECIES_GIRAFARIG] = sGirafarigLevelUpLearnset,
|
||||
[SPECIES_PINECO] = sPinecoLevelUpLearnset,
|
||||
[SPECIES_FORRETRESS] = sForretressLevelUpLearnset,
|
||||
[SPECIES_DUNSPARCE] = sDunsparceLevelUpLearnset,
|
||||
[SPECIES_GLIGAR] = sGligarLevelUpLearnset,
|
||||
[SPECIES_STEELIX] = sSteelixLevelUpLearnset,
|
||||
[SPECIES_SNUBBULL] = sSnubbullLevelUpLearnset,
|
||||
[SPECIES_GRANBULL] = sGranbullLevelUpLearnset,
|
||||
[SPECIES_QWILFISH] = sQwilfishLevelUpLearnset,
|
||||
[SPECIES_SCIZOR] = sScizorLevelUpLearnset,
|
||||
[SPECIES_SHUCKLE] = sShuckleLevelUpLearnset,
|
||||
[SPECIES_HERACROSS] = sHeracrossLevelUpLearnset,
|
||||
[SPECIES_SNEASEL] = sSneaselLevelUpLearnset,
|
||||
[SPECIES_TEDDIURSA] = sTeddiursaLevelUpLearnset,
|
||||
[SPECIES_URSARING] = sUrsaringLevelUpLearnset,
|
||||
[SPECIES_SLUGMA] = sSlugmaLevelUpLearnset,
|
||||
[SPECIES_MAGCARGO] = sMagcargoLevelUpLearnset,
|
||||
[SPECIES_SWINUB] = sSwinubLevelUpLearnset,
|
||||
[SPECIES_PILOSWINE] = sPiloswineLevelUpLearnset,
|
||||
[SPECIES_CORSOLA] = sCorsolaLevelUpLearnset,
|
||||
[SPECIES_REMORAID] = sRemoraidLevelUpLearnset,
|
||||
[SPECIES_OCTILLERY] = sOctilleryLevelUpLearnset,
|
||||
[SPECIES_DELIBIRD] = sDelibirdLevelUpLearnset,
|
||||
[SPECIES_MANTINE] = sMantineLevelUpLearnset,
|
||||
[SPECIES_SKARMORY] = sSkarmoryLevelUpLearnset,
|
||||
[SPECIES_HOUNDOUR] = sHoundourLevelUpLearnset,
|
||||
[SPECIES_HOUNDOOM] = sHoundoomLevelUpLearnset,
|
||||
[SPECIES_KINGDRA] = sKingdraLevelUpLearnset,
|
||||
[SPECIES_PHANPY] = sPhanpyLevelUpLearnset,
|
||||
[SPECIES_DONPHAN] = sDonphanLevelUpLearnset,
|
||||
[SPECIES_PORYGON2] = sPorygon2LevelUpLearnset,
|
||||
[SPECIES_STANTLER] = sStantlerLevelUpLearnset,
|
||||
[SPECIES_SMEARGLE] = sSmeargleLevelUpLearnset,
|
||||
[SPECIES_TYROGUE] = sTyrogueLevelUpLearnset,
|
||||
[SPECIES_HITMONTOP] = sHitmontopLevelUpLearnset,
|
||||
[SPECIES_SMOOCHUM] = sSmoochumLevelUpLearnset,
|
||||
[SPECIES_ELEKID] = sElekidLevelUpLearnset,
|
||||
[SPECIES_MAGBY] = sMagbyLevelUpLearnset,
|
||||
[SPECIES_MILTANK] = sMiltankLevelUpLearnset,
|
||||
[SPECIES_BLISSEY] = sBlisseyLevelUpLearnset,
|
||||
[SPECIES_RAIKOU] = sRaikouLevelUpLearnset,
|
||||
[SPECIES_ENTEI] = sEnteiLevelUpLearnset,
|
||||
[SPECIES_SUICUNE] = sSuicuneLevelUpLearnset,
|
||||
[SPECIES_LARVITAR] = sLarvitarLevelUpLearnset,
|
||||
[SPECIES_PUPITAR] = sPupitarLevelUpLearnset,
|
||||
[SPECIES_TYRANITAR] = sTyranitarLevelUpLearnset,
|
||||
[SPECIES_LUGIA] = sLugiaLevelUpLearnset,
|
||||
[SPECIES_HO_OH] = sHoOhLevelUpLearnset,
|
||||
[SPECIES_CELEBI] = sCelebiLevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_B] = sSpecies252LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_C] = sSpecies253LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_D] = sSpecies254LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_E] = sSpecies255LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_F] = sSpecies256LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_G] = sSpecies257LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_H] = sSpecies258LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_I] = sSpecies259LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_J] = sSpecies260LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_K] = sSpecies261LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_L] = sSpecies262LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_M] = sSpecies263LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_N] = sSpecies264LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_O] = sSpecies265LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_P] = sSpecies266LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_Q] = sSpecies267LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_R] = sSpecies268LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_S] = sSpecies269LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_T] = sSpecies270LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_U] = sSpecies271LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_V] = sSpecies272LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_W] = sSpecies273LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_X] = sSpecies274LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_Y] = sSpecies275LevelUpLearnset,
|
||||
[SPECIES_OLD_UNOWN_Z] = sSpecies276LevelUpLearnset,
|
||||
[SPECIES_TREECKO] = sTreeckoLevelUpLearnset,
|
||||
[SPECIES_GROVYLE] = sGrovyleLevelUpLearnset,
|
||||
[SPECIES_SCEPTILE] = sSceptileLevelUpLearnset,
|
||||
[SPECIES_TORCHIC] = sTorchicLevelUpLearnset,
|
||||
[SPECIES_COMBUSKEN] = sCombuskenLevelUpLearnset,
|
||||
[SPECIES_BLAZIKEN] = sBlazikenLevelUpLearnset,
|
||||
[SPECIES_MUDKIP] = sMudkipLevelUpLearnset,
|
||||
[SPECIES_MARSHTOMP] = sMarshtompLevelUpLearnset,
|
||||
[SPECIES_SWAMPERT] = sSwampertLevelUpLearnset,
|
||||
[SPECIES_POOCHYENA] = sPoochyenaLevelUpLearnset,
|
||||
[SPECIES_MIGHTYENA] = sMightyenaLevelUpLearnset,
|
||||
[SPECIES_ZIGZAGOON] = sZigzagoonLevelUpLearnset,
|
||||
[SPECIES_LINOONE] = sLinooneLevelUpLearnset,
|
||||
[SPECIES_WURMPLE] = sWurmpleLevelUpLearnset,
|
||||
[SPECIES_SILCOON] = sSilcoonLevelUpLearnset,
|
||||
[SPECIES_BEAUTIFLY] = sBeautiflyLevelUpLearnset,
|
||||
[SPECIES_CASCOON] = sCascoonLevelUpLearnset,
|
||||
[SPECIES_DUSTOX] = sDustoxLevelUpLearnset,
|
||||
[SPECIES_LOTAD] = sLotadLevelUpLearnset,
|
||||
[SPECIES_LOMBRE] = sLombreLevelUpLearnset,
|
||||
[SPECIES_LUDICOLO] = sLudicoloLevelUpLearnset,
|
||||
[SPECIES_SEEDOT] = sSeedotLevelUpLearnset,
|
||||
[SPECIES_NUZLEAF] = sNuzleafLevelUpLearnset,
|
||||
[SPECIES_SHIFTRY] = sShiftryLevelUpLearnset,
|
||||
[SPECIES_NINCADA] = sNincadaLevelUpLearnset,
|
||||
[SPECIES_NINJASK] = sNinjaskLevelUpLearnset,
|
||||
[SPECIES_SHEDINJA] = sShedinjaLevelUpLearnset,
|
||||
[SPECIES_TAILLOW] = sTaillowLevelUpLearnset,
|
||||
[SPECIES_SWELLOW] = sSwellowLevelUpLearnset,
|
||||
[SPECIES_SHROOMISH] = sShroomishLevelUpLearnset,
|
||||
[SPECIES_BRELOOM] = sBreloomLevelUpLearnset,
|
||||
[SPECIES_SPINDA] = sSpindaLevelUpLearnset,
|
||||
[SPECIES_WINGULL] = sWingullLevelUpLearnset,
|
||||
[SPECIES_PELIPPER] = sPelipperLevelUpLearnset,
|
||||
[SPECIES_SURSKIT] = sSurskitLevelUpLearnset,
|
||||
[SPECIES_MASQUERAIN] = sMasquerainLevelUpLearnset,
|
||||
[SPECIES_WAILMER] = sWailmerLevelUpLearnset,
|
||||
[SPECIES_WAILORD] = sWailordLevelUpLearnset,
|
||||
[SPECIES_SKITTY] = sSkittyLevelUpLearnset,
|
||||
[SPECIES_DELCATTY] = sDelcattyLevelUpLearnset,
|
||||
[SPECIES_KECLEON] = sKecleonLevelUpLearnset,
|
||||
[SPECIES_BALTOY] = sBaltoyLevelUpLearnset,
|
||||
[SPECIES_CLAYDOL] = sClaydolLevelUpLearnset,
|
||||
[SPECIES_NOSEPASS] = sNosepassLevelUpLearnset,
|
||||
[SPECIES_TORKOAL] = sTorkoalLevelUpLearnset,
|
||||
[SPECIES_SABLEYE] = sSableyeLevelUpLearnset,
|
||||
[SPECIES_BARBOACH] = sBarboachLevelUpLearnset,
|
||||
[SPECIES_WHISCASH] = sWhiscashLevelUpLearnset,
|
||||
[SPECIES_LUVDISC] = sLuvdiscLevelUpLearnset,
|
||||
[SPECIES_CORPHISH] = sCorphishLevelUpLearnset,
|
||||
[SPECIES_CRAWDAUNT] = sCrawdauntLevelUpLearnset,
|
||||
[SPECIES_FEEBAS] = sFeebasLevelUpLearnset,
|
||||
[SPECIES_MILOTIC] = sMiloticLevelUpLearnset,
|
||||
[SPECIES_CARVANHA] = sCarvanhaLevelUpLearnset,
|
||||
[SPECIES_SHARPEDO] = sSharpedoLevelUpLearnset,
|
||||
[SPECIES_TRAPINCH] = sTrapinchLevelUpLearnset,
|
||||
[SPECIES_VIBRAVA] = sVibravaLevelUpLearnset,
|
||||
[SPECIES_FLYGON] = sFlygonLevelUpLearnset,
|
||||
[SPECIES_MAKUHITA] = sMakuhitaLevelUpLearnset,
|
||||
[SPECIES_HARIYAMA] = sHariyamaLevelUpLearnset,
|
||||
[SPECIES_ELECTRIKE] = sElectrikeLevelUpLearnset,
|
||||
[SPECIES_MANECTRIC] = sManectricLevelUpLearnset,
|
||||
[SPECIES_NUMEL] = sNumelLevelUpLearnset,
|
||||
[SPECIES_CAMERUPT] = sCameruptLevelUpLearnset,
|
||||
[SPECIES_SPHEAL] = sSphealLevelUpLearnset,
|
||||
[SPECIES_SEALEO] = sSealeoLevelUpLearnset,
|
||||
[SPECIES_WALREIN] = sWalreinLevelUpLearnset,
|
||||
[SPECIES_CACNEA] = sCacneaLevelUpLearnset,
|
||||
[SPECIES_CACTURNE] = sCacturneLevelUpLearnset,
|
||||
[SPECIES_SNORUNT] = sSnoruntLevelUpLearnset,
|
||||
[SPECIES_GLALIE] = sGlalieLevelUpLearnset,
|
||||
[SPECIES_LUNATONE] = sLunatoneLevelUpLearnset,
|
||||
[SPECIES_SOLROCK] = sSolrockLevelUpLearnset,
|
||||
[SPECIES_AZURILL] = sAzurillLevelUpLearnset,
|
||||
[SPECIES_SPOINK] = sSpoinkLevelUpLearnset,
|
||||
[SPECIES_GRUMPIG] = sGrumpigLevelUpLearnset,
|
||||
[SPECIES_PLUSLE] = sPlusleLevelUpLearnset,
|
||||
[SPECIES_MINUN] = sMinunLevelUpLearnset,
|
||||
[SPECIES_MAWILE] = sMawileLevelUpLearnset,
|
||||
[SPECIES_MEDITITE] = sMedititeLevelUpLearnset,
|
||||
[SPECIES_MEDICHAM] = sMedichamLevelUpLearnset,
|
||||
[SPECIES_SWABLU] = sSwabluLevelUpLearnset,
|
||||
[SPECIES_ALTARIA] = sAltariaLevelUpLearnset,
|
||||
[SPECIES_WYNAUT] = sWynautLevelUpLearnset,
|
||||
[SPECIES_DUSKULL] = sDuskullLevelUpLearnset,
|
||||
[SPECIES_DUSCLOPS] = sDusclopsLevelUpLearnset,
|
||||
[SPECIES_ROSELIA] = sRoseliaLevelUpLearnset,
|
||||
[SPECIES_SLAKOTH] = sSlakothLevelUpLearnset,
|
||||
[SPECIES_VIGOROTH] = sVigorothLevelUpLearnset,
|
||||
[SPECIES_SLAKING] = sSlakingLevelUpLearnset,
|
||||
[SPECIES_GULPIN] = sGulpinLevelUpLearnset,
|
||||
[SPECIES_SWALOT] = sSwalotLevelUpLearnset,
|
||||
[SPECIES_TROPIUS] = sTropiusLevelUpLearnset,
|
||||
[SPECIES_WHISMUR] = sWhismurLevelUpLearnset,
|
||||
[SPECIES_LOUDRED] = sLoudredLevelUpLearnset,
|
||||
[SPECIES_EXPLOUD] = sExploudLevelUpLearnset,
|
||||
[SPECIES_CLAMPERL] = sClamperlLevelUpLearnset,
|
||||
[SPECIES_HUNTAIL] = sHuntailLevelUpLearnset,
|
||||
[SPECIES_GOREBYSS] = sGorebyssLevelUpLearnset,
|
||||
[SPECIES_ABSOL] = sAbsolLevelUpLearnset,
|
||||
[SPECIES_SHUPPET] = sShuppetLevelUpLearnset,
|
||||
[SPECIES_BANETTE] = sBanetteLevelUpLearnset,
|
||||
[SPECIES_SEVIPER] = sSeviperLevelUpLearnset,
|
||||
[SPECIES_ZANGOOSE] = sZangooseLevelUpLearnset,
|
||||
[SPECIES_RELICANTH] = sRelicanthLevelUpLearnset,
|
||||
[SPECIES_ARON] = sAronLevelUpLearnset,
|
||||
[SPECIES_LAIRON] = sLaironLevelUpLearnset,
|
||||
[SPECIES_AGGRON] = sAggronLevelUpLearnset,
|
||||
[SPECIES_CASTFORM] = sCastformLevelUpLearnset,
|
||||
[SPECIES_VOLBEAT] = sVolbeatLevelUpLearnset,
|
||||
[SPECIES_ILLUMISE] = sIllumiseLevelUpLearnset,
|
||||
[SPECIES_LILEEP] = sLileepLevelUpLearnset,
|
||||
[SPECIES_CRADILY] = sCradilyLevelUpLearnset,
|
||||
[SPECIES_ANORITH] = sAnorithLevelUpLearnset,
|
||||
[SPECIES_ARMALDO] = sArmaldoLevelUpLearnset,
|
||||
[SPECIES_RALTS] = sRaltsLevelUpLearnset,
|
||||
[SPECIES_KIRLIA] = sKirliaLevelUpLearnset,
|
||||
[SPECIES_GARDEVOIR] = sGardevoirLevelUpLearnset,
|
||||
[SPECIES_BAGON] = sBagonLevelUpLearnset,
|
||||
[SPECIES_SHELGON] = sShelgonLevelUpLearnset,
|
||||
[SPECIES_SALAMENCE] = sSalamenceLevelUpLearnset,
|
||||
[SPECIES_BELDUM] = sBeldumLevelUpLearnset,
|
||||
[SPECIES_METANG] = sMetangLevelUpLearnset,
|
||||
[SPECIES_METAGROSS] = sMetagrossLevelUpLearnset,
|
||||
[SPECIES_REGIROCK] = sRegirockLevelUpLearnset,
|
||||
[SPECIES_REGICE] = sRegiceLevelUpLearnset,
|
||||
[SPECIES_REGISTEEL] = sRegisteelLevelUpLearnset,
|
||||
[SPECIES_KYOGRE] = sKyogreLevelUpLearnset,
|
||||
[SPECIES_GROUDON] = sGroudonLevelUpLearnset,
|
||||
[SPECIES_RAYQUAZA] = sRayquazaLevelUpLearnset,
|
||||
[SPECIES_LATIAS] = sLatiasLevelUpLearnset,
|
||||
[SPECIES_LATIOS] = sLatiosLevelUpLearnset,
|
||||
[SPECIES_JIRACHI] = sJirachiLevelUpLearnset,
|
||||
[SPECIES_DEOXYS] = sDeoxysLevelUpLearnset,
|
||||
[SPECIES_CHIMECHO] = sChimechoLevelUpLearnset,
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,308 @@
|
||||
// TODO: document trainer pic indices with macro
|
||||
const u8 gFacilityClassToPicIndex[] =
|
||||
{
|
||||
[FACILITY_CLASS_AQUA_LEADER] = 0,
|
||||
[FACILITY_CLASS_TEAM_AQUA] = 1,
|
||||
[FACILITY_CLASS_TEAM_AQUA_2] = 2,
|
||||
[FACILITY_CLASS_AROMA_LADY] = 3,
|
||||
[FACILITY_CLASS_RUIN_MANIAC] = 4,
|
||||
[FACILITY_CLASS_INTERVIEWER] = 5,
|
||||
[FACILITY_CLASS_TUBER] = 6,
|
||||
[FACILITY_CLASS_TUBER_2] = 7,
|
||||
[FACILITY_CLASS_COOLTRAINER] = 8,
|
||||
[FACILITY_CLASS_COOLTRAINER_2] = 9,
|
||||
[FACILITY_CLASS_HEX_MANIAC] = 10,
|
||||
[FACILITY_CLASS_LADY] = 11,
|
||||
[FACILITY_CLASS_BEAUTY] = 12,
|
||||
[FACILITY_CLASS_RICH_BOY] = 13,
|
||||
[FACILITY_CLASS_POKEMANIAC] = 14,
|
||||
[FACILITY_CLASS_SWIMMER_MALE] = 15,
|
||||
[FACILITY_CLASS_BLACK_BELT] = 16,
|
||||
[FACILITY_CLASS_GUITARIST] = 17,
|
||||
[FACILITY_CLASS_KINDLER] = 18,
|
||||
[FACILITY_CLASS_CAMPER] = 19,
|
||||
[FACILITY_CLASS_BUG_MANIAC] = 20,
|
||||
[FACILITY_CLASS_PSYCHIC] = 21,
|
||||
[FACILITY_CLASS_PSYCHIC_2] = 22,
|
||||
[FACILITY_CLASS_GENTLEMAN] = 23,
|
||||
[FACILITY_CLASS_ELITE_FOUR] = 24,
|
||||
[FACILITY_CLASS_ELITE_FOUR_2] = 25,
|
||||
[FACILITY_CLASS_LEADER] = 26,
|
||||
[FACILITY_CLASS_LEADER_2] = 27,
|
||||
[FACILITY_CLASS_LEADER_3] = 28,
|
||||
[FACILITY_CLASS_SCHOOL_KID] = 29,
|
||||
[FACILITY_CLASS_SCHOOL_KID_2] = 30,
|
||||
[FACILITY_CLASS_SR_AND_JR] = 31,
|
||||
[FACILITY_CLASS_POKEFAN] = 32,
|
||||
[FACILITY_CLASS_POKEFAN_2] = 33,
|
||||
[FACILITY_CLASS_EXPERT] = 34,
|
||||
[FACILITY_CLASS_EXPERT_2] = 35,
|
||||
[FACILITY_CLASS_YOUNGSTER] = 36,
|
||||
[FACILITY_CLASS_CHAMPION] = 37,
|
||||
[FACILITY_CLASS_FISHERMAN] = 38,
|
||||
[FACILITY_CLASS_TRIATHLETE] = 39,
|
||||
[FACILITY_CLASS_TRIATHLETE_2] = 40,
|
||||
[FACILITY_CLASS_TRIATHLETE_3] = 41,
|
||||
[FACILITY_CLASS_TRIATHLETE_4] = 42,
|
||||
[FACILITY_CLASS_TRIATHLETE_5] = 43,
|
||||
[FACILITY_CLASS_TRIATHLETE_6] = 44,
|
||||
[FACILITY_CLASS_DRAGON_TAMER] = 45,
|
||||
[FACILITY_CLASS_BIRD_KEEPER] = 46,
|
||||
[FACILITY_CLASS_NINJA_BOY] = 47,
|
||||
[FACILITY_CLASS_BATTLE_GIRL] = 48,
|
||||
[FACILITY_CLASS_PARASOL_LADY] = 49,
|
||||
[FACILITY_CLASS_SWIMMER_FEMALE] = 50,
|
||||
[FACILITY_CLASS_PICNICKER] = 51,
|
||||
[FACILITY_CLASS_TWINS] = 52,
|
||||
[FACILITY_CLASS_SAILOR] = 53,
|
||||
[FACILITY_CLASS_BOARDER] = 36,
|
||||
[FACILITY_CLASS_BOARDER_2] = 36,
|
||||
[FACILITY_CLASS_COLLECTOR] = 54,
|
||||
[FACILITY_CLASS_PKMN_TRAINER] = 55,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_2] = 56,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_3] = 56,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_4] = 56,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_5] = 57,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_6] = 57,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_7] = 57,
|
||||
[FACILITY_CLASS_PKMN_BREEDER] = 58,
|
||||
[FACILITY_CLASS_PKMN_BREEDER_2] = 59,
|
||||
[FACILITY_CLASS_PKMN_RANGER] = 60,
|
||||
[FACILITY_CLASS_PKMN_RANGER_2] = 61,
|
||||
[FACILITY_CLASS_MAGMA_LEADER] = 62,
|
||||
[FACILITY_CLASS_TEAM_MAGMA] = 63,
|
||||
[FACILITY_CLASS_TEAM_MAGMA_2] = 64,
|
||||
[FACILITY_CLASS_LASS] = 65,
|
||||
[FACILITY_CLASS_BUG_CATCHER] = 66,
|
||||
[FACILITY_CLASS_HIKER] = 67,
|
||||
[FACILITY_CLASS_YOUNG_COUPLE] = 68,
|
||||
[FACILITY_CLASS_OLD_COUPLE] = 69,
|
||||
[FACILITY_CLASS_SIS_AND_BRO] = 70,
|
||||
[FACILITY_CLASS_AQUA_ADMIN] = 71,
|
||||
[FACILITY_CLASS_AQUA_ADMIN_2] = 72,
|
||||
[FACILITY_CLASS_MAGMA_ADMIN] = 73,
|
||||
[FACILITY_CLASS_MAGMA_ADMIN_2] = 74,
|
||||
[FACILITY_CLASS_LEADER_4] = 75,
|
||||
[FACILITY_CLASS_LEADER_5] = 76,
|
||||
[FACILITY_CLASS_LEADER_6] = 77,
|
||||
[FACILITY_CLASS_LEADER_7] = 78,
|
||||
[FACILITY_CLASS_LEADER_8] = 79,
|
||||
[FACILITY_CLASS_ELITE_FOUR_3] = 80,
|
||||
[FACILITY_CLASS_ELITE_FOUR_4] = 81,
|
||||
[FACILITY_CLASS_YOUNGSTER_2] = 82,
|
||||
[FACILITY_CLASS_BUG_CATCHER_2] = 83,
|
||||
[FACILITY_CLASS_LASS_2] = 84,
|
||||
[FACILITY_CLASS_SAILOR_2] = 85,
|
||||
[FACILITY_CLASS_CAMPER_2] = 86,
|
||||
[FACILITY_CLASS_PICNICKER_2] = 87,
|
||||
[FACILITY_CLASS_POKEMANIAC_2] = 88,
|
||||
[FACILITY_CLASS_SUPER_NERD] = 89,
|
||||
[FACILITY_CLASS_HIKER_2] = 90,
|
||||
[FACILITY_CLASS_BIKER] = 91,
|
||||
[FACILITY_CLASS_BURGLAR] = 92,
|
||||
[FACILITY_CLASS_ENGINEER] = 93,
|
||||
[FACILITY_CLASS_FISHERMAN_2] = 94,
|
||||
[FACILITY_CLASS_SWIMMER_MALE_2] = 95,
|
||||
[FACILITY_CLASS_CUE_BALL] = 96,
|
||||
[FACILITY_CLASS_GAMER] = 97,
|
||||
[FACILITY_CLASS_BEAUTY_2] = 98,
|
||||
[FACILITY_CLASS_SWIMMER_FEMALE_2] = 99,
|
||||
[FACILITY_CLASS_PSYCHIC_3] = 100,
|
||||
[FACILITY_CLASS_ROCKER] = 101,
|
||||
[FACILITY_CLASS_JUGGLER] = 102,
|
||||
[FACILITY_CLASS_TAMER] = 103,
|
||||
[FACILITY_CLASS_BIRD_KEEPER_2] = 104,
|
||||
[FACILITY_CLASS_BLACK_BELT_2] = 105,
|
||||
[FACILITY_CLASS_RIVAL] = 106,
|
||||
[FACILITY_CLASS_SCIENTIST] = 107,
|
||||
[FACILITY_CLASS_BOSS] = 108,
|
||||
[FACILITY_CLASS_TEAM_ROCKET] = 109,
|
||||
[FACILITY_CLASS_COOLTRAINER_3] = 110,
|
||||
[FACILITY_CLASS_COOLTRAINER_4] = 111,
|
||||
[FACILITY_CLASS_ELITE_FOUR_5] = 112,
|
||||
[FACILITY_CLASS_ELITE_FOUR_6] = 113,
|
||||
[FACILITY_CLASS_LEADER_9] = 116,
|
||||
[FACILITY_CLASS_LEADER_10] = 117,
|
||||
[FACILITY_CLASS_GENTLEMAN_2] = 123,
|
||||
[FACILITY_CLASS_RIVAL_2] = 124,
|
||||
[FACILITY_CLASS_CHAMPION_2] = 125,
|
||||
[FACILITY_CLASS_CHANNELER] = 126,
|
||||
[FACILITY_CLASS_TWINS_2] = 127,
|
||||
[FACILITY_CLASS_COOL_COUPLE] = 128,
|
||||
[FACILITY_CLASS_YOUNG_COUPLE_2] = 129,
|
||||
[FACILITY_CLASS_CRUSH_KIN] = 130,
|
||||
[FACILITY_CLASS_SIS_AND_BRO_2] = 131,
|
||||
[FACILITY_CLASS_PKMN_PROF] = 132,
|
||||
[FACILITY_CLASS_PLAYER] = 133,
|
||||
[FACILITY_CLASS_PLAYER_2] = 134,
|
||||
[FACILITY_CLASS_PLAYER_3] = 135,
|
||||
[FACILITY_CLASS_PLAYER_4] = 136,
|
||||
[FACILITY_CLASS_TEAM_ROCKET_2] = 137,
|
||||
[FACILITY_CLASS_PSYCHIC_4] = 138,
|
||||
[FACILITY_CLASS_CRUSH_GIRL] = 139,
|
||||
[FACILITY_CLASS_TUBER_3] = 140,
|
||||
[FACILITY_CLASS_PKMN_BREEDER_3] = 141,
|
||||
[FACILITY_CLASS_PKMN_RANGER_3] = 142,
|
||||
[FACILITY_CLASS_PKMN_RANGER_4] = 143,
|
||||
[FACILITY_CLASS_AROMA_LADY_2] = 144,
|
||||
[FACILITY_CLASS_RUIN_MANIAC_2] = 145,
|
||||
[FACILITY_CLASS_LADY_2] = 146,
|
||||
[FACILITY_CLASS_PAINTER] = 147,
|
||||
[FACILITY_CLASS_ELITE_FOUR_7] = 112,
|
||||
[FACILITY_CLASS_ELITE_FOUR_8] = 113,
|
||||
[FACILITY_CLASS_CHAMPION_3] = 125,
|
||||
};
|
||||
|
||||
const u8 gFacilityClassToTrainerClass[] =
|
||||
{
|
||||
[FACILITY_CLASS_AQUA_LEADER] = CLASS_AQUA_LEADER,
|
||||
[FACILITY_CLASS_TEAM_AQUA] = CLASS_TEAM_AQUA,
|
||||
[FACILITY_CLASS_TEAM_AQUA_2] = CLASS_TEAM_AQUA,
|
||||
[FACILITY_CLASS_AROMA_LADY] = CLASS_AROMA_LADY,
|
||||
[FACILITY_CLASS_RUIN_MANIAC] = CLASS_RUIN_MANIAC,
|
||||
[FACILITY_CLASS_INTERVIEWER] = CLASS_INTERVIEWER,
|
||||
[FACILITY_CLASS_TUBER] = CLASS_TUBER,
|
||||
[FACILITY_CLASS_TUBER_2] = CLASS_TUBER_2,
|
||||
[FACILITY_CLASS_COOLTRAINER] = CLASS_COOLTRAINER,
|
||||
[FACILITY_CLASS_COOLTRAINER_2] = CLASS_COOLTRAINER,
|
||||
[FACILITY_CLASS_HEX_MANIAC] = CLASS_HEX_MANIAC,
|
||||
[FACILITY_CLASS_LADY] = CLASS_LADY,
|
||||
[FACILITY_CLASS_BEAUTY] = CLASS_BEAUTY,
|
||||
[FACILITY_CLASS_RICH_BOY] = CLASS_RICH_BOY,
|
||||
[FACILITY_CLASS_POKEMANIAC] = CLASS_POKEMANIAC,
|
||||
[FACILITY_CLASS_SWIMMER_MALE] = CLASS_SWIMMER_MALE,
|
||||
[FACILITY_CLASS_BLACK_BELT] = CLASS_BLACK_BELT,
|
||||
[FACILITY_CLASS_GUITARIST] = CLASS_GUITARIST,
|
||||
[FACILITY_CLASS_KINDLER] = CLASS_KINDLER,
|
||||
[FACILITY_CLASS_CAMPER] = CLASS_CAMPER,
|
||||
[FACILITY_CLASS_BUG_MANIAC] = CLASS_BUG_MANIAC,
|
||||
[FACILITY_CLASS_PSYCHIC] = CLASS_PSYCHIC,
|
||||
[FACILITY_CLASS_PSYCHIC_2] = CLASS_PSYCHIC,
|
||||
[FACILITY_CLASS_GENTLEMAN] = CLASS_GENTLEMAN,
|
||||
[FACILITY_CLASS_ELITE_FOUR] = CLASS_ELITE_FOUR,
|
||||
[FACILITY_CLASS_ELITE_FOUR_2] = CLASS_ELITE_FOUR,
|
||||
[FACILITY_CLASS_LEADER] = CLASS_LEADER,
|
||||
[FACILITY_CLASS_LEADER_2] = CLASS_LEADER,
|
||||
[FACILITY_CLASS_LEADER_3] = CLASS_LEADER,
|
||||
[FACILITY_CLASS_SCHOOL_KID] = CLASS_SCHOOL_KID,
|
||||
[FACILITY_CLASS_SCHOOL_KID_2] = CLASS_SCHOOL_KID,
|
||||
[FACILITY_CLASS_SR_AND_JR] = CLASS_SR_AND_JR,
|
||||
[FACILITY_CLASS_POKEFAN] = CLASS_POKEFAN,
|
||||
[FACILITY_CLASS_POKEFAN_2] = CLASS_POKEFAN,
|
||||
[FACILITY_CLASS_EXPERT] = CLASS_EXPERT,
|
||||
[FACILITY_CLASS_EXPERT_2] = CLASS_EXPERT,
|
||||
[FACILITY_CLASS_YOUNGSTER] = CLASS_YOUNGSTER,
|
||||
[FACILITY_CLASS_CHAMPION] = CLASS_CHAMPION,
|
||||
[FACILITY_CLASS_FISHERMAN] = CLASS_FISHERMAN,
|
||||
[FACILITY_CLASS_TRIATHLETE] = CLASS_TRIATHLETE,
|
||||
[FACILITY_CLASS_TRIATHLETE_2] = CLASS_TRIATHLETE,
|
||||
[FACILITY_CLASS_TRIATHLETE_3] = CLASS_TRIATHLETE,
|
||||
[FACILITY_CLASS_TRIATHLETE_4] = CLASS_TRIATHLETE,
|
||||
[FACILITY_CLASS_TRIATHLETE_5] = CLASS_TRIATHLETE,
|
||||
[FACILITY_CLASS_TRIATHLETE_6] = CLASS_TRIATHLETE,
|
||||
[FACILITY_CLASS_DRAGON_TAMER] = CLASS_DRAGON_TAMER,
|
||||
[FACILITY_CLASS_BIRD_KEEPER] = CLASS_BIRD_KEEPER,
|
||||
[FACILITY_CLASS_NINJA_BOY] = CLASS_NINJA_BOY,
|
||||
[FACILITY_CLASS_BATTLE_GIRL] = CLASS_BATTLE_GIRL,
|
||||
[FACILITY_CLASS_PARASOL_LADY] = CLASS_PARASOL_LADY,
|
||||
[FACILITY_CLASS_SWIMMER_FEMALE] = CLASS_SWIMMER_FEMALE,
|
||||
[FACILITY_CLASS_PICNICKER] = CLASS_PICNICKER,
|
||||
[FACILITY_CLASS_TWINS] = CLASS_TWINS,
|
||||
[FACILITY_CLASS_SAILOR] = CLASS_SAILOR,
|
||||
[FACILITY_CLASS_BOARDER] = CLASS_BOARDER,
|
||||
[FACILITY_CLASS_BOARDER_2] = CLASS_BOARDER,
|
||||
[FACILITY_CLASS_COLLECTOR] = CLASS_COLLECTOR,
|
||||
[FACILITY_CLASS_PKMN_TRAINER] = CLASS_PKMN_TRAINER_3,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_2] = CLASS_PKMN_TRAINER_3,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_3] = CLASS_PKMN_TRAINER_3,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_4] = CLASS_PKMN_TRAINER_3,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_5] = CLASS_PKMN_TRAINER_3,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_6] = CLASS_PKMN_TRAINER_3,
|
||||
[FACILITY_CLASS_PKMN_TRAINER_7] = CLASS_PKMN_TRAINER_3,
|
||||
[FACILITY_CLASS_PKMN_BREEDER] = CLASS_PKMN_BREEDER,
|
||||
[FACILITY_CLASS_PKMN_BREEDER_2] = CLASS_PKMN_BREEDER,
|
||||
[FACILITY_CLASS_PKMN_RANGER] = CLASS_PKMN_RANGER,
|
||||
[FACILITY_CLASS_PKMN_RANGER_2] = CLASS_PKMN_RANGER,
|
||||
[FACILITY_CLASS_MAGMA_LEADER] = CLASS_MAGMA_LEADER,
|
||||
[FACILITY_CLASS_TEAM_MAGMA] = CLASS_TEAM_MAGMA,
|
||||
[FACILITY_CLASS_TEAM_MAGMA_2] = CLASS_TEAM_MAGMA,
|
||||
[FACILITY_CLASS_LASS] = CLASS_LASS,
|
||||
[FACILITY_CLASS_BUG_CATCHER] = CLASS_BUG_CATCHER,
|
||||
[FACILITY_CLASS_HIKER] = CLASS_HIKER,
|
||||
[FACILITY_CLASS_YOUNG_COUPLE] = CLASS_YOUNG_COUPLE,
|
||||
[FACILITY_CLASS_OLD_COUPLE] = CLASS_OLD_COUPLE,
|
||||
[FACILITY_CLASS_SIS_AND_BRO] = CLASS_SIS_AND_BRO,
|
||||
[FACILITY_CLASS_AQUA_ADMIN] = CLASS_AQUA_ADMIN,
|
||||
[FACILITY_CLASS_AQUA_ADMIN_2] = CLASS_AQUA_ADMIN,
|
||||
[FACILITY_CLASS_MAGMA_ADMIN] = CLASS_MAGMA_ADMIN,
|
||||
[FACILITY_CLASS_MAGMA_ADMIN_2] = CLASS_MAGMA_ADMIN,
|
||||
[FACILITY_CLASS_LEADER_4] = CLASS_LEADER,
|
||||
[FACILITY_CLASS_LEADER_5] = CLASS_LEADER,
|
||||
[FACILITY_CLASS_LEADER_6] = CLASS_LEADER,
|
||||
[FACILITY_CLASS_LEADER_7] = CLASS_LEADER,
|
||||
[FACILITY_CLASS_LEADER_8] = CLASS_LEADER,
|
||||
[FACILITY_CLASS_ELITE_FOUR_3] = CLASS_ELITE_FOUR,
|
||||
[FACILITY_CLASS_ELITE_FOUR_4] = CLASS_ELITE_FOUR,
|
||||
[FACILITY_CLASS_YOUNGSTER_2] = CLASS_YOUNGSTER_2,
|
||||
[FACILITY_CLASS_BUG_CATCHER_2] = CLASS_BUG_CATCHER_2,
|
||||
[FACILITY_CLASS_LASS_2] = CLASS_LASS_2,
|
||||
[FACILITY_CLASS_SAILOR_2] = CLASS_SAILOR_2,
|
||||
[FACILITY_CLASS_CAMPER_2] = CLASS_CAMPER_2,
|
||||
[FACILITY_CLASS_PICNICKER_2] = CLASS_PICNICKER_2,
|
||||
[FACILITY_CLASS_POKEMANIAC_2] = CLASS_POKEMANIAC_2,
|
||||
[FACILITY_CLASS_SUPER_NERD] = CLASS_SUPER_NERD,
|
||||
[FACILITY_CLASS_HIKER_2] = CLASS_HIKER_2,
|
||||
[FACILITY_CLASS_BIKER] = CLASS_BIKER,
|
||||
[FACILITY_CLASS_BURGLAR] = CLASS_BURGLAR,
|
||||
[FACILITY_CLASS_ENGINEER] = CLASS_ENGINEER,
|
||||
[FACILITY_CLASS_FISHERMAN_2] = CLASS_FISHERMAN_2,
|
||||
[FACILITY_CLASS_SWIMMER_MALE_2] = CLASS_SWIMMER_MALE_2,
|
||||
[FACILITY_CLASS_CUE_BALL] = CLASS_CUE_BALL,
|
||||
[FACILITY_CLASS_GAMER] = CLASS_GAMER,
|
||||
[FACILITY_CLASS_BEAUTY_2] = CLASS_BEAUTY_2,
|
||||
[FACILITY_CLASS_SWIMMER_FEMALE_2] = CLASS_SWIMMER_FEMALE_2,
|
||||
[FACILITY_CLASS_PSYCHIC_3] = CLASS_PSYCHIC_2,
|
||||
[FACILITY_CLASS_ROCKER] = CLASS_ROCKER,
|
||||
[FACILITY_CLASS_JUGGLER] = CLASS_JUGGLER,
|
||||
[FACILITY_CLASS_TAMER] = CLASS_TAMER,
|
||||
[FACILITY_CLASS_BIRD_KEEPER_2] = CLASS_BIRD_KEEPER_2,
|
||||
[FACILITY_CLASS_BLACK_BELT_2] = CLASS_BLACK_BELT_2,
|
||||
[FACILITY_CLASS_RIVAL] = CLASS_RIVAL,
|
||||
[FACILITY_CLASS_SCIENTIST] = CLASS_SCIENTIST,
|
||||
[FACILITY_CLASS_BOSS] = CLASS_BOSS,
|
||||
[FACILITY_CLASS_TEAM_ROCKET] = CLASS_TEAM_ROCKET,
|
||||
[FACILITY_CLASS_COOLTRAINER_3] = CLASS_COOLTRAINER_2,
|
||||
[FACILITY_CLASS_COOLTRAINER_4] = CLASS_COOLTRAINER_2,
|
||||
[FACILITY_CLASS_ELITE_FOUR_5] = CLASS_ELITE_FOUR_2,
|
||||
[FACILITY_CLASS_ELITE_FOUR_6] = CLASS_ELITE_FOUR_2,
|
||||
[FACILITY_CLASS_LEADER_9] = CLASS_LEADER_2,
|
||||
[FACILITY_CLASS_LEADER_10] = CLASS_LEADER_2,
|
||||
[FACILITY_CLASS_GENTLEMAN_2] = CLASS_GENTLEMAN_2,
|
||||
[FACILITY_CLASS_RIVAL_2] = CLASS_RIVAL_2,
|
||||
[FACILITY_CLASS_CHAMPION_2] = CLASS_CHAMPION_2,
|
||||
[FACILITY_CLASS_CHANNELER] = CLASS_CHANNELER,
|
||||
[FACILITY_CLASS_TWINS_2] = CLASS_TWINS_2,
|
||||
[FACILITY_CLASS_COOL_COUPLE] = CLASS_COOL_COUPLE,
|
||||
[FACILITY_CLASS_YOUNG_COUPLE_2] = CLASS_YOUNG_COUPLE_2,
|
||||
[FACILITY_CLASS_CRUSH_KIN] = CLASS_CRUSH_KIN,
|
||||
[FACILITY_CLASS_SIS_AND_BRO_2] = CLASS_SIS_AND_BRO_2,
|
||||
[FACILITY_CLASS_PKMN_PROF] = CLASS_PKMN_PROF,
|
||||
[FACILITY_CLASS_PLAYER] = CLASS_PLAYER,
|
||||
[FACILITY_CLASS_PLAYER_2] = CLASS_PLAYER,
|
||||
[FACILITY_CLASS_PLAYER_3] = CLASS_PLAYER,
|
||||
[FACILITY_CLASS_PLAYER_4] = CLASS_PLAYER,
|
||||
[FACILITY_CLASS_TEAM_ROCKET_2] = CLASS_TEAM_ROCKET,
|
||||
[FACILITY_CLASS_PSYCHIC_4] = CLASS_PSYCHIC_2,
|
||||
[FACILITY_CLASS_CRUSH_GIRL] = CLASS_CRUSH_GIRL,
|
||||
[FACILITY_CLASS_TUBER_3] = CLASS_TUBER_3,
|
||||
[FACILITY_CLASS_PKMN_BREEDER_3] = CLASS_PKMN_BREEDER_2,
|
||||
[FACILITY_CLASS_PKMN_RANGER_3] = CLASS_PKMN_RANGER_2,
|
||||
[FACILITY_CLASS_PKMN_RANGER_4] = CLASS_PKMN_RANGER_2,
|
||||
[FACILITY_CLASS_AROMA_LADY_2] = CLASS_AROMA_LADY_2,
|
||||
[FACILITY_CLASS_RUIN_MANIAC_2] = CLASS_RUIN_MANIAC_2,
|
||||
[FACILITY_CLASS_LADY_2] = CLASS_LADY_2,
|
||||
[FACILITY_CLASS_PAINTER] = CLASS_PAINTER,
|
||||
[FACILITY_CLASS_ELITE_FOUR_7] = CLASS_ELITE_FOUR_2,
|
||||
[FACILITY_CLASS_ELITE_FOUR_8] = CLASS_ELITE_FOUR_2,
|
||||
[FACILITY_CLASS_CHAMPION_3] = CLASS_CHAMPION_2,
|
||||
};
|
||||
+9
-9
@@ -5,7 +5,7 @@
|
||||
#include "string_util.h"
|
||||
#include "constants/species.h"
|
||||
#include "constants/items.h"
|
||||
#include "mail.h"
|
||||
#include "mail_data.h"
|
||||
#include "pokemon_storage_system.h"
|
||||
#include "event_data.h"
|
||||
#include "random.h"
|
||||
@@ -163,7 +163,7 @@ static const u8 *const sCompatibilityMessages[] =
|
||||
static const u8 sNewLineText[] = _("\n");
|
||||
static const u8 sJapaneseEggNickname[] = _("タマゴ"); // "tamago" ("egg" in Japanese)
|
||||
|
||||
static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/palettes/egg_palette.gbapal");
|
||||
static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/egg/normal.gbapal");
|
||||
static const u8 sEggHatchTiles[] = INCBIN_U8("graphics/misc/egg_hatch.4bpp");
|
||||
static const u8 sEggShardTiles[] = INCBIN_U8("graphics/misc/egg_shard.4bpp");
|
||||
|
||||
@@ -1533,7 +1533,7 @@ static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y)
|
||||
|
||||
static void Task_HandleDaycareLevelMenuInput(u8 taskId)
|
||||
{
|
||||
u32 input = ListMenuHandleInput(gTasks[taskId].tMenuListTaskId);
|
||||
u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuListTaskId);
|
||||
|
||||
if (gMain.newKeys & A_BUTTON)
|
||||
{
|
||||
@@ -1547,7 +1547,7 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId)
|
||||
gSpecialVar_Result = 2;
|
||||
break;
|
||||
}
|
||||
DestroyListMenu(gTasks[taskId].tMenuListTaskId, NULL, NULL);
|
||||
DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL);
|
||||
ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE);
|
||||
RemoveWindow(gTasks[taskId].tWindowId);
|
||||
DestroyTask(taskId);
|
||||
@@ -1556,7 +1556,7 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId)
|
||||
else if (gMain.newKeys & B_BUTTON)
|
||||
{
|
||||
gSpecialVar_Result = 2;
|
||||
DestroyListMenu(gTasks[taskId].tMenuListTaskId, NULL, NULL);
|
||||
DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL);
|
||||
ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE);
|
||||
RemoveWindow(gTasks[taskId].tWindowId);
|
||||
DestroyTask(taskId);
|
||||
@@ -1768,8 +1768,8 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc
|
||||
{
|
||||
u16 species = GetMonData(mon, MON_DATA_SPECIES);
|
||||
u32 pid = GetMonData(mon, MON_DATA_PERSONALITY);
|
||||
sub_800ECC4(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid);
|
||||
LoadCompressedObjectPalette(GetMonSpritePalStruct(mon));
|
||||
HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid);
|
||||
LoadCompressedSpritePalette(GetMonSpritePalStruct(mon));
|
||||
*speciesLoc = species;
|
||||
}
|
||||
break;
|
||||
@@ -1824,7 +1824,7 @@ static void CB2_EggHatch_0(void)
|
||||
SetVBlankCallback(VBlankCB_EggHatch);
|
||||
gSpecialVar_0x8005 = GetCurrentMapMusic();
|
||||
|
||||
reset_temp_tile_data_buffers();
|
||||
ResetTempTileDataBuffers();
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, sBgTemplates_EggHatch, ARRAY_COUNT(sBgTemplates_EggHatch));
|
||||
|
||||
@@ -2205,5 +2205,5 @@ static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed)
|
||||
sEggHatchData->textColor.fgColor = 0;
|
||||
sEggHatchData->textColor.bgColor = 5;
|
||||
sEggHatchData->textColor.shadowColor = 6;
|
||||
AddTextPrinterParametrized2(windowId, 3, x, y, 1, 1, &sEggHatchData->textColor, speed, string);
|
||||
AddTextPrinterParameterized4(windowId, 3, x, y, 1, 1, &sEggHatchData->textColor, speed, string);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,662 @@
|
||||
#include "global.h"
|
||||
#include "malloc.h"
|
||||
#include "decompress.h"
|
||||
#include "pokemon.h"
|
||||
#include "text.h"
|
||||
#include "constants/species.h"
|
||||
|
||||
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
|
||||
extern const struct CompressedSpriteSheet gMonBackPicTable[];
|
||||
|
||||
static void DuplicateDeoxysTiles(void *pointer, s32 species);
|
||||
|
||||
void LZDecompressWram(const void *src, void *dest)
|
||||
{
|
||||
LZ77UnCompWram(src, dest);
|
||||
}
|
||||
|
||||
void LZDecompressVram(const void *src, void *dest)
|
||||
{
|
||||
LZ77UnCompVram(src, dest);
|
||||
}
|
||||
|
||||
u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src)
|
||||
{
|
||||
struct SpriteSheet dest;
|
||||
|
||||
LZ77UnCompWram(src->data, gDecompressionBuffer);
|
||||
dest.data = gDecompressionBuffer;
|
||||
dest.size = src->size;
|
||||
dest.tag = src->tag;
|
||||
return LoadSpriteSheet(&dest);
|
||||
}
|
||||
|
||||
void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer)
|
||||
{
|
||||
struct SpriteSheet dest;
|
||||
|
||||
LZ77UnCompWram(src->data, buffer);
|
||||
dest.data = buffer;
|
||||
dest.size = src->size;
|
||||
dest.tag = src->tag;
|
||||
LoadSpriteSheet(&dest);
|
||||
}
|
||||
|
||||
void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src)
|
||||
{
|
||||
struct SpritePalette dest;
|
||||
|
||||
LZ77UnCompWram(src->data, gDecompressionBuffer);
|
||||
dest.data = (void*) gDecompressionBuffer;
|
||||
dest.tag = src->tag;
|
||||
LoadSpritePalette(&dest);
|
||||
}
|
||||
|
||||
void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer)
|
||||
{
|
||||
struct SpritePalette dest;
|
||||
|
||||
LZ77UnCompWram(a->data, buffer);
|
||||
dest.data = buffer;
|
||||
dest.tag = a->tag;
|
||||
LoadSpritePalette(&dest);
|
||||
}
|
||||
|
||||
void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void* buffer, s32 species)
|
||||
{
|
||||
if (species > NUM_SPECIES)
|
||||
LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);
|
||||
else
|
||||
LZ77UnCompWram(src->data, buffer);
|
||||
DuplicateDeoxysTiles(buffer, species);
|
||||
}
|
||||
|
||||
void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality)
|
||||
{
|
||||
bool8 isFrontPic;
|
||||
|
||||
if (src == &gMonFrontPicTable[species])
|
||||
isFrontPic = TRUE; // frontPic
|
||||
else
|
||||
isFrontPic = FALSE; // backPic
|
||||
LoadSpecialPokePic(src, dest, species, personality, isFrontPic);
|
||||
}
|
||||
|
||||
void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic)
|
||||
{
|
||||
if (species == SPECIES_UNOWN)
|
||||
{
|
||||
u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C;
|
||||
|
||||
// The other Unowns are separate from Unown A.
|
||||
if (i == 0)
|
||||
i = SPECIES_UNOWN;
|
||||
else
|
||||
i += SPECIES_UNOWN_B - 1;
|
||||
if (!isFrontPic)
|
||||
LZ77UnCompWram(gMonBackPicTable[i].data, dest);
|
||||
else
|
||||
LZ77UnCompWram(gMonFrontPicTable[i].data, dest);
|
||||
}
|
||||
else if (species > NUM_SPECIES) // is species unknown? draw the ? icon
|
||||
LZ77UnCompWram(gMonFrontPicTable[0].data, dest);
|
||||
else
|
||||
LZ77UnCompWram(src->data, dest);
|
||||
|
||||
DuplicateDeoxysTiles(dest, species);
|
||||
DrawSpindaSpots(species, personality, dest, isFrontPic);
|
||||
}
|
||||
|
||||
static void DuplicateDeoxysTiles(void *pointer, s32 species)
|
||||
{
|
||||
if (species == SPECIES_DEOXYS)
|
||||
CpuCopy32(pointer + 0x800, pointer, 0x800);
|
||||
}
|
||||
|
||||
static void Unused_LZDecompressWramIndirect(const void **src, void *dest)
|
||||
{
|
||||
LZ77UnCompWram(*src, dest);
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING
|
||||
static void sub_800EDDC(s32 a0, s32 a1, const u8 *a2, u8 *a3)
|
||||
{
|
||||
u8 *v1, *v2;
|
||||
int i, j, k, l;
|
||||
|
||||
if (a0 & 1)
|
||||
{
|
||||
u8 v40 = ((a0 >> 1) + 4);
|
||||
for (i = 0; i < a1; ++i)
|
||||
{
|
||||
// this nested loop failed to match
|
||||
for (j = 0; j < 8 - a0; ++j)
|
||||
{
|
||||
for (k = 0; k < 8; ++k)
|
||||
{
|
||||
|
||||
v1 = a3 + 0x100 * v40 + 0x100 * (j >> 1) + 0x20 * k;
|
||||
v2 = a3 + 0x20 * k + 0x100 * (j >> 1);
|
||||
for (l = 0; l < 0x10; ++l)
|
||||
{
|
||||
if (!(j & 1))
|
||||
{
|
||||
v2[0] = j & 1;
|
||||
v1[16] = 0;
|
||||
// a3[0x100 * (j / 2) + 0x20 * k + l] = 0;
|
||||
// a3[0x100 * v40 + 0x100 * (j / 2) + 0x20 * k + l + 0x10] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
v2[16] = 0;
|
||||
v1[0x100] = 0;
|
||||
// a3[0x100 * (j / 2) + 0x20 * k + l + 0x10] = 0;
|
||||
// a3[0x100 * v40 + 0x100 * (j / 2) + 0x20 * k + l + 0x100] = 0;
|
||||
}
|
||||
++v1;
|
||||
++v2; // this should be generated if you write stuff inside operator [] instead of declaring v1/v2
|
||||
}
|
||||
}
|
||||
}
|
||||
for (j = 0; j < 2; ++j)
|
||||
{
|
||||
for (k = 0; k < 8; ++k)
|
||||
{
|
||||
for (l = 0; l < 0x20; ++l)
|
||||
{
|
||||
a3[0x100 * k + 0x20 * j + l] = 0;
|
||||
a3[0x100 * k + 0xC0 + 0x20 * j + l] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (a0 == 5)
|
||||
a3 += 0x120;
|
||||
for (j = 0; j < a0; ++j)
|
||||
{
|
||||
for (k = 0; k < a0; ++k)
|
||||
{
|
||||
for (l = 0; l < 4; ++l)
|
||||
{
|
||||
a3[0x12 + 4 * l] = a2[0 + 4 * l];
|
||||
a3[0x13 + 4 * l] = a2[1 + 4 * l];
|
||||
a3[0x12 + 0x1E + 4 * l] = a2[2 + 4 * l];
|
||||
a3[0x12 + 0x1F + 4 * l] = a2[3 + 4 * l];
|
||||
a3[0x102 + 4 * l] = a2[0x10 + 4 * l];
|
||||
a3[0x103 + 4 * l] = a2[0x11 + 4 * l];
|
||||
a3[0x120 + 4 * l] = a2[0x12 + 4 * l];
|
||||
a3[0x121 + 4 * l] = a2[0x13 + 4 * l];
|
||||
}
|
||||
a2 += 0x20;
|
||||
a3 += 0x20;
|
||||
}
|
||||
if (a0 == 7)
|
||||
a3 += 0x20;
|
||||
else if (a0 == 5)
|
||||
a3 += 0x60;
|
||||
}
|
||||
if (a0 == 7)
|
||||
a3 += 0x100;
|
||||
else if (a0 == 5)
|
||||
a3 += 0x1E0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < a1; ++i)
|
||||
{
|
||||
if (a0 == 6)
|
||||
for (j = 0; j < 0x100; ++j)
|
||||
*a3++ = 0;
|
||||
for (j = 0; j < a0; ++j)
|
||||
{
|
||||
if (a0 == 6)
|
||||
for (k = 0; k < 0x20; ++k)
|
||||
*a3++ = 0;
|
||||
for (k = 0; k < 0x20 * a0; ++k)
|
||||
*a3++ = *a2++;
|
||||
if (a0 == 6)
|
||||
for (k = 0; k < 0x20; ++k)
|
||||
*a3++ = 0;
|
||||
}
|
||||
if (a0 == 6)
|
||||
for (j = 0; j < 0x100; ++j)
|
||||
*a3++ = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
NAKED
|
||||
static void sub_800EDDC(s32 a0, s32 a1, const u8 *a2, u8 *a3)
|
||||
{
|
||||
asm_unified("\n\
|
||||
push {r4-r7,lr}\n\
|
||||
mov r7, r10\n\
|
||||
mov r6, r9\n\
|
||||
mov r5, r8\n\
|
||||
push {r5-r7}\n\
|
||||
sub sp, 0x24\n\
|
||||
mov r9, r0\n\
|
||||
str r1, [sp]\n\
|
||||
str r2, [sp, 0x4]\n\
|
||||
adds r5, r3, 0\n\
|
||||
movs r0, 0x1\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
cmp r0, 0\n\
|
||||
bne _0800EDFC\n\
|
||||
b _0800EF94\n\
|
||||
_0800EDFC:\n\
|
||||
asrs r0, r1, 1\n\
|
||||
adds r0, 0x4\n\
|
||||
lsls r0, 24\n\
|
||||
lsrs r0, 24\n\
|
||||
str r0, [sp, 0x8]\n\
|
||||
movs r0, 0\n\
|
||||
ldr r2, [sp]\n\
|
||||
cmp r0, r2\n\
|
||||
blt _0800EE10\n\
|
||||
b _0800F024\n\
|
||||
_0800EE10:\n\
|
||||
movs r4, 0x8\n\
|
||||
subs r1, r4, r1\n\
|
||||
str r1, [sp, 0x10]\n\
|
||||
_0800EE16:\n\
|
||||
movs r7, 0\n\
|
||||
adds r0, 0x1\n\
|
||||
str r0, [sp, 0x14]\n\
|
||||
ldr r0, [sp, 0x10]\n\
|
||||
cmp r7, r0\n\
|
||||
bge _0800EE92\n\
|
||||
ldr r1, [sp, 0x8]\n\
|
||||
lsls r1, 8\n\
|
||||
str r1, [sp, 0x18]\n\
|
||||
movs r2, 0\n\
|
||||
mov r10, r2\n\
|
||||
mov r0, r9\n\
|
||||
movs r4, 0x8\n\
|
||||
subs r0, r4, r0\n\
|
||||
str r0, [sp, 0xC]\n\
|
||||
_0800EE34:\n\
|
||||
movs r3, 0\n\
|
||||
asrs r0, r7, 1\n\
|
||||
adds r1, r7, 0\n\
|
||||
movs r2, 0x1\n\
|
||||
ands r1, r2\n\
|
||||
str r1, [sp, 0x20]\n\
|
||||
lsls r0, 8\n\
|
||||
mov r8, r0\n\
|
||||
mov r12, r5\n\
|
||||
_0800EE46:\n\
|
||||
lsls r1, r3, 5\n\
|
||||
ldr r4, [sp, 0x18]\n\
|
||||
adds r0, r5, r4\n\
|
||||
adds r0, r1\n\
|
||||
mov r1, r8\n\
|
||||
adds r2, r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
add r1, r8\n\
|
||||
movs r6, 0xF\n\
|
||||
_0800EE58:\n\
|
||||
ldr r4, [sp, 0x20]\n\
|
||||
cmp r4, 0\n\
|
||||
bne _0800EE68\n\
|
||||
strb r4, [r1]\n\
|
||||
add r4, sp, 0x20\n\
|
||||
ldrb r4, [r4]\n\
|
||||
strb r4, [r2, 0x10]\n\
|
||||
b _0800EE76\n\
|
||||
_0800EE68:\n\
|
||||
mov r0, r10\n\
|
||||
strb r0, [r1, 0x10]\n\
|
||||
movs r4, 0x80\n\
|
||||
lsls r4, 1\n\
|
||||
adds r4, r2, r4\n\
|
||||
str r4, [sp, 0x1C]\n\
|
||||
strb r0, [r4]\n\
|
||||
_0800EE76:\n\
|
||||
adds r2, 0x1\n\
|
||||
adds r1, 0x1\n\
|
||||
subs r6, 0x1\n\
|
||||
cmp r6, 0\n\
|
||||
bge _0800EE58\n\
|
||||
movs r0, 0x20\n\
|
||||
add r12, r0\n\
|
||||
adds r3, 0x1\n\
|
||||
cmp r3, 0x7\n\
|
||||
ble _0800EE46\n\
|
||||
adds r7, 0x1\n\
|
||||
ldr r1, [sp, 0xC]\n\
|
||||
cmp r7, r1\n\
|
||||
blt _0800EE34\n\
|
||||
_0800EE92:\n\
|
||||
movs r7, 0\n\
|
||||
movs r2, 0\n\
|
||||
_0800EE96:\n\
|
||||
movs r6, 0\n\
|
||||
adds r4, r7, 0x1\n\
|
||||
mov r8, r4\n\
|
||||
lsls r4, r7, 5\n\
|
||||
_0800EE9E:\n\
|
||||
adds r0, r6, 0x1\n\
|
||||
mov r10, r0\n\
|
||||
lsls r1, r6, 8\n\
|
||||
adds r0, r1, 0\n\
|
||||
adds r0, 0xC0\n\
|
||||
adds r0, r5, r0\n\
|
||||
adds r0, r4\n\
|
||||
adds r1, r5, r1\n\
|
||||
adds r1, r4\n\
|
||||
movs r3, 0x1F\n\
|
||||
_0800EEB2:\n\
|
||||
strb r2, [r1]\n\
|
||||
strb r2, [r0]\n\
|
||||
adds r0, 0x1\n\
|
||||
adds r1, 0x1\n\
|
||||
subs r3, 0x1\n\
|
||||
cmp r3, 0\n\
|
||||
bge _0800EEB2\n\
|
||||
mov r6, r10\n\
|
||||
cmp r6, 0x7\n\
|
||||
ble _0800EE9E\n\
|
||||
mov r7, r8\n\
|
||||
cmp r7, 0x1\n\
|
||||
ble _0800EE96\n\
|
||||
mov r1, r9\n\
|
||||
cmp r1, 0x5\n\
|
||||
bne _0800EED8\n\
|
||||
movs r2, 0x90\n\
|
||||
lsls r2, 1\n\
|
||||
adds r5, r2\n\
|
||||
_0800EED8:\n\
|
||||
movs r7, 0\n\
|
||||
cmp r7, r9\n\
|
||||
bge _0800EF6E\n\
|
||||
_0800EEDE:\n\
|
||||
movs r3, 0\n\
|
||||
adds r7, 0x1\n\
|
||||
mov r8, r7\n\
|
||||
cmp r3, r9\n\
|
||||
bge _0800EF4E\n\
|
||||
_0800EEE8:\n\
|
||||
adds r3, 0x1\n\
|
||||
mov r10, r3\n\
|
||||
ldr r4, [sp, 0x4]\n\
|
||||
adds r4, 0x20\n\
|
||||
adds r7, r5, 0\n\
|
||||
adds r7, 0x20\n\
|
||||
movs r0, 0x12\n\
|
||||
adds r0, r5\n\
|
||||
mov r12, r0\n\
|
||||
ldr r2, [sp, 0x4]\n\
|
||||
adds r3, r5, 0\n\
|
||||
movs r6, 0x3\n\
|
||||
_0800EF00:\n\
|
||||
ldrb r0, [r2]\n\
|
||||
mov r1, r12\n\
|
||||
strb r0, [r1]\n\
|
||||
ldrb r0, [r2, 0x1]\n\
|
||||
strb r0, [r1, 0x1]\n\
|
||||
ldrb r0, [r2, 0x2]\n\
|
||||
strb r0, [r1, 0x1E]\n\
|
||||
ldrb r0, [r2, 0x3]\n\
|
||||
strb r0, [r1, 0x1F]\n\
|
||||
movs r0, 0x81\n\
|
||||
lsls r0, 1\n\
|
||||
adds r1, r3, r0\n\
|
||||
ldrb r0, [r2, 0x10]\n\
|
||||
strb r0, [r1]\n\
|
||||
ldr r0, _0800EF58 @ =0x00000103\n\
|
||||
adds r1, r3, r0\n\
|
||||
ldrb r0, [r2, 0x11]\n\
|
||||
strb r0, [r1]\n\
|
||||
movs r0, 0x90\n\
|
||||
lsls r0, 1\n\
|
||||
adds r1, r3, r0\n\
|
||||
ldrb r0, [r2, 0x12]\n\
|
||||
strb r0, [r1]\n\
|
||||
ldr r0, _0800EF5C @ =0x00000121\n\
|
||||
adds r1, r3, r0\n\
|
||||
ldrb r0, [r2, 0x13]\n\
|
||||
strb r0, [r1]\n\
|
||||
movs r1, 0x4\n\
|
||||
add r12, r1\n\
|
||||
adds r2, 0x4\n\
|
||||
adds r3, 0x4\n\
|
||||
subs r6, 0x1\n\
|
||||
cmp r6, 0\n\
|
||||
bge _0800EF00\n\
|
||||
str r4, [sp, 0x4]\n\
|
||||
adds r5, r7, 0\n\
|
||||
mov r3, r10\n\
|
||||
cmp r3, r9\n\
|
||||
blt _0800EEE8\n\
|
||||
_0800EF4E:\n\
|
||||
mov r2, r9\n\
|
||||
cmp r2, 0x7\n\
|
||||
bne _0800EF60\n\
|
||||
adds r5, 0x20\n\
|
||||
b _0800EF68\n\
|
||||
.align 2, 0\n\
|
||||
_0800EF58: .4byte 0x00000103\n\
|
||||
_0800EF5C: .4byte 0x00000121\n\
|
||||
_0800EF60:\n\
|
||||
mov r4, r9\n\
|
||||
cmp r4, 0x5\n\
|
||||
bne _0800EF68\n\
|
||||
adds r5, 0x60\n\
|
||||
_0800EF68:\n\
|
||||
mov r7, r8\n\
|
||||
cmp r7, r9\n\
|
||||
blt _0800EEDE\n\
|
||||
_0800EF6E:\n\
|
||||
mov r0, r9\n\
|
||||
cmp r0, 0x7\n\
|
||||
bne _0800EF7C\n\
|
||||
movs r1, 0x80\n\
|
||||
lsls r1, 1\n\
|
||||
adds r5, r1\n\
|
||||
b _0800EF88\n\
|
||||
_0800EF7C:\n\
|
||||
mov r2, r9\n\
|
||||
cmp r2, 0x5\n\
|
||||
bne _0800EF88\n\
|
||||
movs r4, 0xF0\n\
|
||||
lsls r4, 1\n\
|
||||
adds r5, r4\n\
|
||||
_0800EF88:\n\
|
||||
ldr r0, [sp, 0x14]\n\
|
||||
ldr r1, [sp]\n\
|
||||
cmp r0, r1\n\
|
||||
bge _0800EF92\n\
|
||||
b _0800EE16\n\
|
||||
_0800EF92:\n\
|
||||
b _0800F024\n\
|
||||
_0800EF94:\n\
|
||||
movs r6, 0\n\
|
||||
ldr r2, [sp]\n\
|
||||
cmp r6, r2\n\
|
||||
bge _0800F024\n\
|
||||
_0800EF9C:\n\
|
||||
adds r6, 0x1\n\
|
||||
mov r10, r6\n\
|
||||
mov r4, r9\n\
|
||||
cmp r4, 0x6\n\
|
||||
bne _0800EFB4\n\
|
||||
movs r0, 0\n\
|
||||
movs r3, 0xFF\n\
|
||||
_0800EFAA:\n\
|
||||
strb r0, [r5]\n\
|
||||
adds r5, 0x1\n\
|
||||
subs r3, 0x1\n\
|
||||
cmp r3, 0\n\
|
||||
bge _0800EFAA\n\
|
||||
_0800EFB4:\n\
|
||||
movs r7, 0\n\
|
||||
cmp r7, r9\n\
|
||||
bge _0800F008\n\
|
||||
_0800EFBA:\n\
|
||||
adds r7, 0x1\n\
|
||||
mov r8, r7\n\
|
||||
mov r1, r9\n\
|
||||
lsls r0, r1, 5\n\
|
||||
cmp r1, 0x6\n\
|
||||
bne _0800EFD4\n\
|
||||
movs r1, 0\n\
|
||||
movs r3, 0x1F\n\
|
||||
_0800EFCA:\n\
|
||||
strb r1, [r5]\n\
|
||||
adds r5, 0x1\n\
|
||||
subs r3, 0x1\n\
|
||||
cmp r3, 0\n\
|
||||
bge _0800EFCA\n\
|
||||
_0800EFD4:\n\
|
||||
adds r1, r0, 0\n\
|
||||
cmp r1, 0\n\
|
||||
ble _0800EFEE\n\
|
||||
adds r3, r1, 0\n\
|
||||
_0800EFDC:\n\
|
||||
ldr r2, [sp, 0x4]\n\
|
||||
ldrb r0, [r2]\n\
|
||||
strb r0, [r5]\n\
|
||||
adds r2, 0x1\n\
|
||||
str r2, [sp, 0x4]\n\
|
||||
adds r5, 0x1\n\
|
||||
subs r3, 0x1\n\
|
||||
cmp r3, 0\n\
|
||||
bne _0800EFDC\n\
|
||||
_0800EFEE:\n\
|
||||
mov r4, r9\n\
|
||||
cmp r4, 0x6\n\
|
||||
bne _0800F002\n\
|
||||
movs r0, 0\n\
|
||||
movs r3, 0x1F\n\
|
||||
_0800EFF8:\n\
|
||||
strb r0, [r5]\n\
|
||||
adds r5, 0x1\n\
|
||||
subs r3, 0x1\n\
|
||||
cmp r3, 0\n\
|
||||
bge _0800EFF8\n\
|
||||
_0800F002:\n\
|
||||
mov r7, r8\n\
|
||||
cmp r7, r9\n\
|
||||
blt _0800EFBA\n\
|
||||
_0800F008:\n\
|
||||
mov r0, r9\n\
|
||||
cmp r0, 0x6\n\
|
||||
bne _0800F01C\n\
|
||||
movs r0, 0\n\
|
||||
movs r3, 0xFF\n\
|
||||
_0800F012:\n\
|
||||
strb r0, [r5]\n\
|
||||
adds r5, 0x1\n\
|
||||
subs r3, 0x1\n\
|
||||
cmp r3, 0\n\
|
||||
bge _0800F012\n\
|
||||
_0800F01C:\n\
|
||||
mov r6, r10\n\
|
||||
ldr r1, [sp]\n\
|
||||
cmp r6, r1\n\
|
||||
blt _0800EF9C\n\
|
||||
_0800F024:\n\
|
||||
add sp, 0x24\n\
|
||||
pop {r3-r5}\n\
|
||||
mov r8, r3\n\
|
||||
mov r9, r4\n\
|
||||
mov r10, r5\n\
|
||||
pop {r4-r7}\n\
|
||||
pop {r0}\n\
|
||||
bx r0\n\
|
||||
");
|
||||
}
|
||||
#endif
|
||||
|
||||
bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src)
|
||||
{
|
||||
struct SpriteSheet dest;
|
||||
void* buffer;
|
||||
|
||||
buffer = AllocZeroed(*((u32*)src->data) >> 8);
|
||||
if (!buffer)
|
||||
return TRUE;
|
||||
LZ77UnCompWram(src->data, buffer);
|
||||
dest.data = buffer;
|
||||
dest.size = src->size;
|
||||
dest.tag = src->tag;
|
||||
LoadSpriteSheet(&dest);
|
||||
Free(buffer);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src)
|
||||
{
|
||||
struct SpritePalette dest;
|
||||
void* buffer;
|
||||
|
||||
buffer = AllocZeroed(*((u32*)src->data) >> 8);
|
||||
if (!buffer)
|
||||
return TRUE;
|
||||
LZ77UnCompWram(src->data, buffer);
|
||||
dest.data = buffer;
|
||||
dest.tag = src->tag;
|
||||
LoadSpritePalette(&dest);
|
||||
Free(buffer);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u32 GetDecompressedDataSize(const u8 *ptr)
|
||||
{
|
||||
u32 ptr32[1];
|
||||
u8 *ptr8 = (u8 *)ptr32;
|
||||
|
||||
ptr8[0] = ptr[1];
|
||||
ptr8[1] = ptr[2];
|
||||
ptr8[2] = ptr[3];
|
||||
ptr8[3] = 0;
|
||||
return ptr32[0];
|
||||
}
|
||||
|
||||
void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void* buffer, s32 species)
|
||||
{
|
||||
if (species > NUM_SPECIES)
|
||||
LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);
|
||||
else
|
||||
LZ77UnCompWram(src->data, buffer);
|
||||
}
|
||||
|
||||
void HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality)
|
||||
{
|
||||
bool8 isFrontPic;
|
||||
|
||||
if (src == &gMonFrontPicTable[species])
|
||||
isFrontPic = TRUE; // frontPic
|
||||
else
|
||||
isFrontPic = FALSE; // backPic
|
||||
LoadSpecialPokePic_DontHandleDeoxys(src, dest, species, personality, isFrontPic);
|
||||
}
|
||||
|
||||
void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic)
|
||||
{
|
||||
if (species == SPECIES_UNOWN)
|
||||
{
|
||||
u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C;
|
||||
|
||||
// The other Unowns are separate from Unown A.
|
||||
if (i == 0)
|
||||
i = SPECIES_UNOWN;
|
||||
else
|
||||
i += SPECIES_UNOWN_B - 1;
|
||||
if (!isFrontPic)
|
||||
LZ77UnCompWram(gMonBackPicTable[i].data, dest);
|
||||
else
|
||||
LZ77UnCompWram(gMonFrontPicTable[i].data, dest);
|
||||
}
|
||||
else if (species > NUM_SPECIES) // is species unknown? draw the ? icon
|
||||
{
|
||||
LZ77UnCompWram(gMonFrontPicTable[0].data, dest);
|
||||
}
|
||||
else
|
||||
{
|
||||
LZ77UnCompWram(src->data, dest);
|
||||
}
|
||||
DrawSpindaSpots(species, personality, dest, isFrontPic);
|
||||
}
|
||||
+285
@@ -0,0 +1,285 @@
|
||||
#include "global.h"
|
||||
#include "bg.h"
|
||||
#include "constants/fanfares.h"
|
||||
#include "dynamic_placeholder_text_util.h"
|
||||
#include "gba/macro.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "main.h"
|
||||
#include "malloc.h"
|
||||
#include "menu.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "overworld.h"
|
||||
#include "palette.h"
|
||||
#include "pokedex.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "sound.h"
|
||||
#include "sprite.h"
|
||||
#include "strings.h"
|
||||
#include "task.h"
|
||||
#include "text.h"
|
||||
#include "window.h"
|
||||
#include "diploma.h"
|
||||
|
||||
struct Diploma
|
||||
{
|
||||
u8 state;
|
||||
u8 gfxStep;
|
||||
u8 callbackStep;
|
||||
u16 tilemapBuffer[0x800];
|
||||
};
|
||||
|
||||
static EWRAM_DATA struct Diploma *gDiploma = NULL;
|
||||
|
||||
static void DiplomaBgInit(void);
|
||||
static void DiplomaPrintText(void);
|
||||
static u8 DiplomaLoadGfx(void);
|
||||
static void DiplomaVblankHandler(void);
|
||||
static void CB2_DiplomaInit(void);
|
||||
static void Task_WaitForExit(u8);
|
||||
static void Task_DiplomaInit(u8);
|
||||
static void Task_DiplomaReturnToOverworld(u8);
|
||||
|
||||
static const u32 gUnknown_84147C0[] = INCBIN_U32("graphics/diploma/unk_84147C0.4bpp.lz");
|
||||
static const u32 gUnknown_84154E8[] = INCBIN_U32("graphics/diploma/unk_84154E8.bin.lz");
|
||||
static const u16 gUnknown_8415954[] = INCBIN_U16("graphics/diploma/unk_8415954.gbapal");
|
||||
|
||||
static const u8 gUnknown_8415994[] = _("{HIGHLIGHT TRANSPARENT}プレイヤー");
|
||||
static const u8 gUnknown_841599D[] = _("{HIGHLIGHT TRANSPARENT}さま");
|
||||
static const u8 gUnknown_84159A3[] = _("{HIGHLIGHT TRANSPARENT}ホウエン");
|
||||
static const u8 gUnknown_84159AB[] = _("{HIGHLIGHT TRANSPARENT}ぜんこく");
|
||||
static const u8 gUnknown_84159B3[] = _("{HIGHLIGHT TRANSPARENT} ポケモンずかんを\nみごと かんせい させた\nいだいなこうせきを たたえ\nここに しょうめい します");
|
||||
static const u8 gUnknown_84159ED[] = _("{COLOR RED}{HIGHLIGHT TRANSPARENT}ゲームフリーク");
|
||||
static const u8 gUnknown_84159FB[] = _("{COLOR RED}{HIGHLIGHT TRANSPARENT}");
|
||||
|
||||
static const ALIGNED(4) struct TextColor gUnknown_8415A04 = {0, 2, 3};
|
||||
|
||||
static const struct BgTemplate gUnknown_8415A08[] = {
|
||||
{
|
||||
.bg = 0,
|
||||
.charBaseIndex = 0,
|
||||
.mapBaseIndex = 31,
|
||||
.screenSize = 0,
|
||||
.paletteMode = 0,
|
||||
.priority = 0,
|
||||
.baseTile = 1,
|
||||
}, {
|
||||
.bg = 1,
|
||||
.charBaseIndex = 1,
|
||||
.mapBaseIndex = 29,
|
||||
.screenSize = 1,
|
||||
.paletteMode = 0,
|
||||
.priority = 1,
|
||||
.baseTile = 0,
|
||||
}
|
||||
};
|
||||
|
||||
static const struct WindowTemplate gUnknown_8415A10[] = {
|
||||
{
|
||||
.bg = 0,
|
||||
.tilemapLeft = 0,
|
||||
.tilemapTop = 2,
|
||||
.width = 29,
|
||||
.height = 16,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x000
|
||||
}, DUMMY_WIN_TEMPLATE
|
||||
};
|
||||
|
||||
static void VCBC_DiplomaOam(void)
|
||||
{
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
}
|
||||
|
||||
void CB2_ShowDiploma(void)
|
||||
{
|
||||
gDiploma = AllocZeroed(sizeof(*gDiploma));
|
||||
gDiploma->state = 0;
|
||||
gDiploma->gfxStep = 0;
|
||||
gDiploma->callbackStep = 0;
|
||||
DiplomaBgInit();
|
||||
CreateTask(Task_DiplomaInit, 0);
|
||||
SetMainCallback2(CB2_DiplomaInit);
|
||||
}
|
||||
|
||||
static void CB2_DiplomaInit(void)
|
||||
{
|
||||
RunTasks();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
static void Task_DiplomaInit(u8 taskId)
|
||||
{
|
||||
switch (gDiploma->callbackStep)
|
||||
{
|
||||
case 0:
|
||||
SetVBlankCallback(NULL);
|
||||
break;
|
||||
case 1:
|
||||
DiplomaVblankHandler();
|
||||
break;
|
||||
case 2:
|
||||
if (!DiplomaLoadGfx())
|
||||
{
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
CopyToBgTilemapBuffer(1, gUnknown_84154E8, 0, 0);
|
||||
break;
|
||||
case 4:
|
||||
if (HasAllKantoMons())
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BG1HOFS, 0x80 << 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
DiplomaPrintText();
|
||||
break;
|
||||
case 6:
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
break;
|
||||
case 7:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
|
||||
break;
|
||||
case 8:
|
||||
SetVBlankCallback(VCBC_DiplomaOam);
|
||||
break;
|
||||
default:
|
||||
if (gPaletteFade.active)
|
||||
{
|
||||
break;
|
||||
}
|
||||
PlayFanfareByFanfareNum(FANFARE_05);
|
||||
gTasks[taskId].func = Task_WaitForExit;
|
||||
}
|
||||
gDiploma->callbackStep++;
|
||||
}
|
||||
|
||||
static void Task_WaitForExit(u8 taskId)
|
||||
{
|
||||
switch (gDiploma->state)
|
||||
{
|
||||
case 0:
|
||||
if (WaitFanfare(0))
|
||||
{
|
||||
gDiploma->state++;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
|
||||
gDiploma->state++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
Task_DiplomaReturnToOverworld(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_DiplomaReturnToOverworld(u8 taskId)
|
||||
{
|
||||
if (gPaletteFade.active)
|
||||
return;
|
||||
DestroyTask(taskId);
|
||||
FreeAllWindowBuffers();
|
||||
FREE_AND_SET_NULL(gDiploma);
|
||||
SetMainCallback2(CB2_Overworld);
|
||||
}
|
||||
|
||||
static void DiplomaBgInit(void)
|
||||
{
|
||||
ResetSpriteData();
|
||||
ResetPaletteFade();
|
||||
FreeAllSpritePalettes();
|
||||
ResetTasks();
|
||||
ScanlineEffect_Stop();
|
||||
}
|
||||
|
||||
static void DiplomaVblankHandler(void)
|
||||
{
|
||||
void *vram = (void *)VRAM;
|
||||
DmaClearLarge16(3, vram, VRAM_SIZE, 0x1000);
|
||||
DmaClear32(3, (void *)OAM, OAM_SIZE);
|
||||
DmaClear16(3, (void *)PLTT, PLTT_SIZE);
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, 0);
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, gUnknown_8415A08, 2);
|
||||
ChangeBgX(0, 0, 0);
|
||||
ChangeBgY(0, 0, 0);
|
||||
ChangeBgX(1, 0, 0);
|
||||
ChangeBgY(1, 0, 0);
|
||||
ChangeBgX(2, 0, 0);
|
||||
ChangeBgY(2, 0, 0);
|
||||
ChangeBgX(3, 0, 0);
|
||||
ChangeBgY(3, 0, 0);
|
||||
InitWindows(gUnknown_8415A10);
|
||||
DeactivateAllTextPrinters();
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
|
||||
SetBgTilemapBuffer(1, gDiploma->tilemapBuffer);
|
||||
ShowBg(0);
|
||||
ShowBg(1);
|
||||
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20);
|
||||
}
|
||||
|
||||
static u8 DiplomaLoadGfx(void)
|
||||
{
|
||||
switch (gDiploma->gfxStep)
|
||||
{
|
||||
case 0:
|
||||
ResetTempTileDataBuffers();
|
||||
break;
|
||||
case 1:
|
||||
DecompressAndCopyTileDataToVram(1, gUnknown_84147C0, 0, 0, 0);
|
||||
break;
|
||||
case 2:
|
||||
if (!(FreeTempTileDataBuffersIfPossible() == 1))
|
||||
{
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
case 3:
|
||||
LoadPalette(gUnknown_8415954, 0, 0x40);
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
gDiploma->gfxStep++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void DiplomaPrintText(void)
|
||||
{
|
||||
u8 arr[160];
|
||||
u32 width;
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
|
||||
if (HasAllKantoMons())
|
||||
{
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841B68F);
|
||||
}
|
||||
else
|
||||
{
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841B698);
|
||||
}
|
||||
FillWindowPixelBuffer(0, 0);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(arr, gUnknown_841B60E);
|
||||
width = GetStringWidth(2, arr, -1);
|
||||
AddTextPrinterParameterized3(0, 2, 0x78 - (width / 2), 4, &gUnknown_8415A04, -1, arr);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(arr, gUnknown_841B619);
|
||||
width = GetStringWidth(2, arr, -1);
|
||||
AddTextPrinterParameterized3(0, 0x2, 0x78 - (width / 2), 0x1E, &gUnknown_8415A04, -1, arr);
|
||||
AddTextPrinterParameterized3(0, 0x2, 0x78, 0x69, &gUnknown_8415A04, 0, gUnknown_841B684);
|
||||
PutWindowTilemap(0);
|
||||
}
|
||||
+38
-375
@@ -1,6 +1,13 @@
|
||||
#include "global.h"
|
||||
#include "dma3.h"
|
||||
|
||||
#define MAX_DMA_REQUESTS 128
|
||||
|
||||
#define DMA_REQUEST_COPY32 1
|
||||
#define DMA_REQUEST_FILL32 2
|
||||
#define DMA_REQUEST_COPY16 3
|
||||
#define DMA_REQUEST_FILL16 4
|
||||
|
||||
static /*IWRAM_DATA*/ struct {
|
||||
/* 0x00 */ const u8 *src;
|
||||
/* 0x04 */ u8 *dest;
|
||||
@@ -9,7 +16,7 @@ static /*IWRAM_DATA*/ struct {
|
||||
/* 0x0C */ u32 value;
|
||||
} gDma3Requests[128];
|
||||
|
||||
static bool8 gDma3ManagerLocked;
|
||||
static volatile bool8 gDma3ManagerLocked;
|
||||
static u8 gDma3RequestCursor;
|
||||
|
||||
void ClearDma3Requests(void)
|
||||
@@ -29,78 +36,50 @@ void ClearDma3Requests(void)
|
||||
gDma3ManagerLocked = FALSE;
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING
|
||||
void ProcessDma3Requests(void)
|
||||
{
|
||||
// NOTE: the fillerA member of the DMA struct is actually u32 value;
|
||||
u16 total_size;
|
||||
u16 bytesTransferred;
|
||||
|
||||
if (gDma3ManagerLocked)
|
||||
return;
|
||||
|
||||
total_size = 0;
|
||||
bytesTransferred = 0;
|
||||
|
||||
// as long as there are DMA requests to process (unless size or vblank is an issue), do not exit
|
||||
while (gDma3Requests[gDma3RequestCursor].size)
|
||||
while (gDma3Requests[gDma3RequestCursor].size != 0)
|
||||
{
|
||||
total_size += gDma3Requests[gDma3RequestCursor].size;
|
||||
bytesTransferred += gDma3Requests[gDma3RequestCursor].size;
|
||||
|
||||
if (total_size > 0xA000)
|
||||
return; // don't do too much at once
|
||||
|
||||
if (REG_VCOUNT > 224)
|
||||
return;// we're about to leave vblank, stop
|
||||
if (bytesTransferred > 40 * 1024)
|
||||
return; // don't transfer more than 40 KiB
|
||||
if (*(u8 *)REG_ADDR_VCOUNT > 224)
|
||||
return; // we're about to leave vblank, stop
|
||||
|
||||
switch (gDma3Requests[gDma3RequestCursor].mode)
|
||||
{
|
||||
case 1: // regular 32-bit copy
|
||||
// _08000C8C
|
||||
if(gDma3Requests[gDma3RequestCursor].size <= 0x1000)
|
||||
{
|
||||
DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
|
||||
break;
|
||||
}
|
||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
||||
{
|
||||
DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
|
||||
gDma3Requests[gDma3RequestCursor].src += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
|
||||
}
|
||||
DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
|
||||
case DMA_REQUEST_COPY32: // regular 32-bit copy
|
||||
Dma3CopyLarge32_(gDma3Requests[gDma3RequestCursor].src,
|
||||
gDma3Requests[gDma3RequestCursor].dest,
|
||||
gDma3Requests[gDma3RequestCursor].size);
|
||||
break;
|
||||
case 2: // repeat a single 32-bit value across RAM
|
||||
// _08000CD0
|
||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
||||
{
|
||||
DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
|
||||
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
|
||||
}
|
||||
DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
|
||||
case DMA_REQUEST_FILL32: // repeat a single 32-bit value across RAM
|
||||
Dma3FillLarge32_(gDma3Requests[gDma3RequestCursor].value,
|
||||
gDma3Requests[gDma3RequestCursor].dest,
|
||||
gDma3Requests[gDma3RequestCursor].size);
|
||||
break;
|
||||
case 3: // regular 16-bit copy
|
||||
// _08000D3C
|
||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
||||
{
|
||||
DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
|
||||
gDma3Requests[gDma3RequestCursor].src += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
|
||||
}
|
||||
DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
|
||||
case DMA_REQUEST_COPY16: // regular 16-bit copy
|
||||
Dma3CopyLarge16_(gDma3Requests[gDma3RequestCursor].src,
|
||||
gDma3Requests[gDma3RequestCursor].dest,
|
||||
gDma3Requests[gDma3RequestCursor].size);
|
||||
break;
|
||||
case 4: // repeat a single 16-bit value across RAM
|
||||
// _08000D88
|
||||
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
|
||||
{
|
||||
DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
|
||||
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
|
||||
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
|
||||
}
|
||||
DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
|
||||
case DMA_REQUEST_FILL16: // repeat a single 16-bit value across RAM
|
||||
Dma3FillLarge16_(gDma3Requests[gDma3RequestCursor].value,
|
||||
gDma3Requests[gDma3RequestCursor].dest,
|
||||
gDma3Requests[gDma3RequestCursor].size);
|
||||
break;
|
||||
}
|
||||
|
||||
// Free the request
|
||||
gDma3Requests[gDma3RequestCursor].src = NULL;
|
||||
gDma3Requests[gDma3RequestCursor].dest = NULL;
|
||||
gDma3Requests[gDma3RequestCursor].size = 0;
|
||||
@@ -108,328 +87,12 @@ void ProcessDma3Requests(void)
|
||||
gDma3Requests[gDma3RequestCursor].value = 0;
|
||||
gDma3RequestCursor++;
|
||||
|
||||
if (gDma3RequestCursor >= 128) // loop back to the first DMA request
|
||||
if (gDma3RequestCursor >= MAX_DMA_REQUESTS) // loop back to the first DMA request
|
||||
gDma3RequestCursor = 0;
|
||||
}
|
||||
}
|
||||
#else
|
||||
__attribute__((naked))
|
||||
void ProcessDma3Requests(void)
|
||||
{
|
||||
asm(".syntax unified\n\
|
||||
push {r4-r7,lr}\n\
|
||||
mov r7, r10\n\
|
||||
mov r6, r9\n\
|
||||
mov r5, r8\n\
|
||||
push {r5-r7}\n\
|
||||
sub sp, 0xC\n\
|
||||
ldr r0, =gDma3ManagerLocked\n\
|
||||
ldrb r0, [r0]\n\
|
||||
cmp r0, 0\n\
|
||||
beq _08000C06\n\
|
||||
b _08000E46\n\
|
||||
_08000C06:\n\
|
||||
movs r0, 0\n\
|
||||
str r0, [sp, 0x8]\n\
|
||||
ldr r1, =gDma3Requests\n\
|
||||
ldr r2, =gDma3RequestCursor\n\
|
||||
ldrb r0, [r2]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r0, r1\n\
|
||||
ldrh r0, [r0, 0x8]\n\
|
||||
mov r12, r2\n\
|
||||
cmp r0, 0\n\
|
||||
bne _08000C1E\n\
|
||||
b _08000E46\n\
|
||||
_08000C1E:\n\
|
||||
mov r8, r1\n\
|
||||
adds r1, 0x4\n\
|
||||
mov r10, r1\n\
|
||||
movs r6, 0x80\n\
|
||||
lsls r6, 5\n\
|
||||
ldr r7, =0x040000D4 @REG_DMA3\n\
|
||||
movs r2, 0\n\
|
||||
mov r9, r2\n\
|
||||
_08000C2E:\n\
|
||||
mov r3, r12 @ gDma3RequestCursor\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r5, r0, 4\n\
|
||||
mov r0, r8 @ gDma3Requests\n\
|
||||
adds r1, r5, r0 @ gDma3Requests[gDma3RequestCursor]\n\
|
||||
ldrh r0, [r1, 0x8] @ gDma3Requests[gDma3RequestCursor].size\n\
|
||||
ldr r2, [sp, 0x8]\n\
|
||||
adds r0, r2, r0\n\
|
||||
lsls r0, 16\n\
|
||||
lsrs r0, 16\n\
|
||||
str r0, [sp, 0x8]\n\
|
||||
movs r0, 0xA0\n\
|
||||
lsls r0, 8\n\
|
||||
ldr r3, [sp, 0x8]\n\
|
||||
cmp r3, r0\n\
|
||||
bls _08000C50\n\
|
||||
b _08000E46\n\
|
||||
_08000C50:\n\
|
||||
ldr r0, =0x04000006 @REG_VCOUNT\n\
|
||||
ldrb r0, [r0]\n\
|
||||
cmp r0, 0xE0\n\
|
||||
bls _08000C5A\n\
|
||||
b _08000E46\n\
|
||||
_08000C5A:\n\
|
||||
ldrh r0, [r1, 0xA]\n\
|
||||
cmp r0, 0x2\n\
|
||||
beq _08000CD0\n\
|
||||
cmp r0, 0x2\n\
|
||||
bgt _08000C80\n\
|
||||
cmp r0, 0x1\n\
|
||||
beq _08000C8C\n\
|
||||
b _08000DF0\n\
|
||||
.pool\n\
|
||||
_08000C80:\n\
|
||||
cmp r0, 0x3\n\
|
||||
beq _08000D3C\n\
|
||||
cmp r0, 0x4\n\
|
||||
bne _08000C8A\n\
|
||||
b _08000D88\n\
|
||||
_08000C8A:\n\
|
||||
b _08000DF0\n\
|
||||
_08000C8C:\n\
|
||||
ldr r3, [r1]\n\
|
||||
mov r2, r10\n\
|
||||
adds r0, r5, r2\n\
|
||||
ldr r2, [r0]\n\
|
||||
ldrh r1, [r1, 0x8]\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000CA6\n\
|
||||
str r3, [r7]\n\
|
||||
str r2, [r7, 0x4]\n\
|
||||
lsrs r0, r1, 2\n\
|
||||
movs r1, 0x84\n\
|
||||
lsls r1, 24\n\
|
||||
b _08000DAA\n\
|
||||
_08000CA6:\n\
|
||||
ldr r4, =0x040000D4 @REG_DMA3\n\
|
||||
str r3, [r4]\n\
|
||||
str r2, [r4, 0x4]\n\
|
||||
ldr r0, =0x84000400\n\
|
||||
str r0, [r4, 0x8]\n\
|
||||
ldr r0, [r4, 0x8]\n\
|
||||
adds r3, r6\n\
|
||||
adds r2, r6\n\
|
||||
subs r1, r6\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000CA6\n\
|
||||
str r3, [r4]\n\
|
||||
str r2, [r4, 0x4]\n\
|
||||
lsrs r0, r1, 2\n\
|
||||
movs r1, 0x84\n\
|
||||
lsls r1, 24\n\
|
||||
b _08000D76\n\
|
||||
.pool\n\
|
||||
_08000CD0:\n\
|
||||
mov r3, r10\n\
|
||||
adds r0, r5, r3\n\
|
||||
ldr r4, [r0]\n\
|
||||
ldrh r1, [r1, 0x8]\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000CF4\n\
|
||||
mov r0, r8\n\
|
||||
adds r0, 0xC\n\
|
||||
adds r0, r5, r0\n\
|
||||
ldr r0, [r0]\n\
|
||||
str r0, [sp]\n\
|
||||
mov r5, sp\n\
|
||||
str r5, [r7]\n\
|
||||
str r4, [r7, 0x4]\n\
|
||||
lsrs r0, r1, 2\n\
|
||||
movs r1, 0x85\n\
|
||||
lsls r1, 24\n\
|
||||
b _08000DAA\n\
|
||||
_08000CF4:\n\
|
||||
mov r2, r12\n\
|
||||
ldrb r0, [r2]\n\
|
||||
lsls r0, 4\n\
|
||||
mov r5, r8\n\
|
||||
adds r5, 0xC\n\
|
||||
adds r0, r5\n\
|
||||
ldr r0, [r0]\n\
|
||||
str r0, [sp]\n\
|
||||
ldr r3, =0x040000D4 @REG_DMA3\n\
|
||||
mov r0, sp\n\
|
||||
str r0, [r3]\n\
|
||||
str r4, [r3, 0x4]\n\
|
||||
ldr r0, =0x85000400\n\
|
||||
str r0, [r3, 0x8]\n\
|
||||
ldr r0, [r3, 0x8]\n\
|
||||
adds r4, r6\n\
|
||||
subs r1, r6\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000CF4\n\
|
||||
ldrb r0, [r2]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r0, r5\n\
|
||||
ldr r0, [r0]\n\
|
||||
str r0, [sp]\n\
|
||||
mov r2, sp\n\
|
||||
str r2, [r3]\n\
|
||||
str r4, [r3, 0x4]\n\
|
||||
lsrs r0, r1, 2\n\
|
||||
movs r1, 0x85\n\
|
||||
lsls r1, 24\n\
|
||||
b _08000DEA\n\
|
||||
.pool\n\
|
||||
_08000D3C:\n\
|
||||
ldr r3, [r1]\n\
|
||||
mov r2, r10\n\
|
||||
adds r0, r5, r2\n\
|
||||
ldr r2, [r0]\n\
|
||||
ldrh r1, [r1, 0x8]\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000D56\n\
|
||||
str r3, [r7]\n\
|
||||
str r2, [r7, 0x4]\n\
|
||||
lsrs r0, r1, 1\n\
|
||||
movs r1, 0x80\n\
|
||||
lsls r1, 24\n\
|
||||
b _08000DAA\n\
|
||||
_08000D56:\n\
|
||||
ldr r4, =0x040000D4 @REG_DMA3\n\
|
||||
str r3, [r4]\n\
|
||||
str r2, [r4, 0x4]\n\
|
||||
ldr r0, =0x80000800\n\
|
||||
str r0, [r4, 0x8]\n\
|
||||
ldr r0, [r4, 0x8]\n\
|
||||
adds r3, r6\n\
|
||||
adds r2, r6\n\
|
||||
subs r1, r6\n\
|
||||
cmp r1, r6\n\
|
||||
bhi _08000D56\n\
|
||||
str r3, [r4]\n\
|
||||
str r2, [r4, 0x4]\n\
|
||||
lsrs r0, r1, 1\n\
|
||||
movs r1, 0x80\n\
|
||||
lsls r1, 24\n\
|
||||
_08000D76:\n\
|
||||
orrs r0, r1\n\
|
||||
str r0, [r4, 0x8]\n\
|
||||
ldr r0, [r4, 0x8]\n\
|
||||
b _08000DF0\n\
|
||||
.pool\n\
|
||||
_08000D88:\n\
|
||||
mov r3, r10\n\
|
||||
adds r0, r5, r3\n\
|
||||
ldr r2, [r0]\n\
|
||||
ldrh r4, [r1, 0x8]\n\
|
||||
add r1, sp, 0x4\n\
|
||||
cmp r4, r6\n\
|
||||
bhi _08000DB2\n\
|
||||
mov r0, r8\n\
|
||||
adds r0, 0xC\n\
|
||||
adds r0, r5, r0\n\
|
||||
ldr r0, [r0]\n\
|
||||
strh r0, [r1]\n\
|
||||
str r1, [r7]\n\
|
||||
str r2, [r7, 0x4]\n\
|
||||
lsrs r0, r4, 1\n\
|
||||
movs r1, 0x81\n\
|
||||
lsls r1, 24\n\
|
||||
_08000DAA:\n\
|
||||
orrs r0, r1\n\
|
||||
str r0, [r7, 0x8]\n\
|
||||
ldr r0, [r7, 0x8]\n\
|
||||
b _08000DF0\n\
|
||||
_08000DB2:\n\
|
||||
mov r5, r12\n\
|
||||
ldrb r0, [r5]\n\
|
||||
lsls r0, 4\n\
|
||||
ldr r3, =gDma3Requests + 0x0C\n\
|
||||
adds r0, r3\n\
|
||||
ldr r0, [r0]\n\
|
||||
strh r0, [r1]\n\
|
||||
ldr r3, =0x040000D4 @REG_DMA3\n\
|
||||
str r1, [r3]\n\
|
||||
str r2, [r3, 0x4]\n\
|
||||
ldr r0, =0x81000800\n\
|
||||
str r0, [r3, 0x8]\n\
|
||||
ldr r0, [r3, 0x8]\n\
|
||||
adds r2, r6\n\
|
||||
subs r4, r6\n\
|
||||
cmp r4, r6\n\
|
||||
bhi _08000DB2\n\
|
||||
ldrb r0, [r5]\n\
|
||||
lsls r0, 4\n\
|
||||
ldr r5, =gDma3Requests + 0x0C\n\
|
||||
adds r0, r5\n\
|
||||
ldr r0, [r0]\n\
|
||||
strh r0, [r1]\n\
|
||||
str r1, [r3]\n\
|
||||
str r2, [r3, 0x4]\n\
|
||||
lsrs r0, r4, 1\n\
|
||||
movs r1, 0x81\n\
|
||||
lsls r1, 24\n\
|
||||
_08000DEA:\n\
|
||||
orrs r0, r1\n\
|
||||
str r0, [r3, 0x8]\n\
|
||||
ldr r0, [r3, 0x8]\n\
|
||||
_08000DF0:\n\
|
||||
ldr r1, =gDma3Requests\n\
|
||||
mov r3, r12\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r0, r1\n\
|
||||
mov r2, r9\n\
|
||||
str r2, [r0]\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r0, 4\n\
|
||||
add r0, r10\n\
|
||||
str r2, [r0]\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r0, r1\n\
|
||||
movs r4, 0\n\
|
||||
strh r2, [r0, 0x8]\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r0, r1\n\
|
||||
mov r5, r9\n\
|
||||
strh r5, [r0, 0xA]\n\
|
||||
ldrb r0, [r3]\n\
|
||||
lsls r0, 4\n\
|
||||
adds r1, 0xC\n\
|
||||
adds r0, r1\n\
|
||||
mov r1, r9\n\
|
||||
str r1, [r0]\n\
|
||||
ldrb r0, [r3]\n\
|
||||
adds r0, 0x1\n\
|
||||
strb r0, [r3]\n\
|
||||
lsls r0, 24\n\
|
||||
cmp r0, 0\n\
|
||||
bge _08000E34\n\
|
||||
strb r4, [r3]\n\
|
||||
_08000E34:\n\
|
||||
mov r2, r12\n\
|
||||
ldrb r0, [r2]\n\
|
||||
lsls r0, 4\n\
|
||||
ldr r3, =gDma3Requests\n\
|
||||
adds r0, r3\n\
|
||||
ldrh r0, [r0, 0x8]\n\
|
||||
cmp r0, 0\n\
|
||||
beq _08000E46\n\
|
||||
b _08000C2E\n\
|
||||
_08000E46:\n\
|
||||
add sp, 0xC\n\
|
||||
pop {r3-r5}\n\
|
||||
mov r8, r3\n\
|
||||
mov r9, r4\n\
|
||||
mov r10, r5\n\
|
||||
pop {r4-r7}\n\
|
||||
pop {r0}\n\
|
||||
bx r0\n\
|
||||
.pool\n\
|
||||
.syntax divided");
|
||||
}
|
||||
#endif
|
||||
|
||||
int RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
|
||||
s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
|
||||
{
|
||||
int cursor;
|
||||
int var = 0;
|
||||
@@ -466,7 +129,7 @@ int RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
|
||||
s16 RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
|
||||
{
|
||||
int cursor;
|
||||
int var = 0;
|
||||
@@ -504,7 +167,7 @@ int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int CheckForSpaceForDma3Request(s16 index)
|
||||
s16 CheckForSpaceForDma3Request(s16 index)
|
||||
{
|
||||
int current = 0;
|
||||
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
#include "global.h"
|
||||
#include "text.h"
|
||||
#include "dynamic_placeholder_text_util.h"
|
||||
#include "string_util.h"
|
||||
|
||||
static EWRAM_DATA const u8 *sStringPointers[8] = {0};
|
||||
|
||||
static const u8 sTextColorTable[] =
|
||||
{
|
||||
0, 0, 0, 16, 17, 17, 17, 16, 16, 0, 0, 17, 1, 0, 17, 16,
|
||||
0, 16, 16, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0,
|
||||
17, 1, 0, 0, 0, 16, 17, 0, 16, 16, 16, 0, 1, 0, 51, 51,
|
||||
51, 51, 51, 51, 51, 51, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34,
|
||||
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 50,
|
||||
};
|
||||
|
||||
void DynamicPlaceholderTextUtil_Reset(void)
|
||||
{
|
||||
const u8 **ptr = sStringPointers;
|
||||
u8 *fillval = NULL;
|
||||
const u8 **ptr2 = ptr + (NELEMS(sStringPointers) - 1);
|
||||
|
||||
do
|
||||
{
|
||||
*ptr2-- = fillval;
|
||||
}
|
||||
while ((intptr_t)ptr2 >= (intptr_t)ptr);
|
||||
}
|
||||
|
||||
void DynamicPlaceholderTextUtil_SetPlaceholderPtr(u8 idx, const u8 *ptr)
|
||||
{
|
||||
if (idx < NELEMS(sStringPointers))
|
||||
sStringPointers[idx] = ptr;
|
||||
}
|
||||
|
||||
u8 *DynamicPlaceholderTextUtil_ExpandPlaceholders(u8 *dest, const u8 *src)
|
||||
{
|
||||
while (*src != EOS)
|
||||
{
|
||||
if (*src != CHAR_SPECIAL_F7)
|
||||
{
|
||||
*dest++ = *src++;
|
||||
}
|
||||
else
|
||||
{
|
||||
src++;
|
||||
if (sStringPointers[*src] != NULL)
|
||||
dest = StringCopy(dest, sStringPointers[*src]);
|
||||
src++;
|
||||
}
|
||||
}
|
||||
*dest = EOS;
|
||||
return dest;
|
||||
}
|
||||
|
||||
const u8 *DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 idx)
|
||||
{
|
||||
return sStringPointers[idx];
|
||||
}
|
||||
|
||||
u8 GetColorFromTextColorTable(u16 graphicId)
|
||||
{
|
||||
u32 test = graphicId >> 1;
|
||||
u32 shift = (graphicId & 1) << 2;
|
||||
|
||||
if (test > 0x4B)
|
||||
return 3;
|
||||
else
|
||||
return (sTextColorTable[graphicId >> 1] >> shift) & 0xF;
|
||||
}
|
||||
-878
@@ -1,878 +0,0 @@
|
||||
#include "global.h"
|
||||
#include "pokemon.h"
|
||||
#include "egg_hatch.h"
|
||||
#include "pokedex.h"
|
||||
#include "constants/items.h"
|
||||
#include "script.h"
|
||||
#include "decompress.h"
|
||||
#include "task.h"
|
||||
#include "palette.h"
|
||||
#include "main.h"
|
||||
#include "event_data.h"
|
||||
#include "sound.h"
|
||||
#include "constants/songs.h"
|
||||
#include "text.h"
|
||||
#include "text_window.h"
|
||||
#include "string_util.h"
|
||||
#include "menu.h"
|
||||
#include "trig.h"
|
||||
#include "random.h"
|
||||
#include "malloc.h"
|
||||
#include "dma3.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "bg.h"
|
||||
#include "m4a.h"
|
||||
#include "window.h"
|
||||
#include "graphics.h"
|
||||
#include "constants/abilities.h"
|
||||
#include "constants/species.h"
|
||||
#include "daycare.h"
|
||||
#include "overworld.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "field_weather.h"
|
||||
#include "international_string_util.h"
|
||||
#include "naming_screen.h"
|
||||
#include "pokemon_storage_system.h"
|
||||
#include "field_screen_effect.h"
|
||||
#include "battle.h" // to get rid of later
|
||||
#include "help_system.h"
|
||||
#include "field_fadetransition.h"
|
||||
#include "new_menu_helpers.h"
|
||||
|
||||
struct EggHatchData
|
||||
{
|
||||
u8 eggSpriteID;
|
||||
u8 pokeSpriteID;
|
||||
u8 CB2_state;
|
||||
u8 CB2_PalCounter;
|
||||
u8 eggPartyID;
|
||||
u8 unused_5;
|
||||
u8 unused_6;
|
||||
u8 eggShardVelocityID;
|
||||
u8 windowId;
|
||||
u8 unused_9;
|
||||
u8 unused_A;
|
||||
u16 species;
|
||||
struct TextColor textColor;
|
||||
};
|
||||
|
||||
extern const u32 gUnknown_08331F60[]; // tilemap gameboy circle
|
||||
extern const u8 gText_HatchedFromEgg[];
|
||||
extern const u8 gText_NickHatchPrompt[];
|
||||
|
||||
static void Task_EggHatch(u8 taskID);
|
||||
static void CB2_EggHatch_0(void);
|
||||
static void CB2_EggHatch_1(void);
|
||||
static void SpriteCB_Egg_0(struct Sprite* sprite);
|
||||
static void SpriteCB_Egg_1(struct Sprite* sprite);
|
||||
static void SpriteCB_Egg_2(struct Sprite* sprite);
|
||||
static void SpriteCB_Egg_3(struct Sprite* sprite);
|
||||
static void SpriteCB_Egg_4(struct Sprite* sprite);
|
||||
static void SpriteCB_Egg_5(struct Sprite* sprite);
|
||||
static void SpriteCB_EggShard(struct Sprite* sprite);
|
||||
static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed);
|
||||
static void CreateRandomEggShardSprite(void);
|
||||
static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex);
|
||||
|
||||
// IWRAM bss
|
||||
static IWRAM_DATA struct EggHatchData *sEggHatchData;
|
||||
|
||||
// rom data
|
||||
static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/palettes/egg_palette.gbapal");
|
||||
static const u8 sEggHatchTiles[] = INCBIN_U8("graphics/misc/egg_hatch.4bpp");
|
||||
static const u8 sEggShardTiles[] = INCBIN_U8("graphics/misc/egg_shard.4bpp");
|
||||
|
||||
static const struct OamData sOamData_EggHatch =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = 0,
|
||||
.objMode = 0,
|
||||
.mosaic = 0,
|
||||
.bpp = 0,
|
||||
.shape = SPRITE_SHAPE(32x32),
|
||||
.x = 0,
|
||||
.matrixNum = 0,
|
||||
.size = SPRITE_SIZE(32x32),
|
||||
.tileNum = 0,
|
||||
.priority = 1,
|
||||
.paletteNum = 0,
|
||||
.affineParam = 0,
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_EggHatch0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 5),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_EggHatch1[] =
|
||||
{
|
||||
ANIMCMD_FRAME(16, 5),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_EggHatch2[] =
|
||||
{
|
||||
ANIMCMD_FRAME(32, 5),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_EggHatch3[] =
|
||||
{
|
||||
ANIMCMD_FRAME(48, 5),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd *const sSpriteAnimTable_EggHatch[] =
|
||||
{
|
||||
sSpriteAnim_EggHatch0,
|
||||
sSpriteAnim_EggHatch1,
|
||||
sSpriteAnim_EggHatch2,
|
||||
sSpriteAnim_EggHatch3,
|
||||
};
|
||||
|
||||
static const struct SpriteSheet sEggHatch_Sheet =
|
||||
{
|
||||
.data = sEggHatchTiles,
|
||||
.size = 2048,
|
||||
.tag = 12345,
|
||||
};
|
||||
|
||||
static const struct SpriteSheet sEggShards_Sheet =
|
||||
{
|
||||
.data = sEggShardTiles,
|
||||
.size = 128,
|
||||
.tag = 23456,
|
||||
};
|
||||
|
||||
static const struct SpritePalette sEgg_SpritePalette =
|
||||
{
|
||||
.data = sEggPalette,
|
||||
.tag = 54321
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_EggHatch =
|
||||
{
|
||||
.tileTag = 12345,
|
||||
.paletteTag = 54321,
|
||||
.oam = &sOamData_EggHatch,
|
||||
.anims = sSpriteAnimTable_EggHatch,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
|
||||
static const struct OamData sOamData_EggShard =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = 0,
|
||||
.objMode = 0,
|
||||
.mosaic = 0,
|
||||
.bpp = 0,
|
||||
.shape = SPRITE_SHAPE(8x8),
|
||||
.x = 0,
|
||||
.matrixNum = 0,
|
||||
.size = SPRITE_SIZE(8x8),
|
||||
.tileNum = 0,
|
||||
.priority = 2,
|
||||
.paletteNum = 0,
|
||||
.affineParam = 0,
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_EggShard0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 5),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_EggShard1[] =
|
||||
{
|
||||
ANIMCMD_FRAME(1, 5),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_EggShard2[] =
|
||||
{
|
||||
ANIMCMD_FRAME(2, 5),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_EggShard3[] =
|
||||
{
|
||||
ANIMCMD_FRAME(3, 5),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd *const sSpriteAnimTable_EggShard[] =
|
||||
{
|
||||
sSpriteAnim_EggShard0,
|
||||
sSpriteAnim_EggShard1,
|
||||
sSpriteAnim_EggShard2,
|
||||
sSpriteAnim_EggShard3,
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_EggShard =
|
||||
{
|
||||
.tileTag = 23456,
|
||||
.paletteTag = 54321,
|
||||
.oam = &sOamData_EggShard,
|
||||
.anims = sSpriteAnimTable_EggShard,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCB_EggShard
|
||||
};
|
||||
|
||||
static const struct BgTemplate sBgTemplates_EggHatch[2] =
|
||||
{
|
||||
{
|
||||
.bg = 0,
|
||||
.charBaseIndex = 2,
|
||||
.mapBaseIndex = 24,
|
||||
.screenSize = 3,
|
||||
.paletteMode = 0,
|
||||
.priority = 0,
|
||||
.baseTile = 0
|
||||
},
|
||||
|
||||
{
|
||||
.bg = 1,
|
||||
.charBaseIndex = 0,
|
||||
.mapBaseIndex = 8,
|
||||
.screenSize = 1,
|
||||
.paletteMode = 0,
|
||||
.priority = 2,
|
||||
.baseTile = 0
|
||||
},
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sWinTemplates_EggHatch[2] =
|
||||
{
|
||||
{
|
||||
.bg = 0,
|
||||
.tilemapLeft = 2,
|
||||
.tilemapTop = 15,
|
||||
.width = 26,
|
||||
.height = 4,
|
||||
.paletteNum = 0,
|
||||
.baseBlock = 64
|
||||
},
|
||||
DUMMY_WIN_TEMPLATE
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sYesNoWinTemplate =
|
||||
{
|
||||
.bg = 0,
|
||||
.tilemapLeft = 21,
|
||||
.tilemapTop = 9,
|
||||
.width = 5,
|
||||
.height = 4,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 424
|
||||
};
|
||||
|
||||
static const s16 sEggShardVelocities[][2] =
|
||||
{
|
||||
{Q_8_8(-1.5), Q_8_8(-3.75)},
|
||||
{Q_8_8(-5), Q_8_8(-3)},
|
||||
{Q_8_8(3.5), Q_8_8(-3)},
|
||||
{Q_8_8(-4), Q_8_8(-3.75)},
|
||||
{Q_8_8(2), Q_8_8(-1.5)},
|
||||
{Q_8_8(-0.5), Q_8_8(-6.75)},
|
||||
{Q_8_8(5), Q_8_8(-2.25)},
|
||||
{Q_8_8(-1.5), Q_8_8(-3.75)},
|
||||
{Q_8_8(4.5), Q_8_8(-1.5)},
|
||||
{Q_8_8(-1), Q_8_8(-6.75)},
|
||||
{Q_8_8(4), Q_8_8(-2.25)},
|
||||
{Q_8_8(-3.5), Q_8_8(-3.75)},
|
||||
{Q_8_8(1), Q_8_8(-1.5)},
|
||||
{Q_8_8(-3.515625), Q_8_8(-6.75)},
|
||||
{Q_8_8(4.5), Q_8_8(-2.25)},
|
||||
{Q_8_8(-0.5), Q_8_8(-7.5)},
|
||||
{Q_8_8(1), Q_8_8(-4.5)},
|
||||
{Q_8_8(-2.5), Q_8_8(-2.25)},
|
||||
{Q_8_8(2.5), Q_8_8(-7.5)},
|
||||
};
|
||||
|
||||
// code
|
||||
|
||||
static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp)
|
||||
{
|
||||
u16 species;
|
||||
u32 personality, pokerus;
|
||||
u8 i, friendship, language, gameMet, markings, obedience;
|
||||
u16 moves[4];
|
||||
u32 ivs[NUM_STATS];
|
||||
|
||||
|
||||
species = GetMonData(egg, MON_DATA_SPECIES);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
moves[i] = GetMonData(egg, MON_DATA_MOVE1 + i);
|
||||
}
|
||||
|
||||
personality = GetMonData(egg, MON_DATA_PERSONALITY);
|
||||
|
||||
for (i = 0; i < NUM_STATS; i++)
|
||||
{
|
||||
ivs[i] = GetMonData(egg, MON_DATA_HP_IV + i);
|
||||
}
|
||||
|
||||
// language = GetMonData(egg, MON_DATA_LANGUAGE);
|
||||
gameMet = GetMonData(egg, MON_DATA_MET_GAME);
|
||||
markings = GetMonData(egg, MON_DATA_MARKINGS);
|
||||
pokerus = GetMonData(egg, MON_DATA_POKERUS);
|
||||
obedience = GetMonData(egg, MON_DATA_OBEDIENCE);
|
||||
|
||||
CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, 0, 0);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
SetMonData(temp, MON_DATA_MOVE1 + i, &moves[i]);
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_STATS; i++)
|
||||
{
|
||||
SetMonData(temp, MON_DATA_HP_IV + i, &ivs[i]);
|
||||
}
|
||||
|
||||
language = GAME_LANGUAGE;
|
||||
SetMonData(temp, MON_DATA_LANGUAGE, &language);
|
||||
SetMonData(temp, MON_DATA_MET_GAME, &gameMet);
|
||||
SetMonData(temp, MON_DATA_MARKINGS, &markings);
|
||||
|
||||
friendship = 120;
|
||||
SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship);
|
||||
SetMonData(temp, MON_DATA_POKERUS, &pokerus);
|
||||
SetMonData(temp, MON_DATA_OBEDIENCE, &obedience);
|
||||
|
||||
*egg = *temp;
|
||||
}
|
||||
|
||||
static void AddHatchedMonToParty(u8 id)
|
||||
{
|
||||
u8 isEgg = 0x46; // ?
|
||||
u16 pokeNum;
|
||||
u8 name[12];
|
||||
u16 ball;
|
||||
u16 caughtLvl;
|
||||
u8 mapNameID;
|
||||
struct Pokemon* mon = &gPlayerParty[id];
|
||||
|
||||
CreatedHatchedMon(mon, &gEnemyParty[0]);
|
||||
SetMonData(mon, MON_DATA_IS_EGG, &isEgg);
|
||||
|
||||
pokeNum = GetMonData(mon, MON_DATA_SPECIES);
|
||||
GetSpeciesName(name, pokeNum);
|
||||
SetMonData(mon, MON_DATA_NICKNAME, name);
|
||||
|
||||
pokeNum = SpeciesToNationalPokedexNum(pokeNum);
|
||||
GetSetPokedexFlag(pokeNum, FLAG_SET_SEEN);
|
||||
GetSetPokedexFlag(pokeNum, FLAG_SET_CAUGHT);
|
||||
|
||||
GetMonNick(mon, gStringVar1);
|
||||
|
||||
ball = ITEM_POKE_BALL;
|
||||
SetMonData(mon, MON_DATA_POKEBALL, &ball);
|
||||
|
||||
caughtLvl = 0;
|
||||
SetMonData(mon, MON_DATA_MET_LEVEL, &caughtLvl);
|
||||
|
||||
mapNameID = GetCurrentRegionMapSectionId();
|
||||
SetMonData(mon, MON_DATA_MET_LOCATION, &mapNameID);
|
||||
|
||||
MonRestorePP(mon);
|
||||
CalculateMonStats(mon);
|
||||
}
|
||||
|
||||
void ScriptHatchMon(void)
|
||||
{
|
||||
AddHatchedMonToParty(gSpecialVar_0x8004);
|
||||
}
|
||||
|
||||
static bool8 sub_8046E34(struct DayCare *daycare, u8 daycareId)
|
||||
{
|
||||
u8 nick[0x20];
|
||||
struct DaycareMon *daycareMon = &daycare->mons[daycareId];
|
||||
|
||||
GetBoxMonNick(&daycareMon->mon, nick);
|
||||
if (daycareMon->mail.message.itemId != 0
|
||||
&& (StringCompare(nick, daycareMon->mail.monName) != 0
|
||||
|| StringCompare(gSaveBlock2Ptr->playerName, daycareMon->mail.OT_name) != 0))
|
||||
{
|
||||
StringCopy(gStringVar1, nick);
|
||||
StringCopy(gStringVar2, daycareMon->mail.OT_name);
|
||||
StringCopy(gStringVar3, daycareMon->mail.monName);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 sub_8046EAC(void)
|
||||
{
|
||||
return sub_8046E34(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004);
|
||||
}
|
||||
|
||||
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
|
||||
|
||||
static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc)
|
||||
{
|
||||
u8 r4 = 0;
|
||||
u8 spriteID = 0; // r7
|
||||
struct Pokemon* mon = NULL; // r5
|
||||
|
||||
if (a0 == 0)
|
||||
{
|
||||
mon = &gPlayerParty[pokeID];
|
||||
r4 = 1;
|
||||
}
|
||||
if (a0 == 1)
|
||||
{
|
||||
mon = &gPlayerParty[pokeID];
|
||||
r4 = 3;
|
||||
}
|
||||
switch (switchID)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
u16 species = GetMonData(mon, MON_DATA_SPECIES);
|
||||
u32 pid = GetMonData(mon, MON_DATA_PERSONALITY);
|
||||
sub_800ECC4(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid);
|
||||
LoadCompressedObjectPalette(GetMonSpritePalStruct(mon));
|
||||
*speciesLoc = species;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, r4);
|
||||
spriteID = CreateSprite(&gMultiuseSpriteTemplate, 120, 70, 6);
|
||||
gSprites[spriteID].invisible = TRUE;
|
||||
gSprites[spriteID].callback = SpriteCallbackDummy;
|
||||
break;
|
||||
}
|
||||
return spriteID;
|
||||
}
|
||||
|
||||
static void VBlankCB_EggHatch(void)
|
||||
{
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
}
|
||||
|
||||
void EggHatch(void)
|
||||
{
|
||||
ScriptContext2_Enable();
|
||||
CreateTask(Task_EggHatch, 10);
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
|
||||
sub_812B478();
|
||||
}
|
||||
|
||||
static void Task_EggHatch(u8 taskID)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
SetMainCallback2(CB2_EggHatch_0);
|
||||
gFieldCallback = FieldCallback_ReturnToEventScript2;
|
||||
DestroyTask(taskID);
|
||||
}
|
||||
}
|
||||
|
||||
static void CB2_EggHatch_0(void)
|
||||
{
|
||||
switch (gMain.state)
|
||||
{
|
||||
case 0:
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, 0);
|
||||
|
||||
sEggHatchData = Alloc(sizeof(struct EggHatchData));
|
||||
AllocateMonSpritesGfx();
|
||||
sEggHatchData->eggPartyID = gSpecialVar_0x8004;
|
||||
sEggHatchData->eggShardVelocityID = 0;
|
||||
|
||||
SetVBlankCallback(VBlankCB_EggHatch);
|
||||
gSpecialVar_0x8005 = GetCurrentMapMusic();
|
||||
|
||||
reset_temp_tile_data_buffers();
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, sBgTemplates_EggHatch, ARRAY_COUNT(sBgTemplates_EggHatch));
|
||||
|
||||
ChangeBgX(1, 0, 0);
|
||||
ChangeBgY(1, 0, 0);
|
||||
ChangeBgX(0, 0, 0);
|
||||
ChangeBgY(0, 0, 0);
|
||||
|
||||
SetBgAttribute(1, 7, 2);
|
||||
SetBgTilemapBuffer(1, Alloc(0x1000));
|
||||
SetBgTilemapBuffer(0, Alloc(0x2000));
|
||||
|
||||
DeactivateAllTextPrinters();
|
||||
ResetPaletteFade();
|
||||
FreeAllSpritePalettes();
|
||||
ResetSpriteData();
|
||||
ResetTasks();
|
||||
ScanlineEffect_Stop();
|
||||
m4aSoundVSyncOn();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 1:
|
||||
InitWindows(sWinTemplates_EggHatch);
|
||||
sEggHatchData->windowId = 0;
|
||||
gMain.state++;
|
||||
break;
|
||||
case 2:
|
||||
DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0);
|
||||
CopyToBgTilemapBuffer(0, gFile_graphics_interface_menu_map_tilemap, 0, 0);
|
||||
LoadCompressedPalette(gBattleTextboxPalette, 0, 0x20);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 3:
|
||||
LoadSpriteSheet(&sEggHatch_Sheet);
|
||||
LoadSpriteSheet(&sEggShards_Sheet);
|
||||
LoadSpritePalette(&sEgg_SpritePalette);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 4:
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
AddHatchedMonToParty(sEggHatchData->eggPartyID);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 5:
|
||||
EggHatchCreateMonSprite(0, 0, sEggHatchData->eggPartyID, &sEggHatchData->species);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 6:
|
||||
sEggHatchData->pokeSpriteID = EggHatchCreateMonSprite(0, 1, sEggHatchData->eggPartyID, &sEggHatchData->species);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 7:
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
|
||||
LoadPalette(gTradeGba2_Pal, 0x10, 0xA0);
|
||||
LoadBgTiles(1, gTradeGba_Gfx, 0x1420, 0);
|
||||
CopyToBgTilemapBuffer(1, gUnknown_08331F60, 0x1000, 0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 8:
|
||||
SetMainCallback2(CB2_EggHatch_1);
|
||||
sEggHatchData->CB2_state = 0;
|
||||
break;
|
||||
}
|
||||
RunTasks();
|
||||
RunTextPrinters();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
static void EggHatchSetMonNickname(void)
|
||||
{
|
||||
SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3);
|
||||
FreeMonSpritesGfx();
|
||||
Free(sEggHatchData);
|
||||
sub_812B484();
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
}
|
||||
|
||||
static void Task_EggHatchPlayBGM(u8 taskID)
|
||||
{
|
||||
if (gTasks[taskID].data[0] == 0)
|
||||
{
|
||||
StopMapMusic();
|
||||
}
|
||||
if (gTasks[taskID].data[0] == 1)
|
||||
PlayBGM(MUS_ME_SHINKA);
|
||||
if (gTasks[taskID].data[0] > 60)
|
||||
{
|
||||
PlayBGM(MUS_SHINKA);
|
||||
DestroyTask(taskID);
|
||||
// UB: task is destroyed, yet the value is incremented
|
||||
}
|
||||
gTasks[taskID].data[0]++;
|
||||
}
|
||||
|
||||
static void CB2_EggHatch_1(void)
|
||||
{
|
||||
u16 species;
|
||||
u8 gender;
|
||||
u32 personality;
|
||||
|
||||
switch (sEggHatchData->CB2_state)
|
||||
{
|
||||
case 0:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
|
||||
sEggHatchData->eggSpriteID = CreateSprite(&sSpriteTemplate_EggHatch, 120, 75, 5);
|
||||
ShowBg(0);
|
||||
ShowBg(1);
|
||||
sEggHatchData->CB2_state++;
|
||||
CreateTask(Task_EggHatchPlayBGM, 5);
|
||||
break;
|
||||
case 1:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
FillWindowPixelBuffer(sEggHatchData->windowId, 0x00);
|
||||
sEggHatchData->CB2_PalCounter = 0;
|
||||
sEggHatchData->CB2_state++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (++sEggHatchData->CB2_PalCounter > 30)
|
||||
{
|
||||
sEggHatchData->CB2_state++;
|
||||
gSprites[sEggHatchData->eggSpriteID].callback = SpriteCB_Egg_0;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (gSprites[sEggHatchData->eggSpriteID].callback == SpriteCallbackDummy)
|
||||
{
|
||||
PlayCry1(sEggHatchData->species, 0);
|
||||
sEggHatchData->CB2_state++;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (IsCryFinished())
|
||||
{
|
||||
sEggHatchData->CB2_state++;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
|
||||
StringExpandPlaceholders(gStringVar4, gText_HatchedFromEgg);
|
||||
EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 3, 0xFF);
|
||||
PlayFanfare(MUS_FANFA5);
|
||||
sEggHatchData->CB2_state++;
|
||||
PutWindowTilemap(sEggHatchData->windowId);
|
||||
CopyWindowToVram(sEggHatchData->windowId, 3);
|
||||
break;
|
||||
case 6:
|
||||
if (IsFanfareTaskInactive())
|
||||
sEggHatchData->CB2_state++;
|
||||
break;
|
||||
case 7:
|
||||
if (IsFanfareTaskInactive())
|
||||
sEggHatchData->CB2_state++;
|
||||
break;
|
||||
case 8:
|
||||
GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
|
||||
StringExpandPlaceholders(gStringVar4, gText_NickHatchPrompt);
|
||||
EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 2, 1);
|
||||
sEggHatchData->CB2_state++;
|
||||
break;
|
||||
case 9:
|
||||
if (!IsTextPrinterActive(sEggHatchData->windowId))
|
||||
{
|
||||
LoadUserWindowBorderGfx(sEggHatchData->windowId, 0x140, 0xE0);
|
||||
CreateYesNoMenu(&sYesNoWinTemplate, 3, 0, 2, 0x140, 0xE, 0);
|
||||
sEggHatchData->CB2_state++;
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
switch (Menu_ProcessInputNoWrapClearOnChoose())
|
||||
{
|
||||
case 0:
|
||||
GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3);
|
||||
species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);
|
||||
gender = GetMonGender(&gPlayerParty[sEggHatchData->eggPartyID]);
|
||||
personality = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_PERSONALITY, 0);
|
||||
DoNamingScreen(3, gStringVar3, species, gender, personality, EggHatchSetMonNickname);
|
||||
break;
|
||||
case 1:
|
||||
case -1:
|
||||
sEggHatchData->CB2_state++;
|
||||
}
|
||||
break;
|
||||
case 11:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
|
||||
sEggHatchData->CB2_state++;
|
||||
break;
|
||||
case 12:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
RemoveWindow(sEggHatchData->windowId);
|
||||
UnsetBgTilemapBuffer(0);
|
||||
UnsetBgTilemapBuffer(1);
|
||||
Free(sEggHatchData);
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
sub_812B484();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
RunTasks();
|
||||
RunTextPrinters();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
static void SpriteCB_Egg_0(struct Sprite* sprite)
|
||||
{
|
||||
if (++sprite->data[0] > 20)
|
||||
{
|
||||
sprite->callback = SpriteCB_Egg_1;
|
||||
sprite->data[0] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
|
||||
sprite->pos2.x = Sin(sprite->data[1], 1);
|
||||
if (sprite->data[0] == 15)
|
||||
{
|
||||
PlaySE(SE_BOWA);
|
||||
StartSpriteAnim(sprite, 1);
|
||||
CreateRandomEggShardSprite();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void SpriteCB_Egg_1(struct Sprite* sprite)
|
||||
{
|
||||
if (++sprite->data[2] > 30)
|
||||
{
|
||||
if (++sprite->data[0] > 20)
|
||||
{
|
||||
sprite->callback = SpriteCB_Egg_2;
|
||||
sprite->data[0] = 0;
|
||||
sprite->data[2] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
|
||||
sprite->pos2.x = Sin(sprite->data[1], 2);
|
||||
if (sprite->data[0] == 15)
|
||||
{
|
||||
PlaySE(SE_BOWA);
|
||||
StartSpriteAnim(sprite, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct UnkStruct_82349CC
|
||||
{
|
||||
u8 field_0;
|
||||
u8 field_1;
|
||||
u8 field_2;
|
||||
u8 field_3;
|
||||
};
|
||||
|
||||
extern const struct UnkStruct_82349CC gUnknown_82349CC[NUM_SPECIES];
|
||||
|
||||
static void SpriteCB_Egg_2(struct Sprite* sprite)
|
||||
{
|
||||
if (++sprite->data[2] > 30)
|
||||
{
|
||||
if (++sprite->data[0] > 38)
|
||||
{
|
||||
u16 species;
|
||||
|
||||
sprite->callback = SpriteCB_Egg_3;
|
||||
sprite->data[0] = 0;
|
||||
species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);
|
||||
gSprites[sEggHatchData->pokeSpriteID].pos2.x = 0;
|
||||
gSprites[sEggHatchData->pokeSpriteID].pos2.y = gUnknown_82349CC[species].field_1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
|
||||
sprite->pos2.x = Sin(sprite->data[1], 2);
|
||||
if (sprite->data[0] == 15)
|
||||
{
|
||||
PlaySE(SE_BOWA);
|
||||
StartSpriteAnim(sprite, 2);
|
||||
CreateRandomEggShardSprite();
|
||||
CreateRandomEggShardSprite();
|
||||
}
|
||||
if (sprite->data[0] == 30)
|
||||
PlaySE(SE_BOWA);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void SpriteCB_Egg_3(struct Sprite* sprite)
|
||||
{
|
||||
if (++sprite->data[0] > 50)
|
||||
{
|
||||
sprite->callback = SpriteCB_Egg_4;
|
||||
sprite->data[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void SpriteCB_Egg_4(struct Sprite* sprite)
|
||||
{
|
||||
s16 i;
|
||||
if (sprite->data[0] == 0)
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, 0xFFFF);
|
||||
if (sprite->data[0] < 4u)
|
||||
{
|
||||
for (i = 0; i <= 3; i++)
|
||||
CreateRandomEggShardSprite();
|
||||
}
|
||||
sprite->data[0]++;
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
PlaySE(SE_JIHANKI);
|
||||
sprite->invisible = TRUE;
|
||||
sprite->callback = SpriteCB_Egg_5;
|
||||
sprite->data[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void SpriteCB_Egg_5(struct Sprite* sprite)
|
||||
{
|
||||
if (sprite->data[0] == 0)
|
||||
{
|
||||
gSprites[sEggHatchData->pokeSpriteID].invisible = FALSE;
|
||||
StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], 1);
|
||||
}
|
||||
if (sprite->data[0] == 8)
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, -1, 0x10, 0, 0xFFFF);
|
||||
if (sprite->data[0] <= 9)
|
||||
gSprites[sEggHatchData->pokeSpriteID].pos1.y -= 1;
|
||||
if (sprite->data[0] > 40)
|
||||
sprite->callback = SpriteCallbackDummy;
|
||||
sprite->data[0]++;
|
||||
}
|
||||
|
||||
static void SpriteCB_EggShard(struct Sprite* sprite)
|
||||
{
|
||||
sprite->data[4] += sprite->data[1];
|
||||
sprite->data[5] += sprite->data[2];
|
||||
|
||||
sprite->pos2.x = sprite->data[4] / 256;
|
||||
sprite->pos2.y = sprite->data[5] / 256;
|
||||
|
||||
sprite->data[2] += sprite->data[3];
|
||||
|
||||
if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data[2] > 0)
|
||||
DestroySprite(sprite);
|
||||
}
|
||||
|
||||
static void CreateRandomEggShardSprite(void)
|
||||
{
|
||||
u16 spriteAnimIndex;
|
||||
|
||||
s16 velocity1 = sEggShardVelocities[sEggHatchData->eggShardVelocityID][0];
|
||||
s16 velocity2 = sEggShardVelocities[sEggHatchData->eggShardVelocityID][1];
|
||||
sEggHatchData->eggShardVelocityID++;
|
||||
spriteAnimIndex = Random() % 4;
|
||||
CreateEggShardSprite(120, 60, velocity1, velocity2, 100, spriteAnimIndex);
|
||||
}
|
||||
|
||||
static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex)
|
||||
{
|
||||
u8 spriteID = CreateSprite(&sSpriteTemplate_EggShard, x, y, 4);
|
||||
gSprites[spriteID].data[1] = data1;
|
||||
gSprites[spriteID].data[2] = data2;
|
||||
gSprites[spriteID].data[3] = data3;
|
||||
StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex);
|
||||
}
|
||||
|
||||
static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed)
|
||||
{
|
||||
FillWindowPixelBuffer(windowId, 0xFF);
|
||||
sEggHatchData->textColor.fgColor = 0;
|
||||
sEggHatchData->textColor.bgColor = 5;
|
||||
sEggHatchData->textColor.shadowColor = 6;
|
||||
AddTextPrinterParametrized2(windowId, 3, x, y, 1, 1, &sEggHatchData->textColor, speed, string);
|
||||
}
|
||||
@@ -0,0 +1,397 @@
|
||||
#include "global.h"
|
||||
#include "link.h"
|
||||
#include "unk_815c27c.h"
|
||||
|
||||
enum {
|
||||
EREADER_XFR_STATE_INIT,
|
||||
EREADER_XFR_STATE_HANDSHAKE,
|
||||
EREADER_XFR_STATE_START,
|
||||
EREADER_XFR_STATE_TRANSFER,
|
||||
};
|
||||
|
||||
struct SendRecvMgr
|
||||
{
|
||||
u8 sendOrRecv;
|
||||
u8 state;
|
||||
u8 field_02;
|
||||
u8 field_03;
|
||||
u8 field_04;
|
||||
u32 * dataptr;
|
||||
int cursor;
|
||||
int size;
|
||||
u32 checksum;
|
||||
};
|
||||
|
||||
static bool16 DetermineSendRecvState(u8);
|
||||
static void SetUpTransferManager(size_t, const void *, void *);
|
||||
static void StartTm3(void);
|
||||
static void EnableSio(void);
|
||||
static void DisableTm3(void);
|
||||
static void GetKeyInput(void);
|
||||
|
||||
static struct SendRecvMgr sSendRecvMgr;
|
||||
static u16 sJoyNewOrRepeated;
|
||||
static u16 sJoyNew;
|
||||
static u16 sSendRecvStatus;
|
||||
static u16 sCounter1;
|
||||
static u32 sCounter2;
|
||||
static u16 sSavedIme;
|
||||
static u16 sSavedIe;
|
||||
static u16 sSavedTm3Cnt;
|
||||
static u16 sSavedSioCnt;
|
||||
static u16 sSavedSioCnt;
|
||||
static u16 sSavedRCnt;
|
||||
|
||||
int EReader_Send(size_t r6, const void * r5)
|
||||
{
|
||||
int result;
|
||||
EReaderHelper_SaveRegsState();
|
||||
|
||||
while (1)
|
||||
{
|
||||
GetKeyInput();
|
||||
if (TEST_BUTTON(sJoyNew, B_BUTTON))
|
||||
gUnknown_3003F84 = 2;
|
||||
|
||||
sSendRecvStatus = EReaderHandleTransfer(1, r6, r5, NULL);
|
||||
if ((sSendRecvStatus & 0x13) == 0x10)
|
||||
{
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
else if (sSendRecvStatus & 8)
|
||||
{
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
else if (sSendRecvStatus & 4)
|
||||
{
|
||||
result = 2;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
gUnknown_3003F84 = 0;
|
||||
VBlankIntrWait();
|
||||
}
|
||||
}
|
||||
|
||||
CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
|
||||
EReaderHelper_RestoreRegsState();
|
||||
return result;
|
||||
}
|
||||
|
||||
int EReader_Recv(void * r5)
|
||||
{
|
||||
int result;
|
||||
EReaderHelper_SaveRegsState();
|
||||
|
||||
while (1)
|
||||
{
|
||||
GetKeyInput();
|
||||
if (TEST_BUTTON(sJoyNew, B_BUTTON))
|
||||
gUnknown_3003F84 = 2;
|
||||
|
||||
sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, r5);
|
||||
if ((sSendRecvStatus & 0x13) == 0x10)
|
||||
{
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
else if (sSendRecvStatus & 8)
|
||||
{
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
else if (sSendRecvStatus & 4)
|
||||
{
|
||||
result = 2;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
gUnknown_3003F84 = 0;
|
||||
VBlankIntrWait();
|
||||
}
|
||||
}
|
||||
|
||||
CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
|
||||
EReaderHelper_RestoreRegsState();
|
||||
return result;
|
||||
}
|
||||
|
||||
static void CloseSerial(void)
|
||||
{
|
||||
REG_IME = 0;
|
||||
REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
|
||||
REG_IME = 1;
|
||||
REG_SIOCNT = 0;
|
||||
REG_TM3CNT_H = 0;
|
||||
REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL;
|
||||
}
|
||||
|
||||
static void OpenSerialMulti(void)
|
||||
{
|
||||
REG_IME = 0;
|
||||
REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
|
||||
REG_IME = 1;
|
||||
REG_RCNT = 0;
|
||||
REG_SIOCNT = SIO_MULTI_MODE;
|
||||
REG_SIOCNT |= SIO_INTR_ENABLE | SIO_115200_BPS;
|
||||
REG_IME = 0;
|
||||
REG_IE |= INTR_FLAG_SERIAL;
|
||||
REG_IME = 1;
|
||||
if (sSendRecvMgr.state == 0)
|
||||
CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
|
||||
}
|
||||
|
||||
static void OpenSerial32(void)
|
||||
{
|
||||
REG_RCNT = 0;
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE;
|
||||
REG_SIOCNT |= SIO_MULTI_SD;
|
||||
gUnknown_3003F84 = 0;
|
||||
sCounter1 = 0;
|
||||
sCounter2 = 0;
|
||||
}
|
||||
|
||||
u16 EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBuffer)
|
||||
{
|
||||
switch (sSendRecvMgr.state)
|
||||
{
|
||||
case 0:
|
||||
OpenSerialMulti();
|
||||
sSendRecvMgr.field_02 = 1;
|
||||
sSendRecvMgr.state = 1;
|
||||
break;
|
||||
case 1:
|
||||
if (DetermineSendRecvState(mode))
|
||||
EnableSio();
|
||||
if (gUnknown_3003F84 == 2)
|
||||
{
|
||||
sSendRecvMgr.field_04 = 2;
|
||||
sSendRecvMgr.state = 6;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
OpenSerial32();
|
||||
SetUpTransferManager(size, data, recvBuffer);
|
||||
sSendRecvMgr.state = 3;
|
||||
// fallthrough
|
||||
case 3:
|
||||
if (gUnknown_3003F84 == 2)
|
||||
{
|
||||
sSendRecvMgr.field_04 = 2;
|
||||
sSendRecvMgr.state = 6;
|
||||
}
|
||||
else
|
||||
{
|
||||
sCounter1++;
|
||||
sCounter2++;
|
||||
if (sSendRecvMgr.sendOrRecv == 0 && sCounter2 > 60)
|
||||
{
|
||||
sSendRecvMgr.field_04 = 1;
|
||||
sSendRecvMgr.state = 6;
|
||||
}
|
||||
if (sSendRecvMgr.field_02 != 2)
|
||||
{
|
||||
if (sSendRecvMgr.sendOrRecv != 0 && sCounter1 > 2)
|
||||
{
|
||||
EnableSio();
|
||||
sSendRecvMgr.field_02 = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
EnableSio();
|
||||
sSendRecvMgr.field_02 = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
OpenSerialMulti();
|
||||
sSendRecvMgr.state = 5;
|
||||
break;
|
||||
case 5:
|
||||
if (sSendRecvMgr.sendOrRecv == 1 && sCounter1 > 2)
|
||||
EnableSio();
|
||||
if (++sCounter1 > 60)
|
||||
{
|
||||
sSendRecvMgr.field_04 = 1;
|
||||
sSendRecvMgr.state = 6;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if (sSendRecvMgr.field_02 != 0)
|
||||
{
|
||||
CloseSerial();
|
||||
sSendRecvMgr.field_02 = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return sSendRecvMgr.field_02 | (sSendRecvMgr.field_04 << 2) | (sSendRecvMgr.field_03 << 4);
|
||||
}
|
||||
|
||||
static bool16 DetermineSendRecvState(u8 mode)
|
||||
{
|
||||
bool16 resp;
|
||||
if ((*(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SI | SIO_MULTI_SD)) == SIO_MULTI_SD && mode)
|
||||
resp = sSendRecvMgr.sendOrRecv = TRUE;
|
||||
else
|
||||
resp = sSendRecvMgr.sendOrRecv = FALSE;
|
||||
return resp;
|
||||
}
|
||||
|
||||
static void SetUpTransferManager(size_t size, const void * data, void * recvBuffer)
|
||||
{
|
||||
if (sSendRecvMgr.sendOrRecv)
|
||||
{
|
||||
REG_SIOCNT |= SIO_38400_BPS;
|
||||
sSendRecvMgr.dataptr = (void *)data;
|
||||
REG_SIODATA32 = size;
|
||||
sSendRecvMgr.size = size / 4 + 1;
|
||||
StartTm3();
|
||||
}
|
||||
else
|
||||
{
|
||||
REG_SIOCNT |= SIO_9600_BPS;
|
||||
sSendRecvMgr.dataptr = recvBuffer;
|
||||
}
|
||||
}
|
||||
|
||||
static void StartTm3(void)
|
||||
{
|
||||
REG_TM3CNT_L = -601;
|
||||
REG_TM3CNT_H = TIMER_INTR_ENABLE;
|
||||
REG_IME = 0;
|
||||
REG_IE |= INTR_FLAG_TIMER3;
|
||||
REG_IME = 1;
|
||||
}
|
||||
|
||||
void EReaderHelper_Timer3Callback(void)
|
||||
{
|
||||
DisableTm3();
|
||||
EnableSio();
|
||||
}
|
||||
|
||||
void EReaderHelper_SerialCallback(void)
|
||||
{
|
||||
u16 recv[4];
|
||||
u16 i;
|
||||
u16 cnt1;
|
||||
u16 cnt2;
|
||||
u32 recv32;
|
||||
|
||||
switch (sSendRecvMgr.state)
|
||||
{
|
||||
case 1:
|
||||
REG_SIOMLT_SEND = 0xCCD0;
|
||||
*(u64 *)recv = REG_SIOMLT_RECV;
|
||||
for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++)
|
||||
{
|
||||
if (recv[i] == 0xCCD0)
|
||||
cnt1++;
|
||||
else if (recv[i] != 0xFFFF)
|
||||
cnt2++;
|
||||
}
|
||||
if (cnt1 == 2 && cnt2 == 0)
|
||||
sSendRecvMgr.state = 2;
|
||||
break;
|
||||
case 3:
|
||||
recv32 = REG_SIODATA32;
|
||||
if (sSendRecvMgr.cursor == 0 && sSendRecvMgr.sendOrRecv == 0)
|
||||
sSendRecvMgr.size = recv32 / 4 + 1;
|
||||
if (sSendRecvMgr.sendOrRecv == 1)
|
||||
{
|
||||
if (sSendRecvMgr.cursor < sSendRecvMgr.size)
|
||||
{
|
||||
REG_SIODATA32 = sSendRecvMgr.dataptr[sSendRecvMgr.cursor];
|
||||
sSendRecvMgr.checksum += sSendRecvMgr.dataptr[sSendRecvMgr.cursor];
|
||||
}
|
||||
else
|
||||
REG_SIODATA32 = sSendRecvMgr.checksum;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (sSendRecvMgr.cursor > 0 && sSendRecvMgr.cursor < sSendRecvMgr.size + 1)
|
||||
{
|
||||
sSendRecvMgr.dataptr[sSendRecvMgr.cursor - 1] = recv32;
|
||||
sSendRecvMgr.checksum += recv32;
|
||||
}
|
||||
else if (sSendRecvMgr.cursor != 0)
|
||||
{
|
||||
if (sSendRecvMgr.checksum == recv32)
|
||||
sSendRecvMgr.field_03 = 1;
|
||||
else
|
||||
sSendRecvMgr.field_03 = 2;
|
||||
}
|
||||
sCounter2 = 0;
|
||||
}
|
||||
sSendRecvMgr.cursor++;
|
||||
if (sSendRecvMgr.cursor < sSendRecvMgr.size + 2)
|
||||
{
|
||||
if (sSendRecvMgr.sendOrRecv != 0)
|
||||
REG_TM3CNT_H |= TIMER_ENABLE;
|
||||
else
|
||||
EnableSio();
|
||||
}
|
||||
else
|
||||
{
|
||||
sSendRecvMgr.state = 4;
|
||||
sCounter1 = 0;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (sSendRecvMgr.sendOrRecv == 0)
|
||||
REG_SIODATA8 = sSendRecvMgr.field_03;
|
||||
*(vu64 *)recv = REG_SIOMLT_RECV;
|
||||
if (recv[1] == 1 || recv[1] == 2)
|
||||
{
|
||||
if (sSendRecvMgr.sendOrRecv == 1)
|
||||
sSendRecvMgr.field_03 = recv[1];
|
||||
sSendRecvMgr.state = 6;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void EnableSio(void)
|
||||
{
|
||||
REG_SIOCNT |= SIO_ENABLE;
|
||||
}
|
||||
|
||||
static void DisableTm3(void)
|
||||
{
|
||||
REG_TM3CNT_H &= ~TIMER_ENABLE;
|
||||
REG_TM3CNT_L = -601;
|
||||
}
|
||||
|
||||
static void GetKeyInput(void)
|
||||
{
|
||||
u16 rawKeys = REG_KEYINPUT ^ 0x3FF;
|
||||
sJoyNew = rawKeys & ~sJoyNewOrRepeated;
|
||||
sJoyNewOrRepeated = rawKeys;
|
||||
}
|
||||
|
||||
void EReaderHelper_SaveRegsState(void)
|
||||
{
|
||||
sSavedIme = REG_IME;
|
||||
sSavedIe = REG_IE;
|
||||
sSavedTm3Cnt = REG_TM3CNT_H;
|
||||
sSavedSioCnt = REG_SIOCNT;
|
||||
sSavedRCnt = REG_RCNT;
|
||||
}
|
||||
|
||||
void EReaderHelper_RestoreRegsState(void)
|
||||
{
|
||||
REG_IME = sSavedIme;
|
||||
REG_IE = sSavedIe;
|
||||
REG_TM3CNT_H = sSavedTm3Cnt;
|
||||
REG_SIOCNT = sSavedSioCnt;
|
||||
REG_RCNT = sSavedRCnt;
|
||||
}
|
||||
|
||||
void EReaderHelper_ClearsSendRecvMgr(void)
|
||||
{
|
||||
CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
|
||||
}
|
||||
+30
-31
@@ -127,9 +127,9 @@ extern const u8 gFameCheckerText_Cancel[];
|
||||
extern const u8 gFameCheckerText_ListMenuCursor[];
|
||||
extern const u8 gFameCheckerText_FameCheckerWillBeClosed[];
|
||||
extern const u8 gFameCheckerText_ClearTextbox[];
|
||||
extern const u8 gFameCheckerText_MainScreenUI[]; // "{KEYGFX_START_BUTTON}PICK {KEYGFX_DPAD_UP_DOWN}SELECT {KEYGFX_A_BUTTON}OK$"
|
||||
extern const u8 gFameCheckerText_PickScreenUI[]; // "{KEYGFX_START_BUTTON}PICK {KEYGFX_DPAD_UP_DOWN}SELECT {KEYGFX_B_BUTTON}CANCEL$"
|
||||
extern const u8 gFameCheckerText_FlavorTextUI[]; // "{KEYGFX_DPAD_ANY}PICK {KEYGFX_A_BUTTON}READ {KEYGFX_B_BUTTON}CANCEL$"
|
||||
extern const u8 gFameCheckerText_MainScreenUI[]; // "{KEYGFX_DPAD_ANY}PICK {KEYGFX_DPAD_UP_DOWN}SELECT {KEYGFX_A_BUTTON}OK$"
|
||||
extern const u8 gFameCheckerText_PickScreenUI[]; // "{KEYGFX_DPAD_ANY}PICK {KEYGFX_DPAD_UP_DOWN}SELECT {KEYGFX_B_BUTTON}CANCEL$"
|
||||
extern const u8 gFameCheckerText_FlavorTextUI[]; // "{KEYGFX_START_BUTTON}PICK {KEYGFX_A_BUTTON}READ {KEYGFX_B_BUTTON}CANCEL$"
|
||||
extern const u8 gFameCheckerOakName[]; // "OAK$"
|
||||
extern const u8 gFameCheckerDaisyName[]; // "DAISY$"
|
||||
extern const u8 gFameCheckerBillName[]; // "BILL$"
|
||||
@@ -552,7 +552,7 @@ static void Task_TopMenuHandleInput(u8 taskId)
|
||||
if (FindTaskIdByFunc(Task_FCOpenOrCloseInfoBox) == 0xFF)
|
||||
{
|
||||
RunTextPrinters();
|
||||
if ((JOY_NEW(SELECT_BUTTON)) && !sFameCheckerData->inPickMode && sFameCheckerData->savedCallback != UseFameCheckerFromMenu)
|
||||
if ((JOY_NEW(SELECT_BUTTON)) && !sFameCheckerData->inPickMode && sFameCheckerData->savedCallback != ReturnToBagFromKeyItem)
|
||||
task->func = Task_StartToCloseFameChecker;
|
||||
else if (JOY_NEW(START_BUTTON))
|
||||
{
|
||||
@@ -580,7 +580,7 @@ static void Task_TopMenuHandleInput(u8 taskId)
|
||||
}
|
||||
else if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
cursorPos = ListMenuHandleInput(0);
|
||||
cursorPos = ListMenu_ProcessInput(0);
|
||||
if (cursorPos == sFameCheckerData->numUnlockedPersons - 1) // CANCEL
|
||||
task->func = Task_StartToCloseFameChecker;
|
||||
else if (sFameCheckerData->inPickMode)
|
||||
@@ -615,7 +615,7 @@ static void Task_TopMenuHandleInput(u8 taskId)
|
||||
task->func = Task_StartToCloseFameChecker;
|
||||
}
|
||||
else
|
||||
ListMenuHandleInput(0);
|
||||
ListMenu_ProcessInput(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -639,7 +639,7 @@ static bool8 TryExitPickMode(u8 taskId)
|
||||
|
||||
static void MessageBoxPrintEmptyText(void)
|
||||
{
|
||||
AddTextPrinterParametrized(2, 2, gFameCheckerText_ClearTextbox, 0, NULL, 2, 1, 3);
|
||||
AddTextPrinterParameterized2(2, 2, gFameCheckerText_ClearTextbox, 0, NULL, 2, 1, 3);
|
||||
}
|
||||
|
||||
static void Task_EnterPickMode(u8 taskId)
|
||||
@@ -779,7 +779,7 @@ static void GetPickModeText(void)
|
||||
if (HasUnlockedAllFlavorTextsForCurrentPerson() == TRUE)
|
||||
offset = NUM_FAMECHECKER_PERSONS;
|
||||
StringExpandPlaceholders(gStringVar4, sFameCheckerNameAndQuotesPointers[sFameCheckerData->unlockedPersons[who] + offset]);
|
||||
AddTextPrinterParametrized(FCWINDOWID_MSGBOX, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3);
|
||||
AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3);
|
||||
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
|
||||
}
|
||||
}
|
||||
@@ -790,7 +790,7 @@ static void PrintSelectedNameInBrightGreen(u8 taskId)
|
||||
u16 cursorPos = FameCheckerGetCursorY();
|
||||
FillWindowPixelRect(FCWINDOWID_MSGBOX, 0x11, 0, 0, 0xd0, 0x20);
|
||||
StringExpandPlaceholders(gStringVar4, sFameCheckerFlavorTextPointers[sFameCheckerData->unlockedPersons[cursorPos] * 6 + data[1]]);
|
||||
AddTextPrinterParametrized(FCWINDOWID_MSGBOX, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3);
|
||||
AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3);
|
||||
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
|
||||
}
|
||||
|
||||
@@ -853,7 +853,7 @@ static void Task_DestroyAssetsAndCloseFameChecker(u8 taskId)
|
||||
FreeQuestionMarkSpriteResources();
|
||||
FreeListMenuSelectorArrowPairResources();
|
||||
SetMainCallback2(sFameCheckerData->savedCallback);
|
||||
DestroyListMenu(sFameCheckerData->listMenuTaskId, NULL, NULL);
|
||||
DestroyListMenuTask(sFameCheckerData->listMenuTaskId, NULL, NULL);
|
||||
Free(sBg3TilemapBuffer);
|
||||
Free(sBg1TilemapBuffer);
|
||||
Free(sBg2TilemapBuffer);
|
||||
@@ -900,7 +900,7 @@ static void PrintUIHelp(u8 state)
|
||||
}
|
||||
width = GetStringWidth(0, src, 0);
|
||||
FillWindowPixelRect(FCWINDOWID_UIHELP, 0x00, 0, 0, 0xc0, 0x10);
|
||||
AddTextPrinterParametrized2(FCWINDOWID_UIHELP, 0, 188 - width, 0, 0, 2, &sTextColor_White, -1, src);
|
||||
AddTextPrinterParameterized4(FCWINDOWID_UIHELP, 0, 188 - width, 0, 0, 2, &sTextColor_White, -1, src);
|
||||
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_UIHELP);
|
||||
}
|
||||
|
||||
@@ -1213,10 +1213,10 @@ static void UpdateIconDescriptionBox(u8 whichText)
|
||||
gIconDescriptionBoxIsOpen = 1;
|
||||
FillWindowPixelRect(FCWINDOWID_ICONDESC, 0x00, 0, 0, 0x58, 0x20);
|
||||
width = (0x54 - GetStringWidth(0, sFlavorTextOriginLocationTexts[idx], 0)) / 2;
|
||||
AddTextPrinterParametrized2(FCWINDOWID_ICONDESC, 0, width, 0, 0, 2, &sTextColor_DkGrey, -1, sFlavorTextOriginLocationTexts[idx]);
|
||||
AddTextPrinterParameterized4(FCWINDOWID_ICONDESC, 0, width, 0, 0, 2, &sTextColor_DkGrey, -1, sFlavorTextOriginLocationTexts[idx]);
|
||||
StringExpandPlaceholders(gStringVar1, sFlavorTextOriginObjectNameTexts[idx]);
|
||||
width = (0x54 - GetStringWidth(0, gStringVar1, 0)) / 2;
|
||||
AddTextPrinterParametrized2(FCWINDOWID_ICONDESC, 0, width, 10, 0, 2, &sTextColor_DkGrey, -1, gStringVar1);
|
||||
AddTextPrinterParameterized4(FCWINDOWID_ICONDESC, 0, width, 10, 0, 2, &sTextColor_DkGrey, -1, gStringVar1);
|
||||
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_ICONDESC);
|
||||
}
|
||||
|
||||
@@ -1270,7 +1270,7 @@ static void FC_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list
|
||||
struct Task *task = &gTasks[taskId];
|
||||
PlaySE(SE_SELECT);
|
||||
task->data[1] = 0;
|
||||
get_coro_args_x18_x1A(sFameCheckerData->listMenuTaskId, &listMenuTopIdx, NULL);
|
||||
ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listMenuTopIdx, NULL);
|
||||
sFameCheckerData->listMenuTopIdx = listMenuTopIdx;
|
||||
if (itemIndex != sFameCheckerData->numUnlockedPersons - 1)
|
||||
{
|
||||
@@ -1330,7 +1330,7 @@ static void Task_SwitchToPickMode(u8 taskId)
|
||||
static void PrintCancelDescription(void)
|
||||
{
|
||||
FillWindowPixelRect(FCWINDOWID_MSGBOX, 0x11, 0, 0, 0xd0, 0x20);
|
||||
AddTextPrinterParametrized(FCWINDOWID_MSGBOX, 2, gFameCheckerText_FameCheckerWillBeClosed, 0, NULL, 2, 1, 3);
|
||||
AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, 2, gFameCheckerText_FameCheckerWillBeClosed, 0, NULL, 2, 1, 3);
|
||||
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
|
||||
}
|
||||
|
||||
@@ -1339,16 +1339,16 @@ static void FC_DoMoveCursor(s32 itemIndex, bool8 onInit)
|
||||
u16 listY;
|
||||
u16 cursorY;
|
||||
u16 who;
|
||||
get_coro_args_x18_x1A(sFameCheckerData->listMenuTaskId, &listY, &cursorY);
|
||||
ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listY, &cursorY);
|
||||
who = listY + cursorY;
|
||||
AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 8, 14 * cursorY + 4, 0, 0, &sTextColor_Green, 0, sListMenuItems[itemIndex].unk_00);
|
||||
AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 8, 14 * cursorY + 4, 0, 0, &sTextColor_Green, 0, sListMenuItems[itemIndex].label);
|
||||
if (!onInit)
|
||||
{
|
||||
if (listY < sFameCheckerData->listMenuTopIdx2)
|
||||
sFameCheckerData->listMenuDrawnSelIdx++;
|
||||
else if (listY > sFameCheckerData->listMenuTopIdx2 && who != sFameCheckerData->numUnlockedPersons - 1)
|
||||
sFameCheckerData->listMenuDrawnSelIdx--;
|
||||
AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 8, 14 * sFameCheckerData->listMenuDrawnSelIdx + 4, 0, 0, &sTextColor_DkGrey, 0, sListMenuItems[sFameCheckerData->listMenuCurIdx].unk_00);
|
||||
AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 8, 14 * sFameCheckerData->listMenuDrawnSelIdx + 4, 0, 0, &sTextColor_DkGrey, 0, sListMenuItems[sFameCheckerData->listMenuCurIdx].label);
|
||||
|
||||
}
|
||||
sFameCheckerData->listMenuCurIdx = itemIndex;
|
||||
@@ -1368,20 +1368,20 @@ static u8 FC_PopulateListMenu(void)
|
||||
{
|
||||
if (sTrainerIdxs[fameCheckerIdx] < FC_NONTRAINER_START)
|
||||
{
|
||||
sListMenuItems[nitems].unk_00 = gTrainers[sTrainerIdxs[fameCheckerIdx]].trainerName;
|
||||
sListMenuItems[nitems].unk_04 = nitems;
|
||||
sListMenuItems[nitems].label = gTrainers[sTrainerIdxs[fameCheckerIdx]].trainerName;
|
||||
sListMenuItems[nitems].index = nitems;
|
||||
}
|
||||
else
|
||||
{
|
||||
sListMenuItems[nitems].unk_00 = sNonTrainerNamePointers[sTrainerIdxs[fameCheckerIdx] - FC_NONTRAINER_START];
|
||||
sListMenuItems[nitems].unk_04 = nitems;
|
||||
sListMenuItems[nitems].label = sNonTrainerNamePointers[sTrainerIdxs[fameCheckerIdx] - FC_NONTRAINER_START];
|
||||
sListMenuItems[nitems].index = nitems;
|
||||
}
|
||||
sFameCheckerData->unlockedPersons[nitems] = fameCheckerIdx;
|
||||
nitems++;
|
||||
}
|
||||
}
|
||||
sListMenuItems[nitems].unk_00 = gFameCheckerText_Cancel;
|
||||
sListMenuItems[nitems].unk_04 = nitems;
|
||||
sListMenuItems[nitems].label = gFameCheckerText_Cancel;
|
||||
sListMenuItems[nitems].index = nitems;
|
||||
sFameCheckerData->unlockedPersons[nitems] = 0xFF;
|
||||
nitems++;
|
||||
gFameChecker_ListMenuTemplate.totalItems = nitems;
|
||||
@@ -1400,7 +1400,7 @@ static void FC_PutWindowTilemapAndCopyWindowToVramMode3_2(u8 windowId)
|
||||
|
||||
static void FC_CreateScrollIndicatorArrowPair(void)
|
||||
{
|
||||
struct ScrollIndicatorArrowPairTemplate template = {
|
||||
struct ScrollArrowsTemplate template = {
|
||||
2,
|
||||
40,
|
||||
26,
|
||||
@@ -1412,13 +1412,12 @@ static void FC_CreateScrollIndicatorArrowPair(void)
|
||||
SPRITETAG_SCROLL_INDICATORS,
|
||||
0xFFFF,
|
||||
1,
|
||||
0
|
||||
};
|
||||
|
||||
if (sFameCheckerData->numUnlockedPersons > 5)
|
||||
{
|
||||
template.unk_06 = 0;
|
||||
template.unk_08 = sFameCheckerData->numUnlockedPersons - 5;
|
||||
template.fullyUpThreshold = 0;
|
||||
template.fullyDownThreshold = sFameCheckerData->numUnlockedPersons - 5;
|
||||
sFameCheckerData->scrollIndicatorPairTaskId = AddScrollIndicatorArrowPair(&template, &sFameCheckerData->listMenuTopIdx);
|
||||
}
|
||||
}
|
||||
@@ -1432,7 +1431,7 @@ static void FreeListMenuSelectorArrowPairResources(void)
|
||||
static u16 FameCheckerGetCursorY(void)
|
||||
{
|
||||
u16 listY, cursorY;
|
||||
get_coro_args_x18_x1A(sFameCheckerData->listMenuTaskId, &listY, &cursorY);
|
||||
ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listY, &cursorY);
|
||||
return listY + cursorY;
|
||||
}
|
||||
|
||||
@@ -1547,7 +1546,7 @@ static void PlaceListMenuCursor(bool8 isActive)
|
||||
{
|
||||
u16 cursorY = ListMenuGetYCoordForPrintingArrowCursor(sFameCheckerData->listMenuTaskId);
|
||||
if (isActive == TRUE)
|
||||
AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, &sTextColor_DkGrey, 0, gFameCheckerText_ListMenuCursor);
|
||||
AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, &sTextColor_DkGrey, 0, gFameCheckerText_ListMenuCursor);
|
||||
else
|
||||
AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, &sTextColor_White, 0, gFameCheckerText_ListMenuCursor);
|
||||
AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, &sTextColor_White, 0, gFameCheckerText_ListMenuCursor);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
#include "global.h"
|
||||
#include "strings.h"
|
||||
#include "task.h"
|
||||
#include "field_message_box.h"
|
||||
#include "script.h"
|
||||
#include "string_util.h"
|
||||
#include "event_data.h"
|
||||
#include "fldeff.h"
|
||||
#include "party_menu.h"
|
||||
#include "field_poison.h"
|
||||
#include "constants/species.h"
|
||||
#include "constants/battle.h"
|
||||
|
||||
static bool32 IsMonValidSpecies(struct Pokemon *pokemon)
|
||||
{
|
||||
u16 species = GetMonData(pokemon, MON_DATA_SPECIES2);
|
||||
if (species == SPECIES_NONE || species == SPECIES_EGG)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static bool32 AllMonsFainted(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
struct Pokemon *pokemon = gPlayerParty;
|
||||
for (i = 0; i < PARTY_SIZE; i++, pokemon++)
|
||||
if (IsMonValidSpecies(pokemon) && GetMonData(pokemon, MON_DATA_HP))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void FaintFromFieldPoison(u8 partyIdx)
|
||||
{
|
||||
struct Pokemon *pokemon = gPlayerParty + partyIdx;
|
||||
u32 status = STATUS1_NONE;
|
||||
AdjustFriendship(pokemon, 8);
|
||||
SetMonData(pokemon, MON_DATA_STATUS, &status);
|
||||
GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);
|
||||
StringGetEnd10(gStringVar1);
|
||||
}
|
||||
|
||||
static bool32 MonFaintedFromPoison(u8 partyIdx)
|
||||
{
|
||||
struct Pokemon *pokemon = gPlayerParty + partyIdx;
|
||||
if (IsMonValidSpecies(pokemon) && !GetMonData(pokemon, MON_DATA_HP) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void Task_WhiteOut(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
switch (data[0])
|
||||
{
|
||||
case 0:
|
||||
for (; data[1] < PARTY_SIZE; data[1]++)
|
||||
{
|
||||
if (MonFaintedFromPoison(data[1]))
|
||||
{
|
||||
FaintFromFieldPoison(data[1]);
|
||||
ShowFieldMessage(gText_PkmnFainted3);
|
||||
data[0]++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
data[0] = 2;
|
||||
break;
|
||||
case 1:
|
||||
if (IsFieldMessageBoxHidden())
|
||||
data[0]--;
|
||||
break;
|
||||
case 2:
|
||||
if (AllMonsFainted())
|
||||
gSpecialVar_Result = 1;
|
||||
else
|
||||
gSpecialVar_Result = 0;
|
||||
EnableBothScriptContexts();
|
||||
DestroyTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteWhiteOut(void)
|
||||
{
|
||||
CreateTask(Task_WhiteOut, 80);
|
||||
ScriptContext1_Stop();
|
||||
}
|
||||
|
||||
s32 DoPoisonFieldEffect(void)
|
||||
{
|
||||
int i;
|
||||
u32 hp;
|
||||
|
||||
struct Pokemon *pokemon = gPlayerParty;
|
||||
u32 numPoisoned = 0;
|
||||
u32 numFainted = 0;
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
|
||||
{
|
||||
hp = GetMonData(pokemon, MON_DATA_HP);
|
||||
if (hp == 0 || --hp == 0)
|
||||
numFainted++;
|
||||
SetMonData(pokemon, MON_DATA_HP, &hp);
|
||||
numPoisoned++;
|
||||
}
|
||||
pokemon++;
|
||||
}
|
||||
if (numFainted || numPoisoned)
|
||||
FldEffPoison_Start();
|
||||
if (numFainted)
|
||||
return FLDPSN_FNT;
|
||||
if (numPoisoned)
|
||||
return FLDPSN_PSN;
|
||||
return FLDPSN_NONE;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
#include "global.h"
|
||||
|
||||
static u32 sub_80A0E78(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void nullsub_57(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void nullsub_58(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void nullsub_59(void)
|
||||
{
|
||||
}
|
||||
|
||||
void nullsub_60(void)
|
||||
{
|
||||
}
|
||||
|
||||
void nullsub_61(void)
|
||||
{
|
||||
}
|
||||
+2
-2
@@ -897,7 +897,7 @@ void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles,
|
||||
if (!tileset->isCompressed)
|
||||
LoadBgTiles(2, tileset->tiles, numTiles * 32, offset);
|
||||
else
|
||||
sub_80F68F0(2, tileset->tiles, numTiles * 32, offset, 0);
|
||||
DecompressAndCopyTileDataToVram2(2, tileset->tiles, numTiles * 32, offset, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -908,7 +908,7 @@ void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles,
|
||||
if (!tileset->isCompressed)
|
||||
LoadBgTiles(2, tileset->tiles, numTiles * 32, offset);
|
||||
else
|
||||
sub_80F69E8(2, tileset->tiles, numTiles * 32, offset, 0);
|
||||
DecompressAndLoadBgGfxUsingHeap2(2, tileset->tiles, numTiles * 32, offset, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
#include "global.h"
|
||||
#include "field_effect.h"
|
||||
#include "field_player_avatar.h"
|
||||
#include "fldeff.h"
|
||||
#include "item_use.h"
|
||||
#include "overworld.h"
|
||||
#include "party_menu.h"
|
||||
#include "sprite.h"
|
||||
#include "constants/map_objects.h"
|
||||
|
||||
static void FieldCallback_Dig(void);
|
||||
static void sub_80C9AFC(void);
|
||||
|
||||
bool8 SetUpFieldMove_Dig(void)
|
||||
{
|
||||
if (CanUseEscapeRopeOnCurrMap() == TRUE)
|
||||
{
|
||||
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
|
||||
gPostMenuFieldCallback = FieldCallback_Dig;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void FieldCallback_Dig(void)
|
||||
{
|
||||
Overworld_ResetStateAfterDigEscRope();
|
||||
FieldEffectStart(FLDEFF_USE_DIG);
|
||||
gFieldEffectArguments[0] = GetCursorSelectionMonId();
|
||||
}
|
||||
|
||||
bool8 FldEff_UseDig(void)
|
||||
{
|
||||
u8 taskId = oei_task_add();
|
||||
|
||||
FLDEFF_SET_FUNC_TO_DATA(sub_80C9AFC);
|
||||
SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void sub_80C9AFC(void)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
FieldEffectActiveListRemove(FLDEFF_USE_DIG);
|
||||
taskId = CreateTask(sub_80A1C44, 8);
|
||||
gTasks[taskId].data[0] = 0;
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
#include "global.h"
|
||||
#include "task.h"
|
||||
#include "bg.h"
|
||||
#include "sound.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
static void Task_FieldPoisonEffect(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
|
||||
switch (data[0])
|
||||
{
|
||||
case 0:
|
||||
data[1] += 1;
|
||||
if (data[1] > 4)
|
||||
data[0]++;
|
||||
break;
|
||||
case 1:
|
||||
data[1] -= 1;
|
||||
if (data[1] == 0)
|
||||
data[0]++;
|
||||
break;
|
||||
case 2:
|
||||
DestroyTask(taskId);
|
||||
return;
|
||||
}
|
||||
AdjustBgMosaic((u8)(((u8)data[1] << 4) | (u8)data[1]), BG_MOSAIC_SET);
|
||||
}
|
||||
|
||||
void FldEffPoison_Start(void)
|
||||
{
|
||||
PlaySE(SE_DAUGI);
|
||||
CreateTask(Task_FieldPoisonEffect, 80);
|
||||
}
|
||||
|
||||
bool32 FldEffPoison_IsActive(void)
|
||||
{
|
||||
return FuncIsActiveTask(Task_FieldPoisonEffect);
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
#include "global.h"
|
||||
#include "global.fieldmap.h"
|
||||
#include "field_player_avatar.h"
|
||||
#include "field_effect.h"
|
||||
#include "party_menu.h"
|
||||
#include "malloc.h"
|
||||
#include "event_data.h"
|
||||
#include "script.h"
|
||||
#include "fldeff.h"
|
||||
#include "event_scripts.h"
|
||||
#include "field_weather.h"
|
||||
#include "sound.h"
|
||||
#include "palette.h"
|
||||
#include "overworld.h"
|
||||
#include "wild_encounter.h"
|
||||
#include "field_map_obj.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/map_objects.h"
|
||||
|
||||
static void task08_080C9820(u8 taskId);
|
||||
static void sub_80C98FC(u8 taskId);
|
||||
static void sub_80C98B0(u8 taskId);
|
||||
static void sub_80C99A0(u8 taskId);
|
||||
static void sub_80C9A10(void);
|
||||
static void sub_80C9A60(void);
|
||||
|
||||
bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId)
|
||||
{
|
||||
u8 mapObjId;
|
||||
|
||||
GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
|
||||
gPlayerFacingPosition.height = PlayerGetZCoord();
|
||||
mapObjId = GetFieldObjectIdByXYZ(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.height);
|
||||
if (gMapObjects[mapObjId].graphicsId != graphicsId)
|
||||
return FALSE;
|
||||
gSpecialVar_LastTalked = gMapObjects[mapObjId].localId;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
u8 oei_task_add(void)
|
||||
{
|
||||
GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
|
||||
return CreateTask(task08_080C9820, 8);
|
||||
}
|
||||
|
||||
static void task08_080C9820(u8 taskId)
|
||||
{
|
||||
u8 mapObjId;
|
||||
|
||||
ScriptContext2_Enable();
|
||||
gPlayerAvatar.unk6 = TRUE;
|
||||
mapObjId = gPlayerAvatar.mapObjectId;
|
||||
if (!FieldObjectIsMovementOverridden(&gMapObjects[mapObjId])
|
||||
|| FieldObjectClearHeldMovementIfFinished(&gMapObjects[mapObjId]))
|
||||
{
|
||||
if (gMapHeader.mapType == MAP_TYPE_UNDERWATER)
|
||||
{
|
||||
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
|
||||
gTasks[taskId].func = sub_80C98FC;
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_805CB70();
|
||||
FieldObjectSetHeldMovement(&gMapObjects[mapObjId], 0x45);
|
||||
gTasks[taskId].func = sub_80C98B0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80C98B0(u8 taskId)
|
||||
{
|
||||
if (FieldObjectCheckHeldMovementStatus(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE)
|
||||
{
|
||||
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
|
||||
gTasks[taskId].func = sub_80C98FC;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80C98FC(u8 taskId)
|
||||
{
|
||||
if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
|
||||
{
|
||||
gFieldEffectArguments[1] = GetPlayerFacingDirection();
|
||||
if (gFieldEffectArguments[1] == 1)
|
||||
gFieldEffectArguments[2] = 0;
|
||||
if (gFieldEffectArguments[1] == 2)
|
||||
gFieldEffectArguments[2] = 1;
|
||||
if (gFieldEffectArguments[1] == 3)
|
||||
gFieldEffectArguments[2] = 2;
|
||||
if (gFieldEffectArguments[1] == 4)
|
||||
gFieldEffectArguments[2] = 3;
|
||||
EventObjectSetGraphicsId(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState());
|
||||
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]);
|
||||
FieldEffectActiveListRemove(6);
|
||||
gTasks[taskId].func = sub_80C99A0;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80C99A0(u8 taskId)
|
||||
{
|
||||
FLDEFF_CALL_FUNC_IN_DATA();
|
||||
gPlayerAvatar.unk6 = FALSE;
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
|
||||
bool8 SetUpFieldMove_RockSmash(void)
|
||||
{
|
||||
if (CheckObjectGraphicsInFrontOfPlayer(/*MAP_OBJ_GFX_BREAKABLE_ROCK*/0x60) == TRUE)
|
||||
{
|
||||
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
|
||||
gPostMenuFieldCallback = sub_80C9A10;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void sub_80C9A10(void)
|
||||
{
|
||||
gFieldEffectArguments[0] = GetCursorSelectionMonId();
|
||||
ScriptContext1_SetupScript(EventScript_FldEffRockSmash);
|
||||
}
|
||||
|
||||
bool8 FldEff_UseRockSmash(void)
|
||||
{
|
||||
u8 taskId = oei_task_add();
|
||||
|
||||
FLDEFF_SET_FUNC_TO_DATA(sub_80C9A60);
|
||||
IncrementGameStat(GAME_STAT_USED_ROCK_SMASH);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void sub_80C9A60(void)
|
||||
{
|
||||
PlaySE(SE_W145);
|
||||
FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH);
|
||||
EnableBothScriptContexts();
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
#include "global.h"
|
||||
#include "party_menu.h"
|
||||
#include "sound.h"
|
||||
#include "string_util.h"
|
||||
#include "menu.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "constants/songs.h"
|
||||
#include "fldeff.h"
|
||||
|
||||
static void sub_80E57E8(u8 taskId);
|
||||
static void sub_80E583C(u8 taskId);
|
||||
static void sub_80E58A0(u8 taskId);
|
||||
static void sub_80E5934(u8 taskId);
|
||||
|
||||
extern const u8 gUnknown_84169F8[];
|
||||
extern const u8 gUnknown_8416F27[];
|
||||
|
||||
bool8 hm_prepare_dive_probably(void)
|
||||
{
|
||||
u16 maxHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_MAX_HP);
|
||||
u16 curHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_HP);
|
||||
|
||||
if (curHp > maxHp / 5)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void sub_80E56DC(u8 taskId)
|
||||
{
|
||||
gUnknown_203B0A0.unkB = 10;
|
||||
gUnknown_203B0A0.unkA = gUnknown_203B0A0.unk9;
|
||||
sub_811F818(GetCursorSelectionMonId(), 1);
|
||||
sub_8121D0C(5);
|
||||
gTasks[taskId].func = sub_811FB28;
|
||||
}
|
||||
|
||||
void sub_80E5724(u8 taskId)
|
||||
{
|
||||
u8 r8 = gUnknown_203B0A0.unk9;
|
||||
u8 r5 = gUnknown_203B0A0.unkA;
|
||||
u16 curHp;
|
||||
s16 delta;
|
||||
|
||||
if (r5 > 6)
|
||||
{
|
||||
gUnknown_203B0A0.unkB = 0;
|
||||
sub_8121D0C(0);
|
||||
gTasks[taskId].func = sub_811FB28;
|
||||
}
|
||||
else
|
||||
{
|
||||
curHp = GetMonData(&gPlayerParty[r5], MON_DATA_HP);
|
||||
if (curHp == 0 || r8 == r5 || GetMonData(&gPlayerParty[r5], MON_DATA_MAX_HP) == curHp)
|
||||
{
|
||||
sub_80E5934(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_KAIFUKU);
|
||||
sub_8120760(taskId, r8, -1, GetMonData(&gPlayerParty[r8], MON_DATA_MAX_HP) / 5, sub_80E57E8);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80E57E8(u8 taskId)
|
||||
{
|
||||
PlaySE(SE_KAIFUKU);
|
||||
sub_8120760(taskId, gUnknown_203B0A0.unkA, 1, GetMonData(&gPlayerParty[gUnknown_203B0A0.unk9], MON_DATA_MAX_HP) / 5, sub_80E583C);
|
||||
}
|
||||
|
||||
static void sub_80E583C(u8 taskId)
|
||||
{
|
||||
GetMonNickname(&gPlayerParty[gUnknown_203B0A0.unkA], gStringVar1);
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_8416F27);
|
||||
sub_81202F8(gStringVar4, 0);
|
||||
ScheduleBgCopyTilemapToVram(2);
|
||||
gTasks[taskId].func = sub_80E58A0;
|
||||
}
|
||||
|
||||
static void sub_80E58A0(u8 taskId)
|
||||
{
|
||||
if (sub_8120370() != TRUE)
|
||||
{
|
||||
gUnknown_203B0A0.unkB = 0;
|
||||
sub_811F818(gUnknown_203B0A0.unk9, 0);
|
||||
gUnknown_203B0A0.unk9 = gUnknown_203B0A0.unkA;
|
||||
sub_811F818(gUnknown_203B0A0.unkA, 1);
|
||||
ClearStdWindowAndFrameToTransparent(6, 0);
|
||||
ClearWindowTilemap(6);
|
||||
sub_8121D0C(0);
|
||||
gTasks[taskId].func = sub_811FB28;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80E5900(u8 taskId)
|
||||
{
|
||||
if (sub_8120370() != TRUE)
|
||||
{
|
||||
sub_8121D0C(5);
|
||||
gTasks[taskId].func = sub_811FB28;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80E5934(u8 taskId)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
sub_81202F8(gUnknown_84169F8, 0);
|
||||
ScheduleBgCopyTilemapToVram(2);
|
||||
gTasks[taskId].func = sub_80E5900;
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
#include "global.h"
|
||||
#include "field_player_avatar.h"
|
||||
#include "field_effect.h"
|
||||
#include "party_menu.h"
|
||||
#include "event_data.h"
|
||||
#include "script.h"
|
||||
#include "fldeff.h"
|
||||
#include "event_scripts.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/map_objects.h"
|
||||
|
||||
static void FldEff_UseStrength(void);
|
||||
static void sub_80D08A8(void);
|
||||
|
||||
bool8 SetUpFieldMove_Strength(void)
|
||||
{
|
||||
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(/*MAP_OBJ_GFX_PUSHABLE_BOULDER*/0x61) != TRUE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
gSpecialVar_Result = GetCursorSelectionMonId();
|
||||
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
|
||||
gPostMenuFieldCallback = FldEff_UseStrength;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
static void FldEff_UseStrength(void)
|
||||
{
|
||||
gFieldEffectArguments[0] = GetCursorSelectionMonId();
|
||||
ScriptContext1_SetupScript(EventScript_FldEffStrength);
|
||||
}
|
||||
|
||||
bool8 sub_80D0860(void)
|
||||
{
|
||||
u8 taskId = oei_task_add();
|
||||
FLDEFF_SET_FUNC_TO_DATA(sub_80D08A8);
|
||||
GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void sub_80D08A8(void)
|
||||
{
|
||||
FieldEffectActiveListRemove(FLDEFF_USE_STRENGTH);
|
||||
EnableBothScriptContexts();
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
#include "global.h"
|
||||
#include "field_player_avatar.h"
|
||||
#include "field_effect.h"
|
||||
#include "party_menu.h"
|
||||
#include "malloc.h"
|
||||
#include "event_data.h"
|
||||
#include "script.h"
|
||||
#include "fldeff.h"
|
||||
#include "event_scripts.h"
|
||||
#include "field_weather.h"
|
||||
#include "sound.h"
|
||||
#include "palette.h"
|
||||
#include "wild_encounter.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
static void FieldCallback_SweetScent(void);
|
||||
static void StartSweetScentFieldEffect(void);
|
||||
static void TrySweetScentEncounter(u8 taskId);
|
||||
static void FailSweetScentEncounter(u8 taskId);
|
||||
|
||||
static void Unused_StartSweetscentFldeff(void)
|
||||
{
|
||||
gUnknown_203B0A0.unk9 = 0;
|
||||
FieldCallback_SweetScent();
|
||||
}
|
||||
|
||||
bool8 SetUpFieldMove_SweetScent(void)
|
||||
{
|
||||
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
|
||||
gPostMenuFieldCallback = FieldCallback_SweetScent;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void FieldCallback_SweetScent(void)
|
||||
{
|
||||
FieldEffectStart(FLDEFF_SWEET_SCENT);
|
||||
gFieldEffectArguments[0] = GetCursorSelectionMonId();
|
||||
}
|
||||
|
||||
bool8 FldEff_SweetScent(void)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
SetWeatherScreenFadeOut();
|
||||
taskId = oei_task_add();
|
||||
FLDEFF_SET_FUNC_TO_DATA(StartSweetScentFieldEffect);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void StartSweetScentFieldEffect(void)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
PlaySE(SE_W260);
|
||||
gUnknown_203AAB0 = (u8 *)Alloc(0x400);
|
||||
CpuFastSet(gPlttBufferUnfaded, gUnknown_203AAB0, 0x100);
|
||||
CpuFastSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x100);
|
||||
BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, RGB(31, 0, 0));
|
||||
taskId = CreateTask(TrySweetScentEncounter, 0);
|
||||
gTasks[taskId].data[0] = 0;
|
||||
FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT);
|
||||
}
|
||||
|
||||
static void TrySweetScentEncounter(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
if (data[0] == 64)
|
||||
{
|
||||
data[0] = 0;
|
||||
if (SweetScentWildEncounter() == TRUE)
|
||||
{
|
||||
Free(gUnknown_203AAB0);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].func = FailSweetScentEncounter;
|
||||
BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, RGB(31, 0, 0));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
data[0]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void FailSweetScentEncounter(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
CpuFastSet(gUnknown_203AAB0, gPlttBufferUnfaded, 0x100);
|
||||
sub_807B070();
|
||||
Free(gUnknown_203AAB0);
|
||||
ScriptContext1_SetupScript(EventScript_FailSweetScent);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
@@ -29,8 +29,7 @@ static void FieldCallback_Teleport(void)
|
||||
bool8 FldEff_UseTeleport(void)
|
||||
{
|
||||
u8 taskId = oei_task_add();
|
||||
gTasks[taskId].data[8] = (u32)StartTeleportFieldEffect >> 16;
|
||||
gTasks[taskId].data[9] = (u32)StartTeleportFieldEffect;
|
||||
FLDEFF_SET_FUNC_TO_DATA(StartTeleportFieldEffect);
|
||||
SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
+3
-3
@@ -10,9 +10,9 @@
|
||||
|
||||
static u8 sGpuRegBuffer[GPU_REG_BUF_SIZE];
|
||||
static u8 sGpuRegWaitingList[GPU_REG_BUF_SIZE];
|
||||
static bool8 sGpuRegBufferLocked;
|
||||
static bool8 sShouldSyncRegIE;
|
||||
static u16 sRegIE;
|
||||
static volatile bool8 sGpuRegBufferLocked;
|
||||
static volatile bool8 sShouldSyncRegIE;
|
||||
static vu16 sRegIE;
|
||||
|
||||
static void CopyBufferedValueToGpuReg(u8 regOffset);
|
||||
static void SyncRegIE(void);
|
||||
|
||||
+1202
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,53 @@
|
||||
#include "global.h"
|
||||
#include "hall_of_fame.h"
|
||||
#include "palette.h"
|
||||
#include "overworld.h"
|
||||
#include "script.h"
|
||||
#include "script_menu.h"
|
||||
#include "task.h"
|
||||
#include "hall_of_fame.h"
|
||||
#include "bg.h"
|
||||
#include "window.h"
|
||||
|
||||
static void ReshowPCMenuAfterHallOfFamePC(void);
|
||||
static void Task_WaitForPaletteFade(u8 taskId);
|
||||
|
||||
static void Task_WaitFadeAndSetCallback(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
FreeAllWindowBuffers();
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
DestroyTask(taskId);
|
||||
SetMainCallback2(sub_80F2978);
|
||||
}
|
||||
}
|
||||
|
||||
void HallOfFamePCBeginFade(void)
|
||||
{
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
|
||||
ScriptContext2_Enable();
|
||||
CreateTask(Task_WaitFadeAndSetCallback, 0);
|
||||
}
|
||||
|
||||
void ReturnFromHallOfFamePC(void)
|
||||
{
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
gFieldCallback = ReshowPCMenuAfterHallOfFamePC;
|
||||
}
|
||||
|
||||
static void ReshowPCMenuAfterHallOfFamePC(void)
|
||||
{
|
||||
ScriptContext2_Enable();
|
||||
Overworld_PlaySpecialMapMusic();
|
||||
ScrSpecial_CreatePCMenu();
|
||||
ScriptMenu_DisplayPCStartupPrompt();
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
|
||||
CreateTask(Task_WaitForPaletteFade, 10);
|
||||
}
|
||||
|
||||
static void Task_WaitForPaletteFade(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
+2175
File diff suppressed because it is too large
Load Diff
+684
@@ -0,0 +1,684 @@
|
||||
#include "global.h"
|
||||
#include "berry.h"
|
||||
#include "event_data.h"
|
||||
#include "item.h"
|
||||
#include "item_use.h"
|
||||
#include "load_save.h"
|
||||
#include "malloc.h"
|
||||
#include "quest_log.h"
|
||||
#include "string_util.h"
|
||||
#include "strings.h"
|
||||
#include "constants/hold_effects.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/maps.h"
|
||||
|
||||
void SortAndCompactBagPocket(struct BagPocket * pocket);
|
||||
|
||||
// Item descriptions and data
|
||||
#include "data/items.h"
|
||||
|
||||
u16 GetBagItemQuantity(u16 * ptr)
|
||||
{
|
||||
return gSaveBlock2Ptr->encryptionKey ^ *ptr;
|
||||
}
|
||||
|
||||
void SetBagItemQuantity(u16 * ptr, u16 value)
|
||||
{
|
||||
*ptr = value ^ gSaveBlock2Ptr->encryptionKey;
|
||||
}
|
||||
|
||||
u16 GetPcItemQuantity(u16 * ptr)
|
||||
{
|
||||
return 0 ^ *ptr;
|
||||
}
|
||||
|
||||
void SetPcItemQuantity(u16 * ptr, u16 value)
|
||||
{
|
||||
*ptr = value ^ 0;
|
||||
}
|
||||
|
||||
void ApplyNewEncryptionKeyToBagItems(u32 key)
|
||||
{
|
||||
u32 i, j;
|
||||
|
||||
for (i = 0; i < NUM_BAG_POCKETS; i++)
|
||||
{
|
||||
for (j = 0; j < gBagPockets[i].capacity; j++)
|
||||
{
|
||||
ApplyNewEncryptionKeyToHword(&gBagPockets[i].itemSlots[j].quantity, key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyNewEncryptionKeyToBagItems_(u32 key)
|
||||
{
|
||||
ApplyNewEncryptionKeyToBagItems(key);
|
||||
}
|
||||
|
||||
void SetBagPocketsPointers(void)
|
||||
{
|
||||
gBagPockets[POCKET_ITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Items;
|
||||
gBagPockets[POCKET_ITEMS - 1].capacity = BAG_ITEMS_COUNT;
|
||||
gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_KeyItems;
|
||||
gBagPockets[POCKET_KEY_ITEMS - 1].capacity = BAG_KEYITEMS_COUNT;
|
||||
gBagPockets[POCKET_POKE_BALLS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_PokeBalls;
|
||||
gBagPockets[POCKET_POKE_BALLS - 1].capacity = BAG_POKEBALLS_COUNT;
|
||||
gBagPockets[POCKET_TM_CASE - 1].itemSlots = gSaveBlock1Ptr->bagPocket_TMHM;
|
||||
gBagPockets[POCKET_TM_CASE - 1].capacity = BAG_TMHM_COUNT;
|
||||
gBagPockets[POCKET_BERRY_POUCH - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Berries;
|
||||
gBagPockets[POCKET_BERRY_POUCH - 1].capacity = BAG_BERRIES_COUNT;
|
||||
}
|
||||
|
||||
void CopyItemName(u16 itemId, u8 * dest)
|
||||
{
|
||||
if (itemId == ITEM_ENIGMA_BERRY)
|
||||
{
|
||||
StringCopy(dest, sub_809C8A0(43)->name);
|
||||
StringAppend(dest, gUnknown_84162BD);
|
||||
}
|
||||
else
|
||||
{
|
||||
StringCopy(dest, ItemId_GetName(itemId));
|
||||
}
|
||||
}
|
||||
|
||||
s8 BagPocketGetFirstEmptySlot(u8 pocketId)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < gBagPockets[pocketId].capacity; i++)
|
||||
{
|
||||
if (gBagPockets[pocketId].itemSlots[i].itemId == ITEM_NONE)
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool8 IsPocketNotEmpty(u8 pocketId)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < gBagPockets[pocketId - 1].capacity; i++)
|
||||
{
|
||||
if (gBagPockets[pocketId - 1].itemSlots[i].itemId != ITEM_NONE)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 CheckBagHasItem(u16 itemId, u16 count)
|
||||
{
|
||||
u8 i;
|
||||
u8 pocket;
|
||||
|
||||
if (ItemId_GetPocket(itemId) == 0)
|
||||
return FALSE;
|
||||
|
||||
pocket = ItemId_GetPocket(itemId) - 1;
|
||||
// Check for item slots that contain the item
|
||||
for (i = 0; i < gBagPockets[pocket].capacity; i++)
|
||||
{
|
||||
if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
|
||||
{
|
||||
u16 quantity;
|
||||
// Does this item slot contain enough of the item?
|
||||
quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
|
||||
if (quantity >= count)
|
||||
return TRUE;
|
||||
// RS and Emerald check whether there is enough of the
|
||||
// item across all stacks.
|
||||
// For whatever reason, FR/LG assume there's only one
|
||||
// stack of the item.
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 CheckHasAtLeastOneBerry(void)
|
||||
{
|
||||
u8 itemId;
|
||||
bool8 exists;
|
||||
|
||||
exists = CheckBagHasItem(ITEM_BERRY_POUCH, 1);
|
||||
if (!exists)
|
||||
{
|
||||
gSpecialVar_Result = FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
for (itemId = FIRST_BERRY_INDEX; itemId <= LAST_BERRY_INDEX; itemId++)
|
||||
{
|
||||
exists = CheckBagHasItem(itemId, 1);
|
||||
if (exists)
|
||||
{
|
||||
gSpecialVar_Result = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
gSpecialVar_Result = FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 CheckBagHasSpace(u16 itemId, u16 count)
|
||||
{
|
||||
u8 i;
|
||||
u8 pocket;
|
||||
|
||||
if (ItemId_GetPocket(itemId) == 0)
|
||||
return FALSE;
|
||||
|
||||
pocket = ItemId_GetPocket(itemId) - 1;
|
||||
// Check for item slots that contain the item
|
||||
for (i = 0; i < gBagPockets[pocket].capacity; i++)
|
||||
{
|
||||
if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
|
||||
{
|
||||
u16 quantity;
|
||||
// Does this stack have room for more??
|
||||
quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
|
||||
if (quantity + count <= 999)
|
||||
return TRUE;
|
||||
// RS and Emerald check whether there is enough of the
|
||||
// item across all stacks.
|
||||
// For whatever reason, FR/LG assume there's only one
|
||||
// stack of the item.
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (BagPocketGetFirstEmptySlot(pocket) != -1)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 AddBagItem(u16 itemId, u16 count)
|
||||
{
|
||||
u8 i;
|
||||
u8 pocket;
|
||||
s8 idx;
|
||||
|
||||
if (ItemId_GetPocket(itemId) == 0)
|
||||
return FALSE;
|
||||
|
||||
pocket = ItemId_GetPocket(itemId) - 1;
|
||||
for (i = 0; i < gBagPockets[pocket].capacity; i++)
|
||||
{
|
||||
if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
|
||||
{
|
||||
u16 quantity;
|
||||
// Does this stack have room for more??
|
||||
quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
|
||||
if (quantity + count <= 999)
|
||||
{
|
||||
quantity += count;
|
||||
SetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity, quantity);
|
||||
return TRUE;
|
||||
}
|
||||
// RS and Emerald check whether there is enough of the
|
||||
// item across all stacks.
|
||||
// For whatever reason, FR/LG assume there's only one
|
||||
// stack of the item.
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (pocket == POCKET_TM_CASE - 1 && !CheckBagHasItem(ITEM_TM_CASE, 1))
|
||||
{
|
||||
idx = BagPocketGetFirstEmptySlot(POCKET_KEY_ITEMS - 1);
|
||||
if (idx == -1)
|
||||
return FALSE;
|
||||
gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].itemId = ITEM_TM_CASE;
|
||||
SetBagItemQuantity(&gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].quantity, 1);
|
||||
}
|
||||
|
||||
if (pocket == POCKET_BERRY_POUCH - 1 && !CheckBagHasItem(ITEM_BERRY_POUCH, 1))
|
||||
{
|
||||
idx = BagPocketGetFirstEmptySlot(POCKET_KEY_ITEMS - 1);
|
||||
if (idx == -1)
|
||||
return FALSE;
|
||||
gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].itemId = ITEM_BERRY_POUCH;
|
||||
SetBagItemQuantity(&gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].quantity, 1);
|
||||
FlagSet(FLAG_0x847);
|
||||
}
|
||||
|
||||
if (itemId == ITEM_BERRY_POUCH)
|
||||
FlagSet(FLAG_0x847);
|
||||
|
||||
idx = BagPocketGetFirstEmptySlot(pocket);
|
||||
if (idx == -1)
|
||||
return FALSE;
|
||||
|
||||
gBagPockets[pocket].itemSlots[idx].itemId = itemId;
|
||||
SetBagItemQuantity(&gBagPockets[pocket].itemSlots[idx].quantity, count);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 RemoveBagItem(u16 itemId, u16 count)
|
||||
{
|
||||
u8 i;
|
||||
u8 pocket;
|
||||
|
||||
if (ItemId_GetPocket(itemId) == 0)
|
||||
return FALSE;
|
||||
|
||||
if (itemId == ITEM_NONE)
|
||||
return FALSE;
|
||||
|
||||
pocket = ItemId_GetPocket(itemId) - 1;
|
||||
// Check for item slots that contain the item
|
||||
for (i = 0; i < gBagPockets[pocket].capacity; i++)
|
||||
{
|
||||
if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
|
||||
{
|
||||
u16 quantity;
|
||||
// Does this item slot contain enough of the item?
|
||||
quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
|
||||
if (quantity >= count)
|
||||
{
|
||||
quantity -= count;
|
||||
SetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity, quantity);
|
||||
if (quantity == 0)
|
||||
gBagPockets[pocket].itemSlots[i].itemId = ITEM_NONE;
|
||||
return TRUE;
|
||||
}
|
||||
// RS and Emerald check whether there is enough of the
|
||||
// item across all stacks.
|
||||
// For whatever reason, FR/LG assume there's only one
|
||||
// stack of the item.
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 GetPocketByItemId(u16 itemId)
|
||||
{
|
||||
return ItemId_GetPocket(itemId); // wow such important
|
||||
}
|
||||
|
||||
void ClearItemSlots(struct ItemSlot * slots, u8 capacity)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < capacity; i++)
|
||||
{
|
||||
slots[i].itemId = ITEM_NONE;
|
||||
SetBagItemQuantity(&slots[i].quantity, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void ClearPCItemSlots(void)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < PC_ITEMS_COUNT; i++)
|
||||
{
|
||||
gSaveBlock1Ptr->pcItems[i].itemId = ITEM_NONE;
|
||||
SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void ClearItemSlotsInAllBagPockets(void)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity);
|
||||
}
|
||||
}
|
||||
|
||||
s8 PCItemsGetFirstEmptySlot(void)
|
||||
{
|
||||
s8 i;
|
||||
|
||||
for (i = 0; i < PC_ITEMS_COUNT; i++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE)
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
u8 CountItemsInPC(void)
|
||||
{
|
||||
u8 count = 0;
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < PC_ITEMS_COUNT; i++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->pcItems[i].itemId != ITEM_NONE)
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
bool8 CheckPCHasItem(u16 itemId, u16 count)
|
||||
{
|
||||
u8 i;
|
||||
u16 quantity;
|
||||
|
||||
for (i = 0; i < PC_ITEMS_COUNT; i++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->pcItems[i].itemId == itemId)
|
||||
{
|
||||
quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity);
|
||||
if (quantity >= count)
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 AddPCItem(u16 itemId, u16 count)
|
||||
{
|
||||
u8 i;
|
||||
u16 quantity;
|
||||
s8 idx;
|
||||
|
||||
for (i = 0; i < PC_ITEMS_COUNT; i++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->pcItems[i].itemId == itemId)
|
||||
{
|
||||
quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity);
|
||||
if (quantity + count <= 999)
|
||||
{
|
||||
quantity += count;
|
||||
SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, quantity);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
idx = PCItemsGetFirstEmptySlot();
|
||||
if (idx == -1)
|
||||
return FALSE;
|
||||
|
||||
gSaveBlock1Ptr->pcItems[idx].itemId = itemId;
|
||||
SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[idx].quantity, count);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void RemoveItemFromPC(u16 itemId, u16 count)
|
||||
{
|
||||
u32 i;
|
||||
u16 quantity;
|
||||
|
||||
if (itemId == ITEM_NONE)
|
||||
return;
|
||||
|
||||
for (i = 0; i < PC_ITEMS_COUNT; i++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->pcItems[i].itemId == itemId)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i != PC_ITEMS_COUNT)
|
||||
{
|
||||
quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity) - count;
|
||||
SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, quantity);
|
||||
if (quantity == 0)
|
||||
gSaveBlock1Ptr->pcItems[i].itemId = ITEM_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
void ItemPcCompaction(void)
|
||||
{
|
||||
u16 i, j;
|
||||
struct ItemSlot tmp;
|
||||
|
||||
for (i = 0; i < PC_ITEMS_COUNT - 1; i++)
|
||||
{
|
||||
for (j = i + 1; j < PC_ITEMS_COUNT; j++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE)
|
||||
{
|
||||
tmp = gSaveBlock1Ptr->pcItems[i];
|
||||
gSaveBlock1Ptr->pcItems[i] = gSaveBlock1Ptr->pcItems[j];
|
||||
gSaveBlock1Ptr->pcItems[j] = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RegisteredItemHandleBikeSwap(void)
|
||||
{
|
||||
switch (gSaveBlock1Ptr->registeredItem)
|
||||
{
|
||||
case ITEM_MACH_BIKE:
|
||||
gSaveBlock1Ptr->registeredItem = ITEM_ACRO_BIKE;
|
||||
break;
|
||||
case ITEM_ACRO_BIKE:
|
||||
gSaveBlock1Ptr->registeredItem = ITEM_MACH_BIKE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SwapItemSlots(struct ItemSlot * a, struct ItemSlot * b)
|
||||
{
|
||||
struct ItemSlot c;
|
||||
c = *a;
|
||||
*a = *b;
|
||||
*b = c;
|
||||
}
|
||||
|
||||
void BagPocketCompaction(struct ItemSlot * slots, u8 capacity)
|
||||
{
|
||||
u16 i, j;
|
||||
|
||||
for (i = 0; i < capacity - 1; i++)
|
||||
{
|
||||
for (j = i + 1; j < capacity; j++)
|
||||
{
|
||||
if (GetBagItemQuantity(&slots[i].quantity) == 0)
|
||||
{
|
||||
SwapItemSlots(&slots[i], &slots[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SortPocketAndPlaceHMsFirst(struct BagPocket * pocket)
|
||||
{
|
||||
u16 i;
|
||||
u16 j = 0;
|
||||
u16 k;
|
||||
struct ItemSlot * buff;
|
||||
|
||||
SortAndCompactBagPocket(pocket);
|
||||
|
||||
for (i = 0; i < pocket->capacity; i++)
|
||||
{
|
||||
if (pocket->itemSlots[i].itemId == ITEM_NONE && GetBagItemQuantity(&pocket->itemSlots[i].quantity) == 0)
|
||||
return;
|
||||
if (pocket->itemSlots[i].itemId >= ITEM_HM01 && GetBagItemQuantity(&pocket->itemSlots[i].quantity) != 0)
|
||||
{
|
||||
for (j = i + 1; j < pocket->capacity; j++)
|
||||
{
|
||||
if (pocket->itemSlots[j].itemId == ITEM_NONE && GetBagItemQuantity(&pocket->itemSlots[j].quantity) == 0)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (k = 0; k < pocket->capacity; k++)
|
||||
pocket->itemSlots[k].quantity = GetBagItemQuantity(&pocket->itemSlots[k].quantity);
|
||||
buff = AllocZeroed(pocket->capacity * sizeof(struct ItemSlot));
|
||||
CpuCopy16(pocket->itemSlots + i, buff, (j - i) * sizeof(struct ItemSlot));
|
||||
CpuCopy16(pocket->itemSlots, buff + (j - i), i * sizeof(struct ItemSlot));
|
||||
CpuCopy16(buff, pocket->itemSlots, pocket->capacity * sizeof(struct ItemSlot));
|
||||
for (k = 0; k < pocket->capacity; k++)
|
||||
SetBagItemQuantity(&pocket->itemSlots[k].quantity, pocket->itemSlots[k].quantity);
|
||||
Free(buff);
|
||||
}
|
||||
|
||||
void SortAndCompactBagPocket(struct BagPocket * pocket)
|
||||
{
|
||||
u16 i, j;
|
||||
|
||||
for (i = 0; i < pocket->capacity; i++)
|
||||
{
|
||||
for (j = i + 1; j < pocket->capacity; j++)
|
||||
{
|
||||
if (GetBagItemQuantity(&pocket->itemSlots[i].quantity) == 0 || (GetBagItemQuantity(&pocket->itemSlots[j].quantity) != 0 && pocket->itemSlots[i].itemId > pocket->itemSlots[j].itemId))
|
||||
SwapItemSlots(&pocket->itemSlots[i], &pocket->itemSlots[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 slotId)
|
||||
{
|
||||
return gBagPockets[pocketId - 1].itemSlots[slotId].itemId;
|
||||
}
|
||||
|
||||
u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 slotId)
|
||||
{
|
||||
return GetBagItemQuantity(&gBagPockets[pocketId - 1].itemSlots[slotId].quantity);
|
||||
}
|
||||
|
||||
u16 BagGetQuantityByItemId(u16 itemId)
|
||||
{
|
||||
u16 i;
|
||||
struct BagPocket * pocket = &gBagPockets[ItemId_GetPocket(itemId) - 1];
|
||||
|
||||
for (i = 0; i < pocket->capacity; i++)
|
||||
{
|
||||
if (pocket->itemSlots[i].itemId == itemId)
|
||||
return GetBagItemQuantity(&pocket->itemSlots[i].quantity);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sub_809A824(u16 itemId)
|
||||
{
|
||||
struct QuestLogStruct_809A824
|
||||
{
|
||||
u16 itemId;
|
||||
u8 mapSectionId;
|
||||
} * ptr;
|
||||
if
|
||||
(
|
||||
itemId == ITEM_OAKS_PARCEL
|
||||
|| itemId == ITEM_POKE_FLUTE
|
||||
|| itemId == ITEM_SECRET_KEY
|
||||
|| itemId == ITEM_BIKE_VOUCHER
|
||||
|| itemId == ITEM_GOLD_TEETH
|
||||
|| itemId == ITEM_OLD_AMBER
|
||||
|| itemId == ITEM_CARD_KEY
|
||||
|| itemId == ITEM_LIFT_KEY
|
||||
|| itemId == ITEM_HELIX_FOSSIL
|
||||
|| itemId == ITEM_DOME_FOSSIL
|
||||
|| itemId == ITEM_SILPH_SCOPE
|
||||
|| itemId == ITEM_BICYCLE
|
||||
|| itemId == ITEM_TOWN_MAP
|
||||
|| itemId == ITEM_VS_SEEKER
|
||||
|| itemId == ITEM_TEACHY_TV
|
||||
|| itemId == ITEM_RAINBOW_PASS
|
||||
|| itemId == ITEM_TEA
|
||||
|| itemId == ITEM_POWDER_JAR
|
||||
|| itemId == ITEM_RUBY
|
||||
|| itemId == ITEM_SAPPHIRE
|
||||
)
|
||||
{
|
||||
if (itemId != ITEM_TOWN_MAP || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_GARYS_HOUSE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_GARYS_HOUSE)))
|
||||
{
|
||||
ptr = malloc(sizeof(*ptr));
|
||||
ptr->itemId = itemId;
|
||||
ptr->mapSectionId = gMapHeader.regionMapSectionId;
|
||||
sub_8113550(40, (void *)ptr);
|
||||
free(ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
u16 SanitizeItemId(u16 itemId)
|
||||
{
|
||||
if (itemId >= ITEM_N_A)
|
||||
return ITEM_NONE;
|
||||
return itemId;
|
||||
}
|
||||
|
||||
const u8 * ItemId_GetName(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].name;
|
||||
}
|
||||
|
||||
u16 itemid_get_number(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].itemId;
|
||||
}
|
||||
|
||||
u16 itemid_get_market_price(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].price;
|
||||
}
|
||||
|
||||
u8 ItemId_GetHoldEffect(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].holdEffect;
|
||||
}
|
||||
|
||||
u8 ItemId_GetHoldEffectParam(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].holdEffectParam;
|
||||
}
|
||||
|
||||
const u8 * ItemId_GetDescription(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].description;
|
||||
}
|
||||
|
||||
bool8 itemid_is_unique(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].importance;
|
||||
}
|
||||
|
||||
u8 itemid_get_x19(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].exitsBagOnUse;
|
||||
}
|
||||
|
||||
u8 ItemId_GetPocket(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].pocket;
|
||||
}
|
||||
|
||||
u8 ItemId_GetType(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].type;
|
||||
}
|
||||
|
||||
ItemUseFunc ItemId_GetFieldFunc(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].fieldUseFunc;
|
||||
}
|
||||
|
||||
bool8 ItemId_GetBattleUsage(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].battleUsage;
|
||||
}
|
||||
|
||||
ItemUseFunc ItemId_GetBattleFunc(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].battleUseFunc;
|
||||
}
|
||||
|
||||
u8 ItemId_GetSecondaryId(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].secondaryId;
|
||||
}
|
||||
@@ -0,0 +1,783 @@
|
||||
#include "global.h"
|
||||
#include "decompress.h"
|
||||
#include "graphics.h"
|
||||
#include "item_menu_icons.h"
|
||||
#include "malloc.h"
|
||||
#include "constants/items.h"
|
||||
|
||||
static EWRAM_DATA u8 gUnknown_2039878[12] = {0};
|
||||
EWRAM_DATA void * gUnknown_2039884 = NULL;
|
||||
static EWRAM_DATA void * gUnknown_2039888 = NULL;
|
||||
|
||||
static void sub_8098560(struct Sprite * sprite);
|
||||
static void sub_80985BC(struct Sprite * sprite);
|
||||
|
||||
static const struct OamData gUnknown_83D416C = {
|
||||
.affineMode = ST_OAM_AFFINE_NORMAL,
|
||||
.shape = ST_OAM_SQUARE,
|
||||
.size = 3,
|
||||
.priority = 1,
|
||||
.paletteNum = 0
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83D4174[] = {
|
||||
ANIMCMD_FRAME( 0, 5),
|
||||
ANIMCMD_FRAME(0x40, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83D4180[] = {
|
||||
ANIMCMD_FRAME( 0, 5),
|
||||
ANIMCMD_FRAME(0x80, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83D418C[] = {
|
||||
ANIMCMD_FRAME( 0, 5),
|
||||
ANIMCMD_FRAME(0xc0, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83D4198[] = {
|
||||
gUnknown_83D4180,
|
||||
gUnknown_83D418C,
|
||||
gUnknown_83D4174
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83D41A4[] = {
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
|
||||
AFFINEANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83D41B4[] = {
|
||||
AFFINEANIMCMD_FRAME(0, 0, -2, 2),
|
||||
AFFINEANIMCMD_FRAME(0, 0, 2, 4),
|
||||
AFFINEANIMCMD_FRAME(0, 0, -2, 4),
|
||||
AFFINEANIMCMD_FRAME(0, 0, 2, 2),
|
||||
AFFINEANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83D41DC[] = {
|
||||
gUnknown_83D41A4,
|
||||
gUnknown_83D41B4
|
||||
};
|
||||
|
||||
const struct CompressedSpriteSheet gUnknown_83D41E4 = {
|
||||
gUnknown_8E8362C,
|
||||
0x2000,
|
||||
100
|
||||
};
|
||||
|
||||
const struct CompressedSpriteSheet gUnknown_83D41EC = {
|
||||
gUnknown_8E83DBC,
|
||||
0x2000,
|
||||
100
|
||||
};
|
||||
|
||||
const struct CompressedSpritePalette gUnknown_83D41F4 = {
|
||||
gUnknown_8E84560,
|
||||
100
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate gUnknown_83D41FC = {
|
||||
100,
|
||||
100,
|
||||
&gUnknown_83D416C,
|
||||
gUnknown_83D4198,
|
||||
NULL,
|
||||
gUnknown_83D41DC,
|
||||
SpriteCallbackDummy
|
||||
};
|
||||
|
||||
static const struct OamData gUnknown_83D4214 = {
|
||||
.affineMode = ST_OAM_AFFINE_OFF,
|
||||
.shape = ST_OAM_SQUARE,
|
||||
.size = 1,
|
||||
.priority = 1,
|
||||
.paletteNum = 1
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83D421C[] = {
|
||||
ANIMCMD_FRAME(0, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83D4224[] = {
|
||||
ANIMCMD_FRAME(4, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83D422C[] = {
|
||||
ANIMCMD_FRAME(0, 0, .hFlip = TRUE),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83D4234[] = {
|
||||
gUnknown_83D421C,
|
||||
gUnknown_83D4224,
|
||||
gUnknown_83D422C
|
||||
};
|
||||
|
||||
const struct CompressedSpriteSheet gBagSwapSpriteSheet = {
|
||||
gFile_graphics_interface_bag_swap_sheet,
|
||||
0x100,
|
||||
101
|
||||
};
|
||||
|
||||
const struct CompressedSpritePalette gBagSwapSpritePalette = {
|
||||
gFile_graphics_interface_bag_swap_palette,
|
||||
101
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate gUnknown_83D4250 = {
|
||||
101,
|
||||
101,
|
||||
&gUnknown_83D4214,
|
||||
gUnknown_83D4234,
|
||||
NULL,
|
||||
gDummySpriteAffineAnimTable,
|
||||
SpriteCallbackDummy
|
||||
};
|
||||
|
||||
static const struct OamData gUnknown_83D4268 = {
|
||||
.affineMode = ST_OAM_AFFINE_OFF,
|
||||
.shape = ST_OAM_SQUARE,
|
||||
.size = 2,
|
||||
.priority = 1,
|
||||
.paletteNum = 2
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83D4270[] = {
|
||||
ANIMCMD_FRAME(0, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83D4278[] = {
|
||||
gUnknown_83D4270
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate gUnknown_83D427C = {
|
||||
102,
|
||||
102,
|
||||
&gUnknown_83D4268,
|
||||
gUnknown_83D4278,
|
||||
NULL,
|
||||
gDummySpriteAffineAnimTable,
|
||||
SpriteCallbackDummy
|
||||
};
|
||||
|
||||
static const void *const gUnknown_83D4294[][2] = {
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_master_ball_sheet, gFile_graphics_items_icon_palettes_master_ball_palette},
|
||||
{gFile_graphics_items_icons_ultra_ball_sheet, gFile_graphics_items_icon_palettes_ultra_ball_palette},
|
||||
{gFile_graphics_items_icons_great_ball_sheet, gFile_graphics_items_icon_palettes_great_ball_palette},
|
||||
{gFile_graphics_items_icons_poke_ball_sheet, gFile_graphics_items_icon_palettes_poke_ball_palette},
|
||||
{gFile_graphics_items_icons_safari_ball_sheet, gFile_graphics_items_icon_palettes_safari_ball_palette},
|
||||
{gFile_graphics_items_icons_net_ball_sheet, gFile_graphics_items_icon_palettes_net_ball_palette},
|
||||
{gFile_graphics_items_icons_dive_ball_sheet, gFile_graphics_items_icon_palettes_dive_ball_palette},
|
||||
{gFile_graphics_items_icons_nest_ball_sheet, gFile_graphics_items_icon_palettes_nest_ball_palette},
|
||||
{gFile_graphics_items_icons_repeat_ball_sheet, gFile_graphics_items_icon_palettes_repeat_ball_palette},
|
||||
{gFile_graphics_items_icons_timer_ball_sheet, gFile_graphics_items_icon_palettes_repeat_ball_palette},
|
||||
{gFile_graphics_items_icons_luxury_ball_sheet, gFile_graphics_items_icon_palettes_luxury_ball_palette},
|
||||
{gFile_graphics_items_icons_premier_ball_sheet, gFile_graphics_items_icon_palettes_luxury_ball_palette},
|
||||
{gFile_graphics_items_icons_potion_sheet, gFile_graphics_items_icon_palettes_potion_palette},
|
||||
{gFile_graphics_items_icons_antidote_sheet, gFile_graphics_items_icon_palettes_antidote_palette},
|
||||
{gFile_graphics_items_icons_status_heal_sheet, gFile_graphics_items_icon_palettes_burn_heal_palette},
|
||||
{gFile_graphics_items_icons_status_heal_sheet, gFile_graphics_items_icon_palettes_ice_heal_palette},
|
||||
{gFile_graphics_items_icons_status_heal_sheet, gFile_graphics_items_icon_palettes_awakening_palette},
|
||||
{gFile_graphics_items_icons_status_heal_sheet, gFile_graphics_items_icon_palettes_paralyze_heal_palette},
|
||||
{gFile_graphics_items_icons_large_potion_sheet, gFile_graphics_items_icon_palettes_full_restore_palette},
|
||||
{gFile_graphics_items_icons_large_potion_sheet, gFile_graphics_items_icon_palettes_max_potion_palette},
|
||||
{gFile_graphics_items_icons_potion_sheet, gFile_graphics_items_icon_palettes_hyper_potion_palette},
|
||||
{gFile_graphics_items_icons_potion_sheet, gFile_graphics_items_icon_palettes_super_potion_palette},
|
||||
{gFile_graphics_items_icons_full_heal_sheet, gFile_graphics_items_icon_palettes_full_heal_palette},
|
||||
{gFile_graphics_items_icons_revive_sheet, gFile_graphics_items_icon_palettes_revive_palette},
|
||||
{gFile_graphics_items_icons_max_revive_sheet, gFile_graphics_items_icon_palettes_revive_palette},
|
||||
{gFile_graphics_items_icons_fresh_water_sheet, gFile_graphics_items_icon_palettes_fresh_water_palette},
|
||||
{gFile_graphics_items_icons_soda_pop_sheet, gFile_graphics_items_icon_palettes_soda_pop_palette},
|
||||
{gFile_graphics_items_icons_lemonade_sheet, gFile_graphics_items_icon_palettes_lemonade_palette},
|
||||
{gFile_graphics_items_icons_moomoo_milk_sheet, gFile_graphics_items_icon_palettes_moomoo_milk_palette},
|
||||
{gFile_graphics_items_icons_powder_sheet, gFile_graphics_items_icon_palettes_energy_powder_palette},
|
||||
{gFile_graphics_items_icons_energy_root_sheet, gFile_graphics_items_icon_palettes_energy_root_palette},
|
||||
{gFile_graphics_items_icons_powder_sheet, gFile_graphics_items_icon_palettes_heal_powder_palette},
|
||||
{gFile_graphics_items_icons_revival_herb_sheet, gFile_graphics_items_icon_palettes_revival_herb_palette},
|
||||
{gFile_graphics_items_icons_ether_sheet, gFile_graphics_items_icon_palettes_ether_palette},
|
||||
{gFile_graphics_items_icons_ether_sheet, gFile_graphics_items_icon_palettes_max_ether_palette},
|
||||
{gFile_graphics_items_icons_ether_sheet, gFile_graphics_items_icon_palettes_elixir_palette},
|
||||
{gFile_graphics_items_icons_ether_sheet, gFile_graphics_items_icon_palettes_max_elixir_palette},
|
||||
{gFile_graphics_items_icons_lava_cookie_sheet, gFile_graphics_items_icon_palettes_lava_cookie_and_letter_palette},
|
||||
{gFile_graphics_items_icons_flute_sheet, gFile_graphics_items_icon_palettes_blue_flute_palette},
|
||||
{gFile_graphics_items_icons_flute_sheet, gFile_graphics_items_icon_palettes_yellow_flute_palette},
|
||||
{gFile_graphics_items_icons_flute_sheet, gFile_graphics_items_icon_palettes_red_flute_palette},
|
||||
{gFile_graphics_items_icons_flute_sheet, gFile_graphics_items_icon_palettes_black_flute_palette},
|
||||
{gFile_graphics_items_icons_flute_sheet, gFile_graphics_items_icon_palettes_white_flute_palette},
|
||||
{gFile_graphics_items_icons_berry_juice_sheet, gFile_graphics_items_icon_palettes_berry_juice_palette},
|
||||
{gFile_graphics_items_icons_sacred_ash_sheet, gFile_graphics_items_icon_palettes_sacred_ash_palette},
|
||||
{gFile_graphics_items_icons_powder_sheet, gFile_graphics_items_icon_palettes_shoal_salt_palette},
|
||||
{gFile_graphics_items_icons_shoal_shell_sheet, gFile_graphics_items_icon_palettes_shell_palette},
|
||||
{gFile_graphics_items_icons_shard_sheet, gFile_graphics_items_icon_palettes_red_shard_palette},
|
||||
{gFile_graphics_items_icons_shard_sheet, gFile_graphics_items_icon_palettes_blue_shard_palette},
|
||||
{gFile_graphics_items_icons_shard_sheet, gFile_graphics_items_icon_palettes_yellow_shard_palette},
|
||||
{gFile_graphics_items_icons_shard_sheet, gFile_graphics_items_icon_palettes_green_shard_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_hp_up_sheet, gFile_graphics_items_icon_palettes_hp_up_palette},
|
||||
{gFile_graphics_items_icons_vitamin_sheet, gFile_graphics_items_icon_palettes_protein_palette},
|
||||
{gFile_graphics_items_icons_vitamin_sheet, gFile_graphics_items_icon_palettes_iron_palette},
|
||||
{gFile_graphics_items_icons_vitamin_sheet, gFile_graphics_items_icon_palettes_carbos_palette},
|
||||
{gFile_graphics_items_icons_vitamin_sheet, gFile_graphics_items_icon_palettes_calcium_palette},
|
||||
{gFile_graphics_items_icons_rare_candy_sheet, gFile_graphics_items_icon_palettes_rare_candy_palette},
|
||||
{gFile_graphics_items_icons_pp_up_sheet, gFile_graphics_items_icon_palettes_pp_up_palette},
|
||||
{gFile_graphics_items_icons_vitamin_sheet, gFile_graphics_items_icon_palettes_zinc_palette},
|
||||
{gFile_graphics_items_icons_pp_max_sheet, gFile_graphics_items_icon_palettes_pp_max_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_guard_spec_palette},
|
||||
{gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_dire_hit_palette},
|
||||
{gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_x_attack_palette},
|
||||
{gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_x_defend_palette},
|
||||
{gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_x_speed_palette},
|
||||
{gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_x_accuracy_palette},
|
||||
{gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_x_special_palette},
|
||||
{gFile_graphics_items_icons_poke_doll_sheet, gFile_graphics_items_icon_palettes_poke_doll_palette},
|
||||
{gFile_graphics_items_icons_fluffy_tail_sheet, gFile_graphics_items_icon_palettes_fluffy_tail_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_repel_sheet, gFile_graphics_items_icon_palettes_super_repel_palette},
|
||||
{gFile_graphics_items_icons_repel_sheet, gFile_graphics_items_icon_palettes_max_repel_palette},
|
||||
{gFile_graphics_items_icons_escape_rope_sheet, gFile_graphics_items_icon_palettes_escape_rope_palette},
|
||||
{gFile_graphics_items_icons_repel_sheet, gFile_graphics_items_icon_palettes_repel_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_sun_stone_sheet, gFile_graphics_items_icon_palettes_sun_stone_palette},
|
||||
{gFile_graphics_items_icons_moon_stone_sheet, gFile_graphics_items_icon_palettes_moon_stone_palette},
|
||||
{gFile_graphics_items_icons_fire_stone_sheet, gFile_graphics_items_icon_palettes_fire_stone_palette},
|
||||
{gFile_graphics_items_icons_thunder_stone_sheet, gFile_graphics_items_icon_palettes_thunder_stone_palette},
|
||||
{gFile_graphics_items_icons_water_stone_sheet, gFile_graphics_items_icon_palettes_water_stone_palette},
|
||||
{gFile_graphics_items_icons_leaf_stone_sheet, gFile_graphics_items_icon_palettes_leaf_stone_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_tiny_mushroom_sheet, gFile_graphics_items_icon_palettes_mushroom_palette},
|
||||
{gFile_graphics_items_icons_big_mushroom_sheet, gFile_graphics_items_icon_palettes_mushroom_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_pearl_sheet, gFile_graphics_items_icon_palettes_pearl_palette},
|
||||
{gFile_graphics_items_icons_big_pearl_sheet, gFile_graphics_items_icon_palettes_pearl_palette},
|
||||
{gFile_graphics_items_icons_stardust_sheet, gFile_graphics_items_icon_palettes_star_palette},
|
||||
{gFile_graphics_items_icons_star_piece_sheet, gFile_graphics_items_icon_palettes_star_palette},
|
||||
{gFile_graphics_items_icons_nugget_sheet, gFile_graphics_items_icon_palettes_nugget_palette},
|
||||
{gFile_graphics_items_icons_heart_scale_sheet, gFile_graphics_items_icon_palettes_heart_scale_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_orange_mail_sheet, gFile_graphics_items_icon_palettes_orange_mail_palette},
|
||||
{gFile_graphics_items_icons_harbor_mail_sheet, gFile_graphics_items_icon_palettes_harbor_mail_palette},
|
||||
{gFile_graphics_items_icons_glitter_mail_sheet, gFile_graphics_items_icon_palettes_glitter_mail_palette},
|
||||
{gFile_graphics_items_icons_mech_mail_sheet, gFile_graphics_items_icon_palettes_mech_mail_palette},
|
||||
{gFile_graphics_items_icons_wood_mail_sheet, gFile_graphics_items_icon_palettes_wood_mail_palette},
|
||||
{gFile_graphics_items_icons_wave_mail_sheet, gFile_graphics_items_icon_palettes_wave_mail_palette},
|
||||
{gFile_graphics_items_icons_bead_mail_sheet, gFile_graphics_items_icon_palettes_bead_mail_palette},
|
||||
{gFile_graphics_items_icons_shadow_mail_sheet, gFile_graphics_items_icon_palettes_shadow_mail_palette},
|
||||
{gFile_graphics_items_icons_tropic_mail_sheet, gFile_graphics_items_icon_palettes_tropic_mail_palette},
|
||||
{gFile_graphics_items_icons_dream_mail_sheet, gFile_graphics_items_icon_palettes_dream_mail_palette},
|
||||
{gFile_graphics_items_icons_fab_mail_sheet, gFile_graphics_items_icon_palettes_fab_mail_palette},
|
||||
{gFile_graphics_items_icons_retro_mail_sheet, gFile_graphics_items_icon_palettes_retro_mail_palette},
|
||||
{gFile_graphics_items_icons_cheri_berry_sheet, gFile_graphics_items_icon_palettes_cheri_berry_palette},
|
||||
{gFile_graphics_items_icons_chesto_berry_sheet, gFile_graphics_items_icon_palettes_chesto_berry_palette},
|
||||
{gFile_graphics_items_icons_pecha_berry_sheet, gFile_graphics_items_icon_palettes_pecha_berry_palette},
|
||||
{gFile_graphics_items_icons_rawst_berry_sheet, gFile_graphics_items_icon_palettes_rawst_berry_palette},
|
||||
{gFile_graphics_items_icons_aspear_berry_sheet, gFile_graphics_items_icon_palettes_aspear_berry_palette},
|
||||
{gFile_graphics_items_icons_leppa_berry_sheet, gFile_graphics_items_icon_palettes_leppa_berry_palette},
|
||||
{gFile_graphics_items_icons_oran_berry_sheet, gFile_graphics_items_icon_palettes_oran_berry_palette},
|
||||
{gFile_graphics_items_icons_persim_berry_sheet, gFile_graphics_items_icon_palettes_persim_berry_palette},
|
||||
{gFile_graphics_items_icons_lum_berry_sheet, gFile_graphics_items_icon_palettes_lum_berry_palette},
|
||||
{gFile_graphics_items_icons_sitrus_berry_sheet, gFile_graphics_items_icon_palettes_sitrus_berry_palette},
|
||||
{gFile_graphics_items_icons_figy_berry_sheet, gFile_graphics_items_icon_palettes_figy_berry_palette},
|
||||
{gFile_graphics_items_icons_wiki_berry_sheet, gFile_graphics_items_icon_palettes_wiki_berry_palette},
|
||||
{gFile_graphics_items_icons_mago_berry_sheet, gFile_graphics_items_icon_palettes_mago_berry_palette},
|
||||
{gFile_graphics_items_icons_aguav_berry_sheet, gFile_graphics_items_icon_palettes_aguav_berry_palette},
|
||||
{gFile_graphics_items_icons_iapapa_berry_sheet, gFile_graphics_items_icon_palettes_iapapa_berry_palette},
|
||||
{gFile_graphics_items_icons_razz_berry_sheet, gFile_graphics_items_icon_palettes_razz_berry_palette},
|
||||
{gFile_graphics_items_icons_bluk_berry_sheet, gFile_graphics_items_icon_palettes_bluk_berry_palette},
|
||||
{gFile_graphics_items_icons_nanab_berry_sheet, gFile_graphics_items_icon_palettes_nanab_berry_palette},
|
||||
{gFile_graphics_items_icons_wepear_berry_sheet, gFile_graphics_items_icon_palettes_wepear_berry_palette},
|
||||
{gFile_graphics_items_icons_pinap_berry_sheet, gFile_graphics_items_icon_palettes_pinap_berry_palette},
|
||||
{gFile_graphics_items_icons_pomeg_berry_sheet, gFile_graphics_items_icon_palettes_pomeg_berry_palette},
|
||||
{gFile_graphics_items_icons_kelpsy_berry_sheet, gFile_graphics_items_icon_palettes_kelpsy_berry_palette},
|
||||
{gFile_graphics_items_icons_qualot_berry_sheet, gFile_graphics_items_icon_palettes_qualot_berry_palette},
|
||||
{gFile_graphics_items_icons_hondew_berry_sheet, gFile_graphics_items_icon_palettes_hondew_berry_palette},
|
||||
{gFile_graphics_items_icons_grepa_berry_sheet, gFile_graphics_items_icon_palettes_grepa_berry_palette},
|
||||
{gFile_graphics_items_icons_tamato_berry_sheet, gFile_graphics_items_icon_palettes_tamato_berry_palette},
|
||||
{gFile_graphics_items_icons_cornn_berry_sheet, gFile_graphics_items_icon_palettes_cornn_berry_palette},
|
||||
{gFile_graphics_items_icons_magost_berry_sheet, gFile_graphics_items_icon_palettes_magost_berry_palette},
|
||||
{gFile_graphics_items_icons_rabuta_berry_sheet, gFile_graphics_items_icon_palettes_rabuta_berry_palette},
|
||||
{gFile_graphics_items_icons_nomel_berry_sheet, gFile_graphics_items_icon_palettes_nomel_berry_palette},
|
||||
{gFile_graphics_items_icons_spelon_berry_sheet, gFile_graphics_items_icon_palettes_spelon_berry_palette},
|
||||
{gFile_graphics_items_icons_pamtre_berry_sheet, gFile_graphics_items_icon_palettes_pamtre_berry_palette},
|
||||
{gFile_graphics_items_icons_watmel_berry_sheet, gFile_graphics_items_icon_palettes_watmel_berry_palette},
|
||||
{gFile_graphics_items_icons_durin_berry_sheet, gFile_graphics_items_icon_palettes_durin_berry_palette},
|
||||
{gFile_graphics_items_icons_belue_berry_sheet, gFile_graphics_items_icon_palettes_belue_berry_palette},
|
||||
{gFile_graphics_items_icons_liechi_berry_sheet, gFile_graphics_items_icon_palettes_liechi_berry_palette},
|
||||
{gFile_graphics_items_icons_ganlon_berry_sheet, gFile_graphics_items_icon_palettes_ganlon_berry_palette},
|
||||
{gFile_graphics_items_icons_salac_berry_sheet, gFile_graphics_items_icon_palettes_salac_berry_palette},
|
||||
{gFile_graphics_items_icons_petaya_berry_sheet, gFile_graphics_items_icon_palettes_petaya_berry_palette},
|
||||
{gFile_graphics_items_icons_apicot_berry_sheet, gFile_graphics_items_icon_palettes_apicot_berry_palette},
|
||||
{gFile_graphics_items_icons_lansat_berry_sheet, gFile_graphics_items_icon_palettes_lansat_berry_palette},
|
||||
{gFile_graphics_items_icons_starf_berry_sheet, gFile_graphics_items_icon_palettes_starf_berry_palette},
|
||||
{gFile_graphics_items_icons_enigma_berry_sheet, gFile_graphics_items_icon_palettes_enigma_berry_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_bright_powder_sheet, gFile_graphics_items_icon_palettes_bright_powder_palette},
|
||||
{gFile_graphics_items_icons_in_battle_herb_sheet, gFile_graphics_items_icon_palettes_white_herb_palette},
|
||||
{gFile_graphics_items_icons_macho_brace_sheet, gFile_graphics_items_icon_palettes_macho_brace_palette},
|
||||
{gFile_graphics_items_icons_exp_share_sheet, gFile_graphics_items_icon_palettes_exp_share_palette},
|
||||
{gFile_graphics_items_icons_quick_claw_sheet, gFile_graphics_items_icon_palettes_quick_claw_palette},
|
||||
{gFile_graphics_items_icons_soothe_bell_sheet, gFile_graphics_items_icon_palettes_soothe_bell_palette},
|
||||
{gFile_graphics_items_icons_in_battle_herb_sheet, gFile_graphics_items_icon_palettes_mental_herb_palette},
|
||||
{gFile_graphics_items_icons_choice_band_sheet, gFile_graphics_items_icon_palettes_choice_band_palette},
|
||||
{gFile_graphics_items_icons_kings_rock_sheet, gFile_graphics_items_icon_palettes_kings_rock_palette},
|
||||
{gFile_graphics_items_icons_silver_powder_sheet, gFile_graphics_items_icon_palettes_silver_powder_palette},
|
||||
{gFile_graphics_items_icons_amulet_coin_sheet, gFile_graphics_items_icon_palettes_amulet_coin_palette},
|
||||
{gFile_graphics_items_icons_cleanse_tag_sheet, gFile_graphics_items_icon_palettes_cleanse_tag_palette},
|
||||
{gFile_graphics_items_icons_soul_dew_sheet, gFile_graphics_items_icon_palettes_soul_dew_palette},
|
||||
{gFile_graphics_items_icons_deep_sea_tooth_sheet, gFile_graphics_items_icon_palettes_deep_sea_tooth_palette},
|
||||
{gFile_graphics_items_icons_deep_sea_scale_sheet, gFile_graphics_items_icon_palettes_deep_sea_scale_palette},
|
||||
{gFile_graphics_items_icons_smoke_ball_sheet, gFile_graphics_items_icon_palettes_smoke_ball_palette},
|
||||
{gFile_graphics_items_icons_everstone_sheet, gFile_graphics_items_icon_palettes_everstone_palette},
|
||||
{gFile_graphics_items_icons_focus_band_sheet, gFile_graphics_items_icon_palettes_focus_band_palette},
|
||||
{gFile_graphics_items_icons_lucky_egg_sheet, gFile_graphics_items_icon_palettes_lucky_egg_palette},
|
||||
{gFile_graphics_items_icons_scope_lens_sheet, gFile_graphics_items_icon_palettes_scope_lens_palette},
|
||||
{gFile_graphics_items_icons_metal_coat_sheet, gFile_graphics_items_icon_palettes_metal_coat_palette},
|
||||
{gFile_graphics_items_icons_leftovers_sheet, gFile_graphics_items_icon_palettes_leftovers_palette},
|
||||
{gFile_graphics_items_icons_dragon_scale_sheet, gFile_graphics_items_icon_palettes_dragon_scale_palette},
|
||||
{gFile_graphics_items_icons_light_ball_sheet, gFile_graphics_items_icon_palettes_light_ball_palette},
|
||||
{gFile_graphics_items_icons_soft_sand_sheet, gFile_graphics_items_icon_palettes_soft_sand_palette},
|
||||
{gFile_graphics_items_icons_hard_stone_sheet, gFile_graphics_items_icon_palettes_hard_stone_palette},
|
||||
{gFile_graphics_items_icons_miracle_seed_sheet, gFile_graphics_items_icon_palettes_miracle_seed_palette},
|
||||
{gFile_graphics_items_icons_black_glasses_sheet, gFile_graphics_items_icon_palettes_black_type_enhancing_item_palette},
|
||||
{gFile_graphics_items_icons_black_belt_sheet, gFile_graphics_items_icon_palettes_black_type_enhancing_item_palette},
|
||||
{gFile_graphics_items_icons_magnet_sheet, gFile_graphics_items_icon_palettes_magnet_palette},
|
||||
{gFile_graphics_items_icons_mystic_water_sheet, gFile_graphics_items_icon_palettes_mystic_water_palette},
|
||||
{gFile_graphics_items_icons_sharp_beak_sheet, gFile_graphics_items_icon_palettes_sharp_beak_palette},
|
||||
{gFile_graphics_items_icons_poison_barb_sheet, gFile_graphics_items_icon_palettes_poison_barb_palette},
|
||||
{gFile_graphics_items_icons_never_melt_ice_sheet, gFile_graphics_items_icon_palettes_never_melt_ice_palette},
|
||||
{gFile_graphics_items_icons_spell_tag_sheet, gFile_graphics_items_icon_palettes_spell_tag_palette},
|
||||
{gFile_graphics_items_icons_twisted_spoon_sheet, gFile_graphics_items_icon_palettes_twisted_spoon_palette},
|
||||
{gFile_graphics_items_icons_charcoal_sheet, gFile_graphics_items_icon_palettes_charcoal_palette},
|
||||
{gFile_graphics_items_icons_dragon_fang_sheet, gFile_graphics_items_icon_palettes_dragon_fang_palette},
|
||||
{gFile_graphics_items_icons_silk_scarf_sheet, gFile_graphics_items_icon_palettes_silk_scarf_palette},
|
||||
{gFile_graphics_items_icons_up_grade_sheet, gFile_graphics_items_icon_palettes_up_grade_palette},
|
||||
{gFile_graphics_items_icons_shell_bell_sheet, gFile_graphics_items_icon_palettes_shell_palette},
|
||||
{gFile_graphics_items_icons_sea_incense_sheet, gFile_graphics_items_icon_palettes_sea_incense_palette},
|
||||
{gFile_graphics_items_icons_lax_incense_sheet, gFile_graphics_items_icon_palettes_lax_incense_palette},
|
||||
{gFile_graphics_items_icons_lucky_punch_sheet, gFile_graphics_items_icon_palettes_lucky_punch_palette},
|
||||
{gFile_graphics_items_icons_metal_powder_sheet, gFile_graphics_items_icon_palettes_metal_powder_palette},
|
||||
{gFile_graphics_items_icons_thick_club_sheet, gFile_graphics_items_icon_palettes_thick_club_palette},
|
||||
{gFile_graphics_items_icons_stick_sheet, gFile_graphics_items_icon_palettes_stick_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_scarf_sheet, gFile_graphics_items_icon_palettes_red_scarf_palette},
|
||||
{gFile_graphics_items_icons_scarf_sheet, gFile_graphics_items_icon_palettes_blue_scarf_palette},
|
||||
{gFile_graphics_items_icons_scarf_sheet, gFile_graphics_items_icon_palettes_pink_scarf_palette},
|
||||
{gFile_graphics_items_icons_scarf_sheet, gFile_graphics_items_icon_palettes_green_scarf_palette},
|
||||
{gFile_graphics_items_icons_scarf_sheet, gFile_graphics_items_icon_palettes_yellow_scarf_palette},
|
||||
{gFile_graphics_items_icons_mach_bike_sheet, gFile_graphics_items_icon_palettes_mach_bike_palette},
|
||||
{gFile_graphics_items_icons_coin_case_sheet, gFile_graphics_items_icon_palettes_coin_case_palette},
|
||||
{gFile_graphics_items_icons_itemfinder_sheet, gFile_graphics_items_icon_palettes_itemfinder_palette},
|
||||
{gFile_graphics_items_icons_old_rod_sheet, gFile_graphics_items_icon_palettes_old_rod_palette},
|
||||
{gFile_graphics_items_icons_good_rod_sheet, gFile_graphics_items_icon_palettes_good_rod_palette},
|
||||
{gFile_graphics_items_icons_super_rod_sheet, gFile_graphics_items_icon_palettes_super_rod_palette},
|
||||
{gFile_graphics_items_icons_ss_ticket_sheet, gFile_graphics_items_icon_palettes_ss_ticket_palette},
|
||||
{gFile_graphics_items_icons_contest_pass_sheet, gFile_graphics_items_icon_palettes_contest_pass_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_wailmer_pail_sheet, gFile_graphics_items_icon_palettes_wailmer_pail_palette},
|
||||
{gFile_graphics_items_icons_devon_goods_sheet, gFile_graphics_items_icon_palettes_devon_goods_palette},
|
||||
{gFile_graphics_items_icons_soot_sack_sheet, gFile_graphics_items_icon_palettes_soot_sack_palette},
|
||||
{gFile_graphics_items_icons_basement_key_sheet, gFile_graphics_items_icon_palettes_old_key_palette},
|
||||
{gFile_graphics_items_icons_acro_bike_sheet, gFile_graphics_items_icon_palettes_acro_bike_palette},
|
||||
{gFile_graphics_items_icons_pokeblock_case_sheet, gFile_graphics_items_icon_palettes_pokeblock_case_palette},
|
||||
{gFile_graphics_items_icons_letter_sheet, gFile_graphics_items_icon_palettes_lava_cookie_and_letter_palette},
|
||||
{gFile_graphics_items_icons_eon_ticket_sheet, gFile_graphics_items_icon_palettes_eon_ticket_palette},
|
||||
{gFile_graphics_items_icons_orb_sheet, gFile_graphics_items_icon_palettes_red_orb_palette},
|
||||
{gFile_graphics_items_icons_orb_sheet, gFile_graphics_items_icon_palettes_blue_orb_palette},
|
||||
{gFile_graphics_items_icons_scanner_sheet, gFile_graphics_items_icon_palettes_scanner_palette},
|
||||
{gFile_graphics_items_icons_go_goggles_sheet, gFile_graphics_items_icon_palettes_go_goggles_palette},
|
||||
{gFile_graphics_items_icons_meteorite_sheet, gFile_graphics_items_icon_palettes_meteorite_palette},
|
||||
{gFile_graphics_items_icons_room1_key_sheet, gFile_graphics_items_icon_palettes_key_palette},
|
||||
{gFile_graphics_items_icons_room2_key_sheet, gFile_graphics_items_icon_palettes_key_palette},
|
||||
{gFile_graphics_items_icons_room4_key_sheet, gFile_graphics_items_icon_palettes_key_palette},
|
||||
{gFile_graphics_items_icons_room6_key_sheet, gFile_graphics_items_icon_palettes_key_palette},
|
||||
{gFile_graphics_items_icons_storage_key_sheet, gFile_graphics_items_icon_palettes_old_key_palette},
|
||||
{gFile_graphics_items_icons_root_fossil_sheet, gFile_graphics_items_icon_palettes_hoenn_fossil_palette},
|
||||
{gFile_graphics_items_icons_claw_fossil_sheet, gFile_graphics_items_icon_palettes_hoenn_fossil_palette},
|
||||
{gFile_graphics_items_icons_devon_scope_sheet, gFile_graphics_items_icon_palettes_devon_scope_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fighting_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_dragon_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_water_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_poison_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ice_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fighting_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_grass_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fire_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_dark_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ice_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ice_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_water_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_grass_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_grass_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_steel_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_electric_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_electric_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ground_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ground_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ghost_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fighting_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_electric_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fire_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_poison_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_rock_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fire_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_rock_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_flying_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_dark_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_dark_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_steel_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_dark_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fire_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_flying_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_water_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fighting_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_water_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_water_tm_hm_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
|
||||
{gFile_graphics_items_icons_oaks_parcel_sheet, gFile_graphics_items_icon_palettes_oaks_parcel_palette},
|
||||
{gFile_graphics_items_icons_poke_flute_sheet, gFile_graphics_items_icon_palettes_poke_flute_palette},
|
||||
{gFile_graphics_items_icons_secret_key_sheet, gFile_graphics_items_icon_palettes_secret_key_palette},
|
||||
{gFile_graphics_items_icons_bike_voucher_sheet, gFile_graphics_items_icon_palettes_bike_voucher_palette},
|
||||
{gFile_graphics_items_icons_gold_teeth_sheet, gFile_graphics_items_icon_palettes_gold_teeth_palette},
|
||||
{gFile_graphics_items_icons_old_amber_sheet, gFile_graphics_items_icon_palettes_old_amber_palette},
|
||||
{gFile_graphics_items_icons_card_key_sheet, gFile_graphics_items_icon_palettes_card_key_palette},
|
||||
{gFile_graphics_items_icons_lift_key_sheet, gFile_graphics_items_icon_palettes_key_palette},
|
||||
{gFile_graphics_items_icons_helix_fossil_sheet, gFile_graphics_items_icon_palettes_kanto_fossil_palette},
|
||||
{gFile_graphics_items_icons_dome_fossil_sheet, gFile_graphics_items_icon_palettes_kanto_fossil_palette},
|
||||
{gFile_graphics_items_icons_silph_scope_sheet, gFile_graphics_items_icon_palettes_silph_scope_palette},
|
||||
{gFile_graphics_items_icons_bicycle_sheet, gFile_graphics_items_icon_palettes_bicycle_palette},
|
||||
{gFile_graphics_items_icons_town_map_sheet, gFile_graphics_items_icon_palettes_town_map_palette},
|
||||
{gFile_graphics_items_icons_vs_seeker_sheet, gFile_graphics_items_icon_palettes_vs_seeker_palette},
|
||||
{gFile_graphics_items_icons_fame_checker_sheet, gFile_graphics_items_icon_palettes_fame_checker_palette},
|
||||
{gFile_graphics_items_icons_tm_case_sheet, gFile_graphics_items_icon_palettes_tm_case_palette},
|
||||
{gFile_graphics_items_icons_berry_pouch_sheet, gFile_graphics_items_icon_palettes_berry_pouch_palette},
|
||||
{gFile_graphics_items_icons_teachy_tv_sheet, gFile_graphics_items_icon_palettes_teachy_tv_palette},
|
||||
{gFile_graphics_items_icons_tri_pass_sheet, gFile_graphics_items_icon_palettes_tri_pass_palette},
|
||||
{gFile_graphics_items_icons_rainbow_pass_sheet, gFile_graphics_items_icon_palettes_rainbow_pass_palette},
|
||||
{gFile_graphics_items_icons_tea_sheet, gFile_graphics_items_icon_palettes_tea_palette},
|
||||
{gFile_graphics_items_icons_mystic_ticket_sheet, gFile_graphics_items_icon_palettes_mystic_ticket_palette},
|
||||
{gFile_graphics_items_icons_aurora_ticket_sheet, gFile_graphics_items_icon_palettes_aurora_ticket_palette},
|
||||
{gFile_graphics_items_icons_powder_jar_sheet, gFile_graphics_items_icon_palettes_powder_jar_palette},
|
||||
{gFile_graphics_items_icons_gem_sheet, gFile_graphics_items_icon_palettes_ruby_palette},
|
||||
{gFile_graphics_items_icons_gem_sheet, gFile_graphics_items_icon_palettes_sapphire_palette},
|
||||
{gFile_graphics_items_icons_return_to_field_arrow_sheet, gFile_graphics_items_icon_palettes_return_to_field_arrow_palette}
|
||||
};
|
||||
|
||||
void ResetItemMenuIconState(void)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < NELEMS(gUnknown_2039878); i++)
|
||||
gUnknown_2039878[i] = 0xFF;
|
||||
}
|
||||
|
||||
void sub_80984FC(u8 animNum)
|
||||
{
|
||||
gUnknown_2039878[0] = CreateSprite(&gUnknown_83D41FC, 40, 68, 0);
|
||||
sub_8098528(animNum);
|
||||
}
|
||||
|
||||
void sub_8098528(u8 animNum)
|
||||
{
|
||||
struct Sprite * sprite = &gSprites[gUnknown_2039878[0]];
|
||||
sprite->pos2.y = -5;
|
||||
sprite->callback = sub_8098560;
|
||||
StartSpriteAnim(sprite, animNum);
|
||||
}
|
||||
|
||||
static void sub_8098560(struct Sprite * sprite)
|
||||
{
|
||||
if (sprite->pos2.y != 0)
|
||||
sprite->pos2.y++;
|
||||
else
|
||||
sprite->callback = SpriteCallbackDummy;
|
||||
}
|
||||
|
||||
void sub_8098580(void)
|
||||
{
|
||||
struct Sprite * sprite = &gSprites[gUnknown_2039878[0]];
|
||||
if (sprite->affineAnimEnded)
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
sprite->callback = sub_80985BC;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80985BC(struct Sprite * sprite)
|
||||
{
|
||||
if (sprite->affineAnimEnded)
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, 0);
|
||||
sprite->callback = SpriteCallbackDummy;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80985E4(void)
|
||||
{
|
||||
u8 i;
|
||||
u8 * ptr = &gUnknown_2039878[1];
|
||||
|
||||
for (i = 0; i < 9; i++)
|
||||
{
|
||||
ptr[i] = CreateSprite(&gUnknown_83D4250, i * 16 + 0x60, 7, 0);
|
||||
if (i != 0)
|
||||
{
|
||||
if (i == 8)
|
||||
StartSpriteAnim(&gSprites[ptr[i]], 2);
|
||||
else
|
||||
StartSpriteAnim(&gSprites[ptr[i]], 1);
|
||||
}
|
||||
gSprites[ptr[i]].invisible = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8098660(u8 flag)
|
||||
{
|
||||
u8 i;
|
||||
u8 * ptr = &gUnknown_2039878[1];
|
||||
|
||||
for (i = 0; i < 9; i++)
|
||||
{
|
||||
gSprites[ptr[i]].invisible = flag;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80986A8(s16 x, u16 y)
|
||||
{
|
||||
u8 i;
|
||||
u8 * ptr = &gUnknown_2039878[1];
|
||||
|
||||
for (i = 0; i < 9; i++)
|
||||
{
|
||||
gSprites[ptr[i]].pos2.x = x;
|
||||
gSprites[ptr[i]].pos1.y = y + 7;
|
||||
}
|
||||
}
|
||||
|
||||
static bool8 sub_80986EC(void)
|
||||
{
|
||||
void ** ptr1, ** ptr2;
|
||||
|
||||
ptr1 = &gUnknown_2039884;
|
||||
*ptr1 = Alloc(0x120);
|
||||
if (*ptr1 == NULL)
|
||||
return FALSE;
|
||||
ptr2 = &gUnknown_2039888;
|
||||
*ptr2 = AllocZeroed(0x200);
|
||||
if (*ptr2 == NULL)
|
||||
{
|
||||
Free(*ptr1);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CopyItemIconPicTo4x4Buffer(const void * src, void * dest)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
CpuCopy16(src + 0x60 * i, dest + 0x80 * i, 0x60);
|
||||
}
|
||||
}
|
||||
|
||||
u8 AddItemIconObject(u16 tilesTag, u16 paletteTag, u16 itemId)
|
||||
{
|
||||
struct SpriteTemplate template;
|
||||
struct SpriteSheet spriteSheet;
|
||||
struct CompressedSpritePalette spritePalette;
|
||||
u8 spriteId;
|
||||
|
||||
if (!sub_80986EC())
|
||||
return MAX_SPRITES;
|
||||
|
||||
LZDecompressWram(sub_8098974(itemId, 0), gUnknown_2039884);
|
||||
CopyItemIconPicTo4x4Buffer(gUnknown_2039884, gUnknown_2039888);
|
||||
spriteSheet.data = gUnknown_2039888;
|
||||
spriteSheet.size = 0x200;
|
||||
spriteSheet.tag = tilesTag;
|
||||
LoadSpriteSheet(&spriteSheet);
|
||||
|
||||
spritePalette.data = sub_8098974(itemId, 1);
|
||||
spritePalette.tag = paletteTag;
|
||||
LoadCompressedSpritePalette(&spritePalette);
|
||||
|
||||
CpuCopy16(&gUnknown_83D427C, &template, sizeof(struct SpriteTemplate));
|
||||
template.tileTag = tilesTag;
|
||||
template.paletteTag = paletteTag;
|
||||
spriteId = CreateSprite(&template, 0, 0, 0);
|
||||
|
||||
Free(gUnknown_2039884);
|
||||
Free(gUnknown_2039888);
|
||||
return spriteId;
|
||||
}
|
||||
|
||||
u8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origTemplate, u16 tilesTag, u16 paletteTag, u16 itemId)
|
||||
{
|
||||
struct SpriteTemplate template;
|
||||
struct SpriteSheet spriteSheet;
|
||||
struct CompressedSpritePalette spritePalette;
|
||||
u8 spriteId;
|
||||
|
||||
if (!sub_80986EC())
|
||||
return MAX_SPRITES;
|
||||
|
||||
LZDecompressWram(sub_8098974(itemId, 0), gUnknown_2039884);
|
||||
CopyItemIconPicTo4x4Buffer(gUnknown_2039884, gUnknown_2039888);
|
||||
spriteSheet.data = gUnknown_2039888;
|
||||
spriteSheet.size = 0x200;
|
||||
spriteSheet.tag = tilesTag;
|
||||
LoadSpriteSheet(&spriteSheet);
|
||||
|
||||
spritePalette.data = sub_8098974(itemId, 1);
|
||||
spritePalette.tag = paletteTag;
|
||||
LoadCompressedSpritePalette(&spritePalette);
|
||||
|
||||
CpuCopy16(origTemplate, &template, sizeof(struct SpriteTemplate));
|
||||
template.tileTag = tilesTag;
|
||||
template.paletteTag = paletteTag;
|
||||
spriteId = CreateSprite(&template, 0, 0, 0);
|
||||
|
||||
Free(gUnknown_2039884);
|
||||
Free(gUnknown_2039888);
|
||||
return spriteId;
|
||||
}
|
||||
|
||||
void CreateItemMenuIcon(u16 itemId, u8 idx)
|
||||
{
|
||||
u8 * ptr = &gUnknown_2039878[10];
|
||||
u8 spriteId;
|
||||
|
||||
if (ptr[idx] == 0xFF)
|
||||
{
|
||||
FreeSpriteTilesByTag(102 + idx);
|
||||
FreeSpritePaletteByTag(102 + idx);
|
||||
spriteId = AddItemIconObject(102 + idx, 102 + idx, itemId);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
ptr[idx] = spriteId;
|
||||
gSprites[spriteId].pos2.x = 24;
|
||||
gSprites[spriteId].pos2.y = 140;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DestroyItemMenuIcon(u8 idx)
|
||||
{
|
||||
u8 * ptr = &gUnknown_2039878[10];
|
||||
|
||||
if (ptr[idx] != 0xFF)
|
||||
{
|
||||
DestroySpriteAndFreeResources(&gSprites[ptr[idx]]);
|
||||
ptr[idx] = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
const void * sub_8098974(u16 itemId, u8 attrId)
|
||||
{
|
||||
if (itemId > ITEM_N_A)
|
||||
itemId = ITEM_NONE;
|
||||
return gUnknown_83D4294[itemId][attrId];
|
||||
}
|
||||
|
||||
void sub_80989A0(u16 itemId, u8 idx)
|
||||
{
|
||||
u8 * ptr = &gUnknown_2039878[10];
|
||||
u8 spriteId;
|
||||
|
||||
if (ptr[idx] == 0xFF)
|
||||
{
|
||||
FreeSpriteTilesByTag(102 + idx);
|
||||
FreeSpritePaletteByTag(102 + idx);
|
||||
spriteId = AddItemIconObject(102 + idx, 102 + idx, itemId);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
ptr[idx] = spriteId;
|
||||
gSprites[spriteId].pos2.x = 24;
|
||||
gSprites[spriteId].pos2.y = 147;
|
||||
}
|
||||
}
|
||||
}
|
||||
+1150
File diff suppressed because it is too large
Load Diff
+879
@@ -0,0 +1,879 @@
|
||||
#include "global.h"
|
||||
#include "battle.h"
|
||||
#include "berry_pouch.h"
|
||||
#include "berry_powder.h"
|
||||
#include "bike.h"
|
||||
#include "coins.h"
|
||||
#include "event_data.h"
|
||||
#include "field_effect.h"
|
||||
#include "field_fadetransition.h"
|
||||
#include "field_map_obj_helpers.h"
|
||||
#include "field_player_avatar.h"
|
||||
#include "field_specials.h"
|
||||
#include "field_weather.h"
|
||||
#include "fieldmap.h"
|
||||
#include "item.h"
|
||||
#include "item_menu.h"
|
||||
#include "item_use.h"
|
||||
#include "itemfinder.h"
|
||||
#include "mail.h"
|
||||
#include "main.h"
|
||||
#include "malloc.h"
|
||||
#include "map_obj_80688E4.h"
|
||||
#include "map_obj_lock.h"
|
||||
#include "metatile_behavior.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "overworld.h"
|
||||
#include "palette.h"
|
||||
#include "party_menu.h"
|
||||
#include "quest_log.h"
|
||||
#include "region_map.h"
|
||||
#include "script.h"
|
||||
#include "sound.h"
|
||||
#include "string_util.h"
|
||||
#include "strings.h"
|
||||
#include "task.h"
|
||||
#include "teachy_tv.h"
|
||||
#include "tm_case.h"
|
||||
#include "vs_seeker.h"
|
||||
#include "constants/fanfares.h"
|
||||
#include "constants/flags.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/maps.h"
|
||||
#include "constants/moves.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
EWRAM_DATA void (*sItemUseOnFieldCB)(u8 taskId) = NULL;
|
||||
|
||||
void sub_80A1084(void);
|
||||
void sub_80A109C(u8 taskId);
|
||||
void sub_80A112C(u8 taskId);
|
||||
void sub_80A11C0(u8 taskId);
|
||||
bool8 sub_80A1194(void);
|
||||
void sub_80A1208(void);
|
||||
void ItemUseOnFieldCB_Bicycle(u8 taskId);
|
||||
bool8 ItemUseCheckFunc_Rod(void);
|
||||
void ItemUseOnFieldCB_Rod(u8 taskId);
|
||||
void FieldUseFunc_EvoItem(u8 taskId);
|
||||
void sub_80A1648(u8 taskId);
|
||||
void sub_80A1674(u8 taskId);
|
||||
void InitTMCaseFromBag(void);
|
||||
void Task_InitTMCaseFromField(u8 taskId);
|
||||
void InitBerryPouchFromBag(void);
|
||||
void Task_InitBerryPouchFromField(u8 taskId);
|
||||
void InitBerryPouchFromBattle(void);
|
||||
void InitTeachyTvFromBag(void);
|
||||
void Task_InitTeachyTvFromField(u8 taskId);
|
||||
void sub_80A19E8(u8 taskId);
|
||||
void sub_80A1A44(void);
|
||||
void sub_80A1B48(u8 taskId);
|
||||
void sub_80A1C08(u8 taskId);
|
||||
void sub_80A1CAC(void);
|
||||
void sub_80A1CC0(u8 taskId);
|
||||
void sub_80A1D58(void);
|
||||
void sub_80A1D68(u8 taskId);
|
||||
void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId);
|
||||
void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId);
|
||||
|
||||
extern void (*const gUnknown_83E2954[])(void);
|
||||
|
||||
void sub_80A0FBC(u8 taskId)
|
||||
{
|
||||
u8 itemType;
|
||||
if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY)
|
||||
itemType = gTasks[taskId].data[4] - 1;
|
||||
else
|
||||
itemType = ItemId_GetType(gSpecialVar_ItemId) - 1;
|
||||
if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)
|
||||
{
|
||||
BerryPouch_SetExitCallback(gUnknown_83E2954[itemType]);
|
||||
BerryPouch_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
ItemMenu_SetExitCallback(gUnknown_83E2954[itemType]);
|
||||
if (itemType == 1)
|
||||
sub_8108CB4();
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A103C(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] != 1)
|
||||
{
|
||||
gFieldCallback = sub_80A1084;
|
||||
sub_80A0FBC(taskId);
|
||||
}
|
||||
else
|
||||
sItemUseOnFieldCB(taskId);
|
||||
}
|
||||
|
||||
void sub_80A1084(void)
|
||||
{
|
||||
sub_807DC00();
|
||||
CreateTask(sub_80A109C, 8);
|
||||
}
|
||||
|
||||
void sub_80A109C(u8 taskId)
|
||||
{
|
||||
if (sub_807AA70() == TRUE)
|
||||
{
|
||||
sItemUseOnFieldCB(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A10C4(u8 taskId, bool8 a1, u8 a2, const u8 * str)
|
||||
{
|
||||
StringExpandPlaceholders(gStringVar4, str);
|
||||
if (a1 == FALSE)
|
||||
DisplayItemMessageInBag(taskId, a2, gStringVar4, sub_810A1F8);
|
||||
else
|
||||
DisplayItemMessageOnField(taskId, a2, gStringVar4, sub_80A112C);
|
||||
}
|
||||
|
||||
void sub_80A1110(u8 taskId, bool8 a1)
|
||||
{
|
||||
sub_80A10C4(taskId, a1, 4, gUnknown_8416425);
|
||||
}
|
||||
|
||||
void sub_80A112C(u8 taskId)
|
||||
{
|
||||
ClearDialogWindowAndFrame(0, 1);
|
||||
DestroyTask(taskId);
|
||||
sub_80696C0();
|
||||
ScriptContext2_Disable();
|
||||
}
|
||||
|
||||
u8 GetItemCompatibilityRule(u16 itemId)
|
||||
{
|
||||
if (ItemId_GetPocket(itemId) == POCKET_TM_CASE)
|
||||
return 1;
|
||||
else if (ItemId_GetFieldFunc(itemId) == FieldUseFunc_EvoItem)
|
||||
return 2;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sub_80A1184(void)
|
||||
{
|
||||
gFieldCallback2 = sub_80A1194;
|
||||
}
|
||||
|
||||
bool8 sub_80A1194(void)
|
||||
{
|
||||
player_bitmagic();
|
||||
ScriptContext2_Enable();
|
||||
sub_807DC00();
|
||||
CreateTask(sub_80A11C0, 10);
|
||||
gUnknown_2031DE0 = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void sub_80A11C0(u8 taskId)
|
||||
{
|
||||
if (sub_807AA70() == TRUE)
|
||||
{
|
||||
UnfreezeMapObjects();
|
||||
ScriptContext2_Disable();
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void FieldUseFunc_OrangeMail(u8 taskId)
|
||||
{
|
||||
ItemMenu_SetExitCallback(sub_80A1208);
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
|
||||
void sub_80A1208(void)
|
||||
{
|
||||
struct MailStruct mail;
|
||||
|
||||
mail.itemId = gSpecialVar_ItemId;
|
||||
sub_80BEBEC(&mail, ReturnToBagFromKeyItem, 0);
|
||||
}
|
||||
|
||||
void FieldUseFunc_MachBike(u8 taskId)
|
||||
{
|
||||
s16 x, y;
|
||||
u8 behavior;
|
||||
|
||||
PlayerGetDestCoords(&x, &y);
|
||||
behavior = MapGridGetMetatileBehaviorAt(x, y);
|
||||
|
||||
if (FlagGet(FLAG_0x830) == TRUE
|
||||
|| MetatileBehavior_ReturnFalse_17(behavior) == TRUE
|
||||
|| MetatileBehavior_ReturnFalse_18(behavior) == TRUE
|
||||
|| MetatileBehavior_ReturnFalse_15(behavior) == TRUE
|
||||
|| MetatileBehavior_ReturnFalse_16(behavior) == TRUE)
|
||||
sub_80A10C4(taskId, gTasks[taskId].data[3], 2, gUnknown_8416451);
|
||||
else if (sub_8055C9C() == TRUE && !sub_80BD540())
|
||||
{
|
||||
sItemUseOnFieldCB = ItemUseOnFieldCB_Bicycle;
|
||||
sub_80A103C(taskId);
|
||||
}
|
||||
else
|
||||
sub_80A1110(taskId, gTasks[taskId].data[3]);
|
||||
}
|
||||
|
||||
void ItemUseOnFieldCB_Bicycle(u8 taskId)
|
||||
{
|
||||
if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))
|
||||
PlaySE(SE_JITENSYA);
|
||||
StartTransitionToFlipBikeState(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE);
|
||||
sub_80696C0();
|
||||
ScriptContext2_Disable();
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
|
||||
void FieldUseFunc_OldRod(u8 taskId)
|
||||
{
|
||||
if (ItemUseCheckFunc_Rod() == TRUE)
|
||||
{
|
||||
sItemUseOnFieldCB = ItemUseOnFieldCB_Rod;
|
||||
sub_80A103C(taskId);
|
||||
}
|
||||
else
|
||||
sub_80A1110(taskId, gTasks[taskId].data[3]);
|
||||
}
|
||||
|
||||
bool8 ItemUseCheckFunc_Rod(void)
|
||||
{
|
||||
s16 x, y;
|
||||
u16 behavior;
|
||||
|
||||
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
||||
behavior = MapGridGetMetatileBehaviorAt(x, y);
|
||||
|
||||
if (MetatileBehavior_IsWaterfall(behavior))
|
||||
return FALSE;
|
||||
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4))
|
||||
return FALSE;
|
||||
if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
|
||||
{
|
||||
if (IsPlayerFacingSurfableFishableWater())
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (MetatileBehavior_IsSurfable(behavior) && !MapGridIsImpassableAt(x, y))
|
||||
return TRUE;
|
||||
if (MetatileBehavior_ReturnFalse_6(behavior) == TRUE)
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void ItemUseOnFieldCB_Rod(u8 taskId)
|
||||
{
|
||||
sub_805D2C0(ItemId_GetSecondaryId(gSpecialVar_ItemId));
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
|
||||
void ItemUseOutOfBattle_Itemfinder(u8 taskId)
|
||||
{
|
||||
IncrementGameStat(GAME_STAT_USED_ITEMFINDER);
|
||||
sItemUseOnFieldCB = sub_813EC8C;
|
||||
sub_80A103C(taskId);
|
||||
}
|
||||
|
||||
void FieldUseFunc_CoinCase(u8 taskId)
|
||||
{
|
||||
ConvertIntToDecimalStringN(gStringVar1, GetCoins(), STR_CONV_MODE_LEFT_ALIGN, 4);
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_8416537);
|
||||
ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
|
||||
else
|
||||
DisplayItemMessageOnField(taskId, 2, gStringVar4, sub_80A112C);
|
||||
}
|
||||
|
||||
void FieldUseFunc_PowderJar(u8 taskId)
|
||||
{
|
||||
ConvertIntToDecimalStringN(gStringVar1, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 5);
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_8416644);
|
||||
ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
|
||||
else
|
||||
DisplayItemMessageOnField(taskId, 2, gStringVar4, sub_80A112C);
|
||||
}
|
||||
|
||||
void FieldUseFunc_PokeFlute(u8 taskId)
|
||||
{
|
||||
bool8 wokeSomeoneUp = FALSE;
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < CalculatePlayerPartyCount(); i++)
|
||||
{
|
||||
if (!ExecuteTableBasedItemEffect(&gPlayerParty[i], ITEM_AWAKENING, i, MOVE_NONE))
|
||||
wokeSomeoneUp = TRUE;
|
||||
}
|
||||
|
||||
if (wokeSomeoneUp)
|
||||
{
|
||||
ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
DisplayItemMessageInBag(taskId, 2, gUnknown_8416690, sub_80A1648);
|
||||
else
|
||||
DisplayItemMessageOnField(taskId, 2, gUnknown_8416690, sub_80A1648);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Now that's a catchy tune!
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
DisplayItemMessageInBag(taskId, 2, gUnknown_841665C, sub_810A1F8);
|
||||
else
|
||||
DisplayItemMessageOnField(taskId, 2, gUnknown_841665C, sub_80A112C);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A1648(u8 taskId)
|
||||
{
|
||||
PlayFanfareByFanfareNum(FANFARE_POKEFLUTE);
|
||||
gTasks[taskId].func = sub_80A1674;
|
||||
}
|
||||
|
||||
void sub_80A1674(u8 taskId)
|
||||
{
|
||||
if (WaitFanfare(FALSE))
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
DisplayItemMessageInBag(taskId, 2, gUnknown_84166A7, sub_810A1F8);
|
||||
else
|
||||
DisplayItemMessageOnField(taskId, 2, gUnknown_84166A7, sub_80A112C);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A16D0(u8 taskId)
|
||||
{
|
||||
sub_80A0FBC(taskId);
|
||||
}
|
||||
|
||||
void FieldUseFunc_Medicine(u8 taskId)
|
||||
{
|
||||
gUnknown_3005E98 = sub_81252D0;
|
||||
sub_80A16D0(taskId);
|
||||
}
|
||||
|
||||
void FieldUseFunc_Ether(u8 taskId)
|
||||
{
|
||||
gUnknown_3005E98 = ItemUseCB_PpRestore;
|
||||
sub_80A16D0(taskId);
|
||||
}
|
||||
|
||||
void FieldUseFunc_PpUp(u8 taskId)
|
||||
{
|
||||
gUnknown_3005E98 = dp05_pp_up;
|
||||
sub_80A16D0(taskId);
|
||||
}
|
||||
|
||||
void FieldUseFunc_RareCandy(u8 taskId)
|
||||
{
|
||||
gUnknown_3005E98 = dp05_rare_candy;
|
||||
sub_80A16D0(taskId);
|
||||
}
|
||||
|
||||
void FieldUseFunc_EvoItem(u8 taskId)
|
||||
{
|
||||
gUnknown_3005E98 = sub_8126B60;
|
||||
sub_80A16D0(taskId);
|
||||
}
|
||||
|
||||
void FieldUseFunc_SacredAsh(u8 taskId)
|
||||
{
|
||||
gUnknown_3005E98 = sub_8126894;
|
||||
sub_80A0FBC(taskId);
|
||||
}
|
||||
|
||||
void FieldUseFunc_TmCase(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
ItemMenu_SetExitCallback(InitTMCaseFromBag);
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_80CCB68();
|
||||
fade_screen(1, 0);
|
||||
gTasks[taskId].func = Task_InitTMCaseFromField;
|
||||
}
|
||||
}
|
||||
|
||||
void InitTMCaseFromBag(void)
|
||||
{
|
||||
InitTMCase(0, ReturnToBagFromKeyItem, 0);
|
||||
}
|
||||
|
||||
void Task_InitTMCaseFromField(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
sub_80A1184();
|
||||
InitTMCase(0, CB2_ReturnToField, 1);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void FieldUseFunc_BerryPouch(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
ItemMenu_SetExitCallback(InitBerryPouchFromBag);
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_80CCB68();
|
||||
fade_screen(1, 0);
|
||||
gTasks[taskId].func = Task_InitBerryPouchFromField;
|
||||
}
|
||||
}
|
||||
|
||||
void InitBerryPouchFromBag(void)
|
||||
{
|
||||
InitBerryPouch(0, ReturnToBagFromKeyItem, 0);
|
||||
}
|
||||
|
||||
void Task_InitBerryPouchFromField(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
sub_80A1184();
|
||||
InitBerryPouch(0, CB2_ReturnToField, 1);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void BattleUseFunc_BerryPouch(u8 taskId)
|
||||
{
|
||||
ItemMenu_SetExitCallback(InitBerryPouchFromBattle);
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
|
||||
void InitBerryPouchFromBattle(void)
|
||||
{
|
||||
InitBerryPouch(4, sub_8107ECC, 0);
|
||||
}
|
||||
|
||||
void FieldUseFunc_TeachyTv(u8 taskId)
|
||||
{
|
||||
ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
ItemMenu_SetExitCallback(InitTeachyTvFromBag);
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_80CCB68();
|
||||
fade_screen(1, 0);
|
||||
gTasks[taskId].func = Task_InitTeachyTvFromField;
|
||||
}
|
||||
}
|
||||
|
||||
void InitTeachyTvFromBag(void)
|
||||
{
|
||||
InitTeachyTvController(0, ReturnToBagFromKeyItem);
|
||||
}
|
||||
|
||||
void Task_InitTeachyTvFromField(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
sub_80A1184();
|
||||
InitTeachyTvController(0, CB2_ReturnToField);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void FieldUseFunc_SuperRepel(u8 taskId)
|
||||
{
|
||||
if (VarGet(VAR_REPEL_STEP_COUNT) == 0)
|
||||
{
|
||||
PlaySE(SE_RU_GASYAN);
|
||||
gTasks[taskId].func = sub_80A19E8;
|
||||
}
|
||||
else
|
||||
// An earlier repel is still in effect
|
||||
DisplayItemMessageInBag(taskId, 2, gUnknown_841659E, sub_810A1F8);
|
||||
}
|
||||
|
||||
void sub_80A19E8(u8 taskId)
|
||||
{
|
||||
if (!IsSEPlaying())
|
||||
{
|
||||
ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
|
||||
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId));
|
||||
sub_80A1A44();
|
||||
DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A1A44(void)
|
||||
{
|
||||
RemoveBagItem(gSpecialVar_ItemId, 1);
|
||||
sub_8108DC8(ItemId_GetPocket(gSpecialVar_ItemId));
|
||||
sub_81089F4(ItemId_GetPocket(gSpecialVar_ItemId));
|
||||
CopyItemName(gSpecialVar_ItemId, gStringVar2);
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_841658C);
|
||||
}
|
||||
|
||||
void FieldUseFunc_BlackFlute(u8 taskId)
|
||||
{
|
||||
ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
|
||||
if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE)
|
||||
{
|
||||
FlagSet(FLAG_WHITE_FLUTE_ACTIVE);
|
||||
FlagClear(FLAG_BLACK_FLUTE_ACTIVE);
|
||||
CopyItemName(gSpecialVar_ItemId, gStringVar2);
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_84165D2);
|
||||
gTasks[taskId].func = sub_80A1B48;
|
||||
gTasks[taskId].data[8] = 0;
|
||||
}
|
||||
else if (gSpecialVar_ItemId == ITEM_BLACK_FLUTE)
|
||||
{
|
||||
FlagSet(FLAG_BLACK_FLUTE_ACTIVE);
|
||||
FlagClear(FLAG_WHITE_FLUTE_ACTIVE);
|
||||
CopyItemName(gSpecialVar_ItemId, gStringVar2);
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_8416600);
|
||||
gTasks[taskId].func = sub_80A1B48;
|
||||
gTasks[taskId].data[8] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A1B48(u8 taskId)
|
||||
{
|
||||
if (++gTasks[taskId].data[8] > 7)
|
||||
{
|
||||
PlaySE(SE_PN_ON);
|
||||
DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
|
||||
}
|
||||
}
|
||||
|
||||
bool8 CanUseEscapeRopeOnCurrMap(void)
|
||||
{
|
||||
if (gMapHeader.escapeRope & 1)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void ItemUseOutOfBattle_EscapeRope(u8 taskId)
|
||||
{
|
||||
if (CanUseEscapeRopeOnCurrMap() == TRUE)
|
||||
{
|
||||
ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, gMapHeader.regionMapSectionId);
|
||||
sItemUseOnFieldCB = sub_80A1C08;
|
||||
sub_80A103C(taskId);
|
||||
}
|
||||
else
|
||||
sub_80A1110(taskId, gTasks[taskId].data[3]);
|
||||
}
|
||||
|
||||
void sub_80A1C08(u8 taskId)
|
||||
{
|
||||
Overworld_ResetStateAfterDigEscRope();
|
||||
sub_80A1A44();
|
||||
gTasks[taskId].data[0] = 0;
|
||||
DisplayItemMessageOnField(taskId, 2, gStringVar4, sub_80A1C44);
|
||||
}
|
||||
|
||||
void sub_80A1C44(u8 taskId)
|
||||
{
|
||||
ResetInitialPlayerAvatarState();
|
||||
sub_8085620();
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
|
||||
void FieldUseFunc_TownMap(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
ItemMenu_SetExitCallback(sub_80A1CAC);
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_80CCB68();
|
||||
fade_screen(1, 0);
|
||||
gTasks[taskId].func = sub_80A1CC0;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A1CAC(void)
|
||||
{
|
||||
sub_80BFF50(0, ReturnToBagFromKeyItem);
|
||||
}
|
||||
|
||||
void sub_80A1CC0(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
sub_80A1184();
|
||||
sub_80BFF50(0, CB2_ReturnToField);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void FieldUseFunc_FameChecker(u8 taskId)
|
||||
{
|
||||
ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
ItemMenu_SetExitCallback(sub_80A1D58);
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_80CCB68();
|
||||
fade_screen(1, 0);
|
||||
gTasks[taskId].func = sub_80A1D68;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A1D58(void)
|
||||
{
|
||||
UseFameChecker(ReturnToBagFromKeyItem);
|
||||
}
|
||||
|
||||
void sub_80A1D68(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
sub_80A1184();
|
||||
UseFameChecker(CB2_ReturnToField);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void FieldUseFunc_VsSeeker(u8 taskId)
|
||||
{
|
||||
if ((gMapHeader.mapType != MAP_TYPE_ROUTE
|
||||
&& gMapHeader.mapType != MAP_TYPE_TOWN
|
||||
&& gMapHeader.mapType != MAP_TYPE_CITY)
|
||||
|| (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(VIRIDIAN_FOREST)
|
||||
&& (gSaveBlock1Ptr->location.mapNum == MAP_NUM(VIRIDIAN_FOREST)
|
||||
|| gSaveBlock1Ptr->location.mapNum == MAP_NUM(MT_EMBER_EXTERIOR)
|
||||
|| gSaveBlock1Ptr->location.mapNum == MAP_NUM(THREE_ISLAND_BERRY_FOREST)
|
||||
|| gSaveBlock1Ptr->location.mapNum == MAP_NUM(SIX_ISLAND_PATTERN_BUSH))))
|
||||
{
|
||||
sub_80A1110(taskId, gTasks[taskId].data[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
sItemUseOnFieldCB = Task_VsSeeker_0;
|
||||
sub_80A103C(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A1E0C(u8 taskId)
|
||||
{
|
||||
sub_80A112C(taskId);
|
||||
}
|
||||
|
||||
void BattleUseFunc_PokeBallEtc(u8 taskId)
|
||||
{
|
||||
if (!IsPlayerPartyAndPokemonStorageFull())
|
||||
{
|
||||
RemoveBagItem(gSpecialVar_ItemId, 1);
|
||||
sub_8108CB4();
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
DisplayItemMessageInBag(taskId, 2, gUnknown_8416631, sub_810A1F8);
|
||||
}
|
||||
}
|
||||
|
||||
void BattleUseFunc_PokeFlute(u8 taskId)
|
||||
{
|
||||
sub_8108CB4();
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
|
||||
void BattleUseFunc_GuardSpec(u8 taskId)
|
||||
{
|
||||
if (ExecuteTableBasedItemEffect(&gPlayerParty[gBattlerPartyIndexes[gBattlerInMenuId]], gSpecialVar_ItemId, gBattlerPartyIndexes[gBattlerInMenuId], 0))
|
||||
{
|
||||
DisplayItemMessageInBag(taskId, 2, gUnknown_84169DC, sub_810A1F8);
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[8] = 0;
|
||||
gTasks[taskId].func = Task_BattleUse_StatBooster_DelayAndPrint;
|
||||
}
|
||||
}
|
||||
|
||||
void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
if (++data[8] > 7)
|
||||
{
|
||||
u16 itemId = gSpecialVar_ItemId;
|
||||
PlaySE(SE_KAIFUKU);
|
||||
RemoveBagItem(itemId, 1);
|
||||
DisplayItemMessageInBag(taskId, 2, Battle_PrintStatBoosterEffectMessage(itemId), Task_BattleUse_StatBooster_WaitButton_ReturnToBattle);
|
||||
}
|
||||
}
|
||||
|
||||
void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId)
|
||||
{
|
||||
if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
|
||||
{
|
||||
sub_8108CB4();
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void ItemUse_SwitchToPartyMenuInBattle(u8 taskId)
|
||||
{
|
||||
if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)
|
||||
{
|
||||
BerryPouch_SetExitCallback(sub_81279E0);
|
||||
BerryPouch_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
ItemMenu_SetExitCallback(sub_81279E0);
|
||||
ItemMenu_StartFadeToExitCallback(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void BattleUseFunc_Medicine(u8 taskId)
|
||||
{
|
||||
gUnknown_3005E98 = ItemUseCB_Medicine;
|
||||
ItemUse_SwitchToPartyMenuInBattle(taskId);
|
||||
}
|
||||
|
||||
void sub_80A1FD8(u8 taskId)
|
||||
{
|
||||
gUnknown_3005E98 = sub_8126894;
|
||||
ItemUse_SwitchToPartyMenuInBattle(taskId);
|
||||
}
|
||||
|
||||
void BattleUseFunc_Ether(u8 taskId)
|
||||
{
|
||||
gUnknown_3005E98 = ItemUseCB_PpRestore;
|
||||
ItemUse_SwitchToPartyMenuInBattle(taskId);
|
||||
}
|
||||
|
||||
void BattleUseFunc_PokeDoll(u8 taskId)
|
||||
{
|
||||
if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER))
|
||||
{
|
||||
sub_80A1A44();
|
||||
ItemUse_SetQuestLogEvent(4, 0, gSpecialVar_ItemId, 0xFFFF);
|
||||
DisplayItemMessageInBag(taskId, 2, gStringVar4, ItemMenu_StartFadeToExitCallback);
|
||||
}
|
||||
else
|
||||
sub_80A1110(taskId, 0);
|
||||
}
|
||||
|
||||
void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
|
||||
{
|
||||
switch (GetItemEffectType(gSpecialVar_ItemId) - 1)
|
||||
{
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
case 13:
|
||||
case 14:
|
||||
case 15:
|
||||
case 16:
|
||||
gTasks[taskId].data[4] = 1;
|
||||
FieldUseFunc_Medicine(taskId);
|
||||
break;
|
||||
case 9:
|
||||
gTasks[taskId].data[4] = 1;
|
||||
FieldUseFunc_SacredAsh(taskId);
|
||||
break;
|
||||
case 0:
|
||||
gTasks[taskId].data[4] = 1;
|
||||
FieldUseFunc_RareCandy(taskId);
|
||||
break;
|
||||
case 18:
|
||||
case 19:
|
||||
gTasks[taskId].data[4] = 1;
|
||||
FieldUseFunc_PpUp(taskId);
|
||||
break;
|
||||
case 20:
|
||||
gTasks[taskId].data[4] = 1;
|
||||
FieldUseFunc_Ether(taskId);
|
||||
break;
|
||||
default:
|
||||
gTasks[taskId].data[4] = 4;
|
||||
FieldUseFunc_OakStopsYou(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void ItemUseInBattle_EnigmaBerry(u8 taskId)
|
||||
{
|
||||
switch (GetItemEffectType(gSpecialVar_ItemId))
|
||||
{
|
||||
case 0:
|
||||
BattleUseFunc_GuardSpec(taskId);
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 11:
|
||||
BattleUseFunc_Medicine(taskId);
|
||||
break;
|
||||
case 21:
|
||||
BattleUseFunc_Ether(taskId);
|
||||
break;
|
||||
default:
|
||||
FieldUseFunc_OakStopsYou(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void FieldUseFunc_OakStopsYou(u8 taskId)
|
||||
{
|
||||
if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)
|
||||
{
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_8416425);
|
||||
DisplayItemMessageInBerryPouch(taskId, 4, gStringVar4, sub_813E2B8);
|
||||
}
|
||||
else
|
||||
sub_80A1110(taskId, gTasks[taskId].data[3]);
|
||||
}
|
||||
|
||||
void ItemUse_SetQuestLogEvent(u8 eventId, struct Pokemon * pokemon, u16 itemId, u16 param)
|
||||
{
|
||||
struct UnkStruct_ItemUseQuestLog
|
||||
{
|
||||
u16 itemId;
|
||||
u16 unk2;
|
||||
u16 species;
|
||||
u16 param;
|
||||
} * questLog = Alloc(sizeof(*questLog));
|
||||
|
||||
questLog->itemId = itemId;
|
||||
questLog->param = param;
|
||||
if (pokemon != NULL)
|
||||
questLog->species = GetMonData(pokemon, MON_DATA_SPECIES2);
|
||||
else
|
||||
questLog->species = 0xFFFF;
|
||||
sub_8113550(eventId, (void *)questLog);
|
||||
Free(questLog);
|
||||
}
|
||||
+786
@@ -0,0 +1,786 @@
|
||||
#include "global.h"
|
||||
#include "menu.h"
|
||||
#include "list_menu.h"
|
||||
#include "menu_indicators.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "window.h"
|
||||
#include "text_window.h"
|
||||
#include "main.h"
|
||||
#include "task.h"
|
||||
#include "graphics.h"
|
||||
#include "decompress.h"
|
||||
#include "palette.h"
|
||||
#include "malloc.h"
|
||||
#include "strings.h"
|
||||
#include "sound.h"
|
||||
#include "pokemon_icon.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
struct UnkIndicatorsStruct
|
||||
{
|
||||
u8 field_0;
|
||||
u16 *field_4;
|
||||
u16 field_8;
|
||||
u16 field_A;
|
||||
u16 field_C;
|
||||
u16 field_E;
|
||||
u8 field_10;
|
||||
u8 field_11;
|
||||
u8 field_12;
|
||||
u8 field_13;
|
||||
u8 field_14_0:4;
|
||||
u8 field_14_1:4;
|
||||
u8 field_15_0:4;
|
||||
u8 field_15_1:4;
|
||||
u8 field_16_0:3;
|
||||
u8 field_16_1:3;
|
||||
u8 field_16_2:2;
|
||||
u8 field_17_0:6;
|
||||
u8 field_17_1:2;
|
||||
};
|
||||
|
||||
struct MysteryGiftLinkMenuStruct
|
||||
{
|
||||
s32 currItemId;
|
||||
u8 state;
|
||||
u8 windowId;
|
||||
u8 listTaskId;
|
||||
};
|
||||
|
||||
struct ListMenuOverride
|
||||
{
|
||||
u8 cursorPal:4;
|
||||
u8 fillValue:4;
|
||||
u8 cursorShadowPal:4;
|
||||
u8 lettersSpacing:6;
|
||||
u8 field_2_2:6; // unused
|
||||
u8 fontId:7;
|
||||
bool8 enabled:1;
|
||||
};
|
||||
|
||||
struct MoveMenuInfoIcon
|
||||
{
|
||||
u8 width;
|
||||
u8 height;
|
||||
u16 offset;
|
||||
};
|
||||
|
||||
static EWRAM_DATA struct MysteryGiftLinkMenuStruct sMysteryGiftLinkMenu = {0};
|
||||
|
||||
struct ListMenuOverride gListMenuOverride;
|
||||
struct ListMenuTemplate gMultiuseListMenuTemplate;
|
||||
|
||||
static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow);
|
||||
static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown);
|
||||
static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count);
|
||||
static void ListMenuDrawCursor(struct ListMenu *list);
|
||||
static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit);
|
||||
static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind);
|
||||
|
||||
const struct MoveMenuInfoIcon gMoveMenuInfoIcons[] =
|
||||
{
|
||||
{ 12, 12, 0x00 }, // Unused
|
||||
{ 32, 12, 0x20 }, // Normal icon
|
||||
{ 32, 12, 0x64 }, // Fight icon
|
||||
{ 32, 12, 0x60 }, // Flying icon
|
||||
{ 32, 12, 0x80 }, // Poison icon
|
||||
{ 32, 12, 0x48 }, // Ground icon
|
||||
{ 32, 12, 0x44 }, // Rock icon
|
||||
{ 32, 12, 0x6C }, // Bug icon
|
||||
{ 32, 12, 0x68 }, // Ghost icon
|
||||
{ 32, 12, 0x88 }, // Steel icon
|
||||
{ 32, 12, 0xA4 }, // ??? (Mystery) icon
|
||||
{ 32, 12, 0x24 }, // Fire icon
|
||||
{ 32, 12, 0x28 }, // Water icon
|
||||
{ 32, 12, 0x2C }, // Grass icon
|
||||
{ 32, 12, 0x40 }, // Electric icon
|
||||
{ 32, 12, 0x84 }, // Psychic icon
|
||||
{ 32, 12, 0x4C }, // Ice icon
|
||||
{ 32, 12, 0xA0 }, // Dragon icon
|
||||
{ 32, 12, 0x8C }, // Dark icon
|
||||
{ 40, 12, 0xA8 }, // -Type- icon
|
||||
{ 40, 12, 0xC0 }, // -Power- icon
|
||||
{ 40, 12, 0xC8 }, // -Accuracy- icon
|
||||
{ 40, 12, 0xE0 }, // -PP- icon
|
||||
{ 40, 12, 0xE8 }, // -Effect- icon
|
||||
};
|
||||
|
||||
static void ListMenuDummyTask(u8 taskId)
|
||||
{
|
||||
}
|
||||
|
||||
s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum)
|
||||
{
|
||||
switch (sMysteryGiftLinkMenu.state)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
sMysteryGiftLinkMenu.windowId = AddWindow(windowTemplate);
|
||||
switch (arg2)
|
||||
{
|
||||
case 2:
|
||||
TextWindow_SetUserSelectedFrame(sMysteryGiftLinkMenu.windowId, tileNum, palNum);
|
||||
case 1:
|
||||
DrawTextBorderOuter(sMysteryGiftLinkMenu.windowId, tileNum, palNum / 16);
|
||||
break;
|
||||
}
|
||||
gMultiuseListMenuTemplate = *listMenuTemplate;
|
||||
gMultiuseListMenuTemplate.windowId = sMysteryGiftLinkMenu.windowId;
|
||||
sMysteryGiftLinkMenu.listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
|
||||
CopyWindowToVram(sMysteryGiftLinkMenu.windowId, 1);
|
||||
sMysteryGiftLinkMenu.state = 1;
|
||||
break;
|
||||
case 1:
|
||||
sMysteryGiftLinkMenu.currItemId = ListMenu_ProcessInput(sMysteryGiftLinkMenu.listTaskId);
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
sMysteryGiftLinkMenu.state = 2;
|
||||
}
|
||||
if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
sMysteryGiftLinkMenu.currItemId = LIST_CANCEL;
|
||||
sMysteryGiftLinkMenu.state = 2;
|
||||
}
|
||||
if (sMysteryGiftLinkMenu.state == 2)
|
||||
{
|
||||
if (!arg2)
|
||||
{
|
||||
ClearWindowTilemap(sMysteryGiftLinkMenu.windowId);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (arg2)
|
||||
{
|
||||
case 0: // can never be reached, because of the if statement above
|
||||
ClearStdWindowAndFrame(sMysteryGiftLinkMenu.windowId, FALSE);
|
||||
break;
|
||||
case 2:
|
||||
case 1:
|
||||
ClearStdWindowAndFrame(sMysteryGiftLinkMenu.windowId, FALSE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
CopyWindowToVram(sMysteryGiftLinkMenu.windowId, 1);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
DestroyListMenuTask(sMysteryGiftLinkMenu.listTaskId, NULL, NULL);
|
||||
RemoveWindow(sMysteryGiftLinkMenu.windowId);
|
||||
sMysteryGiftLinkMenu.state = 0;
|
||||
return sMysteryGiftLinkMenu.currItemId;
|
||||
}
|
||||
return LIST_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
u8 ListMenuInit(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow)
|
||||
{
|
||||
u8 taskId = ListMenuInitInternal(listMenuTemplate, scrollOffset, selectedRow);
|
||||
PutWindowTilemap(listMenuTemplate->windowId);
|
||||
CopyWindowToVram(listMenuTemplate->windowId, 2);
|
||||
return taskId;
|
||||
}
|
||||
|
||||
u8 ListMenuInitInRect(struct ListMenuTemplate *listMenuTemplate, struct ListMenuWindowRect *rect, u16 scrollOffset, u16 selectedRow)
|
||||
{
|
||||
s32 i;
|
||||
u8 taskId = ListMenuInitInternal(listMenuTemplate, scrollOffset, selectedRow);
|
||||
|
||||
for (i = 0; rect[i].palNum != 0xFF; i++)
|
||||
PutWindowRectTilemapOverridePalette(listMenuTemplate->windowId, rect[i].x, rect[i].y, rect[i].width, rect[i].height, rect[i].palNum);
|
||||
CopyWindowToVram(listMenuTemplate->windowId, 2);
|
||||
return taskId;
|
||||
}
|
||||
|
||||
s32 ListMenu_ProcessInput(u8 listTaskId)
|
||||
{
|
||||
struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
return list->template.items[list->scrollOffset + list->selectedRow].index;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return LIST_CANCEL;
|
||||
}
|
||||
else if (gMain.newAndRepeatedKeys & DPAD_UP)
|
||||
{
|
||||
ListMenuChangeSelection(list, TRUE, 1, FALSE);
|
||||
return LIST_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
|
||||
{
|
||||
ListMenuChangeSelection(list, TRUE, 1, TRUE);
|
||||
return LIST_NOTHING_CHOSEN;
|
||||
}
|
||||
else // try to move by one window scroll
|
||||
{
|
||||
bool16 rightButton, leftButton;
|
||||
switch (list->template.scrollMultiple)
|
||||
{
|
||||
case LIST_NO_MULTIPLE_SCROLL:
|
||||
default:
|
||||
leftButton = FALSE;
|
||||
rightButton = FALSE;
|
||||
break;
|
||||
case LIST_MULTIPLE_SCROLL_DPAD:
|
||||
leftButton = gMain.newAndRepeatedKeys & DPAD_LEFT;
|
||||
rightButton = gMain.newAndRepeatedKeys & DPAD_RIGHT;
|
||||
break;
|
||||
case LIST_MULTIPLE_SCROLL_L_R:
|
||||
leftButton = gMain.newAndRepeatedKeys & L_BUTTON;
|
||||
rightButton = gMain.newAndRepeatedKeys & R_BUTTON;
|
||||
break;
|
||||
}
|
||||
if (leftButton)
|
||||
{
|
||||
ListMenuChangeSelection(list, TRUE, list->template.maxShowed, FALSE);
|
||||
return LIST_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (rightButton)
|
||||
{
|
||||
ListMenuChangeSelection(list, TRUE, list->template.maxShowed, TRUE);
|
||||
return LIST_NOTHING_CHOSEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
return LIST_NOTHING_CHOSEN;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DestroyListMenuTask(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow)
|
||||
{
|
||||
struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
|
||||
|
||||
if (scrollOffset != NULL)
|
||||
*scrollOffset = list->scrollOffset;
|
||||
if (selectedRow != NULL)
|
||||
*selectedRow = list->selectedRow;
|
||||
|
||||
if (list->taskId != TASK_NONE)
|
||||
ListMenuRemoveCursorObject(list->taskId, list->template.cursorKind - 2);
|
||||
|
||||
DestroyTask(listTaskId);
|
||||
}
|
||||
|
||||
void RedrawListMenu(u8 listTaskId)
|
||||
{
|
||||
struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
|
||||
|
||||
FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue));
|
||||
ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed);
|
||||
ListMenuDrawCursor(list);
|
||||
CopyWindowToVram(list->template.windowId, 2);
|
||||
}
|
||||
|
||||
static void ChangeListMenuPals(u8 listTaskId, u8 cursorPal, u8 fillValue, u8 cursorShadowPal)
|
||||
{
|
||||
struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
|
||||
|
||||
list->template.cursorPal = cursorPal;
|
||||
list->template.fillValue = fillValue;
|
||||
list->template.cursorShadowPal = cursorShadowPal;
|
||||
}
|
||||
|
||||
static void ChangeListMenuCoords(u8 listTaskId, u8 x, u8 y)
|
||||
{
|
||||
struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
|
||||
|
||||
SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT, x);
|
||||
SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP, y);
|
||||
}
|
||||
|
||||
static s32 ListMenuTestInput(struct ListMenuTemplate *template, u32 scrollOffset, u32 selectedRow, u16 keys, u16 *newScrollOffset, u16 *newSelectedRow)
|
||||
{
|
||||
struct ListMenu list;
|
||||
|
||||
list.template = *template;
|
||||
list.scrollOffset = scrollOffset;
|
||||
list.selectedRow = selectedRow;
|
||||
list.unk_1C = 0;
|
||||
list.unk_1D = 0;
|
||||
if (keys == DPAD_UP)
|
||||
ListMenuChangeSelection(&list, FALSE, 1, FALSE);
|
||||
if (keys == DPAD_DOWN)
|
||||
ListMenuChangeSelection(&list, FALSE, 1, TRUE);
|
||||
|
||||
if (newScrollOffset != NULL)
|
||||
*newScrollOffset = list.scrollOffset;
|
||||
if (newSelectedRow != NULL)
|
||||
*newSelectedRow = list.selectedRow;
|
||||
return LIST_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
static void ListMenuGetCurrentItemArrayId(u8 listTaskId, u16 *arrayId)
|
||||
{
|
||||
struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
|
||||
|
||||
if (arrayId != NULL)
|
||||
*arrayId = list->scrollOffset + list->selectedRow;
|
||||
}
|
||||
|
||||
void ListMenuGetScrollAndRow(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow)
|
||||
{
|
||||
struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
|
||||
|
||||
if (scrollOffset != NULL)
|
||||
*scrollOffset = list->scrollOffset;
|
||||
if (selectedRow != NULL)
|
||||
*selectedRow = list->selectedRow;
|
||||
}
|
||||
|
||||
u16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId)
|
||||
{
|
||||
struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
|
||||
u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
|
||||
|
||||
return list->selectedRow * yMultiplier + list->template.upText_Y;
|
||||
}
|
||||
|
||||
static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow)
|
||||
{
|
||||
u8 listTaskId = CreateTask(ListMenuDummyTask, 0);
|
||||
struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
|
||||
|
||||
list->template = *listMenuTemplate;
|
||||
list->scrollOffset = scrollOffset;
|
||||
list->selectedRow = selectedRow;
|
||||
list->unk_1C = 0;
|
||||
list->unk_1D = 0;
|
||||
list->taskId = TASK_NONE;
|
||||
list->unk_1F = 0;
|
||||
gListMenuOverride.cursorPal = list->template.cursorPal;
|
||||
gListMenuOverride.fillValue = list->template.fillValue;
|
||||
gListMenuOverride.cursorShadowPal = list->template.cursorShadowPal;
|
||||
gListMenuOverride.lettersSpacing = list->template.lettersSpacing;
|
||||
gListMenuOverride.fontId = list->template.fontId;
|
||||
gListMenuOverride.enabled = FALSE;
|
||||
if (list->template.totalItems < list->template.maxShowed)
|
||||
list->template.maxShowed = list->template.totalItems;
|
||||
FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue));
|
||||
ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed);
|
||||
ListMenuDrawCursor(list);
|
||||
ListMenuCallSelectionChangedCallback(list, TRUE);
|
||||
|
||||
return listTaskId;
|
||||
}
|
||||
|
||||
static void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y)
|
||||
{
|
||||
struct TextColor colors;
|
||||
if (gListMenuOverride.enabled)
|
||||
{
|
||||
colors.fgColor = gListMenuOverride.fillValue;
|
||||
colors.bgColor = gListMenuOverride.cursorPal;
|
||||
colors.shadowColor = gListMenuOverride.cursorShadowPal;
|
||||
AddTextPrinterParameterized4(list->template.windowId, gListMenuOverride.fontId, x, y, gListMenuOverride.lettersSpacing, 0, &colors, TEXT_SPEED_FF, str);
|
||||
gListMenuOverride.enabled = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
colors.fgColor = list->template.fillValue;
|
||||
colors.bgColor = list->template.cursorPal;
|
||||
colors.shadowColor = list->template.cursorShadowPal;
|
||||
AddTextPrinterParameterized4(list->template.windowId, list->template.fontId, x, y, list->template.lettersSpacing, 0, &colors, TEXT_SPEED_FF, str);
|
||||
}
|
||||
}
|
||||
|
||||
static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count)
|
||||
{
|
||||
s32 i;
|
||||
u8 x, y;
|
||||
u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if (list->template.items[startIndex].index != LIST_HEADER)
|
||||
x = list->template.item_X;
|
||||
else
|
||||
x = list->template.header_X;
|
||||
y = (yOffset + i) * yMultiplier + list->template.upText_Y;
|
||||
if (list->template.itemPrintFunc != NULL)
|
||||
list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].index, y);
|
||||
ListMenuPrint(list, list->template.items[startIndex].label, x, y);
|
||||
startIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
static void ListMenuDrawCursor(struct ListMenu *list)
|
||||
{
|
||||
u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
|
||||
u8 x = list->template.cursor_X;
|
||||
u8 y = list->selectedRow * yMultiplier + list->template.upText_Y;
|
||||
|
||||
switch (list->template.cursorKind)
|
||||
{
|
||||
case 0:
|
||||
ListMenuPrint(list, gFameCheckerText_ListMenuCursor, x, y);
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
if (list->taskId == TASK_NONE)
|
||||
list->taskId = ListMenuAddCursorObject(list, 0);
|
||||
ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 - 1, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y - 1, 0);
|
||||
break;
|
||||
case 3:
|
||||
if (list->taskId == TASK_NONE)
|
||||
list->taskId = ListMenuAddCursorObject(list, 1);
|
||||
ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 + x, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind)
|
||||
{
|
||||
struct CursorStruct cursor;
|
||||
|
||||
cursor.left = 0;
|
||||
cursor.top = 160;
|
||||
cursor.rowWidth = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8 + 2;
|
||||
cursor.rowHeight = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + 2;
|
||||
cursor.tileTag = 0x4000;
|
||||
cursor.palTag = SPRITE_INVALID_TAG;
|
||||
cursor.palNum = 15;
|
||||
return ListMenuAddCursorObjectInternal(&cursor, cursorKind);
|
||||
}
|
||||
|
||||
static void ListMenuErasePrintedCursor(struct ListMenu *list, u16 selectedRow)
|
||||
{
|
||||
u8 cursorKind = list->template.cursorKind;
|
||||
if (cursorKind == 0)
|
||||
{
|
||||
u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
|
||||
u8 width = GetMenuCursorDimensionByFont(list->template.fontId, 0);
|
||||
u8 height = GetMenuCursorDimensionByFont(list->template.fontId, 1);
|
||||
FillWindowPixelRect(list->template.windowId,
|
||||
PIXEL_FILL(list->template.fillValue),
|
||||
list->template.cursor_X,
|
||||
selectedRow * yMultiplier + list->template.upText_Y,
|
||||
width,
|
||||
height);
|
||||
}
|
||||
}
|
||||
|
||||
static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, bool8 movingDown)
|
||||
{
|
||||
u16 selectedRow = list->selectedRow;
|
||||
u16 scrollOffset = list->scrollOffset;
|
||||
u16 newRow;
|
||||
u32 newScroll;
|
||||
|
||||
if (!movingDown)
|
||||
{
|
||||
if (list->template.maxShowed == 1)
|
||||
newRow = 0;
|
||||
else
|
||||
newRow = list->template.maxShowed - ((list->template.maxShowed / 2) + (list->template.maxShowed % 2)) - 1;
|
||||
|
||||
if (scrollOffset == 0)
|
||||
{
|
||||
while (selectedRow != 0)
|
||||
{
|
||||
selectedRow--;
|
||||
if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER)
|
||||
{
|
||||
list->selectedRow = selectedRow;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (selectedRow > newRow)
|
||||
{
|
||||
selectedRow--;
|
||||
if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER)
|
||||
{
|
||||
list->selectedRow = selectedRow;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
newScroll = scrollOffset - 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (list->template.maxShowed == 1)
|
||||
newRow = 0;
|
||||
else
|
||||
newRow = ((list->template.maxShowed / 2) + (list->template.maxShowed % 2));
|
||||
|
||||
if (scrollOffset == list->template.totalItems - list->template.maxShowed)
|
||||
{
|
||||
while (selectedRow < list->template.maxShowed - 1)
|
||||
{
|
||||
selectedRow++;
|
||||
if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER)
|
||||
{
|
||||
list->selectedRow = selectedRow;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (selectedRow < newRow)
|
||||
{
|
||||
selectedRow++;
|
||||
if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER)
|
||||
{
|
||||
list->selectedRow = selectedRow;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
newScroll = scrollOffset + 1;
|
||||
}
|
||||
}
|
||||
list->selectedRow = newRow;
|
||||
list->scrollOffset = newScroll;
|
||||
return 2;
|
||||
}
|
||||
|
||||
static void ListMenuScroll(struct ListMenu *list, u8 count, bool8 movingDown)
|
||||
{
|
||||
if (count >= list->template.maxShowed)
|
||||
{
|
||||
FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue));
|
||||
ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed);
|
||||
}
|
||||
else
|
||||
{
|
||||
u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
|
||||
|
||||
if (!movingDown)
|
||||
{
|
||||
u16 y, width, height;
|
||||
|
||||
ScrollWindow(list->template.windowId, 1, count * yMultiplier, PIXEL_FILL(list->template.fillValue));
|
||||
ListMenuPrintEntries(list, list->scrollOffset, 0, count);
|
||||
|
||||
y = (list->template.maxShowed * yMultiplier) + list->template.upText_Y;
|
||||
width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8;
|
||||
height = (GetWindowAttribute(list->template.windowId, WINDOW_HEIGHT) * 8) - y;
|
||||
FillWindowPixelRect(list->template.windowId,
|
||||
PIXEL_FILL(list->template.fillValue),
|
||||
0, y, width, height);
|
||||
}
|
||||
else
|
||||
{
|
||||
u16 width;
|
||||
|
||||
ScrollWindow(list->template.windowId, 0, count * yMultiplier, PIXEL_FILL(list->template.fillValue));
|
||||
ListMenuPrintEntries(list, list->scrollOffset + (list->template.maxShowed - count), list->template.maxShowed - count, count);
|
||||
|
||||
width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8;
|
||||
FillWindowPixelRect(list->template.windowId,
|
||||
PIXEL_FILL(list->template.fillValue),
|
||||
0, 0, width, list->template.upText_Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown)
|
||||
{
|
||||
u16 oldSelectedRow;
|
||||
u8 selectionChange, i, cursorCount;
|
||||
|
||||
oldSelectedRow = list->selectedRow;
|
||||
cursorCount = 0;
|
||||
selectionChange = 0;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
do
|
||||
{
|
||||
u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown);
|
||||
|
||||
selectionChange |= ret;
|
||||
if (ret != 2)
|
||||
break;
|
||||
cursorCount++;
|
||||
}
|
||||
while (list->template.items[list->scrollOffset + list->selectedRow].index == LIST_HEADER);
|
||||
}
|
||||
|
||||
if (updateCursorAndCallCallback)
|
||||
{
|
||||
switch (selectionChange)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
return TRUE;
|
||||
case 1:
|
||||
ListMenuErasePrintedCursor(list, oldSelectedRow);
|
||||
ListMenuDrawCursor(list);
|
||||
ListMenuCallSelectionChangedCallback(list, FALSE);
|
||||
CopyWindowToVram(list->template.windowId, 2);
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
ListMenuErasePrintedCursor(list, oldSelectedRow);
|
||||
ListMenuScroll(list, cursorCount, movingDown);
|
||||
ListMenuDrawCursor(list);
|
||||
ListMenuCallSelectionChangedCallback(list, FALSE);
|
||||
CopyWindowToVram(list->template.windowId, 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit)
|
||||
{
|
||||
if (list->template.moveCursorFunc != NULL)
|
||||
list->template.moveCursorFunc(list->template.items[list->scrollOffset + list->selectedRow].index, onInit, list);
|
||||
}
|
||||
|
||||
void ListMenuOverrideSetColors(u8 cursorPal, u8 fillValue, u8 cursorShadowPal)
|
||||
{
|
||||
gListMenuOverride.cursorPal = cursorPal;
|
||||
gListMenuOverride.fillValue = fillValue;
|
||||
gListMenuOverride.cursorShadowPal = cursorShadowPal;
|
||||
gListMenuOverride.enabled = TRUE;
|
||||
}
|
||||
|
||||
void ListMenuDefaultCursorMoveFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)
|
||||
{
|
||||
if (!onInit)
|
||||
PlaySE(SE_SELECT);
|
||||
}
|
||||
|
||||
static s32 ListMenuGetUnkIndicatorsStructFields(u8 taskId, u8 field)
|
||||
{
|
||||
struct UnkIndicatorsStruct *data = (struct UnkIndicatorsStruct *)gTasks[taskId].data;
|
||||
|
||||
switch (field)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
return (s32)(data->field_4);
|
||||
case 2:
|
||||
return data->field_C;
|
||||
case 3:
|
||||
return data->field_E;
|
||||
case 4:
|
||||
return data->field_10;
|
||||
case 5:
|
||||
return data->field_11;
|
||||
case 6:
|
||||
return data->field_12;
|
||||
case 7:
|
||||
return data->field_13;
|
||||
case 8:
|
||||
return data->field_14_0;
|
||||
case 9:
|
||||
return data->field_14_1;
|
||||
case 10:
|
||||
return data->field_15_0;
|
||||
case 11:
|
||||
return data->field_15_1;
|
||||
case 12:
|
||||
return data->field_16_0;
|
||||
case 13:
|
||||
return data->field_16_1;
|
||||
case 14:
|
||||
return data->field_16_2;
|
||||
case 15:
|
||||
return data->field_17_0;
|
||||
case 16:
|
||||
return data->field_17_1;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void ListMenuSetUnkIndicatorsStructField(u8 taskId, u8 field, s32 value)
|
||||
{
|
||||
struct UnkIndicatorsStruct *data = (struct UnkIndicatorsStruct *)gTasks[taskId].data;
|
||||
|
||||
switch (field)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
data->field_4 = (void *)value;
|
||||
break;
|
||||
case 2:
|
||||
data->field_C = value;
|
||||
break;
|
||||
case 3:
|
||||
data->field_E = value;
|
||||
break;
|
||||
case 4:
|
||||
data->field_10 = value;
|
||||
break;
|
||||
case 5:
|
||||
data->field_11 = value;
|
||||
break;
|
||||
case 6:
|
||||
data->field_12 = value;
|
||||
break;
|
||||
case 7:
|
||||
data->field_13 = value;
|
||||
break;
|
||||
case 8:
|
||||
data->field_14_0 = value;
|
||||
break;
|
||||
case 9:
|
||||
data->field_14_1 = value;
|
||||
break;
|
||||
case 10:
|
||||
data->field_15_0 = value;
|
||||
break;
|
||||
case 11:
|
||||
data->field_15_1 = value;
|
||||
break;
|
||||
case 12:
|
||||
data->field_16_0 = value;
|
||||
break;
|
||||
case 13:
|
||||
data->field_16_1 = value;
|
||||
break;
|
||||
case 14:
|
||||
data->field_16_2 = value;
|
||||
break;
|
||||
case 15:
|
||||
data->field_17_0 = value;
|
||||
break;
|
||||
case 16:
|
||||
data->field_17_1 = value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8107CD8(u8 palOffset, u16 speciesId)
|
||||
{
|
||||
LoadPalette(GetValidMonIconPalettePtr(speciesId), palOffset, 0x20);
|
||||
}
|
||||
|
||||
void sub_8107CF8(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y)
|
||||
{
|
||||
BlitBitmapToWindow(windowId, GetMonIconPtr(speciesId, personality, 1), x, y, 32, 32);
|
||||
}
|
||||
|
||||
void sub_8107D38(u8 palOffset, u8 palId)
|
||||
{
|
||||
const u16 *palette;
|
||||
|
||||
switch (palId)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
palette = gFireRedMenuElements1_Pal;
|
||||
break;
|
||||
case 1:
|
||||
palette = gFireRedMenuElements2_Pal;
|
||||
break;
|
||||
}
|
||||
LoadPalette(palette, palOffset, 0x20);
|
||||
}
|
||||
|
||||
void BlitMoveInfoIcon(u8 windowId, u8 iconId, u16 x, u16 y)
|
||||
{
|
||||
BlitBitmapRectToWindow(windowId, gFireRedMenuElements_Gfx + gMoveMenuInfoIcons[iconId].offset * 32, 0, 0, 128, 128, x, y, gMoveMenuInfoIcons[iconId].width, gMoveMenuInfoIcons[iconId].height);
|
||||
}
|
||||
+8
-7
@@ -6,8 +6,9 @@
|
||||
#include "random.h"
|
||||
#include "malloc.h"
|
||||
#include "item.h"
|
||||
#include "save_location.h"
|
||||
|
||||
extern void sub_8099E44(void);
|
||||
extern void SetBagPocketsPointers(void);
|
||||
extern void sub_8110840(void *oldSave);
|
||||
extern void sub_8055778(int);
|
||||
extern void sub_8054F38(u32 newKey);
|
||||
@@ -80,7 +81,7 @@ void SetSaveBlocksPointers(void)
|
||||
*sav1_LocalVar = (void*)(&gSaveBlock1) + offset;
|
||||
gPokemonStoragePtr = (void*)(&gPokemonStorage) + offset;
|
||||
|
||||
sub_8099E44();
|
||||
SetBagPocketsPointers();
|
||||
sub_8110840(oldSave);
|
||||
}
|
||||
|
||||
@@ -132,28 +133,28 @@ void MoveSaveBlocks_ResetHeap(void)
|
||||
|
||||
u32 sav2_x1_query_bit1(void)
|
||||
{
|
||||
return gSaveBlock2Ptr->specialSaveWarp & 1;
|
||||
return gSaveBlock2Ptr->specialSaveWarpFlags & CONTINUE_GAME_WARP;
|
||||
}
|
||||
|
||||
void sav2_x9_clear_bit1(void)
|
||||
{
|
||||
gSaveBlock2Ptr->specialSaveWarp &= ~1;
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP;
|
||||
}
|
||||
|
||||
void sub_804C1AC(void)
|
||||
{
|
||||
gSaveBlock2Ptr->specialSaveWarp |= 1;
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP;
|
||||
}
|
||||
|
||||
void sub_804C1C0(void)
|
||||
{
|
||||
sub_8055778(0);
|
||||
gSaveBlock2Ptr->specialSaveWarp |= 1;
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP;
|
||||
}
|
||||
|
||||
void sav2_gender2_inplace_and_xFE(void)
|
||||
{
|
||||
gSaveBlock2Ptr->specialSaveWarp &= ~1;
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP;
|
||||
}
|
||||
|
||||
void SavePlayerParty(void)
|
||||
|
||||
+186
@@ -0,0 +1,186 @@
|
||||
#include "global.h"
|
||||
#include "text.h"
|
||||
#include "mail.h"
|
||||
#include "mail_data.h"
|
||||
#include "constants/species.h"
|
||||
#include "constants/items.h"
|
||||
#include "pokemon_icon.h"
|
||||
|
||||
void ClearMailData(void)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < MAIL_COUNT; i++)
|
||||
ClearMailStruct(&gSaveBlock1Ptr->mail[i]);
|
||||
}
|
||||
|
||||
void ClearMailStruct(struct MailStruct *mail)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < MAIL_WORDS_COUNT; i++)
|
||||
mail->words[i] = 0xFFFF;
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
|
||||
mail->playerName[i] = EOS;
|
||||
for (i = 0; i < 4; i++)
|
||||
mail->trainerId[i] = 0;
|
||||
mail->species = SPECIES_BULBASAUR;
|
||||
mail->itemId = ITEM_NONE;
|
||||
}
|
||||
|
||||
bool8 MonHasMail(struct Pokemon *mon)
|
||||
{
|
||||
u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM);
|
||||
if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 GiveMailToMon(struct Pokemon *mon, u16 itemId)
|
||||
{
|
||||
u8 heldItem[2];
|
||||
u8 id, i;
|
||||
u16 species;
|
||||
u32 personality;
|
||||
|
||||
heldItem[0] = itemId;
|
||||
heldItem[1] = itemId >> 8;
|
||||
for (id = 0; id < PARTY_SIZE; id++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->mail[id].itemId == 0)
|
||||
{
|
||||
for (i = 0; i < MAIL_WORDS_COUNT; i++)
|
||||
gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF;
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH - 1 && gSaveBlock2Ptr->playerName[i] != EOS; i++)
|
||||
gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i];
|
||||
for (; i <= 5; i++)
|
||||
gSaveBlock1Ptr->mail[id].playerName[i] = CHAR_SPACE;
|
||||
gSaveBlock1Ptr->mail[id].playerName[i] = EOS;
|
||||
for (i = 0; i < 4; i++)
|
||||
gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
|
||||
species = GetBoxMonData(&mon->box, MON_DATA_SPECIES);
|
||||
personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY);
|
||||
gSaveBlock1Ptr->mail[id].species = SpeciesToMailSpecies(species, personality);
|
||||
gSaveBlock1Ptr->mail[id].itemId = itemId;
|
||||
SetMonData(mon, MON_DATA_MAIL, &id);
|
||||
SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
|
||||
return id;
|
||||
}
|
||||
}
|
||||
return 0xFF;
|
||||
}
|
||||
|
||||
u16 SpeciesToMailSpecies(u16 species, u32 personality)
|
||||
{
|
||||
if (species == SPECIES_UNOWN) {
|
||||
u32 mailSpecies = GetUnownLetterByPersonality(personality) + 30000;
|
||||
return mailSpecies;
|
||||
}
|
||||
return species;
|
||||
}
|
||||
|
||||
u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *unownLetter)
|
||||
{
|
||||
u16 result;
|
||||
|
||||
if (mailSpecies >= 30000 && mailSpecies < (30000 + UNOWN_FORM_COUNT))
|
||||
{
|
||||
result = SPECIES_UNOWN;
|
||||
*unownLetter = mailSpecies - 30000;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = mailSpecies;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail)
|
||||
{
|
||||
u8 heldItem[2];
|
||||
u16 itemId = mail->itemId;
|
||||
u8 mailId = GiveMailToMon(mon, itemId);
|
||||
|
||||
if (mailId == 0xFF)
|
||||
return 0xFF;
|
||||
gSaveBlock1Ptr->mail[mailId] = *mail;
|
||||
SetMonData(mon, MON_DATA_MAIL, &mailId);
|
||||
heldItem[0] = itemId;
|
||||
heldItem[1] = itemId >> 8;
|
||||
|
||||
SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
|
||||
|
||||
return mailId;
|
||||
}
|
||||
|
||||
static bool32 DummyMailFunc(void)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void TakeMailFromMon(struct Pokemon *mon)
|
||||
{
|
||||
u8 heldItem[2];
|
||||
u8 mailId;
|
||||
|
||||
if (MonHasMail(mon))
|
||||
{
|
||||
mailId = GetMonData(mon, MON_DATA_MAIL);
|
||||
gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;
|
||||
mailId = 0xFF;
|
||||
heldItem[0] = ITEM_NONE;
|
||||
heldItem[1] = ITEM_NONE << 8;
|
||||
SetMonData(mon, MON_DATA_MAIL, &mailId);
|
||||
SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
|
||||
}
|
||||
}
|
||||
|
||||
void ClearMailItemId(u8 mailId)
|
||||
{
|
||||
gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;
|
||||
}
|
||||
|
||||
u8 TakeMailFromMon2(struct Pokemon *mon)
|
||||
{
|
||||
u8 i, newMailId;
|
||||
u8 newHeldItem[2];
|
||||
|
||||
newHeldItem[0] = ITEM_NONE;
|
||||
newHeldItem[1] = ITEM_NONE << 8;
|
||||
newMailId = 0xFF;
|
||||
for (i = PARTY_SIZE; i < MAIL_COUNT; i++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE)
|
||||
{
|
||||
memcpy(&gSaveBlock1Ptr->mail[i], &gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct));
|
||||
gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)].itemId = ITEM_NONE;
|
||||
SetMonData(mon, MON_DATA_MAIL, &newMailId);
|
||||
SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 0xFF;
|
||||
}
|
||||
|
||||
bool8 ItemIsMail(u16 itemId)
|
||||
{
|
||||
switch (itemId)
|
||||
{
|
||||
case ITEM_ORANGE_MAIL:
|
||||
case ITEM_HARBOR_MAIL:
|
||||
case ITEM_GLITTER_MAIL:
|
||||
case ITEM_MECH_MAIL:
|
||||
case ITEM_WOOD_MAIL:
|
||||
case ITEM_WAVE_MAIL:
|
||||
case ITEM_BEAD_MAIL:
|
||||
case ITEM_SHADOW_MAIL:
|
||||
case ITEM_TROPIC_MAIL:
|
||||
case ITEM_DREAM_MAIL:
|
||||
case ITEM_FAB_MAIL:
|
||||
case ITEM_RETRO_MAIL:
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
+12
-7
@@ -5,6 +5,7 @@
|
||||
#include "dma3.h"
|
||||
#include "gba/flash_internal.h"
|
||||
#include "battle.h"
|
||||
#include "help_system.h"
|
||||
|
||||
extern u16 GetGpuReg(u8);
|
||||
extern void SetGpuReg(u8, u16);
|
||||
@@ -32,7 +33,6 @@ extern u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));
|
||||
extern void ScanlineEffect_Stop(void);
|
||||
extern void sub_80F50F4(void);
|
||||
extern bool32 sub_80F5118(void);
|
||||
extern bool8 sub_813B870(void);
|
||||
|
||||
extern struct SoundInfo gSoundInfo;
|
||||
extern u32 gFlashMemoryPresent;
|
||||
@@ -55,7 +55,12 @@ static void VCountIntr(void);
|
||||
static void SerialIntr(void);
|
||||
static void IntrDummy(void);
|
||||
|
||||
const u8 gGameVersion = VERSION_FIRE_RED;
|
||||
#if defined(FIRERED)
|
||||
#define GAME_VERSION VERSION_FIRE_RED
|
||||
#elif defined(LEAF_GREEN)
|
||||
#define GAME_VERSION VERSION_LEAF_GREEN
|
||||
#endif
|
||||
const u8 gGameVersion = GAME_VERSION;
|
||||
|
||||
const u8 gGameLanguage = GAME_LANGUAGE;
|
||||
|
||||
@@ -96,13 +101,13 @@ u8 gUnknown_3003D84;
|
||||
|
||||
static IntrFunc * const sTimerIntrFunc = gIntrTable + 0x7;
|
||||
|
||||
extern u16 gTrainerId;
|
||||
EWRAM_DATA u8 gDecompressionBuffer[0x4000] = {0};
|
||||
EWRAM_DATA u16 gTrainerId = 0;
|
||||
|
||||
extern bool8 gUnknown_3005ECC;
|
||||
extern bool8 gWirelessCommType;
|
||||
extern bool8 gUnknown_3005E88;
|
||||
|
||||
EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL;
|
||||
|
||||
static void UpdateLinkAndCallCallbacks(void);
|
||||
static void InitMainCallbacks(void);
|
||||
static void CallCallbacks(void);
|
||||
@@ -116,7 +121,7 @@ void EnableVCountIntrAtLine150(void);
|
||||
void AgbMain()
|
||||
{
|
||||
RegisterRamReset(RESET_ALL);
|
||||
*(vu16 *)BG_PLTT = 0x7FFF;
|
||||
*(vu16 *)BG_PLTT = RGB_WHITE;
|
||||
InitGpuRegManager();
|
||||
REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3;
|
||||
InitKeys();
|
||||
@@ -206,7 +211,7 @@ static void InitMainCallbacks(void)
|
||||
|
||||
static void CallCallbacks(void)
|
||||
{
|
||||
if (!sub_80F5118() && !sub_813B870())
|
||||
if (!sub_80F5118() && !RunHelpSystemCallback())
|
||||
{
|
||||
if (gMain.callback1)
|
||||
gMain.callback1();
|
||||
|
||||
+3
-3
@@ -89,7 +89,7 @@ void LockSelectedMapObject(void)
|
||||
void sub_80696C0(void)
|
||||
{
|
||||
u8 fieldObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
|
||||
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[fieldObjectId]);
|
||||
FieldObjectClearHeldMovementIfFinished(&gMapObjects[fieldObjectId]);
|
||||
sub_80974D8();
|
||||
UnfreezeMapObjects();
|
||||
}
|
||||
@@ -98,9 +98,9 @@ void sub_80696F0(void)
|
||||
{
|
||||
u8 fieldObjectId;
|
||||
if (gMapObjects[gSelectedEventObject].active)
|
||||
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedEventObject]);
|
||||
FieldObjectClearHeldMovementIfFinished(&gMapObjects[gSelectedEventObject]);
|
||||
fieldObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
|
||||
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[fieldObjectId]);
|
||||
FieldObjectClearHeldMovementIfFinished(&gMapObjects[fieldObjectId]);
|
||||
sub_80974D8();
|
||||
UnfreezeMapObjects();
|
||||
}
|
||||
|
||||
+878
@@ -0,0 +1,878 @@
|
||||
#include "global.h"
|
||||
#include "bg.h"
|
||||
#include "malloc.h"
|
||||
#include "menu.h"
|
||||
#include "menu_helpers.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "string_util.h"
|
||||
#include "strings.h"
|
||||
#include "task.h"
|
||||
#include "text_window.h"
|
||||
#include "window.h"
|
||||
#include "sound.h"
|
||||
#include "palette.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
struct Menu
|
||||
{
|
||||
u8 left;
|
||||
u8 top;
|
||||
s8 cursorPos;
|
||||
s8 minCursorPos;
|
||||
s8 maxCursorPos;
|
||||
u8 windowId;
|
||||
u8 fontId;
|
||||
u8 optionWidth;
|
||||
u8 optionHeight;
|
||||
u8 columns;
|
||||
u8 rows;
|
||||
bool8 APressMuted;
|
||||
};
|
||||
|
||||
static EWRAM_DATA struct Menu sMenu = {0};
|
||||
static EWRAM_DATA u16 sTileNum = 0;
|
||||
static EWRAM_DATA u8 sPaletteNum = 0;
|
||||
static EWRAM_DATA u8 sYesNoWindowId = 0;
|
||||
static EWRAM_DATA u8 sTopBarWindowId = 0;
|
||||
|
||||
static void WindowFunc_DrawDialogFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
|
||||
static void WindowFunc_ClearDialogWindowAndFrameNullPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
|
||||
static void WindowFunc_DrawStdFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
|
||||
static void WindowFunc_ClearStdWindowAndFrameToTransparent(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
|
||||
static u8 MultichoiceGrid_MoveCursor(s8 deltaX, s8 deltaY);
|
||||
|
||||
static const struct TextColor gUnknown_8456618 =
|
||||
{
|
||||
.fgColor = 15,
|
||||
.bgColor = 1,
|
||||
.shadowColor = 2,
|
||||
};
|
||||
|
||||
void DrawDialogFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 tileNum, u8 paletteNum)
|
||||
{
|
||||
sTileNum = tileNum;
|
||||
sPaletteNum = paletteNum;
|
||||
CallWindowFunction(windowId, WindowFunc_DrawDialogFrameWithCustomTileAndPalette);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
|
||||
PutWindowTilemap(windowId);
|
||||
if (copyToVram == TRUE)
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
// not used
|
||||
static void DrawDialogFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 tileNum)
|
||||
{
|
||||
sTileNum = tileNum;
|
||||
sPaletteNum = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM);
|
||||
CallWindowFunction(windowId, WindowFunc_DrawDialogFrameWithCustomTileAndPalette);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
|
||||
PutWindowTilemap(windowId);
|
||||
if (copyToVram == TRUE)
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
static void WindowFunc_DrawDialogFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
||||
{
|
||||
FillBgTilemapBufferRect(bg, sTileNum, tilemapLeft - 2, tilemapTop - 1, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 2, tilemapLeft, tilemapTop - 1, width, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 5, tilemapLeft - 2, tilemapTop, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 6, tilemapLeft - 1, tilemapTop, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 8, tilemapLeft + width, tilemapTop, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 10), tilemapLeft - 2, tilemapTop + 2, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 11), tilemapLeft - 1, tilemapTop + 2, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 12), tilemapLeft + width, tilemapTop + 2, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 13), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 5), tilemapLeft - 2, tilemapTop + 3, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 6), tilemapLeft - 1, tilemapTop + 3, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 8), tilemapLeft + width, tilemapTop + 3, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 9), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum), tilemapLeft - 2, tilemapTop + 4, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 2), tilemapLeft, tilemapTop + 4, width, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, sPaletteNum);
|
||||
}
|
||||
|
||||
void ClearDialogWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram)
|
||||
{
|
||||
// The palette slot doesn't matter, since the tiles are transparent.
|
||||
CallWindowFunction(windowId, WindowFunc_ClearDialogWindowAndFrameNullPalette);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
||||
ClearWindowTilemap(windowId);
|
||||
if (copyToVram == TRUE)
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
static void WindowFunc_ClearDialogWindowAndFrameNullPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
||||
{
|
||||
FillBgTilemapBufferRect(bg, 0, tilemapLeft - 2, tilemapTop - 1, width + 4, height + 2, 0);
|
||||
}
|
||||
|
||||
void DrawStdFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum)
|
||||
{
|
||||
sTileNum = baseTileNum;
|
||||
sPaletteNum = paletteNum;
|
||||
CallWindowFunction(windowId, WindowFunc_DrawStdFrameWithCustomTileAndPalette);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
|
||||
PutWindowTilemap(windowId);
|
||||
if (copyToVram == TRUE)
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
// not used
|
||||
static void DrawStdFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 baseTileNum)
|
||||
{
|
||||
sTileNum = baseTileNum;
|
||||
sPaletteNum = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM);
|
||||
CallWindowFunction(windowId, WindowFunc_DrawStdFrameWithCustomTileAndPalette);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
|
||||
PutWindowTilemap(windowId);
|
||||
if (copyToVram == TRUE)
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
static void WindowFunc_DrawStdFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
||||
{
|
||||
FillBgTilemapBufferRect(bg, sTileNum, tilemapLeft - 1, tilemapTop - 1, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 1, tilemapLeft, tilemapTop - 1, width, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 2, tilemapLeft + width, tilemapTop - 1, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 3, tilemapLeft - 1, tilemapTop, 1, height, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 5, tilemapLeft + width, tilemapTop, 1, height, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 6, tilemapLeft - 1, tilemapTop + height, 1, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 7, tilemapLeft, tilemapTop + height, width, 1, sPaletteNum);
|
||||
FillBgTilemapBufferRect(bg, sTileNum + 8, tilemapLeft + width, tilemapTop + height, 1, 1, sPaletteNum);
|
||||
}
|
||||
|
||||
void ClearStdWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram)
|
||||
{
|
||||
CallWindowFunction(windowId, WindowFunc_ClearStdWindowAndFrameToTransparent);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
||||
ClearWindowTilemap(windowId);
|
||||
if (copyToVram == TRUE)
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
static void WindowFunc_ClearStdWindowAndFrameToTransparent(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
||||
{
|
||||
FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
The following functions are used for handling top bar window
|
||||
in hall of fame screen and story mode screen before oak intro.
|
||||
However, you can still designate a yPos value to place that bar
|
||||
as well as the bar width.
|
||||
The xPos is simply computed according to width (always right aligned).
|
||||
*/
|
||||
u8 CreateTopBarWindowLoadPalette(u8 bg, u8 width, u8 yPos, u8 palette, u16 baseTile)
|
||||
{
|
||||
struct WindowTemplate window;
|
||||
|
||||
memset(&window, 0, sizeof(window));
|
||||
if (bg > 3)
|
||||
window.bg = 0;
|
||||
else
|
||||
window.bg = bg;
|
||||
window.tilemapTop = yPos;
|
||||
window.height = 2;
|
||||
window.tilemapLeft = 0x1E - width;
|
||||
window.width = width;
|
||||
window.paletteNum = palette;
|
||||
window.baseBlock = baseTile;
|
||||
sTopBarWindowId = AddWindow(&window);
|
||||
if (palette > 15)
|
||||
palette = 15 * 16;
|
||||
else
|
||||
palette *= 16;
|
||||
LoadPalette(stdpal_get(2), palette, 0x20);
|
||||
return sTopBarWindowId;
|
||||
}
|
||||
|
||||
void TopBarWindowPrintString(const u8 *string, u8 unused, bool8 copyToVram)
|
||||
{
|
||||
s32 width;
|
||||
|
||||
if (sTopBarWindowId != 0xFF)
|
||||
{
|
||||
PutWindowTilemap(sTopBarWindowId);
|
||||
FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15));
|
||||
width = GetStringWidth(0, string, 0);
|
||||
AddTextPrinterParameterized3(sTopBarWindowId, 0, -20 - width, 1, &gUnknown_8456618, 0, string);
|
||||
if (copyToVram)
|
||||
CopyWindowToVram(sTopBarWindowId, 3);
|
||||
}
|
||||
}
|
||||
|
||||
void TopBarWindowPrintTwoStrings(const u8 *string, const u8 *string2, bool8 fgColorChooser, u8 unused, bool8 copyToVram)
|
||||
{
|
||||
struct TextColor color;
|
||||
s32 fgColor, width;
|
||||
|
||||
if ( sTopBarWindowId != 0xFF )
|
||||
{
|
||||
if (fgColorChooser)
|
||||
{
|
||||
color.fgColor = 0;
|
||||
color.bgColor = 1;
|
||||
color.shadowColor = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
color.fgColor = 15;
|
||||
color.bgColor = 1;
|
||||
color.shadowColor = 2;
|
||||
}
|
||||
|
||||
PutWindowTilemap(sTopBarWindowId);
|
||||
FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15));
|
||||
if (string2)
|
||||
{
|
||||
width = GetStringWidth(0, string2, 0);
|
||||
AddTextPrinterParameterized3(sTopBarWindowId, 0, -20 - width, 1, &color, 0, string2);
|
||||
}
|
||||
AddTextPrinterParameterized4(sTopBarWindowId, 1, 4, 1, 0, 0, &color, 0, string);
|
||||
if (copyToVram)
|
||||
CopyWindowToVram(sTopBarWindowId, 3);
|
||||
}
|
||||
}
|
||||
|
||||
// not used
|
||||
static void CopyTopBarWindowToVram(void)
|
||||
{
|
||||
if (sTopBarWindowId != 0xFF)
|
||||
CopyWindowToVram(sTopBarWindowId, 3);
|
||||
}
|
||||
|
||||
void ClearTopBarWindow(void)
|
||||
{
|
||||
if (sTopBarWindowId != 0xFF)
|
||||
{
|
||||
FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15));
|
||||
CopyWindowToVram(sTopBarWindowId, 3);
|
||||
}
|
||||
}
|
||||
|
||||
void DestroyTopBarWindow(void)
|
||||
{
|
||||
if (sTopBarWindowId != 0xFF)
|
||||
{
|
||||
FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(0));
|
||||
ClearWindowTilemap(sTopBarWindowId);
|
||||
CopyWindowToVram(sTopBarWindowId, 3);
|
||||
RemoveWindow(sTopBarWindowId);
|
||||
sTopBarWindowId = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
u8 Menu_InitCursorInternal(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos, bool8 APressMuted)
|
||||
{
|
||||
s32 pos;
|
||||
|
||||
sMenu.left = left;
|
||||
sMenu.top = top;
|
||||
sMenu.minCursorPos = 0;
|
||||
sMenu.maxCursorPos = numChoices - 1;
|
||||
sMenu.windowId = windowId;
|
||||
sMenu.fontId = fontId;
|
||||
sMenu.optionHeight = cursorHeight;
|
||||
sMenu.APressMuted = APressMuted;
|
||||
pos = initialCursorPos;
|
||||
if (pos < 0 || pos > sMenu.maxCursorPos)
|
||||
sMenu.cursorPos = 0;
|
||||
else
|
||||
sMenu.cursorPos = pos;
|
||||
|
||||
Menu_MoveCursor(0);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
|
||||
u8 Menu_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos)
|
||||
{
|
||||
return Menu_InitCursorInternal(windowId, fontId, left, top, cursorHeight, numChoices, initialCursorPos, 0);
|
||||
}
|
||||
|
||||
// not used
|
||||
static u8 sub_810F818(u8 windowId, u8 fontId, u8 left, u8 top, u8 numChoices, u8 initialCursorPos)
|
||||
{
|
||||
return Menu_InitCursor(windowId, fontId, left, top, GetMenuCursorDimensionByFont(fontId, 1), numChoices, initialCursorPos);
|
||||
}
|
||||
|
||||
static void Menu_RedrawCursor(u8 oldPos, u8 newPos)
|
||||
{
|
||||
u8 width, height;
|
||||
|
||||
width = GetMenuCursorDimensionByFont(sMenu.fontId, 0);
|
||||
height = GetMenuCursorDimensionByFont(sMenu.fontId, 1);
|
||||
FillWindowPixelRect(sMenu.windowId, 1, sMenu.left, sMenu.optionHeight * oldPos + sMenu.top, width, height);
|
||||
AddTextPrinterParameterized(sMenu.windowId, sMenu.fontId, gFameCheckerText_ListMenuCursor, sMenu.left, sMenu.optionHeight * newPos + sMenu.top, 0, 0);
|
||||
}
|
||||
|
||||
u8 Menu_MoveCursor(s8 cursorDelta)
|
||||
{
|
||||
u8 oldPos = sMenu.cursorPos;
|
||||
s32 newPos = sMenu.cursorPos + cursorDelta;
|
||||
|
||||
if (newPos < sMenu.minCursorPos)
|
||||
sMenu.cursorPos = sMenu.maxCursorPos;
|
||||
else if (newPos > sMenu.maxCursorPos)
|
||||
sMenu.cursorPos = sMenu.minCursorPos;
|
||||
else
|
||||
sMenu.cursorPos += cursorDelta;
|
||||
Menu_RedrawCursor(oldPos, sMenu.cursorPos);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
|
||||
u8 Menu_MoveCursorNoWrapAround(s8 cursorDelta)
|
||||
{
|
||||
u8 oldPos = sMenu.cursorPos;
|
||||
s32 newPos = sMenu.cursorPos + cursorDelta;
|
||||
|
||||
if (newPos < sMenu.minCursorPos)
|
||||
sMenu.cursorPos = sMenu.minCursorPos;
|
||||
else if (newPos > sMenu.maxCursorPos)
|
||||
sMenu.cursorPos = sMenu.maxCursorPos;
|
||||
else
|
||||
sMenu.cursorPos += cursorDelta;
|
||||
|
||||
Menu_RedrawCursor(oldPos, sMenu.cursorPos);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
|
||||
u8 Menu_GetCursorPos(void)
|
||||
{
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
|
||||
s8 Menu_ProcessInput(void)
|
||||
{
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
if (!sMenu.APressMuted)
|
||||
PlaySE(SE_SELECT);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return MENU_B_PRESSED;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_UP))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
Menu_MoveCursor(-1);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_DOWN))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
Menu_MoveCursor(1);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
s8 Menu_ProcessInputNoWrapAround(void)
|
||||
{
|
||||
u8 oldPos = sMenu.cursorPos;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
if (!sMenu.APressMuted)
|
||||
PlaySE(SE_SELECT);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return MENU_B_PRESSED;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_UP))
|
||||
{
|
||||
if (oldPos != Menu_MoveCursorNoWrapAround(-1))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_DOWN))
|
||||
{
|
||||
if (oldPos != Menu_MoveCursorNoWrapAround(1))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
s8 Menu_ProcessInput_other(void)
|
||||
{
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
if (!sMenu.APressMuted)
|
||||
PlaySE(SE_SELECT);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return MENU_B_PRESSED;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_UP)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
Menu_MoveCursor(-1);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
Menu_MoveCursor(1);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
s8 Menu_ProcessInputNoWrapAround_other(void)
|
||||
{
|
||||
u8 oldPos = sMenu.cursorPos;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
if (!sMenu.APressMuted)
|
||||
PlaySE(SE_SELECT);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return MENU_B_PRESSED;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_UP)
|
||||
{
|
||||
if (oldPos != Menu_MoveCursorNoWrapAround(-1))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)
|
||||
{
|
||||
if (oldPos != Menu_MoveCursorNoWrapAround(1))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
void PrintTextArray(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < itemCount; i++)
|
||||
AddTextPrinterParameterized(windowId, fontId, strs[i].text, left, (lineHeight * i) + top, 0xFF, NULL);
|
||||
CopyWindowToVram(windowId, 2);
|
||||
}
|
||||
|
||||
void MultichoiceList_PrintItems(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, u8 letterSpacing, u8 lineSpacing)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < itemCount; i++)
|
||||
AddTextPrinterParameterized5(windowId, fontId, strs[i].text, left, (lineHeight * i) + top, 0xFF, NULL, letterSpacing, lineSpacing);
|
||||
CopyWindowToVram(windowId, 2);
|
||||
}
|
||||
|
||||
void UnionRoomAndTradeMenuPrintOptions(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs)
|
||||
{
|
||||
u8 left = GetMenuCursorDimensionByFont(fontId, 0);
|
||||
|
||||
PrintTextArray(windowId, fontId, left, 0, lineHeight, itemCount, strs);
|
||||
}
|
||||
|
||||
void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray)
|
||||
{
|
||||
u8 i;
|
||||
struct TextPrinterTemplate printer;
|
||||
|
||||
printer.windowId = windowId;
|
||||
printer.fontId = fontId;
|
||||
printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND);
|
||||
printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND);
|
||||
printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW);
|
||||
printer.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN);
|
||||
printer.letterSpacing = letterSpacing;
|
||||
printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);
|
||||
printer.x = left;
|
||||
printer.currentX = left;
|
||||
for (i = 0; i < itemCount; i++)
|
||||
{
|
||||
printer.currentChar = strs[orderArray[i]].text;
|
||||
printer.y = (lineHeight * i) + top;
|
||||
printer.currentY = printer.y;
|
||||
AddTextPrinter(&printer, 0xFF, NULL);
|
||||
}
|
||||
CopyWindowToVram(windowId, 2);
|
||||
}
|
||||
|
||||
// not used
|
||||
static void sub_810FDE4(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray)
|
||||
{
|
||||
AddItemMenuActionTextPrinters(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 0, GetFontAttribute(fontId, FONTATTR_LETTER_SPACING), lineHeight, itemCount, strs, orderArray);
|
||||
}
|
||||
|
||||
struct WindowTemplate SetWindowTemplateFields(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)
|
||||
{
|
||||
struct WindowTemplate template;
|
||||
|
||||
template.bg = bg;
|
||||
template.tilemapLeft = left;
|
||||
template.tilemapTop = top;
|
||||
template.width = width;
|
||||
template.height = height;
|
||||
template.paletteNum = paletteNum;
|
||||
template.baseBlock = baseBlock;
|
||||
return template;
|
||||
}
|
||||
|
||||
// not used
|
||||
static u16 CreateWindowTemplate(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)
|
||||
{
|
||||
struct WindowTemplate template = SetWindowTemplateFields(bg, left, top, width, height, paletteNum, baseBlock);
|
||||
return AddWindow(&template);
|
||||
}
|
||||
|
||||
void CreateYesNoMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos)
|
||||
{
|
||||
struct TextPrinterTemplate textSubPrinter;
|
||||
|
||||
sYesNoWindowId = AddWindow(window);
|
||||
DrawStdFrameWithCustomTileAndPalette(sYesNoWindowId, 1, baseTileNum, paletteNum);
|
||||
textSubPrinter.currentChar = gUnknown_841623D;
|
||||
textSubPrinter.windowId = sYesNoWindowId;
|
||||
textSubPrinter.fontId = fontId;
|
||||
textSubPrinter.x = GetMenuCursorDimensionByFont(fontId, 0) + left;
|
||||
textSubPrinter.y = top;
|
||||
textSubPrinter.currentX = textSubPrinter.x;
|
||||
textSubPrinter.currentY = textSubPrinter.y;
|
||||
textSubPrinter.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND);
|
||||
textSubPrinter.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND);
|
||||
textSubPrinter.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW);
|
||||
textSubPrinter.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN);
|
||||
textSubPrinter.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING);
|
||||
textSubPrinter.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);
|
||||
AddTextPrinter(&textSubPrinter, 0xFF, NULL);
|
||||
Menu_InitCursor(sYesNoWindowId, fontId, left, top, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT) + textSubPrinter.lineSpacing, 2, initialCursorPos);
|
||||
}
|
||||
|
||||
// not used
|
||||
static void CreateYesNoMenu2(const struct WindowTemplate *window, u8 paletteNum, u16 baseTileNum, u8 initialCursorPos)
|
||||
{
|
||||
CreateYesNoMenu(window, paletteNum, 0, 0, baseTileNum, initialCursorPos, 0);
|
||||
}
|
||||
|
||||
s8 Menu_ProcessInputNoWrapClearOnChoose(void)
|
||||
{
|
||||
s8 result = Menu_ProcessInputNoWrapAround();
|
||||
if (result != MENU_NOTHING_CHOSEN)
|
||||
DestroyYesNoMenu();
|
||||
return result;
|
||||
}
|
||||
|
||||
void DestroyYesNoMenu(void)
|
||||
{
|
||||
ClearStdWindowAndFrameToTransparent(sYesNoWindowId, TRUE);
|
||||
RemoveWindow(sYesNoWindowId);
|
||||
}
|
||||
|
||||
void MultichoiceGrid_PrintItems(u8 windowId, u8 fontId, u8 itemWidth, u8 itemHeight, u8 cols, u8 rows, const struct MenuAction *strs)
|
||||
{
|
||||
u8 width, i, j, yOffset;
|
||||
|
||||
fontId = fontId;
|
||||
itemWidth = itemWidth;
|
||||
itemHeight = itemHeight;
|
||||
width = GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH);
|
||||
yOffset = (16 - GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT)) / 2;
|
||||
for (i = 0; i < rows; ++i)
|
||||
for (j = 0; j < cols; ++j)
|
||||
AddTextPrinterParameterized(windowId, fontId, strs[i * cols + j].text, itemWidth * j + width, yOffset + itemHeight * i, 0xFF, 0);
|
||||
CopyWindowToVram(windowId, 2);
|
||||
}
|
||||
|
||||
//not used
|
||||
static void MultichoiceGrid_PrintItemsCustomOrder(u8 windowId, u8 fontId, u8 itemWidth, u8 itemHeight, u8 cols, u8 rows, const struct MenuAction *strs, const u8 *orderArray)
|
||||
{
|
||||
u8 width, i, j;
|
||||
|
||||
fontId = fontId;
|
||||
itemWidth = itemWidth;
|
||||
itemHeight = itemHeight;
|
||||
width = GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH);
|
||||
for (i = 0; i < rows; ++i)
|
||||
for (j = 0; j < cols; ++j)
|
||||
AddTextPrinterParameterized(windowId, fontId, strs[orderArray[i * cols + j]].text, itemWidth * j + width, itemHeight * i, 0xFF, 0);
|
||||
CopyWindowToVram(windowId, 2);
|
||||
}
|
||||
|
||||
static u8 MultichoiceGrid_InitCursorInternal(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 cursorHeight, u8 cols, u8 rows, u8 numChoices, u8 cursorPos)
|
||||
{
|
||||
s32 pos;
|
||||
|
||||
sMenu.left = left;
|
||||
sMenu.top = top;
|
||||
sMenu.minCursorPos = 0;
|
||||
sMenu.maxCursorPos = numChoices - 1;
|
||||
sMenu.windowId = windowId;
|
||||
sMenu.fontId = fontId;
|
||||
sMenu.optionWidth = optionWidth;
|
||||
sMenu.optionHeight = cursorHeight;
|
||||
sMenu.columns = cols;
|
||||
sMenu.rows = rows;
|
||||
pos = cursorPos;
|
||||
if (pos < 0 || pos > sMenu.maxCursorPos)
|
||||
sMenu.cursorPos = 0;
|
||||
else
|
||||
sMenu.cursorPos = pos;
|
||||
MultichoiceGrid_MoveCursor(0, 0);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
|
||||
u8 MultichoiceGrid_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 cols, u8 rows, u8 cursorPos)
|
||||
{
|
||||
s32 cursorHeight = 16;
|
||||
u8 numChoices = cols * rows;
|
||||
|
||||
return MultichoiceGrid_InitCursorInternal(windowId, fontId, left, top, optionWidth, cursorHeight, cols, rows, numChoices, cursorPos);
|
||||
}
|
||||
|
||||
static void MultichoiceGrid_RedrawCursor(u8 oldCursorPos, u8 newCursorPos)
|
||||
{
|
||||
u8 cursorWidth = GetMenuCursorDimensionByFont(sMenu.fontId, 0);
|
||||
u8 cursorHeight = GetMenuCursorDimensionByFont(sMenu.fontId, 1);
|
||||
u8 xPos = (oldCursorPos % sMenu.columns) * sMenu.optionWidth + sMenu.left;
|
||||
u8 yPos = (oldCursorPos / sMenu.columns) * sMenu.optionHeight + sMenu.top;
|
||||
|
||||
FillWindowPixelRect(sMenu.windowId, PIXEL_FILL(1), xPos, yPos, cursorWidth, cursorHeight);
|
||||
xPos = (newCursorPos % sMenu.columns) * sMenu.optionWidth + sMenu.left;
|
||||
yPos = (newCursorPos / sMenu.columns) * sMenu.optionHeight + sMenu.top;
|
||||
AddTextPrinterParameterized(sMenu.windowId, sMenu.fontId, gFameCheckerText_ListMenuCursor, xPos, yPos, 0, 0);
|
||||
}
|
||||
|
||||
static u8 MultichoiceGrid_MoveCursor(s8 deltaX, s8 deltaY)
|
||||
{
|
||||
u8 oldPos = sMenu.cursorPos;
|
||||
|
||||
if (deltaX)
|
||||
{
|
||||
if ((sMenu.cursorPos % sMenu.columns) + deltaX < 0)
|
||||
sMenu.cursorPos += sMenu.columns - 1;
|
||||
else if ((sMenu.cursorPos % sMenu.columns) + deltaX >= sMenu.columns)
|
||||
sMenu.cursorPos = (sMenu.cursorPos / sMenu.columns) * sMenu.columns;
|
||||
else
|
||||
sMenu.cursorPos += deltaX;
|
||||
}
|
||||
if (deltaY)
|
||||
{
|
||||
if ((sMenu.cursorPos / sMenu.columns) + deltaY < 0)
|
||||
sMenu.cursorPos += sMenu.columns * (sMenu.rows - 1);
|
||||
else if ((sMenu.cursorPos / sMenu.columns) + deltaY >= sMenu.rows)
|
||||
sMenu.cursorPos -= sMenu.columns * (sMenu.rows - 1);
|
||||
else
|
||||
sMenu.cursorPos += (sMenu.columns * deltaY);
|
||||
}
|
||||
if (sMenu.cursorPos > sMenu.maxCursorPos)
|
||||
{
|
||||
sMenu.cursorPos = oldPos;
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
else
|
||||
{
|
||||
MultichoiceGrid_RedrawCursor(oldPos, sMenu.cursorPos);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 MultichoiceGrid_MoveCursorIfValid(s8 deltaX, s8 deltaY)
|
||||
{
|
||||
u8 oldPos = sMenu.cursorPos;
|
||||
|
||||
if (deltaX)
|
||||
{
|
||||
if (((sMenu.cursorPos % sMenu.columns) + deltaX >= 0) && ((sMenu.cursorPos % sMenu.columns) + deltaX < sMenu.columns))
|
||||
sMenu.cursorPos += deltaX;
|
||||
}
|
||||
if (deltaY)
|
||||
{
|
||||
if (((sMenu.cursorPos / sMenu.columns) + deltaY >= 0) && ((sMenu.cursorPos / sMenu.columns) + deltaY < sMenu.rows))
|
||||
sMenu.cursorPos += (sMenu.columns * deltaY);
|
||||
}
|
||||
if (sMenu.cursorPos > sMenu.maxCursorPos)
|
||||
{
|
||||
sMenu.cursorPos = oldPos;
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
else
|
||||
{
|
||||
MultichoiceGrid_RedrawCursor(oldPos, sMenu.cursorPos);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
}
|
||||
|
||||
// not used
|
||||
static s8 sub_81105A0(void)
|
||||
{
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return MENU_B_PRESSED;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_UP))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
MultichoiceGrid_MoveCursor(0, -1);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_DOWN))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
MultichoiceGrid_MoveCursor(0, 1);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_LEFT) || GetLRKeysState() == 1)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
MultichoiceGrid_MoveCursor(-1, 0);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_RIGHT) || GetLRKeysState() == 2)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
MultichoiceGrid_MoveCursor(1, 0);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
s8 Menu_ProcessInputGridLayout(void)
|
||||
{
|
||||
u8 oldPos = sMenu.cursorPos;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return MENU_B_PRESSED;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_UP))
|
||||
{
|
||||
if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, -1))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_DOWN))
|
||||
{
|
||||
if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, 1))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_LEFT) || GetLRKeysState() == 1)
|
||||
{
|
||||
if (oldPos != MultichoiceGrid_MoveCursorIfValid(-1, 0))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_NEW(DPAD_RIGHT) || GetLRKeysState() == 2)
|
||||
{
|
||||
if (oldPos != MultichoiceGrid_MoveCursorIfValid(1, 0))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
// not used
|
||||
static s8 sub_81106F4(void)
|
||||
{
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return MENU_B_PRESSED;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_UP)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
MultichoiceGrid_MoveCursor(0, -1);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
MultichoiceGrid_MoveCursor(0, 1);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT || sub_80BF66C() == 1)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
MultichoiceGrid_MoveCursor(-1, 0);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT || sub_80BF66C() == 2)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
MultichoiceGrid_MoveCursor(1, 0);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
|
||||
// not used
|
||||
static s8 sub_81107A0(void)
|
||||
{
|
||||
u8 oldPos = sMenu.cursorPos;
|
||||
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return sMenu.cursorPos;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
return MENU_B_PRESSED;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_UP)
|
||||
{
|
||||
if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, -1))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)
|
||||
{
|
||||
if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, 1))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT || sub_80BF66C() == 1)
|
||||
{
|
||||
if (oldPos != MultichoiceGrid_MoveCursorIfValid(-1, 0))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT || sub_80BF66C() == 2)
|
||||
{
|
||||
if (oldPos != MultichoiceGrid_MoveCursorIfValid(1, 0))
|
||||
PlaySE(SE_SELECT);
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
return MENU_NOTHING_CHOSEN;
|
||||
}
|
||||
+6
-6
@@ -424,7 +424,7 @@ static const u8 gUnknown_845FD54[][5] = {
|
||||
[SPECIES_OLD_UNOWN_QMARK - 1] = {0x20, 0x23, 0x08, 0x20, 0x2d}
|
||||
};
|
||||
|
||||
void box_print(u8 windowId, u8 fontId, u8 x, u8 y, const struct TextColor * color, s8 speed, const u8 * str)
|
||||
void AddTextPrinterParameterized3(u8 windowId, u8 fontId, u8 x, u8 y, const struct TextColor * color, s8 speed, const u8 * str)
|
||||
{
|
||||
struct TextPrinterTemplate printer;
|
||||
|
||||
@@ -444,7 +444,7 @@ void box_print(u8 windowId, u8 fontId, u8 x, u8 y, const struct TextColor * colo
|
||||
AddTextPrinter(&printer, speed, NULL);
|
||||
}
|
||||
|
||||
void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const struct TextColor *color, s8 speed, const u8 *str)
|
||||
void AddTextPrinterParameterized4(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const struct TextColor *color, s8 speed, const u8 *str)
|
||||
{
|
||||
struct TextPrinterTemplate printer;
|
||||
|
||||
@@ -464,7 +464,7 @@ void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSp
|
||||
AddTextPrinter(&printer, speed, NULL);
|
||||
}
|
||||
|
||||
void sub_812E62C(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 letterSpacing, u8 lineSpacing)
|
||||
void AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 letterSpacing, u8 lineSpacing)
|
||||
{
|
||||
struct TextPrinterTemplate printer;
|
||||
|
||||
@@ -498,13 +498,13 @@ void sub_812E6DC(u8 windowId, const u8 * src, u16 x, u16 y)
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_812E62C(windowId, 2, gStringVar4, x, y, 0xFF, NULL, 0, 0);
|
||||
AddTextPrinterParameterized5(windowId, 2, gStringVar4, x, y, 0xFF, NULL, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// Yeah, no, I'm not bothering with this
|
||||
NAKED
|
||||
void sub_819A080(void * a0, void * a1, u16 a2, u16 a3, u16 a4, u16 a5, u16 a6, u16 a7)
|
||||
static void sub_812E768(void * a0, void * a1, u16 a2, u16 a3, u16 a4, u16 a5, u16 a6, u16 a7)
|
||||
{
|
||||
asm_unified("\tpush {r4-r7,lr}\n"
|
||||
"\tmov r7, r10\n"
|
||||
@@ -820,7 +820,7 @@ u8 sub_812EA78(u16 species, u32 personality, u8 a2)
|
||||
{
|
||||
if (species == SPECIES_UNOWN)
|
||||
{
|
||||
u8 unownLetter = GetUnownLetterByPersonality(personality);
|
||||
u8 unownLetter = GetUnownLetterByPersonalityLoByte(personality);
|
||||
switch (unownLetter)
|
||||
{
|
||||
case 0:
|
||||
|
||||
@@ -0,0 +1,251 @@
|
||||
#include "global.h"
|
||||
#include "task.h"
|
||||
#include "bg.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "window.h"
|
||||
#include "menu.h"
|
||||
#include "menu_helpers.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "string_util.h"
|
||||
#include "text.h"
|
||||
#include "sound.h"
|
||||
#include "link.h"
|
||||
#include "overworld.h"
|
||||
#include "mail_data.h"
|
||||
#include "field_specials.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/items.h"
|
||||
|
||||
static EWRAM_DATA const struct YesNoFuncTable *gUnknown_20399C8 = NULL;
|
||||
static EWRAM_DATA TaskFunc gUnknown_20399CC = NULL;
|
||||
static EWRAM_DATA u8 gUnknown_20399D0 = {0};
|
||||
|
||||
static void Task_ContinueTaskAfterMessagePrints(u8 taskId);
|
||||
|
||||
void DisplayMessageAndContinueTask(u8 taskId, u8 windowId, u16 tileNum, u8 paletteNum, u8 fontId, u8 textSpeed, const u8 *string, void *taskFunc)
|
||||
{
|
||||
gUnknown_20399D0 = windowId;
|
||||
DrawDialogFrameWithCustomTileAndPalette(windowId, TRUE, tileNum, paletteNum);
|
||||
|
||||
if (string != gStringVar4)
|
||||
StringExpandPlaceholders(gStringVar4, string);
|
||||
|
||||
gTextFlags.canABSpeedUpPrint = 1;
|
||||
AddTextPrinterParameterized2(windowId, fontId, gStringVar4, textSpeed, NULL, 2, 1, 3);
|
||||
gUnknown_20399CC = taskFunc;
|
||||
gTasks[taskId].func = Task_ContinueTaskAfterMessagePrints;
|
||||
}
|
||||
|
||||
bool16 RunTextPrinters_CheckActive(u8 textPrinterId)
|
||||
{
|
||||
RunTextPrinters();
|
||||
return IsTextPrinterActive(textPrinterId);
|
||||
}
|
||||
|
||||
static void Task_ContinueTaskAfterMessagePrints(u8 taskId)
|
||||
{
|
||||
if (!RunTextPrinters_CheckActive(gUnknown_20399D0))
|
||||
gUnknown_20399CC(taskId);
|
||||
}
|
||||
|
||||
static void Task_CallYesOrNoCallback(u8 taskId)
|
||||
{
|
||||
switch (Menu_ProcessInputNoWrapClearOnChoose())
|
||||
{
|
||||
case 0:
|
||||
PlaySE(SE_SELECT);
|
||||
gTasks[taskId].func = gUnknown_20399C8->yesFunc;
|
||||
break;
|
||||
case 1:
|
||||
case MENU_B_PRESSED:
|
||||
PlaySE(SE_SELECT);
|
||||
gTasks[taskId].func = gUnknown_20399C8->noFunc;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *template, u8 fontId, u8 left, u8 top, u16 tileStart, u8 palette, const struct YesNoFuncTable *yesNo)
|
||||
{
|
||||
CreateYesNoMenu(template, fontId, left, top, tileStart, palette, 0);
|
||||
gUnknown_20399C8 = yesNo;
|
||||
gTasks[taskId].func = Task_CallYesOrNoCallback;
|
||||
}
|
||||
|
||||
u8 GetLRKeysState(void)
|
||||
{
|
||||
if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
|
||||
{
|
||||
if (JOY_NEW(L_BUTTON))
|
||||
return 1;
|
||||
if (JOY_NEW(R_BUTTON))
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
u8 sub_80BF66C(void)
|
||||
{
|
||||
if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
|
||||
{
|
||||
if (JOY_REPT(L_BUTTON))
|
||||
return 1;
|
||||
if (JOY_REPT(R_BUTTON))
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool8 sub_80BF6A8(u16 itemId)
|
||||
{
|
||||
if (itemId != ITEM_ENIGMA_BERRY)
|
||||
return TRUE;
|
||||
else if (!gSaveBlock1Ptr->location.mapGroup && gSaveBlock1Ptr->location.mapNum == 1)
|
||||
return FALSE;
|
||||
else if (InUnionRoom() != TRUE)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 itemid_80BF6D8_mail_related(u16 itemId)
|
||||
{
|
||||
if (IsUpdateLinkStateCBActive() != TRUE && InUnionRoom() != TRUE)
|
||||
return TRUE;
|
||||
else if (ItemIsMail(itemId) != TRUE)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 MenuHelpers_LinkSomething(void)
|
||||
{
|
||||
if (IsUpdateLinkStateCBActive() == TRUE || gReceivedRemoteLinkPlayers == 1)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 sub_80BF72C(void)
|
||||
{
|
||||
if (!MenuHelpers_LinkSomething())
|
||||
return FALSE;
|
||||
else
|
||||
return sub_8058244();
|
||||
}
|
||||
|
||||
bool8 sub_80BF748(void)
|
||||
{
|
||||
if (sub_80BF72C() == TRUE)
|
||||
return TRUE;
|
||||
else if (sub_800B270() != TRUE)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void SetVBlankHBlankCallbacksToNull(void)
|
||||
{
|
||||
SetVBlankCallback(NULL);
|
||||
SetHBlankCallback(NULL);
|
||||
}
|
||||
|
||||
void ClearVramOamPltt(void)
|
||||
{
|
||||
ResetAllBgsCoordinatesAndBgCntRegs();
|
||||
CpuFill16(0, (void*) VRAM, VRAM_SIZE);
|
||||
CpuFill32(0, (void*) OAM, OAM_SIZE);
|
||||
CpuFill16(0, (void*) PLTT, PLTT_SIZE);
|
||||
}
|
||||
|
||||
void ResetAllBgsCoordinatesAndBgCntRegs(void)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BG3CNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BG2CNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BG0CNT, 0);
|
||||
ChangeBgX(0, 0, 0);
|
||||
ChangeBgY(0, 0, 0);
|
||||
ChangeBgX(1, 0, 0);
|
||||
ChangeBgY(1, 0, 0);
|
||||
ChangeBgX(2, 0, 0);
|
||||
ChangeBgY(2, 0, 0);
|
||||
ChangeBgX(3, 0, 0);
|
||||
ChangeBgY(3, 0, 0);
|
||||
}
|
||||
|
||||
bool8 AdjustQuantityAccordingToDPadInput(s16 *arg0, u16 arg1)
|
||||
{
|
||||
s16 valBefore = (*arg0);
|
||||
|
||||
if (JOY_REPT(DPAD_ANY) == DPAD_UP)
|
||||
{
|
||||
(*arg0)++;
|
||||
if ((*arg0) > arg1)
|
||||
(*arg0) = 1;
|
||||
|
||||
if ((*arg0) == valBefore)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)
|
||||
{
|
||||
(*arg0)--;
|
||||
if ((*arg0) <= 0)
|
||||
(*arg0) = arg1;
|
||||
if ((*arg0) == valBefore)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT)
|
||||
{
|
||||
(*arg0) += 10;
|
||||
if ((*arg0) > arg1)
|
||||
(*arg0) = arg1;
|
||||
if ((*arg0) == valBefore)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT)
|
||||
{
|
||||
(*arg0) -= 10;
|
||||
if ((*arg0) <= 0)
|
||||
(*arg0) = 1;
|
||||
if ((*arg0) == valBefore)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 sub_80BF8E4(void)
|
||||
{
|
||||
if (!ContextNpcGetTextColor())
|
||||
return 4;
|
||||
else
|
||||
return 5;
|
||||
}
|
||||
@@ -0,0 +1,659 @@
|
||||
#include "global.h"
|
||||
#include "malloc.h"
|
||||
#include "task.h"
|
||||
#include "decompress.h"
|
||||
#include "palette.h"
|
||||
#include "strings.h"
|
||||
#include "sprite.h"
|
||||
#include "trig.h"
|
||||
#include "list_menu.h"
|
||||
#include "menu_indicators.h"
|
||||
|
||||
struct ScrollIndicatorPair
|
||||
{
|
||||
u8 field_0;
|
||||
u16 *scrollOffset;
|
||||
u16 fullyUpThreshold;
|
||||
u16 fullyDownThreshold;
|
||||
u8 topSpriteId;
|
||||
u8 bottomSpriteId;
|
||||
u16 tileTag;
|
||||
u16 palTag;
|
||||
};
|
||||
|
||||
struct RedOutlineCursor
|
||||
{
|
||||
struct SubspriteTable subspriteTable;
|
||||
struct Subsprite *subspritesPtr;
|
||||
u8 spriteId;
|
||||
u16 tileTag;
|
||||
u16 palTag;
|
||||
};
|
||||
|
||||
struct RedArrowCursor
|
||||
{
|
||||
u8 spriteId;
|
||||
u16 tileTag;
|
||||
u16 palTag;
|
||||
};
|
||||
|
||||
struct ScrollIndicatorTemplate
|
||||
{
|
||||
u8 animNum:4;
|
||||
u8 bounceDir:4;
|
||||
u8 multiplier;
|
||||
s16 frequency;
|
||||
};
|
||||
|
||||
static EWRAM_DATA struct ScrollArrowsTemplate sTempScrollArrowTemplate = {0};
|
||||
|
||||
static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite);
|
||||
static void SpriteCallback_RedArrowCursor(struct Sprite *sprite);
|
||||
static void Task_ScrollIndicatorArrowPair(u8 taskId);
|
||||
static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor);
|
||||
static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y);
|
||||
static void ListMenuRemoveRedArrowCursorObject(u8 taskId);
|
||||
|
||||
static const struct ScrollIndicatorTemplate sScrollIndicatorTemplates[] =
|
||||
{
|
||||
{
|
||||
.animNum = 0,
|
||||
.bounceDir = 0,
|
||||
.multiplier = 2,
|
||||
.frequency = 8,
|
||||
},
|
||||
{
|
||||
.animNum = 1,
|
||||
.bounceDir = 0,
|
||||
.multiplier = 2,
|
||||
.frequency = -8,
|
||||
},
|
||||
{
|
||||
.animNum = 2,
|
||||
.bounceDir = 1,
|
||||
.multiplier = 2,
|
||||
.frequency = 8,
|
||||
},
|
||||
{
|
||||
.animNum = 3,
|
||||
.bounceDir = 1,
|
||||
.multiplier = 2,
|
||||
.frequency = -8,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct OamData sOamData_ScrollArrowIndicator =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = 0,
|
||||
.objMode = 0,
|
||||
.mosaic = 0,
|
||||
.bpp = 0,
|
||||
.shape = SPRITE_SHAPE(16x16),
|
||||
.x = 0,
|
||||
.matrixNum = 0,
|
||||
.size = SPRITE_SIZE(16x16),
|
||||
.tileNum = 0,
|
||||
.priority = 0,
|
||||
.paletteNum = 0,
|
||||
.affineParam = 0,
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_ScrollArrowIndicator0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 30),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_ScrollArrowIndicator1[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 30, 1, 0),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_ScrollArrowIndicator2[] =
|
||||
{
|
||||
ANIMCMD_FRAME(4, 30),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_ScrollArrowIndicator3[] =
|
||||
{
|
||||
ANIMCMD_FRAME(4, 30, 0, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const sSpriteAnimTable_ScrollArrowIndicator[] =
|
||||
{
|
||||
sSpriteAnim_ScrollArrowIndicator0,
|
||||
sSpriteAnim_ScrollArrowIndicator1,
|
||||
sSpriteAnim_ScrollArrowIndicator2,
|
||||
sSpriteAnim_ScrollArrowIndicator3,
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_ScrollArrowIndicator =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &sOamData_ScrollArrowIndicator,
|
||||
.anims = sSpriteAnimTable_ScrollArrowIndicator,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallback_ScrollIndicatorArrow,
|
||||
};
|
||||
|
||||
static const struct Subsprite sSubsprite_RedOutline1 =
|
||||
{
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.shape = SPRITE_SHAPE(8x8),
|
||||
.size = SPRITE_SIZE(8x8),
|
||||
.tileOffset = 0,
|
||||
.priority = 0,
|
||||
};
|
||||
|
||||
static const struct Subsprite sSubsprite_RedOutline2 =
|
||||
{
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.shape = SPRITE_SHAPE(8x8),
|
||||
.size = SPRITE_SIZE(8x8),
|
||||
.tileOffset = 1,
|
||||
.priority = 0,
|
||||
};
|
||||
|
||||
static const struct Subsprite sSubsprite_RedOutline3 =
|
||||
{
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.shape = SPRITE_SHAPE(8x8),
|
||||
.size = SPRITE_SIZE(8x8),
|
||||
.tileOffset = 2,
|
||||
.priority = 0,
|
||||
};
|
||||
|
||||
static const struct Subsprite sSubsprite_RedOutline4 =
|
||||
{
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.shape = SPRITE_SHAPE(8x8),
|
||||
.size = SPRITE_SIZE(8x8),
|
||||
.tileOffset = 3,
|
||||
.priority = 0,
|
||||
};
|
||||
|
||||
static const struct Subsprite sSubsprite_RedOutline5 =
|
||||
{
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.shape = SPRITE_SHAPE(8x8),
|
||||
.size = SPRITE_SIZE(8x8),
|
||||
.tileOffset = 4,
|
||||
.priority = 0,
|
||||
};
|
||||
|
||||
static const struct Subsprite sSubsprite_RedOutline6 =
|
||||
{
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.shape = SPRITE_SHAPE(8x8),
|
||||
.size = SPRITE_SIZE(8x8),
|
||||
.tileOffset = 5,
|
||||
.priority = 0,
|
||||
};
|
||||
|
||||
static const struct Subsprite sSubsprite_RedOutline7 =
|
||||
{
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.shape = SPRITE_SHAPE(8x8),
|
||||
.size = SPRITE_SIZE(8x8),
|
||||
.tileOffset = 6,
|
||||
.priority = 0,
|
||||
};
|
||||
|
||||
static const struct Subsprite sSubsprite_RedOutline8 =
|
||||
{
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.shape = SPRITE_SHAPE(8x8),
|
||||
.size = SPRITE_SIZE(8x8),
|
||||
.tileOffset = 7,
|
||||
.priority = 0,
|
||||
};
|
||||
|
||||
static const struct OamData sOamData_RedArrowCursor =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = 0,
|
||||
.objMode = 0,
|
||||
.mosaic = 0,
|
||||
.bpp = 0,
|
||||
.shape = SPRITE_SHAPE(16x16),
|
||||
.x = 0,
|
||||
.matrixNum = 0,
|
||||
.size = SPRITE_SIZE(16x16),
|
||||
.tileNum = 0,
|
||||
.priority = 0,
|
||||
.paletteNum = 0,
|
||||
.affineParam = 0,
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_RedArrowCursor[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 30),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const sSpriteAnimTable_RedArrowCursor[] = { sSpriteAnim_RedArrowCursor };
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_RedArrowCursor =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &sOamData_RedArrowCursor,
|
||||
.anims = sSpriteAnimTable_RedArrowCursor,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallback_RedArrowCursor,
|
||||
};
|
||||
|
||||
static const u16 sRedArrowPal[] = INCBIN_U16("graphics/interface/red_arrow.gbapal");
|
||||
static const u32 sRedArrowOtherGfx[] = INCBIN_U32("graphics/interface/red_arrow_other.4bpp.lz");
|
||||
static const u32 sSelectorOutlineGfx[] = INCBIN_U32("graphics/interface/selector_outline.4bpp.lz");
|
||||
static const u32 sRedArrowGfx[] = INCBIN_U32("graphics/interface/red_arrow.4bpp.lz");
|
||||
|
||||
#define tState data[0]
|
||||
#define tAnimNum data[1]
|
||||
#define tBounceDir data[2]
|
||||
#define tMultiplier data[3]
|
||||
#define tFrequency data[4]
|
||||
#define tSinePos data[5]
|
||||
|
||||
static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite)
|
||||
{
|
||||
s32 multiplier;
|
||||
|
||||
switch (sprite->tState)
|
||||
{
|
||||
case 0:
|
||||
StartSpriteAnim(sprite, sprite->tAnimNum);
|
||||
sprite->tState++;
|
||||
break;
|
||||
case 1:
|
||||
switch (sprite->tBounceDir)
|
||||
{
|
||||
case 0:
|
||||
multiplier = sprite->tMultiplier;
|
||||
sprite->pos2.x = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256;
|
||||
break;
|
||||
case 1:
|
||||
multiplier = sprite->tMultiplier;
|
||||
sprite->pos2.y = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256;
|
||||
break;
|
||||
}
|
||||
sprite->tSinePos += sprite->tFrequency;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 AddScrollIndicatorArrowObject(u8 arrowDir, u8 x, u8 y, u16 tileTag, u16 palTag)
|
||||
{
|
||||
u8 spriteId;
|
||||
struct SpriteTemplate spriteTemplate;
|
||||
|
||||
spriteTemplate = sSpriteTemplate_ScrollArrowIndicator;
|
||||
spriteTemplate.tileTag = tileTag;
|
||||
spriteTemplate.paletteTag = palTag;
|
||||
spriteId = CreateSprite(&spriteTemplate, x, y, 0);
|
||||
gSprites[spriteId].invisible = TRUE;
|
||||
gSprites[spriteId].tState = 0;
|
||||
gSprites[spriteId].tAnimNum = sScrollIndicatorTemplates[arrowDir].animNum;
|
||||
gSprites[spriteId].tBounceDir = sScrollIndicatorTemplates[arrowDir].bounceDir;
|
||||
gSprites[spriteId].tMultiplier = sScrollIndicatorTemplates[arrowDir].multiplier;
|
||||
gSprites[spriteId].tFrequency = sScrollIndicatorTemplates[arrowDir].frequency;
|
||||
gSprites[spriteId].tSinePos = 0;
|
||||
return spriteId;
|
||||
}
|
||||
|
||||
#undef tState
|
||||
#undef tAnimNum
|
||||
#undef tBounceDir
|
||||
#undef tMultiplier
|
||||
#undef tFrequency
|
||||
#undef tSinePos
|
||||
|
||||
u8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate *arrowInfo, u16 *scrollOffset)
|
||||
{
|
||||
struct CompressedSpriteSheet spriteSheet;
|
||||
struct SpritePalette spritePal;
|
||||
struct ScrollIndicatorPair *data;
|
||||
u8 taskId;
|
||||
|
||||
spriteSheet.data = sRedArrowOtherGfx;
|
||||
spriteSheet.size = 0x100;
|
||||
spriteSheet.tag = arrowInfo->tileTag;
|
||||
LoadCompressedSpriteSheet(&spriteSheet);
|
||||
if (arrowInfo->palTag == SPRITE_INVALID_TAG)
|
||||
{
|
||||
LoadPalette(sRedArrowPal, (16 * arrowInfo->palNum) + 0x100, 0x20);
|
||||
}
|
||||
else
|
||||
{
|
||||
spritePal.data = sRedArrowPal;
|
||||
spritePal.tag = arrowInfo->palTag;
|
||||
LoadSpritePalette(&spritePal);
|
||||
}
|
||||
taskId = CreateTask(Task_ScrollIndicatorArrowPair, 0);
|
||||
data = (struct ScrollIndicatorPair *)gTasks[taskId].data;
|
||||
|
||||
data->field_0 = 0;
|
||||
data->scrollOffset = scrollOffset;
|
||||
data->fullyUpThreshold = arrowInfo->fullyUpThreshold;
|
||||
data->fullyDownThreshold = arrowInfo->fullyDownThreshold;
|
||||
data->tileTag = arrowInfo->tileTag;
|
||||
data->palTag = arrowInfo->palTag;
|
||||
data->topSpriteId = AddScrollIndicatorArrowObject(arrowInfo->firstArrowType, arrowInfo->firstX, arrowInfo->firstY, arrowInfo->tileTag, arrowInfo->palTag);
|
||||
data->bottomSpriteId = AddScrollIndicatorArrowObject(arrowInfo->secondArrowType, arrowInfo->secondX, arrowInfo->secondY, arrowInfo->tileTag, arrowInfo->palTag);
|
||||
|
||||
if (arrowInfo->palTag == SPRITE_INVALID_TAG)
|
||||
{
|
||||
gSprites[data->topSpriteId].oam.paletteNum = arrowInfo->palNum;
|
||||
gSprites[data->bottomSpriteId].oam.paletteNum = arrowInfo->palNum;
|
||||
}
|
||||
return taskId;
|
||||
}
|
||||
|
||||
u8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *scrollOffset)
|
||||
{
|
||||
if (arrowType == SCROLL_ARROW_UP || arrowType == SCROLL_ARROW_DOWN)
|
||||
{
|
||||
sTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_UP;
|
||||
sTempScrollArrowTemplate.firstX = commonPos;
|
||||
sTempScrollArrowTemplate.firstY = firstPos;
|
||||
sTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_DOWN;
|
||||
sTempScrollArrowTemplate.secondX = commonPos;
|
||||
sTempScrollArrowTemplate.secondY = secondPos;
|
||||
}
|
||||
else
|
||||
{
|
||||
sTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_LEFT;
|
||||
sTempScrollArrowTemplate.firstX = firstPos;
|
||||
sTempScrollArrowTemplate.firstY = commonPos;
|
||||
sTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_RIGHT;
|
||||
sTempScrollArrowTemplate.secondX = secondPos;
|
||||
sTempScrollArrowTemplate.secondY = commonPos;
|
||||
}
|
||||
sTempScrollArrowTemplate.fullyUpThreshold = 0;
|
||||
sTempScrollArrowTemplate.fullyDownThreshold = fullyDownThreshold;
|
||||
sTempScrollArrowTemplate.tileTag = tileTag;
|
||||
sTempScrollArrowTemplate.palTag = palTag;
|
||||
sTempScrollArrowTemplate.palNum = 0;
|
||||
|
||||
return AddScrollIndicatorArrowPair(&sTempScrollArrowTemplate, scrollOffset);
|
||||
}
|
||||
|
||||
static void Task_ScrollIndicatorArrowPair(u8 taskId)
|
||||
{
|
||||
struct ScrollIndicatorPair *data = (struct ScrollIndicatorPair *)gTasks[taskId].data;
|
||||
u16 currItem = (*data->scrollOffset);
|
||||
|
||||
if (currItem == data->fullyUpThreshold)
|
||||
gSprites[data->topSpriteId].invisible = TRUE;
|
||||
else
|
||||
gSprites[data->topSpriteId].invisible = FALSE;
|
||||
|
||||
if (currItem == data->fullyDownThreshold)
|
||||
gSprites[data->bottomSpriteId].invisible = TRUE;
|
||||
else
|
||||
gSprites[data->bottomSpriteId].invisible = FALSE;
|
||||
}
|
||||
|
||||
void RemoveScrollIndicatorArrowPair(u8 taskId)
|
||||
{
|
||||
struct ScrollIndicatorPair *data = (struct ScrollIndicatorPair *)gTasks[taskId].data;
|
||||
|
||||
if (data->tileTag != SPRITE_INVALID_TAG)
|
||||
FreeSpriteTilesByTag(data->tileTag);
|
||||
if (data->palTag != SPRITE_INVALID_TAG)
|
||||
FreeSpritePaletteByTag(data->palTag);
|
||||
DestroySprite(&gSprites[data->topSpriteId]);
|
||||
DestroySprite(&gSprites[data->bottomSpriteId]);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
|
||||
u8 ListMenuAddCursorObjectInternal(struct CursorStruct *cursor, u32 cursorKind)
|
||||
{
|
||||
switch (cursorKind)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
return ListMenuAddRedOutlineCursorObject(cursor);
|
||||
case 1:
|
||||
return ListMenuAddRedArrowCursorObject(cursor);
|
||||
}
|
||||
}
|
||||
|
||||
void ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind)
|
||||
{
|
||||
switch (cursorKind)
|
||||
{
|
||||
case 0:
|
||||
ListMenuUpdateRedOutlineCursorObject(taskId, x, y);
|
||||
break;
|
||||
case 1:
|
||||
ListMenuUpdateRedArrowCursorObject(taskId, x, y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind)
|
||||
{
|
||||
switch (cursorKind)
|
||||
{
|
||||
case 0:
|
||||
ListMenuRemoveRedOutlineCursorObject(taskId);
|
||||
break;
|
||||
case 1:
|
||||
ListMenuRemoveRedArrowCursorObject(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Task_RedOutlineCursor(u8 taskId)
|
||||
{
|
||||
}
|
||||
|
||||
u8 ListMenuGetRedOutlineCursorSpriteCount(u16 rowWidth, u16 rowHeight)
|
||||
{
|
||||
s32 i, count = 4;
|
||||
|
||||
if (rowWidth > 16)
|
||||
for (i = 8; i < (rowWidth - 8); i += 8)
|
||||
count += 2;
|
||||
if (rowHeight > 16)
|
||||
for (i = 8; i < (rowHeight - 8); i += 8)
|
||||
count += 2;
|
||||
return count;
|
||||
}
|
||||
|
||||
void ListMenuSetUpRedOutlineCursorSpriteOamTable(u16 rowWidth, u16 rowHeight, struct Subsprite *subsprites)
|
||||
{
|
||||
s32 i, j, id = 0;
|
||||
|
||||
subsprites[id] = sSubsprite_RedOutline1;
|
||||
subsprites[id].x = 136;
|
||||
subsprites[id].y = 136;
|
||||
id++;
|
||||
subsprites[id] = sSubsprite_RedOutline2;
|
||||
subsprites[id].x = rowWidth + 128;
|
||||
subsprites[id].y = 136;
|
||||
id++;
|
||||
subsprites[id] = sSubsprite_RedOutline7;
|
||||
subsprites[id].x = 136;
|
||||
subsprites[id].y = rowHeight + 128;
|
||||
id++;
|
||||
subsprites[id] = sSubsprite_RedOutline8;
|
||||
subsprites[id].x = rowWidth + 128;
|
||||
subsprites[id].y = rowHeight + 128;
|
||||
id++;
|
||||
if (rowWidth > 16)
|
||||
{
|
||||
for (i = 8; i < rowWidth - 8; i += 8)
|
||||
{
|
||||
subsprites[id] = sSubsprite_RedOutline3;
|
||||
subsprites[id].x = i - 120;
|
||||
subsprites[id].y = 136;
|
||||
id++;
|
||||
|
||||
subsprites[id] = sSubsprite_RedOutline6;
|
||||
subsprites[id].x = i - 120;
|
||||
subsprites[id].y = rowHeight + 128;
|
||||
id++;
|
||||
}
|
||||
}
|
||||
if (rowHeight > 16)
|
||||
{
|
||||
for (j = 8; j < rowHeight - 8; j += 8)
|
||||
{
|
||||
subsprites[id] = sSubsprite_RedOutline4;
|
||||
subsprites[id].x = 136;
|
||||
subsprites[id].y = j - 120;
|
||||
id++;
|
||||
subsprites[id] = sSubsprite_RedOutline5;
|
||||
subsprites[id].x = rowWidth + 128;
|
||||
subsprites[id].y = j - 120;
|
||||
id++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
u8 ListMenuAddRedOutlineCursorObject(struct CursorStruct *cursor)
|
||||
{
|
||||
struct CompressedSpriteSheet spriteSheet;
|
||||
struct SpritePalette spritePal;
|
||||
struct RedOutlineCursor *data;
|
||||
struct SpriteTemplate spriteTemplate;
|
||||
u8 taskId;
|
||||
|
||||
spriteSheet.data = sSelectorOutlineGfx;
|
||||
spriteSheet.size = 0x100;
|
||||
spriteSheet.tag = cursor->tileTag;
|
||||
LoadCompressedSpriteSheet(&spriteSheet);
|
||||
if (cursor->palTag == SPRITE_INVALID_TAG)
|
||||
{
|
||||
LoadPalette(sRedArrowPal, (16 * cursor->palNum) + 0x100, 0x20);
|
||||
}
|
||||
else
|
||||
{
|
||||
spritePal.data = sRedArrowPal;
|
||||
spritePal.tag = cursor->palTag;
|
||||
LoadSpritePalette(&spritePal);
|
||||
}
|
||||
taskId = CreateTask(Task_RedOutlineCursor, 0);
|
||||
data = (struct RedOutlineCursor *)gTasks[taskId].data;
|
||||
data->tileTag = cursor->tileTag;
|
||||
data->palTag = cursor->palTag;
|
||||
data->subspriteTable.subspriteCount = ListMenuGetRedOutlineCursorSpriteCount(cursor->rowWidth, cursor->rowHeight);
|
||||
data->subspriteTable.subsprites = data->subspritesPtr = Alloc(data->subspriteTable.subspriteCount * 4);
|
||||
ListMenuSetUpRedOutlineCursorSpriteOamTable(cursor->rowWidth, cursor->rowHeight, data->subspritesPtr);
|
||||
spriteTemplate = gDummySpriteTemplate;
|
||||
spriteTemplate.tileTag = cursor->tileTag;
|
||||
spriteTemplate.paletteTag = cursor->palTag;
|
||||
data->spriteId = CreateSprite(&spriteTemplate, cursor->left + 120, cursor->top + 120, 0);
|
||||
SetSubspriteTables(&gSprites[data->spriteId], &data->subspriteTable);
|
||||
gSprites[data->spriteId].oam.priority = 0;
|
||||
gSprites[data->spriteId].subpriority = 0;
|
||||
gSprites[data->spriteId].subspriteTableNum = 0;
|
||||
if (cursor->palTag == SPRITE_INVALID_TAG)
|
||||
gSprites[data->spriteId].oam.paletteNum = cursor->palNum;
|
||||
return taskId;
|
||||
}
|
||||
|
||||
void ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y)
|
||||
{
|
||||
struct RedOutlineCursor *data = (struct RedOutlineCursor *)gTasks[taskId].data;
|
||||
|
||||
gSprites[data->spriteId].pos1.x = x + 120;
|
||||
gSprites[data->spriteId].pos1.y = y + 120;
|
||||
}
|
||||
|
||||
void ListMenuRemoveRedOutlineCursorObject(u8 taskId)
|
||||
{
|
||||
struct RedOutlineCursor *data = (struct RedOutlineCursor *)gTasks[taskId].data;
|
||||
|
||||
Free(data->subspritesPtr);
|
||||
if (data->tileTag != SPRITE_INVALID_TAG)
|
||||
FreeSpriteTilesByTag(data->tileTag);
|
||||
if (data->palTag != SPRITE_INVALID_TAG)
|
||||
FreeSpritePaletteByTag(data->palTag);
|
||||
DestroySprite(&gSprites[data->spriteId]);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
|
||||
static void SpriteCallback_RedArrowCursor(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos2.x = gSineTable[(u8)(sprite->data[0])] / 64;
|
||||
sprite->data[0] += 8;
|
||||
}
|
||||
|
||||
static void Task_RedArrowCursor(u8 taskId)
|
||||
{
|
||||
}
|
||||
|
||||
static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor)
|
||||
{
|
||||
struct CompressedSpriteSheet spriteSheet;
|
||||
struct SpritePalette spritePal;
|
||||
struct RedArrowCursor *data;
|
||||
struct SpriteTemplate spriteTemplate;
|
||||
u8 taskId;
|
||||
|
||||
spriteSheet.data = sRedArrowGfx;
|
||||
spriteSheet.size = 0x80;
|
||||
spriteSheet.tag = cursor->tileTag;
|
||||
LoadCompressedSpriteSheet(&spriteSheet);
|
||||
if (cursor->palTag == SPRITE_INVALID_TAG)
|
||||
{
|
||||
LoadPalette(sRedArrowPal, (16 * cursor->palNum) + 0x100, 0x20);
|
||||
}
|
||||
else
|
||||
{
|
||||
spritePal.data = sRedArrowPal;
|
||||
spritePal.tag = cursor->palTag;
|
||||
LoadSpritePalette(&spritePal);
|
||||
}
|
||||
taskId = CreateTask(Task_RedArrowCursor, 0);
|
||||
data = (struct RedArrowCursor *)gTasks[taskId].data;
|
||||
data->tileTag = cursor->tileTag;
|
||||
data->palTag = cursor->palTag;
|
||||
spriteTemplate = sSpriteTemplate_RedArrowCursor;
|
||||
spriteTemplate.tileTag = cursor->tileTag;
|
||||
spriteTemplate.paletteTag = cursor->palTag;
|
||||
data->spriteId = CreateSprite(&spriteTemplate, cursor->left, cursor->top, 0);
|
||||
gSprites[data->spriteId].pos2.x = 8;
|
||||
gSprites[data->spriteId].pos2.y = 8;
|
||||
if (cursor->palTag == SPRITE_INVALID_TAG)
|
||||
gSprites[data->spriteId].oam.paletteNum = cursor->palNum;
|
||||
return taskId;
|
||||
}
|
||||
|
||||
static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y)
|
||||
{
|
||||
struct RedArrowCursor *data = (struct RedArrowCursor *)gTasks[taskId].data;
|
||||
|
||||
gSprites[data->spriteId].pos1.x = x;
|
||||
gSprites[data->spriteId].pos1.y = y;
|
||||
}
|
||||
|
||||
static void ListMenuRemoveRedArrowCursorObject(u8 taskId)
|
||||
{
|
||||
struct RedArrowCursor *data = (struct RedArrowCursor *)gTasks[taskId].data;
|
||||
|
||||
if (data->tileTag != SPRITE_INVALID_TAG)
|
||||
FreeSpriteTilesByTag(data->tileTag);
|
||||
if (data->palTag != SPRITE_INVALID_TAG)
|
||||
FreeSpritePaletteByTag(data->palTag);
|
||||
DestroySprite(&gSprites[data->spriteId]);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
+80
-80
@@ -28,7 +28,7 @@ struct MEventTaskData1
|
||||
u16 t02;
|
||||
u16 t04;
|
||||
u16 t06;
|
||||
u8 t08;
|
||||
u8 state;
|
||||
u8 t09;
|
||||
u8 t0A;
|
||||
u8 t0B;
|
||||
@@ -91,46 +91,46 @@ struct MEvent_Str_1 gUnknown_3005ED0;
|
||||
|
||||
static EWRAM_DATA bool32 gUnknown_203F3BC = FALSE;
|
||||
|
||||
void sub_81435DC(struct MEvent_Str_1 *a0, size_t a1, const void * a2)
|
||||
void sub_81435DC(struct MEvent_Str_1 *mgr, size_t size, const void * data)
|
||||
{
|
||||
vu16 imeBak = REG_IME;
|
||||
REG_IME = 0;
|
||||
gIntrTable[1] = sub_815C6D4;
|
||||
gIntrTable[2] = sub_815C6C4;
|
||||
sub_815C8C8();
|
||||
sub_815C960();
|
||||
gIntrTable[1] = EReaderHelper_SerialCallback;
|
||||
gIntrTable[2] = EReaderHelper_Timer3Callback;
|
||||
EReaderHelper_SaveRegsState();
|
||||
EReaderHelper_ClearsSendRecvMgr();
|
||||
REG_IE |= INTR_FLAG_VCOUNT;
|
||||
REG_IME = imeBak;
|
||||
a0->unk_000 = 0;
|
||||
a0->unk_004 = a1;
|
||||
a0->unk_008 = a2;
|
||||
mgr->status = 0;
|
||||
mgr->size = size;
|
||||
mgr->data = data;
|
||||
}
|
||||
|
||||
void sub_8143644(struct MEvent_Str_1 *unused)
|
||||
{
|
||||
vu16 imeBak = REG_IME;
|
||||
REG_IME = 0;
|
||||
sub_815C960();
|
||||
sub_815C91C();
|
||||
EReaderHelper_ClearsSendRecvMgr();
|
||||
EReaderHelper_RestoreRegsState();
|
||||
RestoreSerialTimer3IntrHandlers();
|
||||
REG_IME = imeBak;
|
||||
}
|
||||
|
||||
u8 sub_8143674(struct MEvent_Str_1 *a0)
|
||||
u8 sub_8143674(struct MEvent_Str_1 *mgr)
|
||||
{
|
||||
u8 resp = 0;
|
||||
a0->unk_000 = sub_815C498(1, a0->unk_004, a0->unk_008, 0);
|
||||
if ((a0->unk_000 & 0x13) == 0x10)
|
||||
mgr->status = EReaderHandleTransfer(1, mgr->size, mgr->data, 0);
|
||||
if ((mgr->status & 0x13) == 0x10)
|
||||
resp = 1;
|
||||
if (a0->unk_000 & 8)
|
||||
if (mgr->status & 8)
|
||||
resp = 2;
|
||||
if (a0->unk_000 & 4)
|
||||
if (mgr->status & 4)
|
||||
resp = 3;
|
||||
gUnknown_3003F84 = 0;
|
||||
return resp;
|
||||
}
|
||||
|
||||
void sub_81436BC(void)
|
||||
static void ResetTTDataBuffer(void)
|
||||
{
|
||||
memset(gDecompressionBuffer, 0, 0x2000);
|
||||
gLinkType = 0x5502;
|
||||
@@ -143,7 +143,7 @@ bool32 sub_81436EC(void)
|
||||
vu16 imeBak = REG_IME;
|
||||
u16 data[4];
|
||||
REG_IME = 0;
|
||||
*(u64 *)data = gUnknown_3003FB4;
|
||||
*(u64 *)data = gSioMlt_Recv;
|
||||
REG_IME = imeBak;
|
||||
if ( data[0] == 0xB9A0
|
||||
&& data[1] == 0xCCD0
|
||||
@@ -154,7 +154,7 @@ bool32 sub_81436EC(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool32 sub_814374C(void)
|
||||
static bool32 IsEReaderConnectionSane(void)
|
||||
{
|
||||
if (sub_800AA48() && GetLinkPlayerCount_2() == 2)
|
||||
return TRUE;
|
||||
@@ -244,7 +244,7 @@ void task_add_00_ereader(void)
|
||||
{
|
||||
u8 taskId = CreateTask(sub_8143910, 0);
|
||||
struct MEventTaskData1 *data = (struct MEventTaskData1 *)gTasks[taskId].data;
|
||||
data->t08 = 0;
|
||||
data->state = 0;
|
||||
data->t09 = 0;
|
||||
data->t0A = 0;
|
||||
data->t0B = 0;
|
||||
@@ -258,12 +258,12 @@ void task_add_00_ereader(void)
|
||||
data->t10 = AllocZeroed(sizeof(struct MEvent_Str_2));
|
||||
}
|
||||
|
||||
void sub_81438E8(u16 *a0)
|
||||
static void ResetDelayTimer(u16 *a0)
|
||||
{
|
||||
*a0 = 0;
|
||||
}
|
||||
|
||||
bool32 sub_81438F0(u16 * a0, u16 a1)
|
||||
static bool32 AdvanceDelayTimerCheckTimeout(u16 * a0, u16 a1)
|
||||
{
|
||||
if (++(*a0) > a1)
|
||||
{
|
||||
@@ -276,49 +276,49 @@ bool32 sub_81438F0(u16 * a0, u16 a1)
|
||||
void sub_8143910(u8 taskId)
|
||||
{
|
||||
struct MEventTaskData1 *data = (struct MEventTaskData1 *)gTasks[taskId].data;
|
||||
switch (data->t08)
|
||||
switch (data->state)
|
||||
{
|
||||
case 0:
|
||||
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE52))
|
||||
data->t08 = 1;
|
||||
data->state = 1;
|
||||
break;
|
||||
case 1:
|
||||
sub_81436BC();
|
||||
sub_81438E8(&data->t00);
|
||||
data->t08 = 2;
|
||||
ResetTTDataBuffer();
|
||||
ResetDelayTimer(&data->t00);
|
||||
data->state = 2;
|
||||
break;
|
||||
case 2:
|
||||
if (sub_81438F0(&data->t00, 10))
|
||||
data->t08 = 3;
|
||||
if (AdvanceDelayTimerCheckTimeout(&data->t00, 10))
|
||||
data->state = 3;
|
||||
break;
|
||||
case 3:
|
||||
if (!sub_814374C())
|
||||
if (!IsEReaderConnectionSane())
|
||||
{
|
||||
CloseLink();
|
||||
data->t08 = 4;
|
||||
data->state = 4;
|
||||
}
|
||||
else
|
||||
data->t08 = 13;
|
||||
data->state = 13;
|
||||
break;
|
||||
case 4:
|
||||
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE53))
|
||||
{
|
||||
AddTextPrinterToWindow1(gUnknown_841DE54);
|
||||
sub_81438E8(&data->t00);
|
||||
data->t08 = 5;
|
||||
ResetDelayTimer(&data->t00);
|
||||
data->state = 5;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (sub_81438F0(&data->t00, 90))
|
||||
if (AdvanceDelayTimerCheckTimeout(&data->t00, 90))
|
||||
{
|
||||
sub_81436BC();
|
||||
data->t08 = 6;
|
||||
ResetTTDataBuffer();
|
||||
data->state = 6;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
sub_81438E8(&data->t00);
|
||||
ResetDelayTimer(&data->t00);
|
||||
PlaySE(SE_SELECT);
|
||||
data->t08 = 23;
|
||||
data->state = 23;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
@@ -326,64 +326,64 @@ void sub_8143910(u8 taskId)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
CloseLink();
|
||||
sub_81438E8(&data->t00);
|
||||
data->t08 = 23;
|
||||
ResetDelayTimer(&data->t00);
|
||||
data->state = 23;
|
||||
}
|
||||
else if (GetLinkPlayerCount_2() > 1)
|
||||
{
|
||||
sub_81438E8(&data->t00);
|
||||
ResetDelayTimer(&data->t00);
|
||||
CloseLink();
|
||||
data->t08 = 7;
|
||||
data->state = 7;
|
||||
}
|
||||
else if (sub_81436EC())
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
CloseLink();
|
||||
sub_81438E8(&data->t00);
|
||||
data->t08 = 8;
|
||||
ResetDelayTimer(&data->t00);
|
||||
data->state = 8;
|
||||
}
|
||||
else if (sub_81438F0(&data->t00, 10))
|
||||
else if (AdvanceDelayTimerCheckTimeout(&data->t00, 10))
|
||||
{
|
||||
CloseLink();
|
||||
sub_81436BC();
|
||||
sub_81438E8(&data->t00);
|
||||
ResetTTDataBuffer();
|
||||
ResetDelayTimer(&data->t00);
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE7C))
|
||||
data->t08 = 4;
|
||||
data->state = 4;
|
||||
break;
|
||||
case 8:
|
||||
AddTextPrinterToWindow1(gUnknown_841DE95);
|
||||
sub_81435DC(&gUnknown_3005ED0, gUnknownSerialData_End - gUnknownSerialData_Start, gUnknownSerialData_Start);
|
||||
data->t08 = 9;
|
||||
data->state = 9;
|
||||
break;
|
||||
case 9:
|
||||
data->t0E = sub_8143674(&gUnknown_3005ED0);
|
||||
if (data->t0E != 0)
|
||||
data->t08 = 10;
|
||||
data->state = 10;
|
||||
break;
|
||||
case 10:
|
||||
sub_8143644(&gUnknown_3005ED0);
|
||||
if (data->t0E == 3)
|
||||
data->t08 = 20;
|
||||
data->state = 20;
|
||||
else if (data->t0E == 1)
|
||||
{
|
||||
sub_81438E8(&data->t00);
|
||||
ResetDelayTimer(&data->t00);
|
||||
AddTextPrinterToWindow1(gUnknown_841DE9B);
|
||||
data->t08 = 11;
|
||||
data->state = 11;
|
||||
}
|
||||
else
|
||||
data->t08 = 0;
|
||||
data->state = 0;
|
||||
break;
|
||||
case 11:
|
||||
if (sub_81438F0(&data->t00, 840))
|
||||
data->t08 = 12;
|
||||
if (AdvanceDelayTimerCheckTimeout(&data->t00, 840))
|
||||
data->state = 12;
|
||||
break;
|
||||
case 12:
|
||||
sub_81436BC();
|
||||
ResetTTDataBuffer();
|
||||
AddTextPrinterToWindow1(gUnknown_841DE98);
|
||||
data->t08 = 13;
|
||||
data->state = 13;
|
||||
break;
|
||||
case 13:
|
||||
switch (sub_8143770(&data->t09, &data->t00))
|
||||
@@ -392,21 +392,21 @@ void sub_8143910(u8 taskId)
|
||||
break;
|
||||
case 2:
|
||||
AddTextPrinterToWindow1(gUnknown_841DE95);
|
||||
data->t08 = 14;
|
||||
data->state = 14;
|
||||
break;
|
||||
case 1:
|
||||
PlaySE(SE_SELECT);
|
||||
CloseLink();
|
||||
data->t08 = 23;
|
||||
data->state = 23;
|
||||
break;
|
||||
case 5:
|
||||
CloseLink();
|
||||
data->t08 = 21;
|
||||
data->state = 21;
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
CloseLink();
|
||||
data->t08 = 20;
|
||||
data->state = 20;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -414,65 +414,65 @@ void sub_8143910(u8 taskId)
|
||||
if (HasLinkErrorOccurred())
|
||||
{
|
||||
CloseLink();
|
||||
data->t08 = 20;
|
||||
data->state = 20;
|
||||
}
|
||||
else if (GetBlockReceivedStatus())
|
||||
{
|
||||
ResetBlockReceivedFlags();
|
||||
data->t08 = 15;
|
||||
data->state = 15;
|
||||
}
|
||||
break;
|
||||
case 15:
|
||||
data->t0E = sub_815D6B4(gDecompressionBuffer);
|
||||
data->t0E = ValidateTrainerTowerData((struct TrainerTowerData *)gDecompressionBuffer);
|
||||
sub_800AA80(data->t0E);
|
||||
data->t08 = 16;
|
||||
data->state = 16;
|
||||
break;
|
||||
case 16:
|
||||
if (!gReceivedRemoteLinkPlayers)
|
||||
{
|
||||
if (data->t0E == 1)
|
||||
data->t08 = 17;
|
||||
data->state = 17;
|
||||
else
|
||||
data->t08 = 20;
|
||||
data->state = 20;
|
||||
}
|
||||
break;
|
||||
case 17:
|
||||
if (sub_815D794(gDecompressionBuffer))
|
||||
if (CEReaderTool_SaveTrainerTower((struct TrainerTowerData *)gDecompressionBuffer))
|
||||
{
|
||||
AddTextPrinterToWindow1(gUnknown_841DE99);
|
||||
sub_81438E8(&data->t00);
|
||||
data->t08 = 18;
|
||||
ResetDelayTimer(&data->t00);
|
||||
data->state = 18;
|
||||
}
|
||||
else
|
||||
data->t08 = 22;
|
||||
data->state = 22;
|
||||
break;
|
||||
case 18:
|
||||
if (sub_81438F0(&data->t00, 120))
|
||||
if (AdvanceDelayTimerCheckTimeout(&data->t00, 120))
|
||||
{
|
||||
AddTextPrinterToWindow1(gUnknown_841DE9A);
|
||||
PlayFanfare(258);
|
||||
data->t08 = 19;
|
||||
data->state = 19;
|
||||
}
|
||||
break;
|
||||
case 19:
|
||||
if (IsFanfareTaskInactive() &&JOY_NEW(A_BUTTON | B_BUTTON))
|
||||
data->t08 = 26;
|
||||
data->state = 26;
|
||||
break;
|
||||
case 23:
|
||||
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE7D))
|
||||
data->t08 = 26;
|
||||
data->state = 26;
|
||||
break;
|
||||
case 20:
|
||||
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE96))
|
||||
data->t08 = 0;
|
||||
data->state = 0;
|
||||
break;
|
||||
case 21:
|
||||
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE97))
|
||||
data->t08 = 0;
|
||||
data->state = 0;
|
||||
break;
|
||||
case 22:
|
||||
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE9C))
|
||||
data->t08 = 0;
|
||||
data->state = 0;
|
||||
break;
|
||||
case 26:
|
||||
sub_812B484();
|
||||
|
||||
+21
-20
@@ -6,6 +6,7 @@
|
||||
#include "decompress.h"
|
||||
#include "malloc.h"
|
||||
#include "menu.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "pokemon_icon.h"
|
||||
#include "mystery_gift_menu.h"
|
||||
#include "menu_indicators.h"
|
||||
@@ -97,7 +98,7 @@ const u16 gUnknown_8467E74[] = INCBIN_U16("data/graphics/mevent/pal_467E74.gbapa
|
||||
const u16 gUnknown_8467E94[] = INCBIN_U16("data/graphics/mevent/pal_467E94.gbapal");
|
||||
const u16 gUnknown_8467EB4[] = INCBIN_U16("data/graphics/mevent/pal_467EB4.gbapal");
|
||||
const u16 gUnknown_8467ED4[] = INCBIN_U16("data/graphics/mevent/pal_467ED4.gbapal");
|
||||
const u8 gUnknown_8467EF4[] = INCBIN_U8("data/graphics/mevent/gfx_467EF4.4bpp.lz");
|
||||
const u32 gUnknown_8467EF4[] = INCBIN_U32("data/graphics/mevent/gfx_467EF4.4bpp.lz");
|
||||
|
||||
const struct CompressedSpriteSheet gUnknown_8467F58 = {
|
||||
gUnknown_8467EF4, 0x100, 0x8000
|
||||
@@ -175,13 +176,13 @@ s32 FadeToWonderCardMenu(void)
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
decompress_and_copy_tile_data_to_vram(2, gUnknown_203F3C8->unk_0170->tiles, 0, 0x008, 0);
|
||||
DecompressAndCopyTileDataToVram(2, gUnknown_203F3C8->unk_0170->tiles, 0, 0x008, 0);
|
||||
gUnknown_203F3C8->unk_0176[0] = AddWindow(&gUnknown_8467074[0]);
|
||||
gUnknown_203F3C8->unk_0176[1] = AddWindow(&gUnknown_8467074[1]);
|
||||
gUnknown_203F3C8->unk_0176[2] = AddWindow(&gUnknown_8467074[2]);
|
||||
break;
|
||||
case 3:
|
||||
if (free_temp_tile_data_buffers_if_possible())
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return 0;
|
||||
gPaletteFade.bufferTransferDisabled = TRUE;
|
||||
LoadPalette(gUnknown_203F3C8->unk_0170->pal, 0x10, 0x20);
|
||||
@@ -347,28 +348,28 @@ void sub_8145D18(u8 whichWindow)
|
||||
case 0:
|
||||
{
|
||||
s32 x;
|
||||
box_print(windowId, 3, 0, 1, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_018B);
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, 1, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_018B);
|
||||
x = 160 - GetStringWidth(3, gUnknown_203F3C8->unk_01B4, GetFontAttribute(3, 2));
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
box_print(windowId, 3, x, 17, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01B4);
|
||||
AddTextPrinterParameterized3(windowId, 3, x, 17, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01B4);
|
||||
if (gUnknown_203F3C8->unk_0000.unk_04 != 0)
|
||||
{
|
||||
box_print(windowId, 2, 166, 17, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01DD);
|
||||
AddTextPrinterParameterized3(windowId, 2, 166, 17, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01DD);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
for (; sp0C < 4; sp0C++)
|
||||
{
|
||||
box_print(windowId, 3, 0, 16 * sp0C + 2, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal2], 0, gUnknown_203F3C8->unk_01E4[sp0C]);
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, 16 * sp0C + 2, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal2], 0, gUnknown_203F3C8->unk_01E4[sp0C]);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
box_print(windowId, 3, 0, gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_0288);
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_0288);
|
||||
if (gUnknown_203F3C8->unk_0000.unk_08_0 != 2)
|
||||
{
|
||||
box_print(windowId, 3, 0, 16 + gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02B1);
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, 16 + gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02B1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -377,11 +378,11 @@ void sub_8145D18(u8 whichWindow)
|
||||
s32 spacing = GetFontAttribute(3, 2);
|
||||
for (; sp0C < gUnknown_203F3C8->unk_0175; sp0C++)
|
||||
{
|
||||
box_print(windowId, 3, x, y, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_01);
|
||||
AddTextPrinterParameterized3(windowId, 3, x, y, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_01);
|
||||
if (gUnknown_203F3C8->unk_02DC[sp0C].unk_42[0] != EOS)
|
||||
{
|
||||
x += GetStringWidth(3, gUnknown_203F3C8->unk_02DC[sp0C].unk_01, spacing);
|
||||
box_print(windowId, 2, x, y, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_42);
|
||||
AddTextPrinterParameterized3(windowId, 2, x, y, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_42);
|
||||
x += GetStringWidth(3, gUnknown_203F3C8->unk_02DC[sp0C].unk_42, spacing) + gUnknown_203F3C8->unk_02DC[sp0C].unk_00;
|
||||
}
|
||||
}
|
||||
@@ -402,7 +403,7 @@ void sub_8146060(void)
|
||||
}
|
||||
if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
|
||||
{
|
||||
sub_800F034(&gUnknown_8467F58);
|
||||
LoadCompressedSpriteSheetUsingHeap(&gUnknown_8467F58);
|
||||
LoadSpritePalette(&gUnknown_8467F60[gUnknown_203F3C8->unk_0170->textPal4]);
|
||||
for (; r7 < gUnknown_203F3C8->unk_0000.unk_09; r7++)
|
||||
{
|
||||
@@ -460,7 +461,7 @@ struct UnkStruct_203F3CC
|
||||
/*01cc*/ u8 filler_01CC[2];
|
||||
/*01ce*/ u8 unk_01CE[41];
|
||||
/*01f7*/ u8 unk_01F7[10][41];
|
||||
/*0394*/ struct ScrollIndicatorArrowPairTemplate unk_0394;
|
||||
/*0394*/ struct ScrollArrowsTemplate unk_0394;
|
||||
/*03a4*/ u8 buffer_03A4[0x1000];
|
||||
};
|
||||
|
||||
@@ -478,9 +479,9 @@ const struct WindowTemplate gUnknown_8468040[] = {
|
||||
{0, 1, 0, 28, 3, 15, 0x000},
|
||||
{2, 1, 3, 28, 20, 15, 0x000}
|
||||
};
|
||||
const struct ScrollIndicatorArrowPairTemplate gUnknown_8468050 = {
|
||||
const struct ScrollArrowsTemplate gUnknown_8468050 = {
|
||||
0x02, 0xe8, 0x18, 0x03, 0xe8, 0x98,
|
||||
0x0000, 0x0002, 0x1000, 0x1000, 0x0, 0x000
|
||||
0x0000, 0x0002, 0x1000, 0x1000, 0x0,
|
||||
};
|
||||
|
||||
const u16 gUnknown_8468060[] = INCBIN_U16("data/graphics/mevent/pal_468060.gbapal");
|
||||
@@ -565,12 +566,12 @@ s32 FadeToWonderNewsMenu(void)
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
decompress_and_copy_tile_data_to_vram(3, gUnknown_203F3CC->unk_01BC->tiles, 0, 8, 0);
|
||||
DecompressAndCopyTileDataToVram(3, gUnknown_203F3CC->unk_01BC->tiles, 0, 8, 0);
|
||||
gUnknown_203F3CC->unk_01C8[0] = AddWindow(&gUnknown_8468040[0]);
|
||||
gUnknown_203F3CC->unk_01C8[1] = AddWindow(&gUnknown_8468040[1]);
|
||||
break;
|
||||
case 3:
|
||||
if (free_temp_tile_data_buffers_if_possible())
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return 0;
|
||||
gPaletteFade.bufferTransferDisabled = TRUE;
|
||||
LoadPalette(gUnknown_203F3CC->unk_01BC->pal, 0x10, 0x20);
|
||||
@@ -743,7 +744,7 @@ void sub_8146980(void)
|
||||
++gUnknown_203F3CC->unk_01C4;
|
||||
}
|
||||
gUnknown_203F3CC->unk_0394 = gUnknown_8468050;
|
||||
gUnknown_203F3CC->unk_0394.unk_08 = gUnknown_203F3CC->unk_01C4;
|
||||
gUnknown_203F3CC->unk_0394.fullyDownThreshold = gUnknown_203F3CC->unk_01C4;
|
||||
}
|
||||
|
||||
void sub_8146A30(void)
|
||||
@@ -757,10 +758,10 @@ void sub_8146A30(void)
|
||||
x = (0xe0 - GetStringWidth(3, gUnknown_203F3CC->unk_01CE, GetFontAttribute(3, 2))) / 2;
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
box_print(gUnknown_203F3CC->unk_01C8[0], 3, x, 6, &gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal1], 0, gUnknown_203F3CC->unk_01CE);
|
||||
AddTextPrinterParameterized3(gUnknown_203F3CC->unk_01C8[0], 3, x, 6, &gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal1], 0, gUnknown_203F3CC->unk_01CE);
|
||||
for (; i < 10; ++i)
|
||||
{
|
||||
box_print(gUnknown_203F3CC->unk_01C8[1], 3, 0, 16 * i + 2, &gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal2], 0, gUnknown_203F3CC->unk_01F7[i]);
|
||||
AddTextPrinterParameterized3(gUnknown_203F3CC->unk_01C8[1], 3, 0, 16 * i + 2, &gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal2], 0, gUnknown_203F3CC->unk_01F7[i]);
|
||||
}
|
||||
CopyWindowToVram(gUnknown_203F3CC->unk_01C8[0], 3);
|
||||
CopyWindowToVram(gUnknown_203F3CC->unk_01C8[1], 3);
|
||||
|
||||
+6
-7
@@ -109,7 +109,7 @@ void PrintMoneyAmount(u8 windowId, u8 x, u8 y, int amount, u8 speed)
|
||||
|
||||
void PrintMoneyAmountInMoneyBoxWithBorder(u8 windowId, u16 tileStart, u8 pallete, int amount)
|
||||
{
|
||||
SetWindowBorderStyle(windowId, FALSE, tileStart, pallete);
|
||||
DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, tileStart, pallete);
|
||||
AddTextPrinterParameterized(windowId, 2, gUnknown_8419CE7, 0, 0, 0xFF, 0);
|
||||
PrintMoneyAmountInMoneyBox(windowId, amount, 0);
|
||||
}
|
||||
@@ -121,20 +121,19 @@ void ChangeAmountInMoneyBox(int amount)
|
||||
|
||||
void DrawMoneyBox(int amount, u8 x, u8 y)
|
||||
{
|
||||
struct WindowTemplate template, template2;
|
||||
struct WindowTemplate template;
|
||||
|
||||
SetWindowTemplateFields(&template, 0, x + 1, y + 1, 8, 3, 15, 8);
|
||||
template2 = template;
|
||||
sMoneyBoxWindowId = AddWindow(&template2);
|
||||
template = SetWindowTemplateFields(0, x + 1, y + 1, 8, 3, 15, 8);
|
||||
sMoneyBoxWindowId = AddWindow(&template);
|
||||
FillWindowPixelBuffer(sMoneyBoxWindowId, 0);
|
||||
PutWindowTilemap(sMoneyBoxWindowId);
|
||||
sub_814FF2C(sMoneyBoxWindowId, 0x21D, 0xD0);
|
||||
TextWindow_SetStdFrame0_WithPal(sMoneyBoxWindowId, 0x21D, 0xD0);
|
||||
PrintMoneyAmountInMoneyBoxWithBorder(sMoneyBoxWindowId, 0x21D, 13, amount);
|
||||
}
|
||||
|
||||
void HideMoneyBox(void)
|
||||
{
|
||||
sub_810F4D8(sMoneyBoxWindowId, FALSE);
|
||||
ClearStdWindowAndFrameToTransparent(sMoneyBoxWindowId, FALSE);
|
||||
CopyWindowToVram(sMoneyBoxWindowId, 2);
|
||||
RemoveWindow(sMoneyBoxWindowId);
|
||||
}
|
||||
|
||||
+416
@@ -0,0 +1,416 @@
|
||||
#include "global.h"
|
||||
#include "multiboot.h"
|
||||
|
||||
static IWRAM_DATA u16 MultiBoot_required_data[MULTIBOOT_NCHILD];
|
||||
|
||||
static int MultiBootSend(struct MultiBootParam *mp, u16 data);
|
||||
static int MultiBootHandShake(struct MultiBootParam *mp);
|
||||
static void MultiBootWaitCycles(u32 cycles);
|
||||
static void MultiBootWaitSendDone(void);
|
||||
|
||||
void MultiBootInit(struct MultiBootParam *mp)
|
||||
{
|
||||
mp->client_bit = 0;
|
||||
mp->probe_count = 0;
|
||||
mp->response_bit = 0;
|
||||
mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT;
|
||||
mp->sendflag = 0;
|
||||
mp->handshake_timeout = 0;
|
||||
REG_RCNT = 0;
|
||||
REG_SIOCNT = SIO_MULTI_MODE | SIO_115200_BPS;
|
||||
REG_SIODATA8 = 0;
|
||||
}
|
||||
|
||||
int MultiBootMain(struct MultiBootParam *mp)
|
||||
{
|
||||
int i, j, k;
|
||||
|
||||
if (MultiBootCheckComplete(mp))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (mp->check_wait > MULTIBOOT_CONNECTION_CHECK_WAIT)
|
||||
{
|
||||
mp->check_wait--;
|
||||
return 0;
|
||||
}
|
||||
output_burst:
|
||||
if (mp->sendflag)
|
||||
{
|
||||
mp->sendflag = 0;
|
||||
|
||||
i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_ERROR | SIO_ID | SIO_MULTI_SD | SIO_MULTI_SI);
|
||||
if (i != SIO_MULTI_SD)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
return i ^ SIO_MULTI_SD;
|
||||
}
|
||||
}
|
||||
if (mp->probe_count >= 0xe0)
|
||||
{
|
||||
i = MultiBootHandShake(mp);
|
||||
if (i)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
|
||||
if (mp->server_type == MULTIBOOT_SERVER_TYPE_QUICK
|
||||
&& mp->probe_count > 0xe1
|
||||
&& MultiBootCheckComplete(mp) == 0)
|
||||
{
|
||||
MultiBootWaitSendDone();
|
||||
goto output_burst;
|
||||
}
|
||||
|
||||
if (MultiBootCheckComplete(mp) == 0)
|
||||
{
|
||||
if (mp->handshake_timeout == 0)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
return MULTIBOOT_ERROR_HANDSHAKE_FAILURE;
|
||||
}
|
||||
mp->handshake_timeout--;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
switch (mp->probe_count)
|
||||
{
|
||||
case 0:
|
||||
k = 0x0e;
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
if (*(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2) != 0xffff)
|
||||
{
|
||||
break;
|
||||
}
|
||||
k >>= 1;
|
||||
}
|
||||
k &= 0x0e;
|
||||
mp->response_bit = k;
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
if (mp->client_bit & (1 << i))
|
||||
{
|
||||
if (j != ((MULTIBOOT_CLIENT_INFO << 8) | (1 << i)))
|
||||
{
|
||||
k = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
mp->client_bit &= k;
|
||||
if (k == 0)
|
||||
{
|
||||
mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT;
|
||||
}
|
||||
|
||||
if (mp->check_wait)
|
||||
{
|
||||
mp->check_wait--;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mp->response_bit != mp->client_bit)
|
||||
{
|
||||
MultiBootStartProbe(mp);
|
||||
goto case_1;
|
||||
}
|
||||
}
|
||||
output_master_info:
|
||||
return MultiBootSend(mp, (MULTIBOOT_MASTER_INFO << 8) | mp->client_bit);
|
||||
case_1:
|
||||
case 1:
|
||||
mp->probe_target_bit = 0;
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
if ((j >> 8) == MULTIBOOT_CLIENT_INFO)
|
||||
{
|
||||
MultiBoot_required_data[i - 1] = j;
|
||||
j &= 0xff;
|
||||
if (j == (1 << i))
|
||||
{
|
||||
mp->probe_target_bit |= j;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mp->response_bit != mp->probe_target_bit)
|
||||
{
|
||||
goto output_master_info;
|
||||
}
|
||||
mp->probe_count = 2;
|
||||
return MultiBootSend(mp, (MULTIBOOT_MASTER_START_PROBE << 8) | mp->probe_target_bit);
|
||||
case 2:
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
if (mp->probe_target_bit & (1 << i))
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
if (j != MultiBoot_required_data[i - 1])
|
||||
{
|
||||
mp->probe_target_bit ^= 1 << i;
|
||||
}
|
||||
}
|
||||
}
|
||||
goto output_header;
|
||||
case 0xd0:
|
||||
k = 1;
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
mp->client_data[i - 1] = j;
|
||||
if (mp->probe_target_bit & (1 << i))
|
||||
{
|
||||
if ((j >> 8) != MULTIBOOT_CLIENT_INFO
|
||||
&& (j >> 8) != MULTIBOOT_CLIENT_DLREADY)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
return MULTIBOOT_ERROR_NO_DLREADY;
|
||||
}
|
||||
if (j == MultiBoot_required_data[i - 1])
|
||||
{
|
||||
k = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (k == 0)
|
||||
{
|
||||
return MultiBootSend(mp, (MULTIBOOT_MASTER_REQUEST_DLREADY << 8) | mp->palette_data);
|
||||
}
|
||||
mp->probe_count = 0xd1;
|
||||
k = 0x11;
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
k += mp->client_data[i - 1];
|
||||
}
|
||||
mp->handshake_data = k;
|
||||
return MultiBootSend(mp, (MULTIBOOT_MASTER_START_DL << 8) | (k & 0xff));
|
||||
case 0xd1:
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
if (mp->probe_target_bit & (1 << i))
|
||||
{
|
||||
if ((j >> 8) != MULTIBOOT_CLIENT_DLREADY)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
return MULTIBOOT_ERROR_NO_DLREADY;
|
||||
}
|
||||
}
|
||||
}
|
||||
i = MultiBoot(mp);
|
||||
if (i == 0)
|
||||
{
|
||||
mp->probe_count = 0xe0;
|
||||
mp->handshake_timeout = MULTIBOOT_HANDSHAKE_TIMEOUT;
|
||||
return 0;
|
||||
}
|
||||
MultiBootInit(mp);
|
||||
mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT * 2;
|
||||
return MULTIBOOT_ERROR_BOOT_FAILURE;
|
||||
default:
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
if (mp->probe_target_bit & (1 << i))
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
if ((j >> 8) != (MULTIBOOT_MASTER_START_PROBE + 1 - (mp->probe_count >> 1))
|
||||
|| ((j & 0xff) != (1 << i)))
|
||||
{
|
||||
mp->probe_target_bit ^= 1 << i;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mp->probe_count == 0xc4)
|
||||
{
|
||||
mp->client_bit = mp->probe_target_bit & 0x0e;
|
||||
mp->probe_count = 0;
|
||||
goto output_master_info;
|
||||
}
|
||||
output_header:
|
||||
if (mp->probe_target_bit == 0)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
return MULTIBOOT_ERROR_NO_PROBE_TARGET;
|
||||
}
|
||||
mp->probe_count += 2;
|
||||
if (mp->probe_count == 0xc4)
|
||||
{
|
||||
goto output_master_info;
|
||||
}
|
||||
i = MultiBootSend(mp,
|
||||
(mp->masterp[mp->probe_count - 4 + 1] << 8)
|
||||
| mp->masterp[mp->probe_count - 4]);
|
||||
if (i)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
if (mp->server_type == MULTIBOOT_SERVER_TYPE_QUICK)
|
||||
{
|
||||
MultiBootWaitSendDone();
|
||||
goto output_burst;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int MultiBootSend(struct MultiBootParam *mp, u16 data)
|
||||
{
|
||||
int i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_MULTI_SD | SIO_MULTI_SI);
|
||||
if (i != SIO_MULTI_SD)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
return i ^ SIO_MULTI_SD;
|
||||
}
|
||||
REG_SIODATA8 = data;
|
||||
REG_SIOCNT = SIO_MULTI_MODE | SIO_START | SIO_115200_BPS;
|
||||
mp->sendflag = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void MultiBootStartProbe(struct MultiBootParam *mp)
|
||||
{
|
||||
if (mp->probe_count != 0)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
return;
|
||||
}
|
||||
mp->check_wait = 0;
|
||||
mp->client_bit = 0;
|
||||
mp->probe_count = 1;
|
||||
}
|
||||
|
||||
void MultiBootStartMaster(struct MultiBootParam *mp, const u8 *srcp, int length, u8 palette_color, s8 palette_speed)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
if (mp->probe_count != 0
|
||||
|| mp->client_bit == 0
|
||||
|| mp->check_wait != 0)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
return;
|
||||
}
|
||||
mp->boot_srcp = srcp;
|
||||
length = (length + 15) & ~15;
|
||||
if (length < MULTIBOOT_SEND_SIZE_MIN || length > MULTIBOOT_SEND_SIZE_MAX)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
return;
|
||||
}
|
||||
mp->boot_endp = srcp + length;
|
||||
switch (palette_speed)
|
||||
{
|
||||
case -4:
|
||||
case -3:
|
||||
case -2:
|
||||
case -1:
|
||||
i = (palette_color << 3) | (3 - palette_speed);
|
||||
break;
|
||||
case 0:
|
||||
i = 0x38 | palette_color;
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
i = (palette_color << 3) | (palette_speed - 1);
|
||||
break;
|
||||
}
|
||||
mp->palette_data = ((i & 0x3f) << 1) | 0x81;
|
||||
mp->probe_count = 0xd0;
|
||||
}
|
||||
|
||||
bool32 MultiBootCheckComplete(struct MultiBootParam *mp)
|
||||
{
|
||||
if (mp->probe_count == 0xe9)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int MultiBootHandShake(struct MultiBootParam *mp)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
#define send_data (mp->system_work[0])
|
||||
#define must_data (mp->system_work[1])
|
||||
switch (mp->probe_count)
|
||||
{
|
||||
case_0xe0:
|
||||
case 0xe0:
|
||||
mp->probe_count = 0xe1;
|
||||
must_data = 0x0000;
|
||||
send_data = 0x100000;
|
||||
return MultiBootSend(mp, 0x0000);
|
||||
default:
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
if ((mp->client_bit & (1 << i))
|
||||
&& j != must_data)
|
||||
{
|
||||
goto case_0xe0;
|
||||
}
|
||||
}
|
||||
mp->probe_count++;
|
||||
must_data = send_data & 0xffff;
|
||||
if (send_data == 0x0000)
|
||||
{
|
||||
must_data = mp->masterp[0xac] | (mp->masterp[0xad] << 8);
|
||||
send_data = must_data << 5;
|
||||
}
|
||||
send_data >>= 5;
|
||||
output_common:
|
||||
return MultiBootSend(mp, send_data);
|
||||
case 0xe7:
|
||||
case 0xe8:
|
||||
for (i = MULTIBOOT_NCHILD; i != 0; i--)
|
||||
{
|
||||
j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
|
||||
if ((mp->client_bit & (1 << i)) && j != must_data)
|
||||
{
|
||||
MultiBootInit(mp);
|
||||
return MULTIBOOT_ERROR_HANDSHAKE_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
mp->probe_count++;
|
||||
if (mp->probe_count == 0xe9)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
send_data = mp->masterp[0xae] | (mp->masterp[0xaf] << 8);
|
||||
must_data = send_data;
|
||||
goto output_common;
|
||||
}
|
||||
#undef send_data
|
||||
#undef must_data
|
||||
}
|
||||
|
||||
static void MultiBootWaitCycles(u32 cycles)
|
||||
{
|
||||
asm("mov r2, pc");
|
||||
asm("lsr r2, #24");
|
||||
asm("mov r1, #12");
|
||||
asm("cmp r2, #0x02");
|
||||
asm("beq MultiBootWaitCyclesLoop");
|
||||
asm("mov r1, #13");
|
||||
asm("cmp r2, #0x08");
|
||||
asm("beq MultiBootWaitCyclesLoop");
|
||||
asm("mov r1, #4");
|
||||
|
||||
asm("MultiBootWaitCyclesLoop:");
|
||||
asm("sub r0, r1");
|
||||
asm("bgt MultiBootWaitCyclesLoop");
|
||||
}
|
||||
|
||||
static void MultiBootWaitSendDone(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; (i < 31069) && (REG_SIOCNT & SIO_START); i++);
|
||||
MultiBootWaitCycles(600);
|
||||
}
|
||||
@@ -267,7 +267,7 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx)
|
||||
}
|
||||
|
||||
heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM);
|
||||
if (itemid_is_mail(heldItem))
|
||||
if (ItemIsMail(heldItem))
|
||||
GiveMailToMon2(&gPlayerParty[5], &mail);
|
||||
CompactPartySlots();
|
||||
CalculatePlayerPartyCount();
|
||||
|
||||
@@ -538,14 +538,14 @@ void PrintMysteryGiftOrEReaderTopMenu(bool8 mg_or_ereader, bool32 usePickOkCance
|
||||
if (!mg_or_ereader)
|
||||
{
|
||||
src = usePickOkCancel == TRUE ? gText_PickOKExit : gText_PickOKCancel;
|
||||
AddTextPrinterParametrized2(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gText_MysteryGift);
|
||||
AddTextPrinterParameterized4(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gText_MysteryGift);
|
||||
width = 222 - GetStringWidth(0, src, 0);
|
||||
AddTextPrinterParametrized2(0, 0, width, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, src);
|
||||
AddTextPrinterParameterized4(0, 0, width, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, src);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddTextPrinterParametrized2(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_MysteryGift);
|
||||
AddTextPrinterParametrized2(0, 0, 0x78, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_DecideStop);
|
||||
AddTextPrinterParameterized4(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_MysteryGift);
|
||||
AddTextPrinterParameterized4(0, 0, 0x78, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_DecideStop);
|
||||
}
|
||||
CopyWindowToVram(0, 2);
|
||||
PutWindowTilemap(0);
|
||||
@@ -596,7 +596,7 @@ void AddTextPrinterToWindow1(const u8 *str)
|
||||
{
|
||||
StringExpandPlaceholders(gStringVar4, str);
|
||||
FillWindowPixelBuffer(1, 0x11);
|
||||
AddTextPrinterParametrized2(1, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
|
||||
AddTextPrinterParameterized4(1, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
|
||||
DrawTextBorderOuter(1, 0x001, 0xF);
|
||||
PutWindowTilemap(1);
|
||||
CopyWindowToVram(1, 3);
|
||||
@@ -703,7 +703,7 @@ u32 MysteryGift_HandleThreeOptionMenu(u8 * unused0, u16 * unused1, u8 whichMenu)
|
||||
width = 0;
|
||||
for (i = 0; i < listMenuTemplate.totalItems; i++)
|
||||
{
|
||||
u32 curWidth = GetStringWidth(2, listMenuTemplate.items[i].unk_00, listMenuTemplate.lettersSpacing);
|
||||
u32 curWidth = GetStringWidth(2, listMenuTemplate.items[i].label, listMenuTemplate.lettersSpacing);
|
||||
if (curWidth > width)
|
||||
width = curWidth;
|
||||
}
|
||||
@@ -737,7 +737,7 @@ s8 mevent_message_print_and_prompt_yes_no(u8 * textState, u16 * windowId, bool8
|
||||
*windowId = AddWindow(&sWindowTemplate_PromptYesOrNo_Width20);
|
||||
}
|
||||
FillWindowPixelBuffer(*windowId, 0x11);
|
||||
AddTextPrinterParametrized2(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
|
||||
AddTextPrinterParameterized4(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
|
||||
DrawTextBorderOuter(*windowId, 0x001, 0x0F);
|
||||
CopyWindowToVram(*windowId, 2);
|
||||
PutWindowTilemap(*windowId);
|
||||
@@ -798,7 +798,7 @@ s32 HandleMysteryGiftListMenu(u8 * textState, u16 * windowId, bool32 cannotToss,
|
||||
}
|
||||
*windowId = AddWindow(&sMysteryGiftMenuWindowTemplate);
|
||||
FillWindowPixelBuffer(*windowId, 0x11);
|
||||
AddTextPrinterParametrized2(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
|
||||
AddTextPrinterParameterized4(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
|
||||
DrawTextBorderOuter(*windowId, 0x001, 0x0F);
|
||||
CopyWindowToVram(*windowId, 2);
|
||||
PutWindowTilemap(*windowId);
|
||||
|
||||
@@ -0,0 +1,765 @@
|
||||
#include "global.h"
|
||||
#include "malloc.h"
|
||||
#include "dma3.h"
|
||||
#include "task.h"
|
||||
#include "bg.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "window.h"
|
||||
#include "menu.h"
|
||||
#include "menu_helpers.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "quest_log.h"
|
||||
#include "text.h"
|
||||
#include "field_specials.h"
|
||||
#include "text_window.h"
|
||||
#include "script.h"
|
||||
#include "graphics.h"
|
||||
#include "palette.h"
|
||||
|
||||
#define DLG_WINDOW_PALETTE_NUM 15
|
||||
#define DLG_WINDOW_BASE_TILE_NUM 0x200
|
||||
#define STD_WINDOW_PALETTE_NUM 14
|
||||
#define STD_WINDOW_BASE_TILE_NUM 0x214
|
||||
|
||||
static EWRAM_DATA bool8 gUnknown_203AB58[4] = {FALSE}; // knizz: bgmaps_that_need_syncing
|
||||
static EWRAM_DATA u16 gUnknown_203AB5C = {0};
|
||||
static EWRAM_DATA void *gUnknown_203AB60[0x20] = {NULL};
|
||||
static EWRAM_DATA u8 sStartMenuWindowId = {0};
|
||||
|
||||
static const u8 gUnknown_841F428[] = { 8, 4, 1 };
|
||||
|
||||
static const struct WindowTemplate sStandardTextBox_WindowTemplates[] =
|
||||
{
|
||||
{
|
||||
.bg = 0,
|
||||
.tilemapLeft = 0x2,
|
||||
.tilemapTop = 0xF,
|
||||
.width = 0x1A,
|
||||
.height = 0x4,
|
||||
.paletteNum = DLG_WINDOW_PALETTE_NUM,
|
||||
.baseBlock = 0x198,
|
||||
},
|
||||
DUMMY_WIN_TEMPLATE
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sYesNo_WindowTemplate =
|
||||
{
|
||||
.bg = 0,
|
||||
.tilemapLeft = 0x15,
|
||||
.tilemapTop = 0x9,
|
||||
.width = 0x6,
|
||||
.height = 0x4,
|
||||
.paletteNum = DLG_WINDOW_PALETTE_NUM,
|
||||
.baseBlock = 0x125,
|
||||
};
|
||||
|
||||
static const struct FontInfo gFontInfos[] =
|
||||
{
|
||||
{
|
||||
.fontFunction = Font0Func,
|
||||
.maxLetterWidth = 0x8,
|
||||
.maxLetterHeight = 0xD,
|
||||
.letterSpacing = 0x0,
|
||||
.lineSpacing = 0x0,
|
||||
.unk = 0x0,
|
||||
.fgColor = 0x2,
|
||||
.bgColor = 0x1,
|
||||
.shadowColor = 0x3,
|
||||
},
|
||||
{
|
||||
.fontFunction = Font1Func,
|
||||
.maxLetterWidth = 0x8,
|
||||
.maxLetterHeight = 0xE,
|
||||
.letterSpacing = 0x0,
|
||||
.lineSpacing = 0x0,
|
||||
.unk = 0x0,
|
||||
.fgColor = 0x2,
|
||||
.bgColor = 0x1,
|
||||
.shadowColor = 0x3,
|
||||
},
|
||||
{
|
||||
.fontFunction = Font2Func,
|
||||
.maxLetterWidth = 0xA,
|
||||
.maxLetterHeight = 0xE,
|
||||
.letterSpacing = 0x1,
|
||||
.lineSpacing = 0x0,
|
||||
.unk = 0x0,
|
||||
.fgColor = 0x2,
|
||||
.bgColor = 0x1,
|
||||
.shadowColor = 0x3,
|
||||
},
|
||||
{
|
||||
.fontFunction = Font3Func,
|
||||
.maxLetterWidth = 0xA,
|
||||
.maxLetterHeight = 0xE,
|
||||
.letterSpacing = 0x1,
|
||||
.lineSpacing = 0x0,
|
||||
.unk = 0x0,
|
||||
.fgColor = 0x2,
|
||||
.bgColor = 0x1,
|
||||
.shadowColor = 0x3,
|
||||
},
|
||||
{
|
||||
.fontFunction = Font4Func,
|
||||
.maxLetterWidth = 0xA,
|
||||
.maxLetterHeight = 0xE,
|
||||
.letterSpacing = 0x0,
|
||||
.lineSpacing = 0x0,
|
||||
.unk = 0x0,
|
||||
.fgColor = 0x2,
|
||||
.bgColor = 0x1,
|
||||
.shadowColor = 0x3,
|
||||
},
|
||||
{
|
||||
.fontFunction = Font5Func,
|
||||
.maxLetterWidth = 0xA,
|
||||
.maxLetterHeight = 0xE,
|
||||
.letterSpacing = 0x0,
|
||||
.lineSpacing = 0x0,
|
||||
.unk = 0x0,
|
||||
.fgColor = 0x2,
|
||||
.bgColor = 0x1,
|
||||
.shadowColor = 0x3,
|
||||
},
|
||||
{
|
||||
.fontFunction = Font6Func,
|
||||
.maxLetterWidth = 0x8,
|
||||
.maxLetterHeight = 0x10,
|
||||
.letterSpacing = 0x0,
|
||||
.lineSpacing = 0x2,
|
||||
.unk = 0x0,
|
||||
.fgColor = 0x2,
|
||||
.bgColor = 0x1,
|
||||
.shadowColor = 0x3,
|
||||
},
|
||||
{
|
||||
.fontFunction = NULL,
|
||||
.maxLetterWidth = 0x8,
|
||||
.maxLetterHeight = 0x8,
|
||||
.letterSpacing = 0x0,
|
||||
.lineSpacing = 0x0,
|
||||
.unk = 0x0,
|
||||
.fgColor = 0x1,
|
||||
.bgColor = 0x2,
|
||||
.shadowColor = 0xF,
|
||||
}
|
||||
};
|
||||
|
||||
static const u8 gMenuCursorDimensions[][2] =
|
||||
{
|
||||
{ 0x8, 0xD },
|
||||
{ 0x8, 0xE },
|
||||
{ 0x8, 0xE },
|
||||
{ 0x8, 0xE },
|
||||
{ 0x8, 0xE },
|
||||
{ 0x8, 0xE },
|
||||
{ 0x8, 0x10 },
|
||||
{ 0x0, 0x0 }
|
||||
};
|
||||
|
||||
static u16 CopyDecompressedTileDataToVram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode);
|
||||
static void WindowFunc_DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
|
||||
static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
|
||||
static void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
|
||||
static void WindowFunc_ClearStdWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
|
||||
static void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId);
|
||||
|
||||
void ClearScheduledBgCopiesToVram(void)
|
||||
{
|
||||
memset(gUnknown_203AB58, 0, sizeof(gUnknown_203AB58));
|
||||
}
|
||||
|
||||
void ScheduleBgCopyTilemapToVram(u8 bgId)
|
||||
{
|
||||
gUnknown_203AB58[bgId] = TRUE;
|
||||
}
|
||||
|
||||
void DoScheduledBgTilemapCopiesToVram(void)
|
||||
{
|
||||
if (gUnknown_203AB58[0] == TRUE)
|
||||
{
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
gUnknown_203AB58[0] = FALSE;
|
||||
}
|
||||
if (gUnknown_203AB58[1] == TRUE)
|
||||
{
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
gUnknown_203AB58[1] = FALSE;
|
||||
}
|
||||
if (gUnknown_203AB58[2] == TRUE)
|
||||
{
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
gUnknown_203AB58[2] = FALSE;
|
||||
}
|
||||
if (gUnknown_203AB58[3] == TRUE)
|
||||
{
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
gUnknown_203AB58[3] = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void ResetTempTileDataBuffers(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < (s32)NELEMS(gUnknown_203AB60); i++)
|
||||
{
|
||||
gUnknown_203AB60[i] = NULL;
|
||||
}
|
||||
gUnknown_203AB5C = 0;
|
||||
}
|
||||
|
||||
bool8 FreeTempTileDataBuffersIfPossible(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!IsDma3ManagerBusyWithBgCopy())
|
||||
{
|
||||
if (gUnknown_203AB5C)
|
||||
{
|
||||
for (i = 0; i < gUnknown_203AB5C; i++)
|
||||
{
|
||||
FREE_AND_SET_NULL(gUnknown_203AB60[i]);
|
||||
}
|
||||
gUnknown_203AB5C = 0;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)
|
||||
{
|
||||
u32 sizeOut;
|
||||
|
||||
if (gUnknown_203AB5C < NELEMS(gUnknown_203AB60))
|
||||
{
|
||||
void *ptr = MallocAndDecompress(src, &sizeOut);
|
||||
if (!size)
|
||||
size = sizeOut;
|
||||
if (ptr)
|
||||
{
|
||||
CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode);
|
||||
gUnknown_203AB60[gUnknown_203AB5C++] = ptr;
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *DecompressAndCopyTileDataToVram2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)
|
||||
{
|
||||
u32 sizeOut;
|
||||
|
||||
if (gUnknown_203AB5C < NELEMS(gUnknown_203AB60))
|
||||
{
|
||||
void *ptr = MallocAndDecompress(src, &sizeOut);
|
||||
if (sizeOut > size)
|
||||
sizeOut = size;
|
||||
if (ptr)
|
||||
{
|
||||
CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode);
|
||||
gUnknown_203AB60[gUnknown_203AB5C++] = ptr;
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)
|
||||
{
|
||||
u32 sizeOut;
|
||||
|
||||
void *ptr = MallocAndDecompress(src, &sizeOut);
|
||||
if (!size)
|
||||
size = sizeOut;
|
||||
if (ptr)
|
||||
{
|
||||
u8 taskId = CreateTask(TaskFreeBufAfterCopyingTileDataToVram, 0);
|
||||
gTasks[taskId].data[0] = CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode);
|
||||
SetWordTaskArg(taskId, 1, (u32)ptr);
|
||||
}
|
||||
}
|
||||
|
||||
void DecompressAndLoadBgGfxUsingHeap2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)
|
||||
{
|
||||
u32 sizeOut;
|
||||
|
||||
void *ptr = MallocAndDecompress(src, &sizeOut);
|
||||
if (sizeOut > size)
|
||||
sizeOut = size;
|
||||
if (ptr)
|
||||
{
|
||||
u8 taskId = CreateTask(TaskFreeBufAfterCopyingTileDataToVram, 0);
|
||||
gTasks[taskId].data[0] = CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode);
|
||||
SetWordTaskArg(taskId, 1, (u32)ptr);
|
||||
}
|
||||
}
|
||||
|
||||
static void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId)
|
||||
{
|
||||
if (!CheckForSpaceForDma3Request(gTasks[taskId].data[0]))
|
||||
{
|
||||
Free((void *)GetWordTaskArg(taskId, 1));
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void *MallocAndDecompress(const void *src, u32 *size)
|
||||
{
|
||||
void *ptr;
|
||||
u8 *sizeAsBytes = (u8 *)size;
|
||||
const u8 *srcAsBytes = src;
|
||||
|
||||
sizeAsBytes[0] = srcAsBytes[1];
|
||||
sizeAsBytes[1] = srcAsBytes[2];
|
||||
sizeAsBytes[2] = srcAsBytes[3];
|
||||
sizeAsBytes[3] = 0;
|
||||
|
||||
ptr = Alloc(*size);
|
||||
if (ptr)
|
||||
LZ77UnCompWram(src, ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static u16 CopyDecompressedTileDataToVram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode)
|
||||
{
|
||||
switch (mode)
|
||||
{
|
||||
case 1:
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
return LoadBgTiles(bgId, src, size, offset);
|
||||
}
|
||||
return LoadBgTilemap(bgId, src, size, offset);
|
||||
}
|
||||
|
||||
void SetBgRectPal(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette)
|
||||
{
|
||||
u8 i, j;
|
||||
u16 *ptr = GetBgTilemapBuffer(bgId);
|
||||
|
||||
for (i = top; i < top + height; i++)
|
||||
{
|
||||
for (j = left; j < left + width; j++)
|
||||
{
|
||||
ptr[(i * 32) + j] = (ptr[(i * 32) + j] & 0xFFF) | (palette << 12);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CopyRectIntoAltRect(u8 bgId, u16 *dest, u8 left, u8 top, u8 width, u8 height)
|
||||
{
|
||||
u8 i,j;
|
||||
const u16 *src = GetBgTilemapBuffer(bgId);
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
dest[(i * width) + j] = src[(i + top) * 32 + j + left];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ResetBgPositions(void)
|
||||
{
|
||||
ChangeBgX(0, 0, 0);
|
||||
ChangeBgX(1, 0, 0);
|
||||
ChangeBgX(2, 0, 0);
|
||||
ChangeBgX(3, 0, 0);
|
||||
ChangeBgY(0, 0, 0);
|
||||
ChangeBgY(1, 0, 0);
|
||||
ChangeBgY(2, 0, 0);
|
||||
ChangeBgY(3, 0, 0);
|
||||
}
|
||||
|
||||
void InitStandardTextBoxWindows(void)
|
||||
{
|
||||
InitWindows(sStandardTextBox_WindowTemplates);
|
||||
sStartMenuWindowId = 0xFF;
|
||||
MapNamePopupWindowIdSetDummy();
|
||||
}
|
||||
|
||||
void FreeAllOverworldWindowBuffers(void)
|
||||
{
|
||||
FreeAllWindowBuffers();
|
||||
}
|
||||
|
||||
void ResetBg0(void)
|
||||
{
|
||||
ChangeBgX(0, 0, 0);
|
||||
ChangeBgY(0, 0, 0);
|
||||
DeactivateAllTextPrinters();
|
||||
sub_80F6E9C();
|
||||
}
|
||||
|
||||
u16 RunTextPrinters_CheckPrinter0Active(void)
|
||||
{
|
||||
RunTextPrinters();
|
||||
return IsTextPrinterActive(0);
|
||||
}
|
||||
|
||||
u16 AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 fgColor, u8 bgColor, u8 shadowColor)
|
||||
{
|
||||
struct TextPrinterTemplate printer;
|
||||
|
||||
printer.currentChar = str;
|
||||
printer.windowId = windowId;
|
||||
printer.fontId = fontId;
|
||||
printer.x = 0;
|
||||
printer.y = 1;
|
||||
printer.currentX = 0;
|
||||
printer.currentY = 1;
|
||||
printer.letterSpacing = 1;
|
||||
printer.lineSpacing = 1;
|
||||
printer.unk = 0;
|
||||
printer.fgColor = fgColor;
|
||||
printer.bgColor = bgColor;
|
||||
printer.shadowColor = shadowColor;
|
||||
gTextFlags.useAlternateDownArrow = 0;
|
||||
return AddTextPrinter(&printer, speed, callback);
|
||||
}
|
||||
|
||||
void AddTextPrinterDiffStyle(bool8 allowSkippingDelayWithButtonPress)
|
||||
{
|
||||
u8 result;
|
||||
void *nptr = NULL;
|
||||
|
||||
gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress;
|
||||
result = ContextNpcGetTextColor();
|
||||
if (result == 0)
|
||||
AddTextPrinterParameterized2(0, 4, gStringVar4, GetTextSpeedSetting(), nptr, 8, 1, 3);
|
||||
else if (result == 1)
|
||||
AddTextPrinterParameterized2(0, 5, gStringVar4, GetTextSpeedSetting(), nptr, 4, 1, 3);
|
||||
else
|
||||
AddTextPrinterParameterized2(0, 2, gStringVar4, GetTextSpeedSetting(), nptr, 2, 1, 3);
|
||||
}
|
||||
|
||||
void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress)
|
||||
{
|
||||
gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress;
|
||||
AddTextPrinterParameterized2(0, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3);
|
||||
}
|
||||
|
||||
void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed)
|
||||
{
|
||||
gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress;
|
||||
AddTextPrinterParameterized2(0, 2, gStringVar4, speed, NULL, 2, 1, 3);
|
||||
}
|
||||
|
||||
void sub_80F6E9C(void)
|
||||
{
|
||||
if (gUnknown_203ADFA == 2)
|
||||
{
|
||||
gTextFlags.autoScroll = 1;
|
||||
TextWindow_LoadTilesStdFrame1(0, DLG_WINDOW_BASE_TILE_NUM);
|
||||
}
|
||||
else
|
||||
{
|
||||
Menu_LoadStdPal();
|
||||
TextWindow_LoadResourcesStdFrame0(0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10);
|
||||
}
|
||||
TextWindow_SetUserSelectedFrame(0, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM * 0x10);
|
||||
}
|
||||
|
||||
void DrawDialogueFrame(u8 windowId, bool8 copyToVram)
|
||||
{
|
||||
CallWindowFunction(windowId, WindowFunc_DrawDialogueFrame);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
|
||||
PutWindowTilemap(windowId);
|
||||
if (copyToVram == TRUE)
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
void DrawStdWindowFrame(u8 windowId, bool8 copyToVram)
|
||||
{
|
||||
CallWindowFunction(windowId, WindowFunc_DrawStandardFrame);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
|
||||
PutWindowTilemap(windowId);
|
||||
if (copyToVram == TRUE)
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
void ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram)
|
||||
{
|
||||
CallWindowFunction(windowId, WindowFunc_ClearDialogWindowAndFrame);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
|
||||
ClearWindowTilemap(windowId);
|
||||
if (copyToVram == TRUE)
|
||||
CopyWindowToVram(windowId, 3);
|
||||
if (gUnknown_203ADFA == 2)
|
||||
sub_8111134();
|
||||
}
|
||||
|
||||
void ClearStdWindowAndFrame(u8 windowId, bool8 copyToVram)
|
||||
{
|
||||
CallWindowFunction(windowId, WindowFunc_ClearStdWindowAndFrame);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
|
||||
ClearWindowTilemap(windowId);
|
||||
if (copyToVram == TRUE)
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
||||
{
|
||||
int i;
|
||||
|
||||
FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 1, tilemapTop - 1, 1, 1, STD_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 1, tilemapLeft, tilemapTop - 1, width, 1, STD_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 2, tilemapLeft + width, tilemapTop - 1, 1, 1, STD_WINDOW_PALETTE_NUM);
|
||||
for (i = tilemapTop; i < tilemapTop + height; i++)
|
||||
{
|
||||
FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 3, tilemapLeft - 1, i, 1, 1, STD_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 5, tilemapLeft + width, i, 1, 1, STD_WINDOW_PALETTE_NUM);
|
||||
}
|
||||
FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop + height, 1, 1, STD_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 7, tilemapLeft, tilemapTop + height, width, 1, STD_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop + height, 1, 1, STD_WINDOW_PALETTE_NUM);
|
||||
}
|
||||
|
||||
static void WindowFunc_DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
||||
{
|
||||
if (!IsMsgSignPost() || gUnknown_203ADFA == 2)
|
||||
{
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 2, tilemapLeft, tilemapTop - 1, width, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 5, tilemapLeft - 2, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 10), tilemapLeft - 2, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 11), tilemapLeft - 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 12), tilemapLeft + width, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 13), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5), tilemapLeft - 2, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6), tilemapLeft - 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 8), tilemapLeft + width, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 9), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), tilemapLeft, tilemapTop + 4, width, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
}
|
||||
else
|
||||
{
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 2, tilemapLeft, tilemapTop - 1, width, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 5, tilemapLeft - 2, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5), tilemapLeft - 2, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6), tilemapLeft - 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 8), tilemapLeft + width, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 9), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 10), tilemapLeft - 2, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 11), tilemapLeft - 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 12), tilemapLeft + width, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 13), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), tilemapLeft, tilemapTop + 4, width, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
|
||||
}
|
||||
}
|
||||
|
||||
static void WindowFunc_ClearStdWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
||||
{
|
||||
FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, STD_WINDOW_PALETTE_NUM);
|
||||
}
|
||||
|
||||
static void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
|
||||
{
|
||||
FillBgTilemapBufferRect(bg, 0, tilemapLeft - 2, tilemapTop - 1, width + 4, height + 2, STD_WINDOW_PALETTE_NUM);
|
||||
}
|
||||
|
||||
void sub_80F771C(bool8 copyToVram)
|
||||
{
|
||||
FillBgTilemapBufferRect(0, 0, 0, 0, 0x20, 0x20, 0x11);
|
||||
if (copyToVram == TRUE)
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
}
|
||||
|
||||
void SetStdWindowBorderStyle(u8 windowId, bool8 copyToVram)
|
||||
{
|
||||
DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM);
|
||||
}
|
||||
|
||||
void sub_80F7768(u8 windowId, bool8 copyToVram)
|
||||
{
|
||||
if (gUnknown_203ADFA == 2)
|
||||
{
|
||||
gTextFlags.autoScroll = 1;
|
||||
TextWindow_LoadTilesStdFrame1(0, DLG_WINDOW_BASE_TILE_NUM);
|
||||
}
|
||||
else
|
||||
{
|
||||
TextWindow_LoadResourcesStdFrame0(windowId, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10);
|
||||
}
|
||||
DrawDialogFrameWithCustomTileAndPalette(windowId, copyToVram, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM);
|
||||
}
|
||||
|
||||
void Menu_LoadStdPal(void)
|
||||
{
|
||||
LoadPalette(gTMCaseMainWindowPalette, STD_WINDOW_PALETTE_NUM * 0x10, 0x14);
|
||||
}
|
||||
|
||||
void Menu_LoadStdPalAt(u16 offset)
|
||||
{
|
||||
LoadPalette(gTMCaseMainWindowPalette, offset, 0x14);
|
||||
}
|
||||
|
||||
static const u16 *GetTmCaseMainWindowPalette(void)
|
||||
{
|
||||
return gTMCaseMainWindowPalette;
|
||||
}
|
||||
|
||||
static u16 GetStdPalColor(u8 colorNum)
|
||||
{
|
||||
if (colorNum > 0xF)
|
||||
colorNum = 0;
|
||||
return gTMCaseMainWindowPalette[colorNum];
|
||||
}
|
||||
|
||||
void DisplayItemMessageOnField(u8 taskId, u8 bgId, const u8 *string, TaskFunc callback)
|
||||
{
|
||||
sub_80F6E9C();
|
||||
DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, bgId, GetTextSpeedSetting(), string, callback);
|
||||
CopyWindowToVram(0, 3);
|
||||
}
|
||||
|
||||
void DisplayYesNoMenuDefaultYes(void)
|
||||
{
|
||||
CreateYesNoMenu(&sYesNo_WindowTemplate, 2, 0, 2, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0);
|
||||
}
|
||||
|
||||
void DisplayYesNoMenuDefaultNo(void)
|
||||
{
|
||||
CreateYesNoMenu(&sYesNo_WindowTemplate, 2, 0, 2, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 1);
|
||||
}
|
||||
|
||||
u8 GetTextSpeedSetting(void)
|
||||
{
|
||||
u32 speed;
|
||||
if (gSaveBlock2Ptr->optionsTextSpeed > OPTIONS_TEXT_SPEED_FAST)
|
||||
gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_MID;
|
||||
return gUnknown_841F428[gSaveBlock2Ptr->optionsTextSpeed];
|
||||
}
|
||||
|
||||
u8 sub_80F78E0(u8 height)
|
||||
{
|
||||
if (sStartMenuWindowId == 0xFF)
|
||||
{
|
||||
struct WindowTemplate template = SetWindowTemplateFields(0, 0x16, 1, 7, height * 2 - 1, DLG_WINDOW_PALETTE_NUM, 0x13D);
|
||||
sStartMenuWindowId = AddWindow(&template);
|
||||
PutWindowTilemap(sStartMenuWindowId);
|
||||
}
|
||||
return sStartMenuWindowId;
|
||||
}
|
||||
|
||||
u8 GetStartMenuWindowId(void)
|
||||
{
|
||||
return sStartMenuWindowId;
|
||||
}
|
||||
|
||||
void RemoveStartMenuWindow(void)
|
||||
{
|
||||
if (sStartMenuWindowId != 0xFF)
|
||||
{
|
||||
RemoveWindow(sStartMenuWindowId);
|
||||
sStartMenuWindowId = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
static u16 GetDlgWindowBaseTileNum(void)
|
||||
{
|
||||
return DLG_WINDOW_BASE_TILE_NUM;
|
||||
}
|
||||
|
||||
u16 GetStdWindowBaseTileNum(void)
|
||||
{
|
||||
return STD_WINDOW_BASE_TILE_NUM;
|
||||
}
|
||||
|
||||
void sub_80F7974(const u8 * text)
|
||||
{
|
||||
sub_814FE6C(sub_8112EB4(), DLG_WINDOW_BASE_TILE_NUM, 0x10 * DLG_WINDOW_PALETTE_NUM);
|
||||
sub_8113018(text, 2);
|
||||
}
|
||||
|
||||
void sub_80F7998(void)
|
||||
{
|
||||
sub_8112EDC(2);
|
||||
}
|
||||
|
||||
void sub_80F79A4(void)
|
||||
{
|
||||
Menu_LoadStdPal();
|
||||
sub_814FEEC(0, DLG_WINDOW_BASE_TILE_NUM, 0x10 * DLG_WINDOW_PALETTE_NUM);
|
||||
TextWindow_SetUserSelectedFrame(0, STD_WINDOW_BASE_TILE_NUM, 0x10 * STD_WINDOW_PALETTE_NUM);
|
||||
}
|
||||
|
||||
void SetDefaultFontsPointer(void)
|
||||
{
|
||||
SetFontsPointer(&gFontInfos[0]);
|
||||
}
|
||||
|
||||
u8 GetFontAttribute(u8 fontId, u8 attributeId)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
switch (attributeId)
|
||||
{
|
||||
case FONTATTR_MAX_LETTER_WIDTH:
|
||||
result = gFontInfos[fontId].maxLetterWidth;
|
||||
break;
|
||||
case FONTATTR_MAX_LETTER_HEIGHT:
|
||||
result = gFontInfos[fontId].maxLetterHeight;
|
||||
break;
|
||||
case FONTATTR_LETTER_SPACING:
|
||||
result = gFontInfos[fontId].letterSpacing;
|
||||
break;
|
||||
case FONTATTR_LINE_SPACING:
|
||||
result = gFontInfos[fontId].lineSpacing;
|
||||
break;
|
||||
case FONTATTR_UNKNOWN:
|
||||
result = gFontInfos[fontId].unk;
|
||||
break;
|
||||
case FONTATTR_COLOR_FOREGROUND:
|
||||
result = gFontInfos[fontId].fgColor;
|
||||
break;
|
||||
case FONTATTR_COLOR_BACKGROUND:
|
||||
result = gFontInfos[fontId].bgColor;
|
||||
break;
|
||||
case FONTATTR_COLOR_SHADOW:
|
||||
result = gFontInfos[fontId].shadowColor;
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
u8 GetMenuCursorDimensionByFont(u8 fontId, u8 whichDimension)
|
||||
{
|
||||
return gMenuCursorDimensions[fontId][whichDimension];
|
||||
}
|
||||
+52
-52
@@ -14,7 +14,7 @@
|
||||
#include "menu.h"
|
||||
#include "help_system.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "pokemon_3.h"
|
||||
#include "pokemon.h"
|
||||
#include "sound.h"
|
||||
#include "event_scripts.h"
|
||||
#include "scanline_effect.h"
|
||||
@@ -37,7 +37,7 @@ struct OakSpeechResources
|
||||
u16 unk_0010;
|
||||
u16 unk_0012;
|
||||
u16 unk_0014[4];
|
||||
u8 unk_001C[3];
|
||||
struct TextColor textColor;
|
||||
u8 textSpeed;
|
||||
u8 filler_0020[0x1800];
|
||||
u8 bg2TilemapBuffer[0x400];
|
||||
@@ -495,12 +495,12 @@ static void Task_OaksSpeech1(u8 taskId)
|
||||
ScanlineEffect_Stop();
|
||||
ResetSpriteData();
|
||||
FreeAllSpritePalettes();
|
||||
reset_temp_tile_data_buffers();
|
||||
ResetTempTileDataBuffers();
|
||||
HelpSystem_SetSomeVariable2(2);
|
||||
break;
|
||||
case 1:
|
||||
sOakSpeechResources = AllocZeroed(sizeof(*sOakSpeechResources));
|
||||
SetUpMonSpriteManagerMaybe(1, 1);
|
||||
OakSpeechNidoranFSetup(1, 1);
|
||||
break;
|
||||
case 2:
|
||||
SetGpuReg(REG_OFFSET_WIN0H, 0);
|
||||
@@ -536,17 +536,17 @@ static void Task_OaksSpeech1(u8 taskId)
|
||||
case 5:
|
||||
sOakSpeechResources->textSpeed = GetTextSpeedSetting();
|
||||
gTextFlags.canABSpeedUpPrint = TRUE;
|
||||
decompress_and_copy_tile_data_to_vram(1, sOakSpeechGfx_GameStartHelpUI, 0, 0, 0);
|
||||
DecompressAndCopyTileDataToVram(1, sOakSpeechGfx_GameStartHelpUI, 0, 0, 0);
|
||||
break;
|
||||
case 6:
|
||||
if (free_temp_tile_data_buffers_if_possible())
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return;
|
||||
ClearDialogWindowAndFrame(0, 1);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x0000, 0, 0, 32, 32);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
break;
|
||||
case 7:
|
||||
CreateWindow_SnapRight_StdPal(0, 30, 0, 13, 0x1C4);
|
||||
CreateTopBarWindowLoadPalette(0, 30, 0, 13, 0x1C4);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0xD00F, 0, 0, 30, 2);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0xD002, 0, 2, 30, 1);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0xD00E, 0, 19, 30, 1);
|
||||
@@ -572,11 +572,11 @@ static void Task_OaksSpeech1(u8 taskId)
|
||||
|
||||
static void CreateHelpDocsPage1(void)
|
||||
{
|
||||
Menu_PrintHelpSystemUIHeader(gText_Controls, gText_ABUTTONNext, 0, 0, 1);
|
||||
TopBarWindowPrintTwoStrings(gText_Controls, gText_ABUTTONNext, 0, 0, 1);
|
||||
sOakSpeechResources->unk_0014[0] = AddWindow(sHelpDocsWindowTemplatePtrs[sOakSpeechResources->unk_0012]);
|
||||
PutWindowTilemap(sOakSpeechResources->unk_0014[0]);
|
||||
FillWindowPixelBuffer(sOakSpeechResources->unk_0014[0], 0x00);
|
||||
AddTextPrinterParametrized2(sOakSpeechResources->unk_0014[0], 2, 2, 0, 1, 1, &sTextColor_HelpSystem, 0, gNewGame_HelpDocs1);
|
||||
AddTextPrinterParameterized4(sOakSpeechResources->unk_0014[0], 2, 2, 0, 1, 1, &sTextColor_HelpSystem, 0, gNewGame_HelpDocs1);
|
||||
CopyWindowToVram(sOakSpeechResources->unk_0014[0], 3);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x3000, 1, 3, 5, 16);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
@@ -592,13 +592,13 @@ static void Task_OakSpeech4(u8 taskId)
|
||||
}
|
||||
else
|
||||
{
|
||||
PrintTextOnRightSnappedWindow(gText_ABUTTONNext_BBUTTONBack, 0, 1);
|
||||
TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, 1);
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
sOakSpeechResources->unk_0014[i] = AddWindow(&sHelpDocsWindowTemplatePtrs[sOakSpeechResources->unk_0012][i]);
|
||||
PutWindowTilemap(sOakSpeechResources->unk_0014[i]);
|
||||
FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00);
|
||||
AddTextPrinterParametrized2(sOakSpeechResources->unk_0014[i], 2, 6, 0, 1, 1, &sTextColor_HelpSystem, 0, sHelpDocsPtrs[i + r7 * 3]);
|
||||
AddTextPrinterParameterized4(sOakSpeechResources->unk_0014[i], 2, 6, 0, 1, 1, &sTextColor_HelpSystem, 0, sHelpDocsPtrs[i + r7 * 3]);
|
||||
CopyWindowToVram(sOakSpeechResources->unk_0014[i], 3);
|
||||
}
|
||||
|
||||
@@ -716,9 +716,9 @@ static void Task_OakSpeech6(u8 taskId)
|
||||
else
|
||||
{
|
||||
PlayBGM(BGM_FRLG_GAME_EXPLANATION_MIDDLE);
|
||||
sub_810F71C();
|
||||
PrintTextOnRightSnappedWindow(gText_ABUTTONNext, 0, 1);
|
||||
sOakSpeechResources->unk_0008 = malloc_and_decompress(sNewGameAdventureIntroTilemap, &sp14);
|
||||
ClearTopBarWindow();
|
||||
TopBarWindowPrintString(gText_ABUTTONNext, 0, 1);
|
||||
sOakSpeechResources->unk_0008 = MallocAndDecompress(sNewGameAdventureIntroTilemap, &sp14);
|
||||
CopyToBgTilemapBufferRect(1, sOakSpeechResources->unk_0008, 0, 2, 30, 19);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
Free(sOakSpeechResources->unk_0008);
|
||||
@@ -730,7 +730,7 @@ static void Task_OakSpeech6(u8 taskId)
|
||||
sOakSpeechResources->unk_0012 = 0;
|
||||
gMain.state = 0;
|
||||
data[15] = 16;
|
||||
AddTextPrinterParametrized2(data[14], 2, 3, 5, 1, 0, &sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[0]);
|
||||
AddTextPrinterParameterized4(data[14], 2, 3, 5, 1, 0, &sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[0]);
|
||||
data[5] = CreateTextCursorSpriteForOakSpeech(0, 0xe2, 0x91, 0, 0);
|
||||
gSprites[data[5]].oam.objMode = ST_OAM_OBJ_BLEND;
|
||||
gSprites[data[5]].oam.priority = 0;
|
||||
@@ -790,16 +790,16 @@ static void Task_OakSpeech7(u8 taskId)
|
||||
if (data[15] <= 0)
|
||||
{
|
||||
FillWindowPixelBuffer(data[14], 0x00);
|
||||
AddTextPrinterParametrized2(data[14], 2, 3, 5, 1, 0, &sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[sOakSpeechResources->unk_0012]);
|
||||
AddTextPrinterParameterized4(data[14], 2, 3, 5, 1, 0, &sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[sOakSpeechResources->unk_0012]);
|
||||
if (sOakSpeechResources->unk_0012 == 0)
|
||||
{
|
||||
sub_810F71C();
|
||||
PrintTextOnRightSnappedWindow(gText_ABUTTONNext, 0, 1);
|
||||
ClearTopBarWindow();
|
||||
TopBarWindowPrintString(gText_ABUTTONNext, 0, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_810F71C();
|
||||
PrintTextOnRightSnappedWindow(gText_ABUTTONNext_BBUTTONBack, 0, 1);
|
||||
ClearTopBarWindow();
|
||||
TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, 1);
|
||||
}
|
||||
gMain.state++;
|
||||
}
|
||||
@@ -846,7 +846,7 @@ static void Task_OakSpeech8(u8 taskId)
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
sub_810F740();
|
||||
DestroyTopBarWindow();
|
||||
FillWindowPixelBuffer(data[14], 0x00);
|
||||
ClearWindowTilemap(data[14]);
|
||||
CopyWindowToVram(data[14], 3);
|
||||
@@ -869,7 +869,7 @@ static void Task_OakSpeech9(u8 taskId)
|
||||
data[3]--;
|
||||
else
|
||||
{
|
||||
sOakSpeechResources->solidColorsGfx = malloc_and_decompress(sOakSpeechGfx_SolidColors, &size);
|
||||
sOakSpeechResources->solidColorsGfx = MallocAndDecompress(sOakSpeechGfx_SolidColors, &size);
|
||||
LoadBgTiles(1, sOakSpeechResources->solidColorsGfx, size, 0);
|
||||
CopyToBgTilemapBuffer(1, sOakSpeech_BackgroundTilemap, 0, 0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
@@ -889,11 +889,11 @@ static void Task_OakSpeech9(u8 taskId)
|
||||
if (str != gStringVar4) \
|
||||
{ \
|
||||
StringExpandPlaceholders(gStringVar4, str); \
|
||||
AddTextPrinterParametrized(0, 4, gStringVar4, speed, NULL, 2, 1, 3); \
|
||||
AddTextPrinterParameterized2(0, 4, gStringVar4, speed, NULL, 2, 1, 3); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
AddTextPrinterParametrized(0, 4, str, speed, NULL, 2, 1, 3); \
|
||||
AddTextPrinterParameterized2(0, 4, str, speed, NULL, 2, 1, 3); \
|
||||
} \
|
||||
CopyWindowToVram(0, 3); \
|
||||
})
|
||||
@@ -1054,17 +1054,17 @@ static void Task_OakSpeech19(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].data[13] = AddWindow(&sNewGameAdventureIntroWindowTemplates[1]);
|
||||
PutWindowTilemap(gTasks[taskId].data[13]);
|
||||
SetWindowBorderStyle(gTasks[taskId].data[13], 1, sub_80F796C(), 14);
|
||||
DrawStdFrameWithCustomTileAndPalette(gTasks[taskId].data[13], 1, GetStdWindowBaseTileNum(), 14);
|
||||
FillWindowPixelBuffer(gTasks[taskId].data[13], 0x11);
|
||||
sOakSpeechResources->unk_001C[0] = 1;
|
||||
sOakSpeechResources->unk_001C[1] = 2;
|
||||
sOakSpeechResources->unk_001C[2] = 3;
|
||||
box_print(gTasks[taskId].data[13], 2, 8, 1, sOakSpeechResources->unk_001C, 0, gText_Boy);
|
||||
sOakSpeechResources->unk_001C[0] = 1;
|
||||
sOakSpeechResources->unk_001C[1] = 2;
|
||||
sOakSpeechResources->unk_001C[2] = 3;
|
||||
box_print(gTasks[taskId].data[13], 2, 8, 17, sOakSpeechResources->unk_001C, 0, gText_Girl);
|
||||
ProgramAndPlaceMenuCursorOnWindow(gTasks[taskId].data[13], 2, 0, 1, GetFontAttribute(2, 1) + 2, 2, 0);
|
||||
sOakSpeechResources->textColor.fgColor = 1;
|
||||
sOakSpeechResources->textColor.bgColor = 2;
|
||||
sOakSpeechResources->textColor.shadowColor = 3;
|
||||
AddTextPrinterParameterized3(gTasks[taskId].data[13], 2, 8, 1, &sOakSpeechResources->textColor, 0, gText_Boy);
|
||||
sOakSpeechResources->textColor.fgColor = 1;
|
||||
sOakSpeechResources->textColor.bgColor = 2;
|
||||
sOakSpeechResources->textColor.shadowColor = 3;
|
||||
AddTextPrinterParameterized3(gTasks[taskId].data[13], 2, 8, 17, &sOakSpeechResources->textColor, 0, gText_Girl);
|
||||
Menu_InitCursor(gTasks[taskId].data[13], 2, 0, 1, GetFontAttribute(2, 1) + 2, 2, 0);
|
||||
CopyWindowToVram(gTasks[taskId].data[13], 3);
|
||||
gTasks[taskId].func = Task_OakSpeech20;
|
||||
}
|
||||
@@ -1072,7 +1072,7 @@ static void Task_OakSpeech19(u8 taskId)
|
||||
|
||||
static void Task_OakSpeech20(u8 taskId)
|
||||
{
|
||||
s8 input = ProcessMenuInputNoWrapAround();
|
||||
s8 input = Menu_ProcessInputNoWrapAround();
|
||||
switch (input)
|
||||
{
|
||||
case 0:
|
||||
@@ -1092,7 +1092,7 @@ static void Task_OakSpeech20(u8 taskId)
|
||||
static void Task_OakSpeech21(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
sub_810F4D8(data[13], 1);
|
||||
ClearStdWindowAndFrameToTransparent(data[13], 1);
|
||||
RemoveWindow(data[13]);
|
||||
data[13] = 0;
|
||||
ClearDialogWindowAndFrame(0, 1);
|
||||
@@ -1176,7 +1176,7 @@ static void Task_OakSpeech28(u8 taskId)
|
||||
static void Task_OakSpeech29(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
s8 input = ProcessMenuInput();
|
||||
s8 input = Menu_ProcessInput();
|
||||
switch (input)
|
||||
{
|
||||
case 1:
|
||||
@@ -1184,7 +1184,7 @@ static void Task_OakSpeech29(u8 taskId)
|
||||
case 3:
|
||||
case 4:
|
||||
PlaySE(SE_SELECT);
|
||||
sub_810F4D8(data[13], TRUE);
|
||||
ClearStdWindowAndFrameToTransparent(data[13], TRUE);
|
||||
RemoveWindow(data[13]);
|
||||
GetDefaultName(sOakSpeechResources->unk_0010, input - 1);
|
||||
data[15] = 1;
|
||||
@@ -1211,7 +1211,7 @@ static void Task_OakSpeech25(u8 taskId)
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_810F4D8(gTasks[taskId].data[13], 1);
|
||||
ClearStdWindowAndFrameToTransparent(gTasks[taskId].data[13], 1);
|
||||
RemoveWindow(gTasks[taskId].data[13]);
|
||||
DoNamingScreen(4, gSaveBlock1Ptr->rivalName, 0, 0, 0, CB2_ReturnFromNamingScreen);
|
||||
}
|
||||
@@ -1246,7 +1246,7 @@ static void Task_OakSpeech26(u8 taskId)
|
||||
data[3]--;
|
||||
else
|
||||
{
|
||||
CreateYesNoMenu(&sNewGameAdventureIntroWindowTemplates[2], 2, 0, 2, sub_80F796C(), 14, 0);
|
||||
CreateYesNoMenu(&sNewGameAdventureIntroWindowTemplates[2], 2, 0, 2, GetStdWindowBaseTileNum(), 14, 0);
|
||||
gTasks[taskId].func = Task_OakSpeech27;
|
||||
}
|
||||
}
|
||||
@@ -1513,7 +1513,7 @@ static void Task_OakSpeech41(u8 taskId)
|
||||
static void Task_OakSpeech42(u8 taskId)
|
||||
{
|
||||
FreeAllWindowBuffers();
|
||||
sub_8044D80();
|
||||
OakSpeechNidoranFFreeResources();
|
||||
Free(sOakSpeechResources);
|
||||
sOakSpeechResources = NULL;
|
||||
gTextFlags.canABSpeedUpPrint = FALSE;
|
||||
@@ -1536,7 +1536,7 @@ static void CB2_ReturnFromNamingScreen(void)
|
||||
ScanlineEffect_Stop();
|
||||
ResetSpriteData();
|
||||
FreeAllSpritePalettes();
|
||||
reset_temp_tile_data_buffers();
|
||||
ResetTempTileDataBuffers();
|
||||
break;
|
||||
case 1:
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
@@ -1564,10 +1564,10 @@ static void CB2_ReturnFromNamingScreen(void)
|
||||
LoadPalette(sHelpDocsPalette, 0, 0xe0);
|
||||
break;
|
||||
case 4:
|
||||
decompress_and_copy_tile_data_to_vram(1, sOakSpeechGfx_SolidColors, 0, 0, 0);
|
||||
DecompressAndCopyTileDataToVram(1, sOakSpeechGfx_SolidColors, 0, 0, 0);
|
||||
break;
|
||||
case 5:
|
||||
if (free_temp_tile_data_buffers_if_possible())
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return;
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
|
||||
CopyToBgTilemapBuffer(1, sOakSpeech_BackgroundTilemap, 0, 0);
|
||||
@@ -1612,8 +1612,8 @@ static void CreateNidoranFSprite(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
|
||||
DecompressPicFromTable(gUnknown_8235194, sub_8044E00(0), SPECIES_NIDORAN_F);
|
||||
sub_800F078(&gUnknown_82373F4);
|
||||
DecompressPicFromTable(gUnknown_8235194, OakSpeechNidoranFGetBuffer(0), SPECIES_NIDORAN_F);
|
||||
LoadCompressedSpritePaletteUsingHeap(&gUnknown_82373F4);
|
||||
SetMultiuseSpriteTemplateToPokemon(SPECIES_NIDORAN_F, 0);
|
||||
spriteId = CreateSprite(&gMultiuseSpriteTemplate, 0x60, 0x60, 1);
|
||||
gSprites[spriteId].callback = SpriteCallbackDummy;
|
||||
@@ -1635,9 +1635,9 @@ static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 st
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[0]);
|
||||
LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[1]);
|
||||
LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[2]);
|
||||
LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[0]);
|
||||
LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[1]);
|
||||
LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[2]);
|
||||
LoadSpritePalette(&sOakSpeech_PikaSpritePal);
|
||||
spriteId = CreateSprite(&sOakSpeech_PikaSpriteTemplates[0], 0x10, 0x11, 2);
|
||||
gSprites[spriteId].oam.priority = 0;
|
||||
@@ -1654,7 +1654,7 @@ static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 st
|
||||
gTasks[taskId].data[9] = spriteId;
|
||||
break;
|
||||
case 1:
|
||||
LoadCompressedObjectPic(&sOakSpeech_GrassPlatformSpriteSheet);
|
||||
LoadCompressedSpriteSheet(&sOakSpeech_GrassPlatformSpriteSheet);
|
||||
LoadSpritePalette(&sOakSpeech_GrassPlatformSpritePal);
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
@@ -1850,7 +1850,7 @@ static void PrintNameChoiceOptions(u8 taskId, u8 state)
|
||||
|
||||
data[13] = AddWindow(&sNewGameAdventureIntroWindowTemplates[3]);
|
||||
PutWindowTilemap(data[13]);
|
||||
SetWindowBorderStyle(data[13], 1, sub_80F796C(), 14);
|
||||
DrawStdFrameWithCustomTileAndPalette(data[13], 1, GetStdWindowBaseTileNum(), 14);
|
||||
FillWindowPixelBuffer(gTasks[taskId].data[13], 0x11);
|
||||
AddTextPrinterParameterized(data[13], 2, gOtherText_NewName, 8, 1, 0, NULL);
|
||||
if (state == 0)
|
||||
@@ -1861,7 +1861,7 @@ static void PrintNameChoiceOptions(u8 taskId, u8 state)
|
||||
{
|
||||
AddTextPrinterParameterized(data[13], 2, textPtrs[i], 8, 16 * (i + 1) + 1, 0, NULL);
|
||||
}
|
||||
ProgramAndPlaceMenuCursorOnWindow(data[13], 2, 0, 1, 16, 5, 0);
|
||||
Menu_InitCursor(data[13], 2, 0, 1, 16, 5, 0);
|
||||
CopyWindowToVram(data[13], 3);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
#include "play_time.h"
|
||||
|
||||
static IWRAM_DATA u8 sPlayTimeCounterState;
|
||||
|
||||
enum
|
||||
{
|
||||
STOPPED,
|
||||
RUNNING,
|
||||
MAXED_OUT,
|
||||
};
|
||||
|
||||
void PlayTimeCounter_Reset(void)
|
||||
{
|
||||
sPlayTimeCounterState = STOPPED;
|
||||
gSaveBlock2Ptr->playTimeHours = 0;
|
||||
gSaveBlock2Ptr->playTimeMinutes = 0;
|
||||
gSaveBlock2Ptr->playTimeSeconds = 0;
|
||||
gSaveBlock2Ptr->playTimeVBlanks = 0;
|
||||
}
|
||||
|
||||
void PlayTimeCounter_Start(void)
|
||||
{
|
||||
sPlayTimeCounterState = RUNNING;
|
||||
if (gSaveBlock2Ptr->playTimeHours > 999)
|
||||
PlayTimeCounter_SetToMax();
|
||||
}
|
||||
|
||||
void PlayTimeCounter_Stop(void)
|
||||
{
|
||||
sPlayTimeCounterState = STOPPED;
|
||||
}
|
||||
|
||||
void PlayTimeCounter_Update(void)
|
||||
{
|
||||
if (sPlayTimeCounterState == RUNNING)
|
||||
{
|
||||
gSaveBlock2Ptr->playTimeVBlanks++;
|
||||
if (gSaveBlock2Ptr->playTimeVBlanks > 59)
|
||||
{
|
||||
gSaveBlock2Ptr->playTimeVBlanks = 0;
|
||||
gSaveBlock2Ptr->playTimeSeconds++;
|
||||
if (gSaveBlock2Ptr->playTimeSeconds > 59)
|
||||
{
|
||||
gSaveBlock2Ptr->playTimeSeconds = 0;
|
||||
gSaveBlock2Ptr->playTimeMinutes++;
|
||||
if (gSaveBlock2Ptr->playTimeMinutes > 59)
|
||||
{
|
||||
gSaveBlock2Ptr->playTimeMinutes = 0;
|
||||
gSaveBlock2Ptr->playTimeHours++;
|
||||
if (gSaveBlock2Ptr->playTimeHours > 999)
|
||||
PlayTimeCounter_SetToMax();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PlayTimeCounter_SetToMax(void)
|
||||
{
|
||||
sPlayTimeCounterState = MAXED_OUT;
|
||||
gSaveBlock2Ptr->playTimeHours = 999;
|
||||
gSaveBlock2Ptr->playTimeMinutes = 59;
|
||||
gSaveBlock2Ptr->playTimeSeconds = 59;
|
||||
gSaveBlock2Ptr->playTimeVBlanks = 59;
|
||||
}
|
||||
+2452
-199
File diff suppressed because it is too large
Load Diff
+135
-134
@@ -11,7 +11,7 @@
|
||||
#include "menu_helpers.h"
|
||||
#include "window.h"
|
||||
#include "text_window.h"
|
||||
#include "unk_text_util.h"
|
||||
#include "dynamic_placeholder_text_util.h"
|
||||
#include "event_data.h"
|
||||
#include "event_scripts.h"
|
||||
#include "string_util.h"
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "link.h"
|
||||
#include "quest_log_8150454.h"
|
||||
#include "quest_log.h"
|
||||
#include "new_menu_helpers.h"
|
||||
|
||||
u8 gUnknown_3005E88;
|
||||
|
||||
@@ -859,7 +860,7 @@ void sub_8110F14(u8 taskId)
|
||||
}
|
||||
else
|
||||
{
|
||||
SetMainCallback2(sub_8056938);
|
||||
SetMainCallback2(CB2_ContinueSavedGame);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
@@ -922,7 +923,7 @@ void sub_8111070(u8 a0)
|
||||
StringAppend(gStringVar4, gStringVar1);
|
||||
}
|
||||
|
||||
AddTextPrinterParametrized2(gUnknown_203ADFE[0], 2, 2, 2, 1, 2, &gUnknown_8456634, 0, gStringVar4);
|
||||
AddTextPrinterParameterized4(gUnknown_203ADFE[0], 2, 2, 2, 1, 2, &gUnknown_8456634, 0, gStringVar4);
|
||||
PutWindowTilemap(gUnknown_203ADFE[0]);
|
||||
PutWindowTilemap(gUnknown_203ADFE[1]);
|
||||
CopyWindowToVram(gUnknown_203ADFE[0], 2);
|
||||
@@ -985,8 +986,8 @@ void sub_8111368(void)
|
||||
{
|
||||
gUnknown_203ADFA = 2;
|
||||
sub_806E6FC();
|
||||
sub_809A2DC();
|
||||
sub_809A2A4();
|
||||
ClearItemSlotsInAllBagPockets();
|
||||
ClearPCItemSlots();
|
||||
if (sub_8110AC8() == 1)
|
||||
{
|
||||
sub_8111274(gUnknown_203ADF8, 0);
|
||||
@@ -996,7 +997,7 @@ void sub_8111368(void)
|
||||
else
|
||||
{
|
||||
sub_8111274(gUnknown_203ADF8, 1);
|
||||
warp_in();
|
||||
WarpIntoMap();
|
||||
gFieldCallback2 = sub_8111000;
|
||||
SetMainCallback2(sub_805726C);
|
||||
}
|
||||
@@ -1417,8 +1418,8 @@ void sub_8111D10(void)
|
||||
|
||||
PutWindowTilemap(gUnknown_203ADFE[2]);
|
||||
sub_8111D90(gUnknown_203ADFE[2]);
|
||||
AddTextPrinterParametrized2(gUnknown_203ADFE[2], 2, 2, gUnknown_8456698[count], 1, 0, &gUnknown_8456634, 0, gStringVar4);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
AddTextPrinterParameterized4(gUnknown_203ADFE[2], 2, 2, gUnknown_8456698[count], 1, 0, &gUnknown_8456634, 0, gStringVar4);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
}
|
||||
|
||||
void sub_8111D90(u8 a0)
|
||||
@@ -1567,7 +1568,7 @@ void sub_81120AC(u8 taskId)
|
||||
{
|
||||
case 0:
|
||||
gUnknown_2031DD8 = 0;
|
||||
sub_8055DC4();
|
||||
Overworld_PlaySpecialMapMusic();
|
||||
sub_811229C();
|
||||
FillWindowPixelRect(gUnknown_203ADFE[0], 0xF, 0, 0, gUnknown_845661C[0].width * 8, gUnknown_845661C[0].height * 8);
|
||||
data[0]++;
|
||||
@@ -1691,7 +1692,7 @@ void sub_81123BC(void)
|
||||
|
||||
void sub_8112450(void)
|
||||
{
|
||||
if (sub_80BF708() != 1)
|
||||
if (MenuHelpers_LinkSomething() != 1)
|
||||
{
|
||||
sub_8112364();
|
||||
sub_81123BC();
|
||||
@@ -1705,7 +1706,7 @@ void sub_811246C(struct Sprite *sprite)
|
||||
{
|
||||
if (gUnknown_203AF9A[0][0] != 0xFF)
|
||||
{
|
||||
sub_8063CA4(mapObject, gUnknown_203AF9A[0][0]);
|
||||
FieldObjectSetHeldMovement(mapObject, gUnknown_203AF9A[0][0]);
|
||||
gUnknown_203AF9A[0][0] = 0xFF;
|
||||
}
|
||||
if (gUnknown_203AF9A[0][1] != 0xFF)
|
||||
@@ -1719,7 +1720,7 @@ void sub_811246C(struct Sprite *sprite)
|
||||
{
|
||||
if (gUnknown_203AF9A[mapObject->localId][0] != 0xFF)
|
||||
{
|
||||
sub_8063CA4(mapObject, gUnknown_203AF9A[mapObject->localId][0]);
|
||||
FieldObjectSetHeldMovement(mapObject, gUnknown_203AF9A[mapObject->localId][0]);
|
||||
gUnknown_203AF9A[mapObject->localId][0] = 0xFF;
|
||||
}
|
||||
sub_8063E28(mapObject, sprite);
|
||||
@@ -1911,7 +1912,7 @@ void sub_8112940(u8 a0, struct UnkStruct_203AE98 *a1, u16 a2)
|
||||
gUnknown_3005E94[gUnknown_203AF98].unk_4 = 0;
|
||||
gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0;
|
||||
gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0;
|
||||
switch (player_get_direction_lower_nybble())
|
||||
switch (GetPlayerFacingDirection())
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
@@ -2297,7 +2298,7 @@ const struct WindowTemplate gUnknown_8456928 = {
|
||||
0x00, 0, 15, 30, 5, 15, 0x008F
|
||||
};
|
||||
|
||||
void sub_8112EA8(void)
|
||||
void MapNamePopupWindowIdSetDummy(void)
|
||||
{
|
||||
gUnknown_203B020 = 0xFF;
|
||||
}
|
||||
@@ -2468,15 +2469,15 @@ const struct TextColor gUnknown_8456930 = {
|
||||
|
||||
void sub_8112FE4(const u8 * a0)
|
||||
{
|
||||
AddTextPrinterParametrized2(gUnknown_203B020, 0x02, 2, 5, 1, 1, &gUnknown_8456930, -1, a0);
|
||||
AddTextPrinterParameterized4(gUnknown_203B020, 0x02, 2, 5, 1, 1, &gUnknown_8456930, -1, a0);
|
||||
}
|
||||
|
||||
void sub_8113018(const u8 * a0, u8 a1)
|
||||
void sub_8113018(const u8 * text, u8 mode)
|
||||
{
|
||||
sub_8112FD0();
|
||||
sub_8112FE4(a0);
|
||||
if (a1)
|
||||
CopyWindowToVram(gUnknown_203B020, a1);
|
||||
sub_8112FE4(text);
|
||||
if (mode)
|
||||
CopyWindowToVram(gUnknown_203B020, mode);
|
||||
}
|
||||
|
||||
void sub_8113044(void)
|
||||
@@ -2746,7 +2747,7 @@ void sub_81134CC(struct Var4038Struct * a0)
|
||||
if (VarGet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) == 2)
|
||||
{
|
||||
sub_8113078(a0);
|
||||
if (gUnknown_2023E8A == 1)
|
||||
if (gBattleOutcome == B_OUTCOME_WON)
|
||||
sub_8113194(a0);
|
||||
else
|
||||
sub_81131FC(a0);
|
||||
@@ -2842,7 +2843,7 @@ void sub_8113550(u16 a0, const u16 * a1)
|
||||
if (sub_81138A0(a0, a1) == TRUE)
|
||||
return;
|
||||
|
||||
if (sub_80BF708() == TRUE)
|
||||
if (MenuHelpers_LinkSomething() == TRUE)
|
||||
return;
|
||||
|
||||
// NONMATCHING: branch logic here
|
||||
@@ -2954,7 +2955,7 @@ void sub_8113550(u16 a0, const u16 * a1)
|
||||
"\tbne _081135AA\n"
|
||||
"\tb ._return\n"
|
||||
"_081135AA:\n"
|
||||
"\tbl sub_80BF708\n"
|
||||
"\tbl MenuHelpers_LinkSomething\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tlsrs r0, 24\n"
|
||||
"\tcmp r0, 0x1\n"
|
||||
@@ -3656,9 +3657,9 @@ void QuestLog_AutoGetSpeciesName(u16 a0, u8 * a1, u8 a2)
|
||||
else
|
||||
{
|
||||
if (a0 != SPECIES_EGG)
|
||||
UnkTextUtil_SetPtrI(a2, gSpeciesNames[a0]);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(a2, gSpeciesNames[a0]);
|
||||
else
|
||||
UnkTextUtil_SetPtrI(a2, gText_EggNickname);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(a2, gText_EggNickname);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3708,7 +3709,7 @@ const u16 * sub_8113FBC(const u16 * a0)
|
||||
case POCKET_ITEMS:
|
||||
case POCKET_POKE_BALLS:
|
||||
case POCKET_BERRY_POUCH:
|
||||
StringCopy(gStringVar1, ItemId_GetItem(r5[0])->name);
|
||||
StringCopy(gStringVar1, ItemId_GetName(r5[0]));
|
||||
if (r5[0] == ITEM_ESCAPE_ROPE)
|
||||
{
|
||||
sub_80C4DF8(gStringVar2, r5[2]);
|
||||
@@ -3725,7 +3726,7 @@ const u16 * sub_8113FBC(const u16 * a0)
|
||||
}
|
||||
break;
|
||||
case POCKET_KEY_ITEMS:
|
||||
StringCopy(gStringVar1, ItemId_GetItem(r5[0])->name);
|
||||
StringCopy(gStringVar1, ItemId_GetName(r5[0]));
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_841A220);
|
||||
break;
|
||||
case POCKET_TM_CASE:
|
||||
@@ -3771,7 +3772,7 @@ const u16 * sub_8114188(const u16 * a0)
|
||||
{
|
||||
const u16 * r4 = sub_8113E88(5, a0);
|
||||
QuestLog_AutoGetSpeciesName(r4[1], gStringVar1, 0);
|
||||
StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
|
||||
StringCopy(gStringVar2, ItemId_GetName(r4[0]));
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_841AB74);
|
||||
r4 += 2;
|
||||
return r4;
|
||||
@@ -3787,7 +3788,7 @@ const u16 * sub_81141E4(const u16 * a0)
|
||||
const u16 * r4 = sub_8113E88(6, a0);
|
||||
|
||||
QuestLog_AutoGetSpeciesName(r4[1], gStringVar1, 0);
|
||||
StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
|
||||
StringCopy(gStringVar2, ItemId_GetName(r4[0]));
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_841AB8E);
|
||||
r4 += 2;
|
||||
return r4;
|
||||
@@ -3803,7 +3804,7 @@ const u16 * sub_8114240(const u16 * a0)
|
||||
const u16 * r4 = sub_8113E88(7, a0);
|
||||
|
||||
QuestLog_AutoGetSpeciesName(r4[1], gStringVar2, 0);
|
||||
StringCopy(gStringVar1, ItemId_GetItem(r4[0])->name);
|
||||
StringCopy(gStringVar1, ItemId_GetName(r4[0]));
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_841A6A5);
|
||||
r4 += 2;
|
||||
return r4;
|
||||
@@ -3819,7 +3820,7 @@ const u16 * sub_811429C(const u16 * a0)
|
||||
const u16 * r4 = sub_8113E88(8, a0);
|
||||
|
||||
QuestLog_AutoGetSpeciesName(r4[1], gStringVar1, 0);
|
||||
StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
|
||||
StringCopy(gStringVar2, ItemId_GetName(r4[0]));
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_841A1CD);
|
||||
r4 += 2;
|
||||
return r4;
|
||||
@@ -3846,8 +3847,8 @@ const u16 * sub_8114324(const u16 * a0)
|
||||
{
|
||||
const u16 * r4 = sub_8113E88(9, a0);
|
||||
QuestLog_AutoGetSpeciesName(r4[2], gStringVar1, 0);
|
||||
StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
|
||||
StringCopy(gStringVar3, ItemId_GetItem(r4[1])->name);
|
||||
StringCopy(gStringVar2, ItemId_GetName(r4[0]));
|
||||
StringCopy(gStringVar3, ItemId_GetName(r4[1]));
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_841A193);
|
||||
r4 += 3;
|
||||
return r4;
|
||||
@@ -3862,8 +3863,8 @@ const u16 * sub_8114394(const u16 * a0)
|
||||
{
|
||||
const u16 * r4 = sub_8113E88(10, a0);
|
||||
QuestLog_AutoGetSpeciesName(r4[2], gStringVar2, 0);
|
||||
StringCopy(gStringVar3, ItemId_GetItem(r4[0])->name);
|
||||
StringCopy(gStringVar1, ItemId_GetItem(r4[1])->name);
|
||||
StringCopy(gStringVar3, ItemId_GetName(r4[0]));
|
||||
StringCopy(gStringVar1, ItemId_GetName(r4[1]));
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_841A6E1);
|
||||
r4 += 3;
|
||||
return r4;
|
||||
@@ -3949,14 +3950,14 @@ u16 * sub_81144EC(u16 * a0, const u16 * a1)
|
||||
|
||||
const u16 * sub_8114518(const u16 * a0)
|
||||
{
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
|
||||
memset(gStringVar1, EOS, 8);
|
||||
memcpy(gStringVar1, (const u8 *)a0 + 5, 7);
|
||||
sub_8115834(gStringVar1);
|
||||
UnkTextUtil_SetPtrI(0, gStringVar1);
|
||||
UnkTextUtil_SetPtrI(1, gUnknown_8456AE4[((const u8 *)a0)[4]]);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A422);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_8456AE4[((const u8 *)a0)[4]]);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A422);
|
||||
a0 += 6;
|
||||
return a0;
|
||||
}
|
||||
@@ -3973,14 +3974,14 @@ u16 * sub_8114578(u16 * a0, const u16 * a1)
|
||||
|
||||
const u16 * sub_81145A4(const u16 * a0)
|
||||
{
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
|
||||
memset(gStringVar1, EOS, 8);
|
||||
memcpy(gStringVar1, (const u8 *)a0 + 5, 7);
|
||||
sub_8115834(gStringVar1);
|
||||
UnkTextUtil_SetPtrI(0, gStringVar1);
|
||||
UnkTextUtil_SetPtrI(1, gUnknown_8456AE4[((const u8 *)a0)[4]]);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A477);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_8456AE4[((const u8 *)a0)[4]]);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A477);
|
||||
a0 += 6;
|
||||
return a0;
|
||||
}
|
||||
@@ -3999,7 +4000,7 @@ u16 * sub_8114604(u16 * a0, const u16 * a1)
|
||||
|
||||
const u16 * sub_811464C(const u16 * a0)
|
||||
{
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
|
||||
memset(gStringVar1, EOS, 8);
|
||||
memset(gStringVar2, EOS, 8);
|
||||
@@ -4010,12 +4011,12 @@ const u16 * sub_811464C(const u16 * a0)
|
||||
sub_8115834(gStringVar1);
|
||||
sub_8115834(gStringVar2);
|
||||
sub_8115834(gStringVar3);
|
||||
UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName);
|
||||
UnkTextUtil_SetPtrI(1, gStringVar1);
|
||||
UnkTextUtil_SetPtrI(2, gStringVar2);
|
||||
UnkTextUtil_SetPtrI(3, gStringVar3);
|
||||
UnkTextUtil_SetPtrI(4, gUnknown_8456AE4[((const u8 *)a0)[4]]);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A4C6);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gUnknown_8456AE4[((const u8 *)a0)[4]]);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A4C6);
|
||||
a0 += 13;
|
||||
return a0;
|
||||
}
|
||||
@@ -4111,12 +4112,12 @@ const u16 * sub_81148BC(const u16 * a0)
|
||||
const u8 * boxIdxs;
|
||||
a0 = sub_8113E88(20, a0);
|
||||
boxIdxs = (const u8 *)a0 + 4;
|
||||
UnkTextUtil_Reset();
|
||||
UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
|
||||
UnkTextUtil_SetPtrI(2, GetBoxNamePtr(boxIdxs[1]));
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1]));
|
||||
QuestLog_AutoGetSpeciesName(a0[1], NULL, 3);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A566);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A566);
|
||||
return a0 + 3;
|
||||
}
|
||||
|
||||
@@ -4136,11 +4137,11 @@ const u16 * sub_8114944(const u16 * a0)
|
||||
const u8 * boxIdxs;
|
||||
a0 = sub_8113E88(21, a0);
|
||||
boxIdxs = (const u8 *)a0 + 4;
|
||||
UnkTextUtil_Reset();
|
||||
UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
|
||||
QuestLog_AutoGetSpeciesName(a0[1], NULL, 2);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A5D9);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A5D9);
|
||||
return a0 + 3;
|
||||
}
|
||||
|
||||
@@ -4172,11 +4173,11 @@ const u16 * sub_81149D0(const u16 * a0)
|
||||
const u8 * boxIdxs;
|
||||
a0 = sub_8113E88(22, a0);
|
||||
boxIdxs = (const u8 *)a0 + 4;
|
||||
UnkTextUtil_Reset();
|
||||
UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
|
||||
QuestLog_AutoGetSpeciesName(a0[1], NULL, 2);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A60A);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A60A);
|
||||
return a0 + 3;
|
||||
}
|
||||
|
||||
@@ -4199,11 +4200,11 @@ const u16 * sub_8114A4C(const u16 * a0)
|
||||
const u8 * boxIdxs;
|
||||
a0 = sub_8113E88(23, a0);
|
||||
boxIdxs = (const u8 *)a0 + 2;
|
||||
UnkTextUtil_Reset();
|
||||
UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
|
||||
UnkTextUtil_SetPtrI(2, GetBoxNamePtr(boxIdxs[1]));
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A59C);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1]));
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A59C);
|
||||
return (const u16 *)boxIdxs + 1;
|
||||
}
|
||||
|
||||
@@ -4223,10 +4224,10 @@ const u16 * sub_8114AC8(const u16 * a0)
|
||||
const u8 * boxIdxs;
|
||||
a0 = sub_8113E88(24, a0);
|
||||
boxIdxs = (const u8 *)a0 + 2;
|
||||
UnkTextUtil_Reset();
|
||||
UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A5FA);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A5FA);
|
||||
return (const u16 *)boxIdxs + 1;
|
||||
}
|
||||
|
||||
@@ -4246,10 +4247,10 @@ const u16 * sub_8114B34(const u16 * a0)
|
||||
const u8 * boxIdxs;
|
||||
a0 = sub_8113E88(25, a0);
|
||||
boxIdxs = (const u8 *)a0 + 2;
|
||||
UnkTextUtil_Reset();
|
||||
UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
|
||||
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A632);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A632);
|
||||
return (const u16 *)boxIdxs + 1;
|
||||
}
|
||||
|
||||
@@ -4269,10 +4270,10 @@ const u16 * sub_8114BA0(const u16 * a0)
|
||||
const u8 * boxIdxs;
|
||||
a0 = sub_8113E88(26, a0);
|
||||
boxIdxs = (const u8 *)a0 + 2;
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
QuestLog_AutoGetSpeciesName(a0[0], NULL, 0);
|
||||
UnkTextUtil_SetPtrI(1, GetBoxNamePtr(boxIdxs[0]));
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A64F);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(boxIdxs[0]));
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A64F);
|
||||
return (const u16 *)boxIdxs + 1;
|
||||
}
|
||||
|
||||
@@ -4290,13 +4291,13 @@ u16 * sub_8114BE4(u16 * a0, const u16 * a1)
|
||||
const u16 * sub_8114C0C(const u16 * a0)
|
||||
{
|
||||
const u16 *r4 = sub_8113E88(27, a0);
|
||||
UnkTextUtil_Reset();
|
||||
UnkTextUtil_SetPtrI(0, GetBoxNamePtr(*((const u8 *)r4 + 0)));
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(*((const u8 *)r4 + 0)));
|
||||
if (*((const u8 *)r4 + 0) == *((const u8 *)r4 + 1))
|
||||
UnkTextUtil_SetPtrI(1, gUnknown_841A694);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841A694);
|
||||
else
|
||||
UnkTextUtil_SetPtrI(1, GetBoxNamePtr(*((const u8 *)r4 + 1)));
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A66E);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(*((const u8 *)r4 + 1)));
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A66E);
|
||||
return r4 + 1;
|
||||
}
|
||||
|
||||
@@ -4358,14 +4359,14 @@ const u16 * sub_8114D68(const u16 * a0)
|
||||
const u8 * r6;
|
||||
a0 = sub_8113E88(30, a0);
|
||||
r6 = (const u8 *)a0 + 6;
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
sub_80C4DF8(gStringVar1, r6[0]);
|
||||
UnkTextUtil_SetPtrI(0, gStringVar1);
|
||||
UnkTextUtil_SetPtrI(1, gTrainers[a0[2]].trainerName);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gTrainers[a0[2]].trainerName);
|
||||
QuestLog_AutoGetSpeciesName(a0[0], 0, 2);
|
||||
QuestLog_AutoGetSpeciesName(a0[1], 0, 3);
|
||||
UnkTextUtil_SetPtrI(4, gUnknown_8456ACC[r6[1]]);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF0C);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gUnknown_8456ACC[r6[1]]);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AF0C);
|
||||
return a0 + 4;
|
||||
}
|
||||
|
||||
@@ -4399,43 +4400,43 @@ const u16 * sub_8114E68(const u16 * a0)
|
||||
return NULL;
|
||||
|
||||
r6 = (const u8 *)a0 + 8;
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
sub_80C4DF8(gStringVar1, r6[2]);
|
||||
UnkTextUtil_SetPtrI(0, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
QuestLog_AutoGetSpeciesName(a0[2], NULL, 1);
|
||||
ConvertIntToDecimalStringN(gStringVar2, r6[0], STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||
UnkTextUtil_SetPtrI(2, gStringVar2);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);
|
||||
QuestLog_AutoGetSpeciesName(a0[3], NULL, 3);
|
||||
ConvertIntToDecimalStringN(gStringVar3, r6[1], STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||
UnkTextUtil_SetPtrI(4, gStringVar3);
|
||||
UnkTextUtil_SetPtrI(5, gSaveBlock2Ptr->playerName);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar3);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, gSaveBlock2Ptr->playerName);
|
||||
if (r6[0] == 0)
|
||||
{
|
||||
if (r6[1] == 1)
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA01);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AA01);
|
||||
else
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA2B);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AA2B);
|
||||
}
|
||||
else if (r6[1] == 0)
|
||||
{
|
||||
if (r6[0] == 1)
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A9A9);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A9A9);
|
||||
else
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A9D4);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A9D4);
|
||||
}
|
||||
else if (r6[0] == 1)
|
||||
{
|
||||
if (r6[1] == 1)
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA76);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AA76);
|
||||
else
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AAAA);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AAAA);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (r6[1] == 1)
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AAEC);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AAEC);
|
||||
else
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AB29);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AB29);
|
||||
}
|
||||
return (const u16 *)(r6 + 4);
|
||||
}
|
||||
@@ -4464,12 +4465,12 @@ const u16 * sub_811500C(const u16 * a0)
|
||||
const u8 * r5;
|
||||
a0 = sub_8113E88(32, a0);
|
||||
r5 = (const u8 *)a0 + 6;
|
||||
UnkTextUtil_Reset();
|
||||
UnkTextUtil_SetPtrI(0, gTrainers[a0[2]].trainerName);
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gTrainers[a0[2]].trainerName);
|
||||
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
|
||||
QuestLog_AutoGetSpeciesName(a0[1], NULL, 2);
|
||||
UnkTextUtil_SetPtrI(3, gUnknown_8456ACC[r5[1]]);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF3E);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gUnknown_8456ACC[r5[1]]);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AF3E);
|
||||
return a0 + 4;
|
||||
}
|
||||
|
||||
@@ -4493,25 +4494,25 @@ const u16 * sub_81150CC(const u16 * a0)
|
||||
return NULL;
|
||||
|
||||
r5 = (const u8 *)a0 + 8;
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
|
||||
switch (gUnknown_203B044.unk_2)
|
||||
{
|
||||
case 0:
|
||||
UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName);
|
||||
UnkTextUtil_SetPtrI(1, gSaveBlock1Ptr->rivalName);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A2E1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gSaveBlock1Ptr->rivalName);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A2E1);
|
||||
break;
|
||||
case 1:
|
||||
UnkTextUtil_SetPtrI(0, gSaveBlock1Ptr->rivalName);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock1Ptr->rivalName);
|
||||
QuestLog_AutoGetSpeciesName(a0[2], NULL, 1);
|
||||
UnkTextUtil_SetPtrI(2, gSaveBlock2Ptr->playerName);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gSaveBlock2Ptr->playerName);
|
||||
QuestLog_AutoGetSpeciesName(a0[3], NULL, 3);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A312);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A312);
|
||||
break;
|
||||
case 2:
|
||||
UnkTextUtil_SetPtrI(0, gUnknown_8456AD8[r5[0]]);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A349);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_8456AD8[r5[0]]);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A349);
|
||||
break;
|
||||
}
|
||||
return (const u16 *)(r5 + 2);
|
||||
@@ -4527,21 +4528,21 @@ const u16 * sub_81151DC(const u16 * a0)
|
||||
{
|
||||
const u16 * r5 = sub_8113E88(34, a0);
|
||||
const u8 * r6 = (const u8 *)r5 + 6;
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
sub_80C4DF8(gStringVar1, r6[0]);
|
||||
UnkTextUtil_SetPtrI(0, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
if (
|
||||
gTrainers[r5[2]].trainerClass == 0x51
|
||||
|| gTrainers[r5[2]].trainerClass == 0x59
|
||||
|| gTrainers[r5[2]].trainerClass == 0x5A
|
||||
)
|
||||
UnkTextUtil_SetPtrI(1, GetExpandedPlaceholder(6));
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetExpandedPlaceholder(6));
|
||||
else
|
||||
UnkTextUtil_SetPtrI(1, gTrainers[r5[2]].trainerName);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gTrainers[r5[2]].trainerName);
|
||||
QuestLog_AutoGetSpeciesName(r5[0], NULL, 2);
|
||||
QuestLog_AutoGetSpeciesName(r5[1], NULL, 3);
|
||||
UnkTextUtil_SetPtrI(4, gUnknown_8456ACC[r6[1]]);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF6D);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gUnknown_8456ACC[r6[1]]);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AF6D);
|
||||
return (const u16 *)(r6 + 2);
|
||||
}
|
||||
|
||||
@@ -4814,17 +4815,17 @@ const u16 * sub_8115518(const u16 * a0)
|
||||
const u16 * r4 = sub_8113E88(37, a0);
|
||||
const u8 * r7 = (const u8 *)r4 + 8;
|
||||
u32 r6 = (r4[2] << 16) + r4[3];
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
sub_80C4DF8(gStringVar1, r7[0]);
|
||||
UnkTextUtil_SetPtrI(0, gStringVar1);
|
||||
UnkTextUtil_SetPtrI(1, ItemId_GetItem(r4[0])->name);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r4[0]));
|
||||
if (r4[1] < 2)
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A7DD);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A7DD);
|
||||
else
|
||||
{
|
||||
ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6);
|
||||
UnkTextUtil_SetPtrI(2, gStringVar2);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A810);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A810);
|
||||
}
|
||||
return (const u16 *)(r7 + 2);
|
||||
}
|
||||
@@ -4847,30 +4848,30 @@ const u16 * sub_81155E0(const u16 * a0) {
|
||||
const u16 *r5 = sub_8113E88(38, a0);
|
||||
const u8 *r7 = (const u8 *) r5 + 8;
|
||||
u32 r6 = (r5[2] << 16) + r5[3];
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
sub_80C4DF8(gStringVar1, r7[0]);
|
||||
if (r7[1] == 0) {
|
||||
UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName);
|
||||
UnkTextUtil_SetPtrI(1, gStringVar1);
|
||||
UnkTextUtil_SetPtrI(2, ItemId_GetItem(r5[0])->name);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, ItemId_GetName(r5[0]));
|
||||
if (r5[1] == 1)
|
||||
UnkTextUtil_SetPtrI(3, gUnknown_841A8D4);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gUnknown_841A8D4);
|
||||
else
|
||||
{
|
||||
ConvertIntToDecimalStringN(gStringVar2, r5[1], STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||
UnkTextUtil_SetPtrI(4, gStringVar2);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar3, gUnknown_841A8DD);
|
||||
UnkTextUtil_SetPtrI(3, gStringVar3);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar2);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar3, gUnknown_841A8DD);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3);
|
||||
}
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A858);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A858);
|
||||
}
|
||||
else
|
||||
{
|
||||
UnkTextUtil_SetPtrI(0, gStringVar1);
|
||||
UnkTextUtil_SetPtrI(1, ItemId_GetItem(r5[0])->name);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r5[0]));
|
||||
ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6);
|
||||
UnkTextUtil_SetPtrI(2, gStringVar2);
|
||||
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A896);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);
|
||||
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A896);
|
||||
}
|
||||
return (const u16 *)(r7 + 2);
|
||||
}
|
||||
@@ -4890,7 +4891,7 @@ const u16 * sub_8115700(const u16 * a0)
|
||||
const u16 * r4 = sub_8113E88(40, a0);
|
||||
const u8 * r5 = (const u8 *)r4 + 2;
|
||||
sub_80C4DF8(gStringVar1, r5[0]);
|
||||
StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
|
||||
StringCopy(gStringVar2, ItemId_GetName(r4[0]));
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_841B03F);
|
||||
return (const u16 *)(r5 + 2);
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ void sub_81505C4(u8 taskId)
|
||||
gTasks[taskId].data[0]++;
|
||||
break;
|
||||
case 2:
|
||||
StartSpriteAnim(sprite, sub_8063500(player_get_direction_lower_nybble()));
|
||||
StartSpriteAnim(sprite, sub_8063500(GetPlayerFacingDirection()));
|
||||
gTasks[taskId].data[0]++;
|
||||
break;
|
||||
case 3:
|
||||
@@ -173,7 +173,7 @@ void sub_8150794(u8 taskId)
|
||||
|
||||
void sub_81507BC(struct MapObject * a0, u8 a1)
|
||||
{
|
||||
sub_805F060(a0, a1);
|
||||
EventObjectSetGraphicsId(a0, a1);
|
||||
}
|
||||
|
||||
void sub_81507CC(void)
|
||||
|
||||
@@ -26,7 +26,7 @@ void sub_812C334(s32 *, s32 *);
|
||||
|
||||
void sub_812BFDC(void)
|
||||
{
|
||||
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_DOME)) && (gUnknown_2023E8A == 1 || gUnknown_2023E8A == 7))
|
||||
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_POKEDUDE)) && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT))
|
||||
{
|
||||
struct QuestLogStruct_TrainerBattleRecord * questLogTrainerBattleRecord = Alloc(sizeof(struct QuestLogStruct_TrainerBattleRecord));
|
||||
struct QuestLogStruct_WildBattleRecord * questLogWildBattleRecord = Alloc(sizeof(struct QuestLogStruct_WildBattleRecord));
|
||||
@@ -81,7 +81,7 @@ void sub_812BFDC(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gUnknown_2023E8A == 1)
|
||||
if (gBattleOutcome == B_OUTCOME_WON)
|
||||
{
|
||||
questLogWildBattleRecord->v0 = GetMonData(gEnemyParty + 0, MON_DATA_SPECIES);
|
||||
questLogWildBattleRecord->v2 = SPECIES_NONE;
|
||||
@@ -116,7 +116,7 @@ void sub_812C224(void)
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
struct QuestLogStruct_LinkBattleRecord * r5 = Alloc(sizeof(struct QuestLogStruct_LinkBattleRecord));
|
||||
r5->v0 = gUnknown_2023E8A - 1;
|
||||
r5->v0 = gBattleOutcome - 1; // 0 = won, 1 = lost, 2 = drew
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
|
||||
{
|
||||
r8 = 15;
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
#include "global.h"
|
||||
#include "main.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "m4a.h"
|
||||
#include "load_save.h"
|
||||
#include "save.h"
|
||||
#include "new_game.h"
|
||||
#include "overworld.h"
|
||||
#include "malloc.h"
|
||||
|
||||
void sub_8079B7C(void)
|
||||
{
|
||||
u16 imeBackup = REG_IME;
|
||||
|
||||
REG_IME = 0;
|
||||
RegisterRamReset(RESET_EWRAM);
|
||||
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK);
|
||||
REG_IME = imeBackup;
|
||||
gMain.inBattle = FALSE;
|
||||
SetSaveBlocksPointers();
|
||||
ResetMenuAndMonGlobals();
|
||||
Save_ResetSaveCounters();
|
||||
Save_LoadGameData(0);
|
||||
if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
|
||||
Sav2_ClearSetDefault();
|
||||
SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
|
||||
InitHeap(gHeap, HEAP_SIZE);
|
||||
SetMainCallback2(CB2_ContinueSavedGame);
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
#include "global.h"
|
||||
#include "battle.h"
|
||||
#include "event_scripts.h"
|
||||
#include "overworld.h"
|
||||
#include "battle.h"
|
||||
#include "script.h"
|
||||
#include "event_data.h"
|
||||
#include "field_screen_effect.h"
|
||||
|
||||
EWRAM_DATA u8 gNumSafariBalls = 0;
|
||||
EWRAM_DATA u16 gSafariZoneStepCounter = 0;
|
||||
|
||||
bool32 GetSafariZoneFlag(void)
|
||||
{
|
||||
return FlagGet(FLAG_SYS_SAFARI_MODE);
|
||||
}
|
||||
|
||||
void SetSafariZoneFlag(void)
|
||||
{
|
||||
FlagSet(FLAG_SYS_SAFARI_MODE);
|
||||
}
|
||||
|
||||
void ResetSafariZoneFlag(void)
|
||||
{
|
||||
FlagClear(FLAG_SYS_SAFARI_MODE);
|
||||
}
|
||||
|
||||
void EnterSafariMode(void)
|
||||
{
|
||||
IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE);
|
||||
SetSafariZoneFlag();
|
||||
gNumSafariBalls = 30;
|
||||
gSafariZoneStepCounter = 600;
|
||||
}
|
||||
|
||||
void ExitSafariMode(void)
|
||||
{
|
||||
ResetSafariZoneFlag();
|
||||
gNumSafariBalls = 0;
|
||||
gSafariZoneStepCounter = 0;
|
||||
}
|
||||
|
||||
bool8 SafariZoneTakeStep(void)
|
||||
{
|
||||
if (GetSafariZoneFlag() == FALSE)
|
||||
return FALSE;
|
||||
gSafariZoneStepCounter--;
|
||||
if (gSafariZoneStepCounter == 0)
|
||||
{
|
||||
ScriptContext1_SetupScript(EventScript_SafariTimesUp);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void SafariZoneRetirePrompt(void)
|
||||
{
|
||||
ScriptContext1_SetupScript(EventScript_SafariRetire);
|
||||
}
|
||||
|
||||
void CB2_EndSafariBattle(void)
|
||||
{
|
||||
if (gNumSafariBalls != 0)
|
||||
{
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
}
|
||||
else if (gBattleOutcome == B_OUTCOME_NO_SAFARI_BALLS)
|
||||
{
|
||||
ScriptContext2_RunNewScript(EventScript_SafariWarpOut);
|
||||
WarpIntoMap();
|
||||
gFieldCallback = sub_807E3EC;
|
||||
SetMainCallback2(CB2_LoadMap);
|
||||
}
|
||||
else if (gBattleOutcome == B_OUTCOME_CAUGHT)
|
||||
{
|
||||
ScriptContext1_SetupScript(EventScript_SafariOutOfBalls);
|
||||
ScriptContext1_Stop();
|
||||
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -828,7 +828,7 @@ u32 TryCopySpecialSaveSection(u8 sector, u8* dst)
|
||||
return 1;
|
||||
}
|
||||
|
||||
u32 sub_80DA5E0(u8 sector, u8* src)
|
||||
u32 TryWriteSpecialSaveSection(u8 sector, u8* src)
|
||||
{
|
||||
s32 i;
|
||||
s32 size;
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
#include "global.h"
|
||||
#include "save_location.h"
|
||||
#include "constants/maps.h"
|
||||
|
||||
static bool32 IsCurMapInLocationList(const u16 *list)
|
||||
{
|
||||
s32 i;
|
||||
u16 locSum = (gSaveBlock1Ptr->location.mapGroup << 8) + (gSaveBlock1Ptr->location.mapNum);
|
||||
|
||||
for (i = 0; list[i] != 0xFFFF; i++)
|
||||
{
|
||||
if (list[i] == locSum)
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static const u16 sSaveLocationPokeCenterList[] =
|
||||
{
|
||||
MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F, MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F,
|
||||
MAP_PEWTER_CITY_POKEMON_CENTER_1F, MAP_PEWTER_CITY_POKEMON_CENTER_2F,
|
||||
MAP_CERULEAN_CITY_POKEMON_CENTER_1F, MAP_CERULEAN_CITY_POKEMON_CENTER_2F,
|
||||
MAP_LAVENDER_TOWN_POKEMON_CENTER_1F, MAP_LAVENDER_TOWN_POKEMON_CENTER_2F,
|
||||
MAP_VERMILION_CITY_POKEMON_CENTER_1F, MAP_VERMILION_CITY_POKEMON_CENTER_2F,
|
||||
MAP_CELADON_CITY_POKEMON_CENTER_1F, MAP_CELADON_CITY_POKEMON_CENTER_2F,
|
||||
MAP_FUCHSIA_CITY_POKEMON_CENTER_1F, MAP_FUCHSIA_CITY_POKEMON_CENTER_2F,
|
||||
MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F, MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F,
|
||||
MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F, MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F,
|
||||
MAP_SAFFRON_CITY_POKEMON_CENTER_1F, MAP_SAFFRON_CITY_POKEMON_CENTER_2F,
|
||||
MAP_ROUTE4_POKEMON_CENTER_1F, MAP_ROUTE4_POKEMON_CENTER_2F,
|
||||
MAP_ROUTE10_POKEMON_CENTER_1F, MAP_ROUTE10_POKEMON_CENTER_2F,
|
||||
MAP_ONE_ISLAND_POKEMON_CENTER_1F, MAP_ONE_ISLAND_POKEMON_CENTER_2F,
|
||||
MAP_TWO_ISLAND_POKEMON_CENTER_1F, MAP_TWO_ISLAND_POKEMON_CENTER_2F,
|
||||
MAP_THREE_ISLAND_POKEMON_CENTER_1F, MAP_THREE_ISLAND_POKEMON_CENTER_2F,
|
||||
MAP_FOUR_ISLAND_POKEMON_CENTER_1F, MAP_FOUR_ISLAND_POKEMON_CENTER_2F,
|
||||
MAP_FIVE_ISLAND_POKEMON_CENTER_1F, MAP_FIVE_ISLAND_POKEMON_CENTER_2F,
|
||||
MAP_SEVEN_ISLAND_POKEMON_CENTER_1F, MAP_SEVEN_ISLAND_POKEMON_CENTER_2F,
|
||||
MAP_SIX_ISLAND_POKEMON_CENTER_1F, MAP_SIX_ISLAND_POKEMON_CENTER_2F,
|
||||
MAP_UNKNOWN_MAP_00_00, MAP_UNKNOWN_MAP_00_01,
|
||||
MAP_UNKNOWN_MAP_00_03, MAP_UNKNOWN_MAP_00_04,
|
||||
0xFFFF,
|
||||
};
|
||||
|
||||
bool32 IsCurMapPokeCenter(void)
|
||||
{
|
||||
return IsCurMapInLocationList(sSaveLocationPokeCenterList);
|
||||
}
|
||||
|
||||
static const u16 sSaveLocationReloadLocList[] = { 0xFFFF };
|
||||
|
||||
static bool32 IsCurMapReloadLocation(void)
|
||||
{
|
||||
return IsCurMapInLocationList(sSaveLocationReloadLocList);
|
||||
}
|
||||
|
||||
static const u16 sUnknown_8453094[] = { 0xFFFF };
|
||||
|
||||
static bool32 sub_810B75C(void)
|
||||
{
|
||||
return IsCurMapInLocationList(sUnknown_8453094);
|
||||
}
|
||||
|
||||
static void TrySetPokeCenterWarpStatus(void)
|
||||
{
|
||||
if (IsCurMapPokeCenter() == FALSE)
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags &= ~(POKECENTER_SAVEWARP);
|
||||
else
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags |= POKECENTER_SAVEWARP;
|
||||
}
|
||||
|
||||
static void TrySetReloadWarpStatus(void)
|
||||
{
|
||||
if (!IsCurMapReloadLocation())
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags &= ~(LOBBY_SAVEWARP);
|
||||
else
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags |= LOBBY_SAVEWARP;
|
||||
}
|
||||
|
||||
static void sub_810B7CC(void)
|
||||
{
|
||||
if (!sub_810B75C())
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags &= ~(UNK_SPECIAL_SAVE_WARP_FLAG_3);
|
||||
else
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags |= UNK_SPECIAL_SAVE_WARP_FLAG_3;
|
||||
}
|
||||
|
||||
void TrySetMapSaveWarpStatus(void)
|
||||
{
|
||||
TrySetPokeCenterWarpStatus();
|
||||
TrySetReloadWarpStatus();
|
||||
sub_810B7CC();
|
||||
}
|
||||
|
||||
void sub_810B810(void)
|
||||
{
|
||||
gSaveBlock2Ptr->field_A8 |= 0x1;
|
||||
gSaveBlock2Ptr->field_A8 |= 0x10;
|
||||
gSaveBlock2Ptr->field_A8 |= 0x20;
|
||||
}
|
||||
|
||||
void sub_810B82C(void)
|
||||
{
|
||||
gSaveBlock2Ptr->specialSaveWarpFlags |= 0x80;
|
||||
gSaveBlock2Ptr->field_A8 |= 0x2;
|
||||
gSaveBlock2Ptr->field_A8 |= 0x4;
|
||||
gSaveBlock2Ptr->field_A8 |= 0x8;
|
||||
gSaveBlock2Ptr->field_A8 |= 0x8000;
|
||||
}
|
||||
+8
-8
@@ -807,7 +807,7 @@ bool8 ScrCmd_warpteleport2(struct ScriptContext *ctx)
|
||||
u16 y = VarGet(ScriptReadHalfword(ctx));
|
||||
|
||||
Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
|
||||
sub_805DAE4(player_get_direction_lower_nybble());
|
||||
sub_805DAE4(GetPlayerFacingDirection());
|
||||
sub_807E500();
|
||||
ResetInitialPlayerAvatarState();
|
||||
return TRUE;
|
||||
@@ -1154,7 +1154,7 @@ bool8 ScrCmd_faceplayer(struct ScriptContext *ctx)
|
||||
if (gMapObjects[gSelectedEventObject].active)
|
||||
{
|
||||
FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedEventObject],
|
||||
player_get_direction_lower_nybble());
|
||||
GetPlayerFacingDirection());
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
@@ -1201,7 +1201,7 @@ bool8 ScrCmd_turnvobject(struct ScriptContext *ctx)
|
||||
|
||||
bool8 ScrCmd_lockall(struct ScriptContext *ctx)
|
||||
{
|
||||
if (is_c1_link_related_active())
|
||||
if (IsUpdateLinkStateCBActive())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@@ -1215,7 +1215,7 @@ bool8 ScrCmd_lockall(struct ScriptContext *ctx)
|
||||
|
||||
bool8 ScrCmd_lock(struct ScriptContext *ctx)
|
||||
{
|
||||
if (is_c1_link_related_active())
|
||||
if (IsUpdateLinkStateCBActive())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@@ -1241,7 +1241,7 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx)
|
||||
|
||||
HideFieldMessageBox();
|
||||
playerObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
|
||||
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[playerObjectId]);
|
||||
FieldObjectClearHeldMovementIfFinished(&gMapObjects[playerObjectId]);
|
||||
sub_80974D8();
|
||||
UnfreezeMapObjects();
|
||||
return FALSE;
|
||||
@@ -1253,9 +1253,9 @@ bool8 ScrCmd_release(struct ScriptContext *ctx)
|
||||
|
||||
HideFieldMessageBox();
|
||||
if (gMapObjects[gSelectedEventObject].active)
|
||||
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedEventObject]);
|
||||
FieldObjectClearHeldMovementIfFinished(&gMapObjects[gSelectedEventObject]);
|
||||
playerObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
|
||||
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[playerObjectId]);
|
||||
FieldObjectClearHeldMovementIfFinished(&gMapObjects[playerObjectId]);
|
||||
sub_80974D8();
|
||||
UnfreezeMapObjects();
|
||||
return FALSE;
|
||||
@@ -1984,7 +1984,7 @@ bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx)
|
||||
{
|
||||
u8 slotMachineIndex = VarGet(ScriptReadHalfword(ctx));
|
||||
|
||||
PlaySlotMachine(slotMachineIndex, c2_exit_to_overworld_1_continue_scripts_restart_music);
|
||||
PlaySlotMachine(slotMachineIndex, CB2_ReturnToFieldContinueScriptPlayMapMusic);
|
||||
ScriptContext1_Stop();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
+1
-1
@@ -279,7 +279,7 @@ void sub_8069A2C(void)
|
||||
gUnknown_3000FA1 = 0;
|
||||
}
|
||||
|
||||
bool8 sub_8069A38(void)
|
||||
bool8 IsMsgSignPost(void)
|
||||
{
|
||||
if(gUnknown_3000FA1 == TRUE)
|
||||
return TRUE;
|
||||
|
||||
+2
-2
@@ -323,8 +323,8 @@ static void Task_SeaGallop_3(void)
|
||||
PlayRainStoppingSoundEffect();
|
||||
PlaySE(SE_KAIDAN);
|
||||
gFieldCallback = sub_807DF64;
|
||||
warp_in();
|
||||
SetMainCallback2(sub_805671C);
|
||||
WarpIntoMap();
|
||||
SetMainCallback2(CB2_LoadMap);
|
||||
ResetInitialPlayerAvatarState();
|
||||
FreeFerrySpriteResources();
|
||||
Free(sBg3TilemapBuffer);
|
||||
|
||||
+18
-18
@@ -1833,7 +1833,7 @@ bool32 sub_8140C0C(void)
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < NELEMS(gUnknown_84655B0); i++)
|
||||
LoadCompressedObjectPic(&gUnknown_84655B0[i]);
|
||||
LoadCompressedSpriteSheet(&gUnknown_84655B0[i]);
|
||||
LoadSpritePalettes(gUnknown_84655C8);
|
||||
sSlotMachineGfxManager = Alloc(sizeof(*sSlotMachineGfxManager));
|
||||
if (sSlotMachineGfxManager == NULL)
|
||||
@@ -2075,7 +2075,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
|
||||
RequestDma3Fill(0, (void *)VRAM, 0x20, 1);
|
||||
RequestDma3Fill(0, (void *)(VRAM + 0xC000), 0x20, 1);
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, 0);
|
||||
sub_80F6C14();
|
||||
ResetBgPositions();
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, gUnknown_8466B10, NELEMS(gUnknown_8466B10));
|
||||
InitWindows(gUnknown_8466B20);
|
||||
@@ -2084,9 +2084,9 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
|
||||
FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
|
||||
reset_temp_tile_data_buffers();
|
||||
decompress_and_copy_tile_data_to_vram(2, gUnknown_84659D0, 0, 0x00, 0);
|
||||
decompress_and_copy_tile_data_to_vram(2, gUnknown_846653C, 0, 0xC0, 0);
|
||||
ResetTempTileDataBuffers();
|
||||
DecompressAndCopyTileDataToVram(2, gUnknown_84659D0, 0, 0x00, 0);
|
||||
DecompressAndCopyTileDataToVram(2, gUnknown_846653C, 0, 0xC0, 0);
|
||||
SetBgTilemapBuffer(2, ptr->field_185C);
|
||||
CopyToBgTilemapBuffer(2, gUnknown_84661D4, 0, 0x00);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
@@ -2100,8 +2100,8 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
|
||||
|
||||
SetBgTilemapBuffer(0, ptr->field_085C);
|
||||
FillBgTilemapBufferRect_Palette0(0, 0, 0, 2, 32, 30);
|
||||
decompress_and_copy_tile_data_to_vram(1, gUnknown_8466620, 0, 0, 0);
|
||||
decompress_and_copy_tile_data_to_vram(1, gUnknown_8466998, 0, 0, 1);
|
||||
DecompressAndCopyTileDataToVram(1, gUnknown_8466620, 0, 0, 0);
|
||||
DecompressAndCopyTileDataToVram(1, gUnknown_8466998, 0, 0, 1);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
|
||||
LoadPalette(stdpal_get(2), 0xE0, 0x20);
|
||||
@@ -2112,7 +2112,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
|
||||
textColor.fgColor = 15;
|
||||
textColor.bgColor = 1;
|
||||
textColor.shadowColor = 2;
|
||||
box_print(1, 0, x, 0, &textColor, 0, gUnknown_841B779);
|
||||
AddTextPrinterParameterized3(1, 0, x, 0, &textColor, 0, gUnknown_841B779);
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | 0x20 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
|
||||
@@ -2128,7 +2128,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
|
||||
(*state)++;
|
||||
break;
|
||||
case 2:
|
||||
if (!free_temp_tile_data_buffers_if_possible())
|
||||
if (!FreeTempTileDataBuffersIfPossible())
|
||||
{
|
||||
ShowBg(0);
|
||||
ShowBg(3);
|
||||
@@ -2210,7 +2210,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
|
||||
"\tmovs r0, 0\n"
|
||||
"\tmovs r1, 0\n"
|
||||
"\tbl SetGpuReg\n"
|
||||
"\tbl sub_80F6C14\n"
|
||||
"\tbl ResetBgPositions\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tbl ResetBgsAndClearDma3BusyFlags\n"
|
||||
"\tldr r1, _081413A0 @ =gUnknown_8466B10\n"
|
||||
@@ -2233,20 +2233,20 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
|
||||
"\tbl FillBgTilemapBufferRect_Palette0\n"
|
||||
"\tmovs r0, 0x3\n"
|
||||
"\tbl CopyBgTilemapBufferToVram\n"
|
||||
"\tbl reset_temp_tile_data_buffers\n"
|
||||
"\tbl ResetTempTileDataBuffers\n"
|
||||
"\tldr r1, _081413AC @ =gUnknown_84659D0\n"
|
||||
"\tmovs r5, 0\n"
|
||||
"\tstr r5, [sp]\n"
|
||||
"\tmovs r0, 0x2\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tmovs r3, 0\n"
|
||||
"\tbl decompress_and_copy_tile_data_to_vram\n"
|
||||
"\tbl DecompressAndCopyTileDataToVram\n"
|
||||
"\tldr r1, _081413B0 @ =gUnknown_846653C\n"
|
||||
"\tstr r5, [sp]\n"
|
||||
"\tmovs r0, 0x2\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tmovs r3, 0xC0\n"
|
||||
"\tbl decompress_and_copy_tile_data_to_vram\n"
|
||||
"\tbl DecompressAndCopyTileDataToVram\n"
|
||||
"\tldr r1, _081413B4 @ =0x0000185c\n"
|
||||
"\tadd r1, r8\n"
|
||||
"\tmovs r0, 0x2\n"
|
||||
@@ -2301,13 +2301,13 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tmovs r3, 0\n"
|
||||
"\tbl decompress_and_copy_tile_data_to_vram\n"
|
||||
"\tbl DecompressAndCopyTileDataToVram\n"
|
||||
"\tldr r1, _081413D4 @ =gUnknown_8466998\n"
|
||||
"\tstr r6, [sp]\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tmovs r3, 0\n"
|
||||
"\tbl decompress_and_copy_tile_data_to_vram\n"
|
||||
"\tbl DecompressAndCopyTileDataToVram\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tbl CopyBgTilemapBufferToVram\n"
|
||||
"\tmovs r0, 0x2\n"
|
||||
@@ -2341,7 +2341,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tmovs r1, 0\n"
|
||||
"\tmovs r3, 0\n"
|
||||
"\tbl box_print\n"
|
||||
"\tbl AddTextPrinterParameterized3\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tbl CopyBgTilemapBufferToVram\n"
|
||||
"\tmovs r1, 0x83\n"
|
||||
@@ -2386,7 +2386,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
|
||||
"_081413DC: .4byte sub_8141118\n"
|
||||
"_081413E0: .4byte sub_8140E40\n"
|
||||
"_081413E4:\n"
|
||||
"\tbl free_temp_tile_data_buffers_if_possible\n"
|
||||
"\tbl FreeTempTileDataBuffersIfPossible\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tlsrs r5, r0, 24\n"
|
||||
"\tcmp r5, 0\n"
|
||||
@@ -2678,7 +2678,7 @@ void sub_81417E4(const u8 * str)
|
||||
FillWindowPixelBuffer(0, 0x11);
|
||||
PutWindowTilemap(0);
|
||||
DrawTextBorderOuter(0, 0x001, 15);
|
||||
sub_812E62C(0, 2, str, 1, 2, -1, NULL, 1, 2);
|
||||
AddTextPrinterParameterized5(0, 2, str, 1, 2, -1, NULL, 1, 2);
|
||||
}
|
||||
|
||||
void sub_8141828(void)
|
||||
|
||||
+1
-1
@@ -169,7 +169,7 @@ void FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed)
|
||||
sMapMusicFadeInSpeed = fadeInSpeed;
|
||||
}
|
||||
|
||||
void FadeInNewMapMusic(u16 songNum, u8 speed)
|
||||
static void FadeInNewMapMusic(u16 songNum, u8 speed)
|
||||
{
|
||||
FadeInNewBGM(songNum, speed);
|
||||
sCurrentMapMusic = songNum;
|
||||
|
||||
+24
-90
@@ -250,12 +250,26 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] =
|
||||
AffineAnimCmd_frame,
|
||||
};
|
||||
|
||||
static const s32 gUnknown_082EC6F4[24] =
|
||||
static const s32 sUnknown_082EC6F4[3][4][2] =
|
||||
{
|
||||
8, 8, 0x10, 0x10, 0x20, 0x20,
|
||||
0x40, 0x40, 0x10, 8, 0x20, 8,
|
||||
0x20, 0x10, 0x40, 0x20, 8, 0x10,
|
||||
8, 0x20, 0x10, 0x20, 0x20, 0x40,
|
||||
{
|
||||
{8, 8},
|
||||
{0x10, 0x10},
|
||||
{0x20, 0x20},
|
||||
{0x40, 0x40},
|
||||
},
|
||||
{
|
||||
{0x10, 8},
|
||||
{0x20, 8},
|
||||
{0x20, 0x10},
|
||||
{0x40, 0x20},
|
||||
},
|
||||
{
|
||||
{8, 0x10},
|
||||
{8, 0x20},
|
||||
{0x10, 0x20},
|
||||
{0x20, 0x40},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct OamDimensions sOamDimensions[3][4] =
|
||||
@@ -1227,106 +1241,26 @@ s32 sub_800800C(s32 a0, s32 a1, s32 a2)
|
||||
return a2 - ((u32)(a2 * a1) / (u32)(a0) + var1);
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING
|
||||
void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2)
|
||||
void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2)
|
||||
{
|
||||
s32 var0, var1, var2;
|
||||
u8 matrixNum = sprite->oam.matrixNum;
|
||||
|
||||
u32 matrixNum = sprite->oam.matrixNum;
|
||||
if (a1 != 0x800)
|
||||
{
|
||||
var0 = gUnknown_082EC6F4[sprite->oam.size * 8 + sprite->oam.shape * 32];
|
||||
var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][0];
|
||||
var1 = var0 << 8;
|
||||
var2 = (var0 << 16) / gOamMatrices[matrixNum].a;
|
||||
sprite->pos2.x = sub_800800C(var1, var2, a1);
|
||||
}
|
||||
if (a2 != 0x800)
|
||||
{
|
||||
var0 = gUnknown_082EC6F4[4 + (sprite->oam.size * 8 + sprite->oam.shape * 32)];
|
||||
var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][1];
|
||||
var1 = var0 << 8;
|
||||
var2 = (var0 << 16) / gOamMatrices[matrixNum].d;
|
||||
sprite->pos2.y = sub_800800C(var1, var2, a2);
|
||||
}
|
||||
}
|
||||
#else
|
||||
__attribute__((naked))
|
||||
void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2)
|
||||
{
|
||||
asm(".syntax unified\n\
|
||||
push {r4-r7,lr}\n\
|
||||
mov r7, r9\n\
|
||||
mov r6, r8\n\
|
||||
push {r6,r7}\n\
|
||||
adds r5, r0, 0\n\
|
||||
adds r6, r1, 0\n\
|
||||
mov r8, r2\n\
|
||||
ldrb r1, [r5, 0x3]\n\
|
||||
lsls r0, r1, 26\n\
|
||||
lsrs r7, r0, 27\n\
|
||||
movs r0, 0x80\n\
|
||||
lsls r0, 4\n\
|
||||
mov r9, r0\n\
|
||||
cmp r6, r9\n\
|
||||
beq _08007EA2\n\
|
||||
ldr r2, =gUnknown_082EC6F4\n\
|
||||
lsrs r1, 6\n\
|
||||
lsls r1, 3\n\
|
||||
ldrb r0, [r5, 0x1]\n\
|
||||
lsrs r0, 6\n\
|
||||
lsls r0, 5\n\
|
||||
adds r1, r0\n\
|
||||
adds r1, r2\n\
|
||||
ldr r0, [r1]\n\
|
||||
lsls r4, r0, 8\n\
|
||||
lsls r0, 16\n\
|
||||
ldr r2, =gOamMatrices\n\
|
||||
lsls r1, r7, 3\n\
|
||||
adds r1, r2\n\
|
||||
movs r2, 0\n\
|
||||
ldrsh r1, [r1, r2]\n\
|
||||
bl __divsi3\n\
|
||||
adds r1, r0, 0\n\
|
||||
adds r0, r4, 0\n\
|
||||
adds r2, r6, 0\n\
|
||||
bl sub_800800C\n\
|
||||
strh r0, [r5, 0x24]\n\
|
||||
_08007EA2:\n\
|
||||
cmp r8, r9\n\
|
||||
beq _08007EDA\n\
|
||||
ldr r2, =gUnknown_082EC6F4\n\
|
||||
ldrb r1, [r5, 0x3]\n\
|
||||
lsrs r1, 6\n\
|
||||
lsls r1, 3\n\
|
||||
ldrb r0, [r5, 0x1]\n\
|
||||
lsrs r0, 6\n\
|
||||
lsls r0, 5\n\
|
||||
adds r1, r0\n\
|
||||
adds r2, 0x4\n\
|
||||
adds r1, r2\n\
|
||||
ldr r0, [r1]\n\
|
||||
lsls r4, r0, 8\n\
|
||||
lsls r0, 16\n\
|
||||
ldr r2, =gOamMatrices\n\
|
||||
lsls r1, r7, 3\n\
|
||||
adds r1, r2\n\
|
||||
movs r2, 0x6\n\
|
||||
ldrsh r1, [r1, r2]\n\
|
||||
bl __divsi3\n\
|
||||
adds r1, r0, 0\n\
|
||||
adds r0, r4, 0\n\
|
||||
mov r2, r8\n\
|
||||
bl sub_800800C\n\
|
||||
strh r0, [r5, 0x26]\n\
|
||||
_08007EDA:\n\
|
||||
pop {r3,r4}\n\
|
||||
mov r8, r3\n\
|
||||
mov r9, r4\n\
|
||||
pop {r4-r7}\n\
|
||||
pop {r0}\n\
|
||||
bx r0\n\
|
||||
.pool\n\
|
||||
.syntax divided");
|
||||
}
|
||||
#endif // NONMATCHING
|
||||
|
||||
void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip)
|
||||
{
|
||||
|
||||
+200
@@ -0,0 +1,200 @@
|
||||
#include "global.h"
|
||||
#include "task.h"
|
||||
#include "sound.h"
|
||||
#include "field_map_obj.h"
|
||||
#include "script.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
// Tasks governing the ship's departure after you've gotten HM01 CUT
|
||||
|
||||
#define SPRITE_TAG_WAKE 4000
|
||||
#define SPRITE_TAG_SMOKE 4001
|
||||
|
||||
static void Task_SSAnneInit(u8 taskId);
|
||||
static void Task_SSAnneRun(u8 taskId);
|
||||
static void Task_SSAnneFinish(u8 taskId);
|
||||
static void CreateWakeBehindBoat(void);
|
||||
static void WakeSpriteCallback(struct Sprite * sprite);
|
||||
static void CreateSmokeSprite(void);
|
||||
static void SmokeSpriteCallback(struct Sprite * sprite);
|
||||
|
||||
static const u16 sWakeTiles[] = INCBIN_U16("graphics/ss_anne/unk_8479838.4bpp");
|
||||
static const u16 sSmokeTiles[] = INCBIN_U16("graphics/ss_anne/unk_8479A38.4bpp");
|
||||
|
||||
static const struct SpriteSheet sSpriteSheets[] = {
|
||||
{(const void *)sWakeTiles, sizeof(sWakeTiles), SPRITE_TAG_WAKE},
|
||||
{(const void *)sSmokeTiles, sizeof(sSmokeTiles), SPRITE_TAG_SMOKE},
|
||||
{0}
|
||||
};
|
||||
|
||||
static const union AnimCmd sWakeAnim[] = {
|
||||
ANIMCMD_FRAME(0, 12),
|
||||
ANIMCMD_FRAME(8, 12),
|
||||
ANIMCMD_JUMP(0)
|
||||
};
|
||||
|
||||
static const union AnimCmd *const sWakeAnimTable[] = {
|
||||
sWakeAnim
|
||||
};
|
||||
|
||||
static const struct OamData sWakeOamData = {
|
||||
.shape = ST_OAM_V_RECTANGLE,
|
||||
.size = 2
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sWakeSpriteTemplate = {
|
||||
SPRITE_TAG_WAKE,
|
||||
0xFFFF,
|
||||
&sWakeOamData,
|
||||
sWakeAnimTable,
|
||||
NULL,
|
||||
gDummySpriteAffineAnimTable,
|
||||
WakeSpriteCallback
|
||||
};
|
||||
|
||||
static const union AnimCmd sSmokeAnim[] = {
|
||||
ANIMCMD_FRAME( 0, 10),
|
||||
ANIMCMD_FRAME( 4, 20),
|
||||
ANIMCMD_FRAME( 8, 20),
|
||||
ANIMCMD_FRAME(12, 30),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd *const sSmokeAnimTable[] = {
|
||||
sSmokeAnim
|
||||
};
|
||||
|
||||
static const struct OamData sSmokeOamData = {
|
||||
.shape = ST_OAM_SQUARE,
|
||||
.size = 1
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSmokeSpriteTemplate = {
|
||||
SPRITE_TAG_SMOKE,
|
||||
0xFFFF,
|
||||
&sSmokeOamData,
|
||||
sSmokeAnimTable,
|
||||
NULL,
|
||||
gDummySpriteAffineAnimTable,
|
||||
SmokeSpriteCallback
|
||||
};
|
||||
|
||||
void Special_SSAnneDepartureCutscene(void)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
PlaySE(SE_SHIP_HORN);
|
||||
taskId = CreateTask(Task_SSAnneInit, 8);
|
||||
gTasks[taskId].data[0] = 50;
|
||||
}
|
||||
|
||||
static void Task_SSAnneInit(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
if (--data[0] == 0)
|
||||
{
|
||||
LoadSpriteSheets(sSpriteSheets);
|
||||
CreateWakeBehindBoat();
|
||||
gTasks[taskId].func = Task_SSAnneRun;
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_SSAnneRun(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
u8 mapObjectId;
|
||||
struct MapObject * boatObject;
|
||||
s16 x;
|
||||
|
||||
data[1]++;
|
||||
data[2]++;
|
||||
if (data[1] == 70)
|
||||
{
|
||||
data[1] = 0;
|
||||
CreateSmokeSprite();
|
||||
}
|
||||
TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
|
||||
boatObject = &gMapObjects[mapObjectId];
|
||||
if (gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x < -120)
|
||||
{
|
||||
PlaySE(SE_SHIP_HORN);
|
||||
gTasks[taskId].func = Task_SSAnneFinish;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = data[2] / 5;
|
||||
gSprites[boatObject->spriteId].pos2.x = -x;
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_SSAnneFinish(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
if (++data[3] == 40)
|
||||
{
|
||||
FreeSpriteTilesByTag(SPRITE_TAG_WAKE);
|
||||
FreeSpriteTilesByTag(SPRITE_TAG_SMOKE);
|
||||
DestroyTask(taskId);
|
||||
EnableBothScriptContexts();
|
||||
}
|
||||
}
|
||||
|
||||
static void CreateWakeBehindBoat(void)
|
||||
{
|
||||
u8 mapObjectId;
|
||||
struct MapObject * boatObject;
|
||||
u16 x;
|
||||
u8 spriteId;
|
||||
|
||||
TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
|
||||
boatObject = &gMapObjects[mapObjectId];
|
||||
x = gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x + 80;
|
||||
spriteId = CreateSprite(&sWakeSpriteTemplate, x, 109, 0xFF);
|
||||
gSprites[spriteId].oam.priority = 2;
|
||||
gSprites[spriteId].oam.paletteNum = 10;
|
||||
}
|
||||
|
||||
static void WakeSpriteCallback(struct Sprite * sprite)
|
||||
{
|
||||
u8 mapObjectId;
|
||||
struct MapObject * boatObject;
|
||||
u16 x;
|
||||
|
||||
TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
|
||||
boatObject = &gMapObjects[mapObjectId];
|
||||
x = gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x + 80;
|
||||
sprite->pos1.x = x;
|
||||
if (sprite->data[0] / 6 < 22)
|
||||
sprite->data[0]++;
|
||||
sprite->pos2.x = sprite->data[0] / 6;
|
||||
if (sprite->pos1.x + sprite->pos2.x < -18)
|
||||
DestroySprite(sprite);
|
||||
}
|
||||
|
||||
static void CreateSmokeSprite(void)
|
||||
{
|
||||
u8 mapObjectId;
|
||||
struct MapObject * boatObject;
|
||||
u16 x;
|
||||
u8 spriteId;
|
||||
|
||||
TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
|
||||
boatObject = &gMapObjects[mapObjectId];
|
||||
x = gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x + 49;
|
||||
if ((s16)x >= -32)
|
||||
{
|
||||
spriteId = CreateSprite(&sSmokeSpriteTemplate, x, 78, 8);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
gSprites[spriteId].oam.paletteNum = 10;
|
||||
}
|
||||
}
|
||||
|
||||
static void SmokeSpriteCallback(struct Sprite * sprite)
|
||||
{
|
||||
sprite->data[0]++;
|
||||
sprite->pos2.x = sprite->data[0] / 4;
|
||||
if (sprite->animEnded)
|
||||
DestroySprite(sprite);
|
||||
}
|
||||
+1416
File diff suppressed because it is too large
Load Diff
+2
-3
@@ -16,10 +16,9 @@ extern void FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 wid
|
||||
extern void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight);
|
||||
extern u8 GetKeypadIconWidth(u8 keypadIconId);
|
||||
extern void CopyWindowToVram(u8 windowId, u8 mode);
|
||||
extern u16 Font6Func(struct TextPrinter *textPrinter);
|
||||
extern s32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese);
|
||||
extern void PlaySE(u16 songNum);
|
||||
extern u8* UnkTextUtil_GetPtrI(u8 a1);
|
||||
extern u8* DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 a1);
|
||||
|
||||
TextFlags gTextFlags;
|
||||
|
||||
@@ -1545,7 +1544,7 @@ s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
|
||||
}
|
||||
case 0xF7:
|
||||
if (bufferPointer == NULL)
|
||||
bufferPointer = UnkTextUtil_GetPtrI(*++str);
|
||||
bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str);
|
||||
while (*bufferPointer != 0xFF)
|
||||
{
|
||||
glyphWidth = func(*bufferPointer++, isJapanese);
|
||||
|
||||
+13
-13
@@ -31,19 +31,19 @@ void sub_814FD6C(u8 bgId, u16 destOffset, u8 palIdx)
|
||||
|
||||
void sub_814FDA0(u8 bgId, u16 destOffset, u8 palIdx)
|
||||
{
|
||||
LoadBgTiles(bgId, gUnknown_8471A4C, 0x120, destOffset);
|
||||
LoadBgTiles(bgId, gStdFrame0, 0x120, destOffset);
|
||||
LoadPalette(stdpal_get(3), palIdx, 32);
|
||||
}
|
||||
|
||||
void sub_814FDD4(u8 bgId, u16 destOffset)
|
||||
{
|
||||
LoadBgTiles(bgId, gUnknown_8471B6C, 0x280, destOffset);
|
||||
LoadBgTiles(bgId, gStdFrame1, 0x280, destOffset);
|
||||
}
|
||||
|
||||
void sub_814FDF4(u8 bgId, u8 frameType, u16 destOffset, u8 palIdx)
|
||||
{
|
||||
LoadBgTiles(bgId, gUnknown_8471E8C[frameType].tiles, 0x120, destOffset);
|
||||
LoadPalette(gUnknown_8471E8C[frameType].palette, palIdx, 32);
|
||||
LoadBgTiles(bgId, gUserFrames[frameType].tiles, 0x120, destOffset);
|
||||
LoadPalette(gUserFrames[frameType].palette, palIdx, 32);
|
||||
}
|
||||
|
||||
void LoadUserWindowBorderGfx(u8 windowId, u16 destOffset, u8 palIdx)
|
||||
@@ -57,7 +57,7 @@ void sub_814FE6C(u8 windowId, u16 destOffset, u8 palIdx)
|
||||
LoadPalette(stdpal_get(2), palIdx, 32);
|
||||
}
|
||||
|
||||
void sub_814FEAC(u8 windowId, u16 destOffset, u8 palIdx)
|
||||
void TextWindow_LoadResourcesStdFrame0(u8 windowId, u16 destOffset, u8 palIdx)
|
||||
{
|
||||
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_841F1C8, 0x280, destOffset);
|
||||
LoadPalette(stdpal_get(0), palIdx, 32);
|
||||
@@ -69,29 +69,29 @@ void sub_814FEEC(u8 windowId, u16 destOffset, u8 palIdx)
|
||||
LoadPalette(stdpal_get(1), palIdx, 32);
|
||||
}
|
||||
|
||||
void sub_814FF2C(u8 windowId, u16 destOffset, u8 palIdx)
|
||||
void TextWindow_SetStdFrame0_WithPal(u8 windowId, u16 destOffset, u8 palIdx)
|
||||
{
|
||||
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_8471A4C, 0x120, destOffset);
|
||||
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdFrame0, 0x120, destOffset);
|
||||
LoadPalette(stdpal_get(3), palIdx, 32);
|
||||
}
|
||||
|
||||
void sub_814FF6C(u8 windowId, u16 destOffset)
|
||||
{
|
||||
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_8471A4C, 0x120, destOffset);
|
||||
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdFrame0, 0x120, destOffset);
|
||||
}
|
||||
|
||||
void sub_814FF98(u8 windowId, u16 destOffset)
|
||||
void TextWindow_LoadTilesStdFrame1(u8 windowId, u16 destOffset)
|
||||
{
|
||||
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_8471B6C, 0x280, destOffset);
|
||||
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdFrame1, 0x280, destOffset);
|
||||
}
|
||||
|
||||
void sub_814FFC4(u8 windowId, u8 frameType, u16 destOffset, u8 palIdx)
|
||||
{
|
||||
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_8471E8C[frameType].tiles, 0x120, destOffset);
|
||||
LoadPalette(gUnknown_8471E8C[frameType].palette, palIdx, 32);
|
||||
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUserFrames[frameType].tiles, 0x120, destOffset);
|
||||
LoadPalette(gUserFrames[frameType].palette, palIdx, 32);
|
||||
}
|
||||
|
||||
void sub_815001C(u8 windowId, u16 destOffset, u8 palIdx)
|
||||
void TextWindow_SetUserSelectedFrame(u8 windowId, u16 destOffset, u8 palIdx)
|
||||
{
|
||||
sub_814FFC4(windowId, gSaveBlock2Ptr->optionsWindowFrameType, destOffset, palIdx);
|
||||
}
|
||||
|
||||
@@ -27,8 +27,8 @@ static const u16 gUnknown_84719EC[] = INCBIN_U16("graphics/text_window/unk_84715
|
||||
static const u16 gUnknown_8471A0C[] = INCBIN_U16("graphics/text_window/unk_84716AC.gbapal");
|
||||
static const u16 gUnknown_8471A2C[] = INCBIN_U16("graphics/text_window/unk_84717CC.gbapal");
|
||||
|
||||
const u16 gUnknown_8471A4C[] = INCBIN_U16("graphics/text_window/unk_8471A4C.4bpp");
|
||||
const u16 gUnknown_8471B6C[] = INCBIN_U16("graphics/text_window/unk_8471B6C.4bpp");
|
||||
const u16 gStdFrame0[] = INCBIN_U16("graphics/text_window/unk_8471A4C.4bpp");
|
||||
const u16 gStdFrame1[] = INCBIN_U16("graphics/text_window/unk_8471B6C.4bpp");
|
||||
|
||||
const u16 gUnknown_8471DEC[][16] = {
|
||||
INCBIN_U16("graphics/text_window/stdpal_0.gbapal"),
|
||||
@@ -38,7 +38,7 @@ const u16 gUnknown_8471DEC[][16] = {
|
||||
INCBIN_U16("graphics/text_window/stdpal_4.gbapal")
|
||||
};
|
||||
|
||||
const struct TextWindowGraphics gUnknown_8471E8C[] = {
|
||||
const struct TextWindowGraphics gUserFrames[] = {
|
||||
{gUnknown_8470D6C, gUnknown_847190C},
|
||||
{gUnknown_8470E8C, gUnknown_847192C},
|
||||
{gUnknown_8470FCC, gUnknown_847194C},
|
||||
@@ -53,8 +53,8 @@ const struct TextWindowGraphics gUnknown_8471E8C[] = {
|
||||
|
||||
const struct TextWindowGraphics * sub_8069788(u8 idx)
|
||||
{
|
||||
if (idx >= 20) // if (idx >= NELEMS(gUnknown_8471E8C))
|
||||
return &gUnknown_8471E8C[0];
|
||||
if (idx >= 20) // if (idx >= NELEMS(gUserFrames))
|
||||
return &gUserFrames[0];
|
||||
else
|
||||
return &gUnknown_8471E8C[idx];
|
||||
return &gUserFrames[idx];
|
||||
}
|
||||
|
||||
+84
-84
@@ -290,7 +290,7 @@ static void CB2_Idle(void)
|
||||
RunTasks();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
do_scheduled_bg_tilemap_copies_to_vram();
|
||||
DoScheduledBgTilemapCopiesToVram();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
@@ -309,7 +309,7 @@ static void CB2_SetUpTMCaseUI_Blocking(void)
|
||||
break;
|
||||
if (DoSetUpTMCaseUI() == TRUE)
|
||||
break;
|
||||
if (sub_80BF708() == TRUE)
|
||||
if (MenuHelpers_LinkSomething() == TRUE)
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -321,8 +321,8 @@ static bool8 DoSetUpTMCaseUI(void)
|
||||
switch (gMain.state)
|
||||
{
|
||||
case 0:
|
||||
sub_80BF768();
|
||||
clear_scheduled_bg_copies_to_vram();
|
||||
SetVBlankHBlankCallbacksToNull();
|
||||
ClearScheduledBgCopiesToVram();
|
||||
gMain.state++;
|
||||
break;
|
||||
case 1:
|
||||
@@ -359,7 +359,7 @@ static bool8 DoSetUpTMCaseUI(void)
|
||||
gMain.state++;
|
||||
break;
|
||||
case 9:
|
||||
sub_809A5E4(&gBagPockets[POCKET_TM_CASE - 1]);
|
||||
SortPocketAndPlaceHMsFirst(&gBagPockets[POCKET_TM_CASE - 1]);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 10:
|
||||
@@ -426,14 +426,14 @@ static void ResetBufferPointers_NoFree(void)
|
||||
static void LoadBGTemplates(void)
|
||||
{
|
||||
void ** ptr;
|
||||
sub_80BF7C8();
|
||||
ResetAllBgsCoordinatesAndBgCntRegs();
|
||||
ptr = &sTilemapBuffer;
|
||||
*ptr = AllocZeroed(0x800);
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, sBGTemplates, NELEMS(sBGTemplates));
|
||||
SetBgTilemapBuffer(2, *ptr);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
schedule_bg_copy_tilemap_to_vram(2);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
ScheduleBgCopyTilemapToVram(2);
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
ShowBg(0);
|
||||
@@ -446,12 +446,12 @@ static bool8 HandleLoadTMCaseGraphicsAndPalettes(void)
|
||||
switch (sTMCaseDynamicResources->seqId)
|
||||
{
|
||||
case 0:
|
||||
reset_temp_tile_data_buffers();
|
||||
decompress_and_copy_tile_data_to_vram(1, gUnknown_8E845D8, 0, 0, 0);
|
||||
ResetTempTileDataBuffers();
|
||||
DecompressAndCopyTileDataToVram(1, gUnknown_8E845D8, 0, 0, 0);
|
||||
sTMCaseDynamicResources->seqId++;
|
||||
break;
|
||||
case 1:
|
||||
if (free_temp_tile_data_buffers_if_possible() != TRUE)
|
||||
if (FreeTempTileDataBuffersIfPossible() != TRUE)
|
||||
{
|
||||
LZDecompressWram(gUnknown_8E84A24, sTilemapBuffer);
|
||||
sTMCaseDynamicResources->seqId++;
|
||||
@@ -469,7 +469,7 @@ static bool8 HandleLoadTMCaseGraphicsAndPalettes(void)
|
||||
sTMCaseDynamicResources->seqId++;
|
||||
break;
|
||||
case 4:
|
||||
LoadCompressedObjectPic(&sTMSpriteSheet);
|
||||
LoadCompressedSpriteSheet(&sTMSpriteSheet);
|
||||
sTMCaseDynamicResources->seqId++;
|
||||
break;
|
||||
default:
|
||||
@@ -496,11 +496,11 @@ static void InitTMCaseListMenuItems(void)
|
||||
for (i = 0; i < sTMCaseDynamicResources->numTMs; i++)
|
||||
{
|
||||
GetTMNumberAndMoveString(sListMenuStringsBuffer[i], pocket->itemSlots[i].itemId);
|
||||
sListMenuItemsBuffer[i].unk_00 = sListMenuStringsBuffer[i];
|
||||
sListMenuItemsBuffer[i].unk_04 = i;
|
||||
sListMenuItemsBuffer[i].label = sListMenuStringsBuffer[i];
|
||||
sListMenuItemsBuffer[i].index = i;
|
||||
}
|
||||
sListMenuItemsBuffer[i].unk_00 = gText_Close;
|
||||
sListMenuItemsBuffer[i].unk_04 = -2;
|
||||
sListMenuItemsBuffer[i].label = gText_Close;
|
||||
sListMenuItemsBuffer[i].index = -2;
|
||||
gMultiuseListMenuTemplate.items = sListMenuItemsBuffer;
|
||||
gMultiuseListMenuTemplate.totalItems = sTMCaseDynamicResources->numTMs + 1;
|
||||
gMultiuseListMenuTemplate.windowId = 0;
|
||||
@@ -595,8 +595,8 @@ static void TMCase_MoveCursor_UpdatePrintedDescription(s32 itemIndex)
|
||||
|
||||
static void FillBG2RowWithPalette_2timesNplus1(s32 a0)
|
||||
{
|
||||
sub_80F6B08(2, 0, 12, 30, 8, 2 * a0 + 1);
|
||||
schedule_bg_copy_tilemap_to_vram(2);
|
||||
SetBgRectPal(2, 0, 12, 30, 8, 2 * a0 + 1);
|
||||
ScheduleBgCopyTilemapToVram(2);
|
||||
}
|
||||
|
||||
static void PrintListMenuCursorByID_WithColorIdx(u8 a0, u8 a1)
|
||||
@@ -619,13 +619,13 @@ static void PrintListMenuCursorAt_WithColorIdx(u8 a0, u8 a1)
|
||||
|
||||
static void CreateTMCaseScrollIndicatorArrowPair_Main(void)
|
||||
{
|
||||
sTMCaseDynamicResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParametrized(2, 0xA0, 0x08, 0x58, sTMCaseDynamicResources->numTMs - sTMCaseDynamicResources->maxTMsShown + 1, 0x6E, 0x6E, &sTMCaseStaticResources.scrollOffset);
|
||||
sTMCaseDynamicResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParameterized(2, 0xA0, 0x08, 0x58, sTMCaseDynamicResources->numTMs - sTMCaseDynamicResources->maxTMsShown + 1, 0x6E, 0x6E, &sTMCaseStaticResources.scrollOffset);
|
||||
}
|
||||
|
||||
static void CreateTMCaseScrollIndicatorArrowPair_SellQuantitySelect(void)
|
||||
{
|
||||
sTMCaseDynamicResources->currItem = 1;
|
||||
sTMCaseDynamicResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParametrized(2, 0x98, 0x48, 0x68, 2, 0x6E, 0x6E, &sTMCaseDynamicResources->currItem);
|
||||
sTMCaseDynamicResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParameterized(2, 0x98, 0x48, 0x68, 2, 0x6E, 0x6E, &sTMCaseDynamicResources->currItem);
|
||||
}
|
||||
|
||||
static void RemoveTMCaseScrollIndicatorArrowPair(void)
|
||||
@@ -648,7 +648,7 @@ static void TMCaseSetup_GetTMCount(void)
|
||||
struct BagPocket * pocket = &gBagPockets[POCKET_TM_CASE - 1];
|
||||
u16 i;
|
||||
|
||||
sub_809A584(pocket->itemSlots, pocket->capacity);
|
||||
BagPocketCompaction(pocket->itemSlots, pocket->capacity);
|
||||
sTMCaseDynamicResources->numTMs = 0;
|
||||
for (i = 0; i < pocket->capacity; i++)
|
||||
{
|
||||
@@ -716,7 +716,7 @@ static void Task_FadeOutAndCloseTMCase(u8 taskId)
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
DestroyListMenu(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
|
||||
DestroyListMenuTask(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
|
||||
if (sTMCaseDynamicResources->savedCallback != NULL)
|
||||
SetMainCallback2(sTMCaseDynamicResources->savedCallback);
|
||||
else
|
||||
@@ -736,8 +736,8 @@ static void Task_TMCaseMain(u8 taskId)
|
||||
{
|
||||
if (sub_80BF72C() != TRUE)
|
||||
{
|
||||
input = ListMenuHandleInput(data[0]);
|
||||
get_coro_args_x18_x1A(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
|
||||
input = ListMenu_ProcessInput(data[0]);
|
||||
ListMenuGetScrollAndRow(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
|
||||
if (JOY_NEW(SELECT_BUTTON) && sTMCaseStaticResources.unk_05 == 1)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
@@ -782,7 +782,7 @@ static void Task_SelectTMAction_FromFieldBag(u8 taskId)
|
||||
{
|
||||
u8 * strbuf;
|
||||
TMCase_SetWindowBorder2(2);
|
||||
if (!sub_80BF708() && InUnionRoom() != TRUE)
|
||||
if (!MenuHelpers_LinkSomething() && InUnionRoom() != TRUE)
|
||||
{
|
||||
AddTMContextMenu(&sTMCaseDynamicResources->contextMenuWindowId, 0);
|
||||
sTMCaseDynamicResources->menuActionIndices = sMenuActionIndices_Field;
|
||||
@@ -795,7 +795,7 @@ static void Task_SelectTMAction_FromFieldBag(u8 taskId)
|
||||
sTMCaseDynamicResources->numMenuActions = NELEMS(sMenuActionIndices_UnionRoom);
|
||||
}
|
||||
AddItemMenuActionTextPrinters(sTMCaseDynamicResources->contextMenuWindowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, 0, GetFontAttribute(2, 1) + 2, sTMCaseDynamicResources->numMenuActions, sMenuActions_UseGiveExit, sTMCaseDynamicResources->menuActionIndices);
|
||||
ProgramAndPlaceMenuCursorOnWindow(sTMCaseDynamicResources->contextMenuWindowId, 2, 0, 2, GetFontAttribute(2, 1) + 2, sTMCaseDynamicResources->numMenuActions, 0);
|
||||
Menu_InitCursor(sTMCaseDynamicResources->contextMenuWindowId, 2, 0, 2, GetFontAttribute(2, 1) + 2, sTMCaseDynamicResources->numMenuActions, 0);
|
||||
strbuf = Alloc(256);
|
||||
GetTMNumberAndMoveString(strbuf, gSpecialVar_ItemId);
|
||||
StringAppend(strbuf, gText_IsSelected);
|
||||
@@ -806,8 +806,8 @@ static void Task_SelectTMAction_FromFieldBag(u8 taskId)
|
||||
PlaceHMTileInWindow(2, 0, 2);
|
||||
CopyWindowToVram(2, 2);
|
||||
}
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
gTasks[taskId].func = Task_TMContextMenu_HandleInput;
|
||||
}
|
||||
|
||||
@@ -817,7 +817,7 @@ static void Task_TMContextMenu_HandleInput(u8 taskId)
|
||||
|
||||
if (sub_80BF72C() != TRUE)
|
||||
{
|
||||
input = ProcessMenuInputNoWrapAround();
|
||||
input = Menu_ProcessInputNoWrapAround();
|
||||
switch (input)
|
||||
{
|
||||
case -1:
|
||||
@@ -837,11 +837,11 @@ static void Task_TMContextMenu_HandleInput(u8 taskId)
|
||||
static void TMHMContextMenuAction_Use(u8 taskId)
|
||||
{
|
||||
RemoveTMContextMenu(&sTMCaseDynamicResources->contextMenuWindowId);
|
||||
sub_810F4D8(2, 0);
|
||||
ClearStdWindowAndFrameToTransparent(2, 0);
|
||||
ClearWindowTilemap(2);
|
||||
PutWindowTilemap(0);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
if (CalculatePlayerPartyCount() == 0)
|
||||
{
|
||||
PrintError_ThereIsNoPokemon(taskId);
|
||||
@@ -859,13 +859,13 @@ static void TMHMContextMenuAction_Give(u8 taskId)
|
||||
s16 * data = gTasks[taskId].data;
|
||||
u16 itemId = BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1]);
|
||||
RemoveTMContextMenu(&sTMCaseDynamicResources->contextMenuWindowId);
|
||||
sub_810F4D8(2, 0);
|
||||
ClearStdWindowAndFrameToTransparent(2, 0);
|
||||
ClearWindowTilemap(2);
|
||||
PutWindowTilemap(1);
|
||||
PutWindowTilemap(4);
|
||||
PutWindowTilemap(5);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
if (!itemid_is_unique(itemId))
|
||||
{
|
||||
if (CalculatePlayerPartyCount() == 0)
|
||||
@@ -909,16 +909,16 @@ static void Subtask_CloseContextMenuAndReturnToMain(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
DestroyListMenu(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
|
||||
DestroyListMenuTask(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
|
||||
data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sTMCaseStaticResources.scrollOffset, sTMCaseStaticResources.selectedRow);
|
||||
PrintListMenuCursorByID_WithColorIdx(data[0], 1);
|
||||
sub_810F260(6, 0);
|
||||
ClearDialogWindowAndFrameToTransparent(6, 0);
|
||||
ClearWindowTilemap(6);
|
||||
PutWindowTilemap(1);
|
||||
PutWindowTilemap(4);
|
||||
PutWindowTilemap(5);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
Subtask_ReturnToTMCaseMain(taskId);
|
||||
}
|
||||
|
||||
@@ -927,15 +927,15 @@ static void TMHMContextMenuAction_Exit(u8 taskId)
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
RemoveTMContextMenu(&sTMCaseDynamicResources->contextMenuWindowId);
|
||||
sub_810F4D8(2, 0);
|
||||
ClearStdWindowAndFrameToTransparent(2, 0);
|
||||
ClearWindowTilemap(2);
|
||||
PutWindowTilemap(0);
|
||||
PrintListMenuCursorByID_WithColorIdx(data[0], 1);
|
||||
PutWindowTilemap(1);
|
||||
PutWindowTilemap(4);
|
||||
PutWindowTilemap(5);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
Subtask_ReturnToTMCaseMain(taskId);
|
||||
}
|
||||
|
||||
@@ -1016,15 +1016,15 @@ static void Task_SaleOfTMsCancelled(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
sub_810F4D8(8, 0);
|
||||
sub_810F260(6, 0);
|
||||
ClearStdWindowAndFrameToTransparent(8, 0);
|
||||
ClearDialogWindowAndFrameToTransparent(6, 0);
|
||||
PutWindowTilemap(0);
|
||||
PutWindowTilemap(1);
|
||||
PutWindowTilemap(3);
|
||||
PutWindowTilemap(4);
|
||||
PutWindowTilemap(5);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
PrintListMenuCursorByID_WithColorIdx(data[0], 1);
|
||||
Subtask_ReturnToTMCaseMain(taskId);
|
||||
}
|
||||
@@ -1040,8 +1040,8 @@ static void Task_InitQuantitySelectUI(u8 taskId)
|
||||
SellTM_PrintQuantityAndSalePrice(1, itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1])) / 2 * data[8]);
|
||||
HandlePrintMoneyOnHand();
|
||||
CreateTMCaseScrollIndicatorArrowPair_SellQuantitySelect();
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
gTasks[taskId].func = Task_QuantitySelect_HandleInput;
|
||||
}
|
||||
|
||||
@@ -1058,30 +1058,30 @@ static void Task_QuantitySelect_HandleInput(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
if (sub_80BF848(&data[8], data[2]) == 1)
|
||||
if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == 1)
|
||||
{
|
||||
SellTM_PrintQuantityAndSalePrice(data[8], itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1])) / 2 * data[8]);
|
||||
}
|
||||
else if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
sub_810F4D8(7, 0);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ClearStdWindowAndFrameToTransparent(7, 0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
RemoveTMCaseScrollIndicatorArrowPair();
|
||||
Task_AskConfirmSaleWithAmount(taskId);
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
sub_810F4D8(7, 0);
|
||||
sub_810F4D8(8, 0);
|
||||
sub_810F260(6, 0);
|
||||
ClearStdWindowAndFrameToTransparent(7, 0);
|
||||
ClearStdWindowAndFrameToTransparent(8, 0);
|
||||
ClearDialogWindowAndFrameToTransparent(6, 0);
|
||||
PutWindowTilemap(3);
|
||||
PutWindowTilemap(0);
|
||||
PutWindowTilemap(1);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
RemoveTMCaseScrollIndicatorArrowPair();
|
||||
PrintListMenuCursorByID_WithColorIdx(data[0], 1);
|
||||
Subtask_ReturnToTMCaseMain(taskId);
|
||||
@@ -1093,7 +1093,7 @@ static void Task_PrintSaleConfirmedText(u8 taskId)
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
PutWindowTilemap(0);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
CopyItemName(gSpecialVar_ItemId, gStringVar1);
|
||||
ConvertIntToDecimalStringN(gStringVar3, itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6);
|
||||
StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen);
|
||||
@@ -1108,7 +1108,7 @@ static void Task_DoSaleOfTMs(u8 taskId)
|
||||
RemoveBagItem(gSpecialVar_ItemId, data[8]);
|
||||
AddMoney(&gSaveBlock1Ptr->money, itemid_get_market_price(gSpecialVar_ItemId) / 2 * data[8]);
|
||||
sub_809C09C(gSpecialVar_ItemId, data[8], 2);
|
||||
DestroyListMenu(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
|
||||
DestroyListMenuTask(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
|
||||
TMCaseSetup_GetTMCount();
|
||||
TMCaseSetup_InitListMenuPositions();
|
||||
InitTMCaseListMenuItems();
|
||||
@@ -1123,8 +1123,8 @@ static void Task_AfterSale_ReturnToList(u8 taskId)
|
||||
if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
sub_810F4D8(8, 0);
|
||||
sub_810F260(6, 0);
|
||||
ClearStdWindowAndFrameToTransparent(8, 0);
|
||||
ClearDialogWindowAndFrameToTransparent(6, 0);
|
||||
PutWindowTilemap(1);
|
||||
PutWindowTilemap(3);
|
||||
PutWindowTilemap(4);
|
||||
@@ -1171,7 +1171,7 @@ static void Task_TMCaseDude_Playback(u8 taskId)
|
||||
if (data[8] < 21)
|
||||
{
|
||||
data[8] = 21;
|
||||
sub_815AC20();
|
||||
SetTeachyTvControllerModeToResume();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1204,7 +1204,7 @@ static void Task_TMCaseDude_Playback(u8 taskId)
|
||||
{
|
||||
gMain.newKeys = 0;
|
||||
gMain.newAndRepeatedKeys = DPAD_DOWN;
|
||||
ListMenuHandleInput(data[0]);
|
||||
ListMenu_ProcessInput(data[0]);
|
||||
}
|
||||
data[9]++;
|
||||
if (data[9] > 0x65)
|
||||
@@ -1223,7 +1223,7 @@ static void Task_TMCaseDude_Playback(u8 taskId)
|
||||
{
|
||||
gMain.newKeys = 0;
|
||||
gMain.newAndRepeatedKeys = DPAD_UP;
|
||||
ListMenuHandleInput(data[0]);
|
||||
ListMenu_ProcessInput(data[0]);
|
||||
}
|
||||
data[9]++;
|
||||
if (data[9] > 0x65)
|
||||
@@ -1249,8 +1249,8 @@ static void Task_TMCaseDude_Playback(u8 taskId)
|
||||
{
|
||||
FillBG2RowWithPalette_2timesNplus1(0);
|
||||
BeginNormalPaletteFade(0x00000400, 0, 6, 0, 0);
|
||||
sub_810F260(6, 0);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ClearDialogWindowAndFrameToTransparent(6, 0);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
data[8]++;
|
||||
}
|
||||
break;
|
||||
@@ -1269,7 +1269,7 @@ static void Task_TMCaseDude_Playback(u8 taskId)
|
||||
{
|
||||
memcpy(gSaveBlock1Ptr->bagPocket_TMHM, sPokeDudePackBackup->bagPocket_TMHM, sizeof(gSaveBlock1Ptr->bagPocket_TMHM));
|
||||
memcpy(gSaveBlock1Ptr->bagPocket_KeyItems, sPokeDudePackBackup->bagPocket_KeyItems, sizeof(gSaveBlock1Ptr->bagPocket_KeyItems));
|
||||
DestroyListMenu(data[0], NULL, NULL);
|
||||
DestroyListMenuTask(data[0], NULL, NULL);
|
||||
sTMCaseStaticResources.selectedRow = sPokeDudePackBackup->unk_160;
|
||||
sTMCaseStaticResources.scrollOffset = sPokeDudePackBackup->unk_162;
|
||||
Free(sPokeDudePackBackup);
|
||||
@@ -1297,9 +1297,9 @@ static void InitWindowTemplatesAndPals(void)
|
||||
|
||||
InitWindows(sWindowTemplates);
|
||||
DeactivateAllTextPrinters();
|
||||
sub_815001C(0, 0x5B, 0xE0);
|
||||
sub_814FEAC(0, 0x64, 0xB0);
|
||||
sub_814FF2C(0, 0x78, 0xD0);
|
||||
TextWindow_SetUserSelectedFrame(0, 0x5B, 0xE0);
|
||||
TextWindow_LoadResourcesStdFrame0(0, 0x64, 0xB0);
|
||||
TextWindow_SetStdFrame0_WithPal(0, 0x78, 0xD0);
|
||||
LoadPalette(gTMCaseMainWindowPalette, 0xF0, 0x20);
|
||||
LoadPalette(gTMCaseMainWindowPalette, 0xA0, 0x20);
|
||||
LoadPalette(sPal3Override, 0xF6, 0x04);
|
||||
@@ -1312,42 +1312,42 @@ static void InitWindowTemplatesAndPals(void)
|
||||
PutWindowTilemap(3);
|
||||
PutWindowTilemap(4);
|
||||
PutWindowTilemap(5);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
}
|
||||
|
||||
static void AddTextPrinterParameterized_ColorByIndex(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx)
|
||||
{
|
||||
AddTextPrinterParametrized2(windowId, fontId, x, y, letterSpacing, lineSpacing, &sTextColors[colorIdx], speed, str);
|
||||
AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, &sTextColors[colorIdx], speed, str);
|
||||
}
|
||||
|
||||
static void TMCase_SetWindowBorder1(u8 windowId)
|
||||
{
|
||||
SetWindowBorderStyle(windowId, FALSE, 0x5B, 0x0E);
|
||||
DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x5B, 0x0E);
|
||||
}
|
||||
|
||||
static void TMCase_SetWindowBorder2(u8 windowId)
|
||||
{
|
||||
SetWindowBorderStyle(windowId, FALSE, 0x78, 0x0D);
|
||||
DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x78, 0x0D);
|
||||
}
|
||||
|
||||
static void TMCase_PrintMessageWithFollowupTask(u8 taskId, u8 windowId, const u8 * str, TaskFunc func)
|
||||
{
|
||||
DisplayMessageAndContinueTask(taskId, 6, 0x64, 0x0B, windowId, GetTextSpeedSetting(), str, func);
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
}
|
||||
|
||||
static void PrintStringTMCaseOnWindow3(void)
|
||||
{
|
||||
u32 distance = 72 - GetStringWidth(1, gText_TMCase, 0);
|
||||
box_print(3, 1, distance / 2, 1, &sTextColors[0], 0, gText_TMCase);
|
||||
AddTextPrinterParameterized3(3, 1, distance / 2, 1, &sTextColors[0], 0, gText_TMCase);
|
||||
}
|
||||
|
||||
static void DrawMoveInfoUIMarkers(void)
|
||||
{
|
||||
blit_move_info_icon(4, 19, 0, 0);
|
||||
blit_move_info_icon(4, 20, 0, 12);
|
||||
blit_move_info_icon(4, 21, 0, 24);
|
||||
blit_move_info_icon(4, 22, 0, 36);
|
||||
BlitMoveInfoIcon(4, 19, 0, 0);
|
||||
BlitMoveInfoIcon(4, 20, 0, 12);
|
||||
BlitMoveInfoIcon(4, 21, 0, 24);
|
||||
BlitMoveInfoIcon(4, 22, 0, 36);
|
||||
CopyWindowToVram(4, 2);
|
||||
}
|
||||
|
||||
@@ -1369,7 +1369,7 @@ static void TMCase_MoveCursor_UpdatePrintedTMInfo(u16 itemId)
|
||||
else
|
||||
{
|
||||
move = ItemIdToBattleMoveId(itemId);
|
||||
blit_move_info_icon(5, gBattleMoves[move].type + 1, 0, 0);
|
||||
BlitMoveInfoIcon(5, gBattleMoves[move].type + 1, 0, 0);
|
||||
if (gBattleMoves[move].power < 2)
|
||||
str = gText_ThreeHyphens;
|
||||
else
|
||||
@@ -1413,17 +1413,17 @@ static u8 AddTMContextMenu(u8 * a0, u8 a1)
|
||||
{
|
||||
*a0 = AddWindow(&sTMContextWindowTemplates[a1]);
|
||||
TMCase_SetWindowBorder1(*a0);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
}
|
||||
return *a0;
|
||||
}
|
||||
|
||||
static void RemoveTMContextMenu(u8 * a0)
|
||||
{
|
||||
sub_810F4D8(*a0, FALSE);
|
||||
ClearStdWindowAndFrameToTransparent(*a0, FALSE);
|
||||
ClearWindowTilemap(*a0);
|
||||
RemoveWindow(*a0);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
*a0 = 0xFF;
|
||||
}
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 palett
|
||||
else
|
||||
{
|
||||
sCreatingSpriteTemplate.paletteTag = paletteTag;
|
||||
LoadCompressedObjectPalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality));
|
||||
LoadCompressedSpritePalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality));
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -122,7 +122,7 @@ void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 palett
|
||||
else
|
||||
{
|
||||
sCreatingSpriteTemplate.paletteTag = paletteTag;
|
||||
LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[species]);
|
||||
LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[species]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+57
-114
@@ -35,45 +35,10 @@ struct UnkStruct_8479D34
|
||||
u8 flags3[8];
|
||||
};
|
||||
|
||||
struct UnkSubstruct_203F458_000C_004
|
||||
{
|
||||
/* 0x000 */ u8 unk_000[11];
|
||||
/* 0x00B */ u8 unk_00B;
|
||||
/* 0x00C */ u8 unk_00C;
|
||||
/* 0x00E */ u16 unk_00E[6];
|
||||
/* 0x01A */ u16 unk_01A[6];
|
||||
/* 0x026 */ u16 unk_026[6];
|
||||
/* 0x032 */ u16 unk_032[6];
|
||||
/* 0x040 */ struct BattleTowerPokemon unk_040[PARTY_SIZE];
|
||||
}; // size: 328
|
||||
|
||||
struct UnkSubstruct_203F458_000C
|
||||
{
|
||||
/* 0x000 */ u8 unk_000;
|
||||
/* 0x000 */ u8 unk_001;
|
||||
/* 0x002 */ u8 unk_002;
|
||||
/* 0x003 */ u8 unk_003;
|
||||
/* 0x004 */ struct UnkSubstruct_203F458_000C_004 unk_004[3];
|
||||
/* 0x3DC */ u8 filler_3DC[4];
|
||||
};
|
||||
|
||||
struct Unk_203F458_Header
|
||||
{
|
||||
u8 unk0;
|
||||
u8 unk1;
|
||||
u32 unk4;
|
||||
};
|
||||
|
||||
struct UnkStruct_203F458_SaveBlock
|
||||
{
|
||||
struct Unk_203F458_Header unk_0000;
|
||||
struct UnkSubstruct_203F458_000C unk_0008[8];
|
||||
};
|
||||
|
||||
struct UnkStruct_203F458
|
||||
{
|
||||
/* 0x0000 */ u8 unk_0000;
|
||||
/* 0x0004 */ struct UnkStruct_203F458_SaveBlock unk_0004;
|
||||
/* 0x0004 */ struct TrainerTowerData unk_0004;
|
||||
};
|
||||
|
||||
struct UnkStruct_203F45C
|
||||
@@ -112,6 +77,7 @@ struct UnkStruct_847A074
|
||||
|
||||
EWRAM_DATA struct UnkStruct_203F458 * gUnknown_203F458 = NULL;
|
||||
EWRAM_DATA struct UnkStruct_203F45C * gUnknown_203F45C = NULL;
|
||||
EWRAM_DATA u8 unused_variable = 0;
|
||||
|
||||
void sub_815D96C(void);
|
||||
void sub_815DC8C(void); // setup
|
||||
@@ -563,30 +529,7 @@ const u8 gUnknown_847A30E[][3] = {
|
||||
};
|
||||
|
||||
extern const struct Unk_203F458_Header gUnknown_84827AC;
|
||||
extern const struct UnkSubstruct_203F458_000C *const gUnknown_84827B4[][8];
|
||||
|
||||
bool32 sub_815D7BC(void * dest, void * buffer)
|
||||
{
|
||||
if (TryCopySpecialSaveSection(30, buffer) != 1)
|
||||
return FALSE;
|
||||
memcpy(dest + 0x000, buffer, 0xF88);
|
||||
|
||||
if (TryCopySpecialSaveSection(31, buffer) != 1)
|
||||
return FALSE;
|
||||
memcpy(dest + 0xF88, buffer, 0xF80);
|
||||
|
||||
if (!sub_815D6B4(dest))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 sub_815D80C(void * dest)
|
||||
{
|
||||
void * buffer = AllocZeroed(0x1000);
|
||||
bool32 success = sub_815D7BC(dest, buffer);
|
||||
Free(buffer);
|
||||
return success;
|
||||
}
|
||||
extern const struct TrainerTowerTrainer *const gUnknown_84827B4[][8];
|
||||
|
||||
bool32 sub_815D834(void)
|
||||
{
|
||||
@@ -623,10 +566,10 @@ void sub_815D8C8(void)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_815D8F8(void) // fakematching
|
||||
void sub_815D8F8(void)
|
||||
{
|
||||
u8 i;
|
||||
register u32 found_map asm("r4") = 0xFF;
|
||||
u8 found_map = 0xFF;
|
||||
for (i = 0; i < 15; i++)
|
||||
{
|
||||
if (gUnknown_8479D34[i].mapGroup == gSaveBlock1Ptr->location.mapGroup && gUnknown_8479D34[i].mapNum == gSaveBlock1Ptr->location.mapNum)
|
||||
@@ -696,23 +639,23 @@ void sub_815DA54(void)
|
||||
sub_815DC8C();
|
||||
gUnknown_203F45C = AllocZeroed(sizeof(*gUnknown_203F45C));
|
||||
r10 = VarGet(VAR_0x4001);
|
||||
StringCopyN(gUnknown_203F45C->unk_00, gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10].unk_000, 11);
|
||||
StringCopyN(gUnknown_203F45C->unk_00, gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10].unk_000, 11);
|
||||
|
||||
for (r9 = 0; r9 < 6; r9++)
|
||||
{
|
||||
gUnknown_203F45C->unk_0C[r9] = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10].unk_01A[r9];
|
||||
gUnknown_203F45C->unk_18[r9] = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10].unk_026[r9];
|
||||
gUnknown_203F45C->unk_0C[r9] = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10].unk_01A[r9];
|
||||
gUnknown_203F45C->unk_18[r9] = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10].unk_026[r9];
|
||||
|
||||
if (gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002 == 1)
|
||||
if (gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002 == 1)
|
||||
{
|
||||
gUnknown_203F45C->unk_24[r9] = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10 + 1].unk_01A[r9];
|
||||
gUnknown_203F45C->unk_30[r9] = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10 + 1].unk_026[r9];
|
||||
gUnknown_203F45C->unk_24[r9] = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10 + 1].unk_01A[r9];
|
||||
gUnknown_203F45C->unk_30[r9] = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10 + 1].unk_026[r9];
|
||||
}
|
||||
}
|
||||
|
||||
gUnknown_203F45C->unk_3C = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002;
|
||||
gUnknown_203F45C->unk_3D = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10].unk_00B;
|
||||
gUnknown_203F45C->unk_3E = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10].unk_00C;
|
||||
gUnknown_203F45C->unk_3C = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002;
|
||||
gUnknown_203F45C->unk_3D = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10].unk_00B;
|
||||
gUnknown_203F45C->unk_3E = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10].unk_00C;
|
||||
SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
|
||||
sub_815DD2C();
|
||||
}
|
||||
@@ -750,12 +693,12 @@ void sub_815DC8C(void) // fakematching
|
||||
{
|
||||
u32 whichTimer = gSaveBlock1Ptr->unkArrayIdx;
|
||||
s32 r4;
|
||||
const struct UnkSubstruct_203F458_000C *const * r7;
|
||||
const struct TrainerTowerTrainer *const * r7;
|
||||
|
||||
gUnknown_203F458 = AllocZeroed(sizeof(*gUnknown_203F458));
|
||||
gUnknown_203F458->unk_0000 = gMapHeader.mapDataId - 0x2A;
|
||||
if (sub_815D834() == TRUE)
|
||||
sub_815D80C(&gUnknown_203F458->unk_0004);
|
||||
CEReaderTool_LoadTrainerTower(&gUnknown_203F458->unk_0004);
|
||||
else
|
||||
{
|
||||
struct UnkStruct_203F458 * r0_ = gUnknown_203F458;
|
||||
@@ -767,12 +710,12 @@ void sub_815DC8C(void) // fakematching
|
||||
for (r4 = 0; r4 < 8; r4++)
|
||||
{
|
||||
void * r0 = gUnknown_203F458;
|
||||
r0 = r4 * sizeof(struct UnkSubstruct_203F458_000C) + r0;
|
||||
r0 += offsetof(struct UnkStruct_203F458, unk_0004.unk_0008);
|
||||
memcpy(r0, r7[r4], sizeof(struct UnkSubstruct_203F458_000C));
|
||||
r0 = r4 * sizeof(struct TrainerTowerTrainer) + r0;
|
||||
r0 += offsetof(struct UnkStruct_203F458, unk_0004.trainers);
|
||||
memcpy(r0, r7[r4], sizeof(struct TrainerTowerTrainer));
|
||||
// r0[r4] = *r7[r4];
|
||||
}
|
||||
gUnknown_203F458->unk_0004.unk_0000.unk4 = CalcByteArraySum((void *)gUnknown_203F458->unk_0004.unk_0008, sizeof(gUnknown_203F458->unk_0004.unk_0008));
|
||||
gUnknown_203F458->unk_0004.unk4 = CalcByteArraySum((void *)gUnknown_203F458->unk_0004.trainers, sizeof(gUnknown_203F458->unk_0004.trainers));
|
||||
sub_815EC0C();
|
||||
}
|
||||
}
|
||||
@@ -799,7 +742,7 @@ void sub_815DC8C(void)
|
||||
"\tbne _0815DCD0\n"
|
||||
"\tldr r0, [r4]\n"
|
||||
"\tadds r0, 0x4\n"
|
||||
"\tbl sub_815D80C\n"
|
||||
"\tbl CEReaderTool_LoadTrainerTower\n"
|
||||
"\tb _0815DD18\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0815DCBC: .4byte gSaveBlock1Ptr\n"
|
||||
@@ -860,14 +803,14 @@ void sub_815DD2C(void)
|
||||
|
||||
void sub_815DD44(void)
|
||||
{
|
||||
if (gMapHeader.mapDataId - 0x129 > gUnknown_203F458->unk_0004.unk_0000.unk0)
|
||||
if (gMapHeader.mapDataId - 0x129 > gUnknown_203F458->unk_0004.count)
|
||||
{
|
||||
gSpecialVar_Result = 3;
|
||||
SetCurrentMapLayout(0x132);
|
||||
}
|
||||
else
|
||||
{
|
||||
gSpecialVar_Result = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002;
|
||||
gSpecialVar_Result = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002;
|
||||
SetCurrentMapLayout(gUnknown_847A284[gUnknown_203F458->unk_0000][gSpecialVar_Result]);
|
||||
sub_815DDB0();
|
||||
}
|
||||
@@ -877,10 +820,10 @@ void sub_815DDB0(void)
|
||||
{
|
||||
s32 r3, r4;
|
||||
u8 r1, r2, r4_;
|
||||
switch (gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002)
|
||||
switch (gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002)
|
||||
{
|
||||
case 0:
|
||||
r2 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[0].unk_00B;
|
||||
r2 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_00B;
|
||||
for (r3 = 0; r3 < NELEMS(gUnknown_8479ED8); r3++)
|
||||
{
|
||||
if (gUnknown_8479ED8[r3].unk1 == r2)
|
||||
@@ -893,7 +836,7 @@ void sub_815DDB0(void)
|
||||
VarSet(VAR_0x4011, r1);
|
||||
break;
|
||||
case 1:
|
||||
r2 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[0].unk_00B;
|
||||
r2 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_00B;
|
||||
for (r3 = 0; r3 < NELEMS(gUnknown_847A024); r3++)
|
||||
{
|
||||
if (gUnknown_847A024[r3].unk2 == r2)
|
||||
@@ -915,7 +858,7 @@ void sub_815DDB0(void)
|
||||
case 2:
|
||||
for (r4 = 0; r4 < 3; r4++)
|
||||
{
|
||||
r2 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_00B;
|
||||
r2 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_00B;
|
||||
for (r3 = 0; r3 < NELEMS(gUnknown_8479ED8); r3++)
|
||||
{
|
||||
if (gUnknown_8479ED8[r3].unk1 == r2)
|
||||
@@ -962,25 +905,25 @@ void sub_815DF54(void)
|
||||
{
|
||||
u16 r4 = gSpecialVar_0x8006;
|
||||
u8 r1;
|
||||
u8 r5 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002;
|
||||
u8 r5 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002;
|
||||
// HOW DO I MATCH THIS CONTROL FLOW?!?!
|
||||
r1 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r5 == 1 ? 0 : r4].unk_00B;
|
||||
r1 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r5 == 1 ? 0 : r4].unk_00B;
|
||||
switch (gSpecialVar_0x8005)
|
||||
{
|
||||
case 2:
|
||||
sub_815E068(r5, r1);
|
||||
sub_815DEFC(gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_00E, gStringVar4);
|
||||
sub_815DEFC(gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_00E, gStringVar4);
|
||||
break;
|
||||
case 3:
|
||||
sub_815E068(r5, r1);
|
||||
sub_815DEFC(gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_01A, gStringVar4);
|
||||
sub_815DEFC(gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_01A, gStringVar4);
|
||||
break;
|
||||
case 4:
|
||||
sub_815E068(r5, r1);
|
||||
sub_815DEFC(gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_026, gStringVar4);
|
||||
sub_815DEFC(gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_026, gStringVar4);
|
||||
break;
|
||||
case 5:
|
||||
sub_815DEFC(gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_032, gStringVar4);
|
||||
sub_815DEFC(gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_032, gStringVar4);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1163,7 +1106,7 @@ void sub_815E068(u8 battleType, u8 facilityClass)
|
||||
|
||||
void sub_815E114(void)
|
||||
{
|
||||
SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
|
||||
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
|
||||
}
|
||||
|
||||
void sub_815E124(u8 taskId)
|
||||
@@ -1180,7 +1123,7 @@ void sub_815E124(u8 taskId)
|
||||
void sub_815E160(void)
|
||||
{
|
||||
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_FACTORY;
|
||||
if (gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002 == 1)
|
||||
if (gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002 == 1)
|
||||
gBattleTypeFlags |= BATTLE_TYPE_DOUBLE;
|
||||
gTrainerBattleOpponent_A = 0;
|
||||
sub_815E9FC();
|
||||
@@ -1192,7 +1135,7 @@ void sub_815E160(void)
|
||||
void sub_815E1C0(void)
|
||||
{
|
||||
if (!gSpecialVar_0x8005)
|
||||
gSpecialVar_Result = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002;
|
||||
gSpecialVar_Result = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002;
|
||||
}
|
||||
|
||||
void sub_815E1F0(void)
|
||||
@@ -1203,7 +1146,7 @@ void sub_815E1F0(void)
|
||||
void sub_815E218(void)
|
||||
{
|
||||
u16 mapDataId = gMapHeader.mapDataId;
|
||||
if (mapDataId - 0x12A == gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8 && mapDataId - 0x129 <= gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_001)
|
||||
if (mapDataId - 0x12A == gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8 && mapDataId - 0x129 <= gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_001)
|
||||
gSpecialVar_Result = FALSE;
|
||||
else
|
||||
gSpecialVar_Result = TRUE;
|
||||
@@ -1239,7 +1182,7 @@ void sub_815E394(void)
|
||||
|
||||
void sub_815E408(void)
|
||||
{
|
||||
u16 itemId = gUnknown_847A2B4[gUnknown_203F458->unk_0004.unk_0008->unk_003];
|
||||
u16 itemId = gUnknown_847A2B4[gUnknown_203F458->unk_0004.trainers->unk_003];
|
||||
if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0)
|
||||
gSpecialVar_Result = 2;
|
||||
else if (AddBagItem(itemId, 1) == 1)
|
||||
@@ -1356,7 +1299,7 @@ void sub_815E720(void)
|
||||
void sub_815E88C(void)
|
||||
{
|
||||
u8 windowId = VarGet(VAR_0x4001);
|
||||
sub_810F4D8(windowId, TRUE);
|
||||
ClearStdWindowAndFrameToTransparent(windowId, TRUE);
|
||||
RemoveWindow(windowId);
|
||||
}
|
||||
|
||||
@@ -1367,9 +1310,9 @@ void sub_815E8B4(void)
|
||||
|
||||
void sub_815E8CC(void)
|
||||
{
|
||||
if (gUnknown_203F458->unk_0004.unk_0000.unk0 != gUnknown_203F458->unk_0004.unk_0008[0].unk_001)
|
||||
if (gUnknown_203F458->unk_0004.count != gUnknown_203F458->unk_0004.trainers[0].unk_001)
|
||||
{
|
||||
ConvertIntToDecimalStringN(gStringVar1, gUnknown_203F458->unk_0004.unk_0000.unk0, STR_CONV_MODE_LEFT_ALIGN, 1);
|
||||
ConvertIntToDecimalStringN(gStringVar1, gUnknown_203F458->unk_0004.count, STR_CONV_MODE_LEFT_ALIGN, 1);
|
||||
gSpecialVar_Result = TRUE;
|
||||
}
|
||||
else
|
||||
@@ -1394,7 +1337,7 @@ void sub_815E948(void)
|
||||
{
|
||||
s32 i;
|
||||
u16 var_4001 = VarGet(VAR_0x4001);
|
||||
u8 r1 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[var_4001].unk_00B;
|
||||
u8 r1 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[var_4001].unk_00B;
|
||||
|
||||
for (i = 0; i < NELEMS(gUnknown_847A074); i++)
|
||||
{
|
||||
@@ -1427,29 +1370,29 @@ void sub_815E9FC(void)
|
||||
|
||||
ZeroEnemyPartyMons();
|
||||
|
||||
switch (gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002)
|
||||
switch (gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
for (r6 = 0; r6 < 2; r6++)
|
||||
{
|
||||
r2 = gUnknown_847A2EE[r5][r6];
|
||||
gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9;
|
||||
sub_803E0A4(&gEnemyParty[r6], &gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
|
||||
gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9;
|
||||
CreateBattleTowerMon(&gEnemyParty[r6], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
r2 = gUnknown_847A2FE[r5][0];
|
||||
gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2].level = r9;
|
||||
sub_803E0A4(&gEnemyParty[0], &gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2]);
|
||||
gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2].level = r9;
|
||||
CreateBattleTowerMon(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2]);
|
||||
r2 = gUnknown_847A2FE[r5][1];
|
||||
gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2].level = r9;
|
||||
sub_803E0A4(&gEnemyParty[1], &gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2]);
|
||||
gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2].level = r9;
|
||||
CreateBattleTowerMon(&gEnemyParty[1], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2]);
|
||||
break;
|
||||
case 2:
|
||||
r2 = gUnknown_847A30E[r5][r4];
|
||||
gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9;
|
||||
sub_803E0A4(&gEnemyParty[0], &gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
|
||||
gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9;
|
||||
CreateBattleTowerMon(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1474,15 +1417,15 @@ static s32 GetPartyMaxLevel(void)
|
||||
|
||||
void sub_815EC0C(void)
|
||||
{
|
||||
if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 != gUnknown_203F458->unk_0004.unk_0000.unk1)
|
||||
if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 != gUnknown_203F458->unk_0004.id)
|
||||
{
|
||||
gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 = gUnknown_203F458->unk_0004.unk_0000.unk1;
|
||||
gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 = gUnknown_203F458->unk_0004.id;
|
||||
sub_815EDF4(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4, 215999);
|
||||
gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_815EC8C(void)
|
||||
void PrintTrainerTowerRecords(void)
|
||||
{
|
||||
s32 i;
|
||||
u8 windowId = 0;
|
||||
@@ -1490,14 +1433,14 @@ void sub_815EC8C(void)
|
||||
sub_815DC8C();
|
||||
FillWindowPixelRect(0, 0, 0, 0, 0xd8, 0x90);
|
||||
sub_815EC0C();
|
||||
box_print(0, 2, 0x4a, 0, &gUnknown_847A22C, 0, gUnknown_83FE982);
|
||||
AddTextPrinterParameterized3(0, 2, 0x4a, 0, &gUnknown_847A22C, 0, gUnknown_83FE982);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
PRINT_TOWER_TIME(sub_815EDDC(&gSaveBlock1Ptr->unkArray[i].unk4));
|
||||
StringExpandPlaceholders(gStringVar4, gUnknown_83FE998);
|
||||
box_print(windowId, 2, 0x18, 0x24 + 0x14 * i, &gUnknown_847A22C, 0, gUnknown_83FE9C4[i]);
|
||||
box_print(windowId, 2, 0x60, 0x24 + 0x14 * i, &gUnknown_847A22C, 0, gStringVar4);
|
||||
AddTextPrinterParameterized3(windowId, 2, 0x18, 0x24 + 0x14 * i, &gUnknown_847A22C, 0, gUnknown_83FE9C4[i]);
|
||||
AddTextPrinterParameterized3(windowId, 2, 0x60, 0x24 + 0x14 * i, &gUnknown_847A22C, 0, gStringVar4);
|
||||
}
|
||||
|
||||
PutWindowTilemap(windowId);
|
||||
|
||||
+2
-2
@@ -28,7 +28,7 @@ void sub_8159F40(void)
|
||||
s32 opIdx = 0;
|
||||
const struct UnkStruct_84792D0 * data;
|
||||
|
||||
gBattleTypeFlags = BATTLE_TYPE_DOME;
|
||||
gBattleTypeFlags = BATTLE_TYPE_POKEDUDE;
|
||||
ZeroPlayerPartyMons();
|
||||
ZeroEnemyPartyMons();
|
||||
data = gUnknown_84792D0[gSpecialVar_0x8004];
|
||||
@@ -612,7 +612,7 @@ void sub_815A540(void)
|
||||
s16 x, y;
|
||||
|
||||
PlayerGetDestCoords(&x, &y);
|
||||
if (!MetatileBehavior_IsSurfable(MapGridGetMetatileBehaviorAt(x, y)) && TestPlayerAvatarFlags(0x08))
|
||||
if (!MetatileBehavior_IsSurfable(MapGridGetMetatileBehaviorAt(x, y)) && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
|
||||
{
|
||||
struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
|
||||
SetPlayerAvatarTransitionFlags(0x01);
|
||||
|
||||
+3
-2
@@ -41,6 +41,7 @@ static void sub_815CFEC(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2);
|
||||
static bool32 SharesTileWithAnyActive(u32 id);
|
||||
static bool32 SharesPalWithAnyActive(u32 id);
|
||||
static void sub_8035648(void);
|
||||
static u8 sub_815D324(u32 shape, u32 size);
|
||||
|
||||
// ewram
|
||||
static EWRAM_DATA struct UnkStruct1 *gUnknown_203F454 = {0};
|
||||
@@ -127,7 +128,7 @@ bool32 sub_815CA40(u32 id, s32 arg1, const struct UnkStruct3 *arg2)
|
||||
|
||||
compObjectPic = *(struct CompressedSpriteSheet*)(arg2->spriteSheet);
|
||||
compObjectPic.size = GetDecompressedDataSize(arg2->spriteSheet->data);
|
||||
gUnknown_203F454->array[id].tileStart = LoadCompressedObjectPic(&compObjectPic);
|
||||
gUnknown_203F454->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic);
|
||||
}
|
||||
|
||||
if (gUnknown_203F454->array[id].tileStart == 0xFFFF)
|
||||
@@ -430,7 +431,7 @@ static bool32 SharesPalWithAnyActive(u32 id)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 sub_815D324(u32 shape, u32 size)
|
||||
static u8 sub_815D324(u32 shape, u32 size)
|
||||
{
|
||||
return gUnknown_8479658[shape][size];
|
||||
}
|
||||
|
||||
@@ -0,0 +1,322 @@
|
||||
#include "global.h"
|
||||
#include "decompress.h"
|
||||
#include "sound.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
void sub_815F1AC(u8 taskId);
|
||||
bool32 sub_815F2AC(u8 spriteId);
|
||||
void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3);
|
||||
bool32 sub_815F444(u8 spriteId);
|
||||
void sub_815F470(struct Sprite * sprite);
|
||||
void sub_815F564(u16 tilesTag, u16 palTag);
|
||||
u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);
|
||||
void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p);
|
||||
|
||||
void sub_815F138(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
|
||||
{
|
||||
u8 taskId = CreateTask(sub_815F1AC, 80);
|
||||
gTasks[taskId].data[2] = tilesTag;
|
||||
gTasks[taskId].data[3] = palTag;
|
||||
gTasks[taskId].data[4] = x;
|
||||
gTasks[taskId].data[5] = y;
|
||||
gTasks[taskId].data[6] = subpriority;
|
||||
}
|
||||
|
||||
bool8 sub_815F198(void)
|
||||
{
|
||||
return FuncIsActiveTask(sub_815F1AC);
|
||||
}
|
||||
|
||||
void sub_815F1AC(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
switch (data[0])
|
||||
{
|
||||
case 0:
|
||||
sub_815F564(data[2], data[3]);
|
||||
data[7] = sub_815F5BC(data[2], data[3], data[4], data[5], data[6]);
|
||||
sub_815F610(data[2], data[3], data[4], data[5], data[6], &data[8], &data[9]);
|
||||
data[0]++;
|
||||
break;
|
||||
case 1:
|
||||
if (!sub_815F2AC(data[7]))
|
||||
{
|
||||
sub_815F3E0(data[7], data[8], data[9]);
|
||||
FreeSpriteOamMatrix(&gSprites[data[7]]);
|
||||
DestroySprite(&gSprites[data[7]]);
|
||||
data[0]++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (!sub_815F444(data[8]))
|
||||
{
|
||||
DestroySprite(&gSprites[data[8]]);
|
||||
DestroySprite(&gSprites[data[9]]);
|
||||
FreeSpriteTilesByTag(data[2]);
|
||||
FreeSpritePaletteByTag(data[3]);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool32 sub_815F2AC(u8 spriteId)
|
||||
{
|
||||
struct Sprite * sprite = &gSprites[spriteId];
|
||||
|
||||
switch (sprite->data[0])
|
||||
{
|
||||
case 0:
|
||||
sub_8007FFC(sprite, 0x800, 0x1A);
|
||||
sprite->data[0]++;
|
||||
// fallthrough
|
||||
case 1:
|
||||
if (sprite->data[2] == 0)
|
||||
PlaySE(SE_TRACK_STOP);
|
||||
if (++sprite->data[2] >= 20)
|
||||
{
|
||||
sprite->data[2] = 0;
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
sprite->data[0]++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (sprite->affineAnimEnded)
|
||||
sprite->data[0]++;
|
||||
break;
|
||||
case 3:
|
||||
if (++sprite->data[2] >= 4)
|
||||
{
|
||||
sprite->data[2] = 0;
|
||||
sprite->data[0]++;
|
||||
StartSpriteAffineAnim(sprite, 2);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
sprite->pos1.y -= 4;
|
||||
if (++sprite->data[2] >= 8)
|
||||
{
|
||||
if (sprite->data[4] < 2)
|
||||
{
|
||||
StartSpriteAnim(sprite, sprite->data[4] + 1);
|
||||
sprite->data[2] = 0;
|
||||
sprite->data[0]++;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[0] = 7;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
sprite->pos1.y += 4;
|
||||
if (++sprite->data[2] >= 8)
|
||||
{
|
||||
sprite->data[2] = 0;
|
||||
StartSpriteAffineAnim(sprite, 3);
|
||||
sprite->data[0]++;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if (sprite->affineAnimEnded)
|
||||
{
|
||||
sprite->data[4]++;
|
||||
sprite->data[0] = 1;
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3)
|
||||
{
|
||||
gSprites[spriteId2].pos2.y = -40;
|
||||
gSprites[spriteId3].pos2.y = -40;
|
||||
gSprites[spriteId2].invisible = FALSE;
|
||||
gSprites[spriteId3].invisible = FALSE;
|
||||
gSprites[spriteId2].callback = sub_815F470;
|
||||
gSprites[spriteId3].callback = sub_815F470;
|
||||
}
|
||||
|
||||
bool32 sub_815F444(u8 spriteId)
|
||||
{
|
||||
return gSprites[spriteId].callback == sub_815F470;
|
||||
}
|
||||
|
||||
void sub_815F470(struct Sprite * sprite)
|
||||
{
|
||||
s16 * data = sprite->data;
|
||||
s32 y;
|
||||
|
||||
switch (sprite->data[0])
|
||||
{
|
||||
case 0:
|
||||
data[4] = 64;
|
||||
data[5] = sprite->pos2.y << 4;
|
||||
data[0]++;
|
||||
//fallthrough
|
||||
case 1:
|
||||
data[5] += data[4];
|
||||
data[4]++;
|
||||
sprite->pos2.y = data[5] >> 4;
|
||||
if (sprite->pos2.y >= 0)
|
||||
{
|
||||
PlaySE(SE_TRACK_STOP);
|
||||
sprite->pos2.y = 0;
|
||||
data[0]++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
data[1] += 12;
|
||||
if (data[1] >= 128)
|
||||
{
|
||||
PlaySE(SE_TRACK_STOP);
|
||||
data[1] = 0;
|
||||
data[0]++;
|
||||
}
|
||||
y = gSineTable[data[1]];
|
||||
sprite->pos2.y = -(y >> 4);
|
||||
break;
|
||||
case 3:
|
||||
data[1] += 16;
|
||||
if (data[1] >= 128)
|
||||
{
|
||||
PlaySE(SE_TRACK_STOP);
|
||||
data[1] = 0;
|
||||
data[0]++;
|
||||
}
|
||||
sprite->pos2.y = -(gSineTable[data[1]] >> 5);
|
||||
break;
|
||||
case 4:
|
||||
if (++data[1] > 40)
|
||||
sprite->callback = SpriteCallbackDummy;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const u16 gUnknown_847A328[] = INCBIN_U16("data/graphics/unk_847a348.gbapal");
|
||||
const u16 gUnknown_847A348[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz");
|
||||
|
||||
void sub_815F564(u16 tilesTag, u16 palTag)
|
||||
{
|
||||
struct CompressedSpriteSheet spriteSheet = {(const void *)gUnknown_847A348, 0xE00};
|
||||
struct SpritePalette spritePalette = {gUnknown_847A328};
|
||||
spriteSheet.tag = tilesTag;
|
||||
spritePalette.tag = palTag;
|
||||
LoadCompressedSpriteSheet(&spriteSheet);
|
||||
LoadSpritePalette(&spritePalette);
|
||||
}
|
||||
|
||||
const struct OamData gOamData_847A7AC = {
|
||||
.affineMode = ST_OAM_AFFINE_DOUBLE,
|
||||
.shape = ST_OAM_SQUARE,
|
||||
.size = 2
|
||||
};
|
||||
|
||||
const struct OamData gOamData_847A7B4 = {
|
||||
.affineMode = ST_OAM_AFFINE_OFF,
|
||||
.shape = ST_OAM_H_RECTANGLE,
|
||||
.size = 3
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_847A7BC[] = {
|
||||
ANIMCMD_FRAME( 0, 1),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_847A7C4[] = {
|
||||
ANIMCMD_FRAME(16, 1),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_847A7CC[] = {
|
||||
ANIMCMD_FRAME(32, 1),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd *const gUnknown_847A7D4[] = {
|
||||
gUnknown_847A7BC,
|
||||
gUnknown_847A7C4,
|
||||
gUnknown_847A7CC
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_847A7E0[] = {
|
||||
ANIMCMD_FRAME(48, 1),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_847A7E8[] = {
|
||||
ANIMCMD_FRAME(80, 1),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd *const gUnknown_847A7F0[] = {
|
||||
gUnknown_847A7E0,
|
||||
gUnknown_847A7E8
|
||||
};
|
||||
|
||||
const union AffineAnimCmd gUnknown_847A7F8[] = {
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
|
||||
AFFINEANIMCMD_END
|
||||
};
|
||||
|
||||
const union AffineAnimCmd gUnknown_847A808[] = {
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
|
||||
AFFINEANIMCMD_FRAME( 0x10, -0x10, 0, 8),
|
||||
AFFINEANIMCMD_END
|
||||
};
|
||||
|
||||
const union AffineAnimCmd gUnknown_847A820[] = {
|
||||
AFFINEANIMCMD_FRAME(-0x12, 0x12, 0, 8),
|
||||
AFFINEANIMCMD_END
|
||||
};
|
||||
|
||||
const union AffineAnimCmd gUnknown_847A830[] = {
|
||||
AFFINEANIMCMD_FRAME( 0x6, -0x6, 0, 8),
|
||||
AFFINEANIMCMD_FRAME( -0x4, 0x4, 0, 8),
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
|
||||
AFFINEANIMCMD_END
|
||||
};
|
||||
|
||||
const union AffineAnimCmd *const gUnknown_847A850[] = {
|
||||
gUnknown_847A7F8,
|
||||
gUnknown_847A808,
|
||||
gUnknown_847A820,
|
||||
gUnknown_847A830
|
||||
};
|
||||
|
||||
u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
|
||||
{
|
||||
struct SpriteTemplate spriteTemplate = {
|
||||
.oam = &gOamData_847A7AC,
|
||||
.anims = gUnknown_847A7D4,
|
||||
.affineAnims = gUnknown_847A850,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
spriteTemplate.tileTag = tilesTag;
|
||||
spriteTemplate.paletteTag = palTag;
|
||||
return CreateSprite(&spriteTemplate, x, y, subpriority);
|
||||
}
|
||||
|
||||
void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p)
|
||||
{
|
||||
struct SpriteTemplate spriteTemplate = {
|
||||
.oam = &gOamData_847A7B4,
|
||||
.anims = gUnknown_847A7F0,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
spriteTemplate.tileTag = tilesTag;
|
||||
spriteTemplate.paletteTag = palTag;
|
||||
*spriteId2_p = CreateSprite(&spriteTemplate, x - 32, y, subpriority);
|
||||
*spriteId3_p = CreateSprite(&spriteTemplate, x + 32, y, subpriority);
|
||||
gSprites[*spriteId2_p].invisible = TRUE;
|
||||
gSprites[*spriteId3_p].invisible = TRUE;
|
||||
StartSpriteAnim(&gSprites[*spriteId3_p], 1);
|
||||
}
|
||||
+1
-1
@@ -814,7 +814,7 @@ void Task_VsSeeker_0(u8 taskId)
|
||||
}
|
||||
else if (respval == 2)
|
||||
{
|
||||
sub_80A2294(4, 0, gSpecialVar_ItemId, 0xffff);
|
||||
ItemUse_SetQuestLogEvent(4, 0, gSpecialVar_ItemId, 0xffff);
|
||||
FieldEffectStart(FLDEFF_UNK_41); // TODO: name this enum
|
||||
gTasks[taskId].func = Task_VsSeeker_1;
|
||||
gTasks[taskId].data[0] = 15;
|
||||
|
||||
+60
-682
@@ -378,698 +378,76 @@ void FillWindowPixelBuffer(u8 windowId, u8 fillValue)
|
||||
CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize);
|
||||
}
|
||||
|
||||
// functionally equivalent, its fucking hard to match
|
||||
#ifdef NONMATCHING
|
||||
#define MOVE_TILES_DOWN(a) \
|
||||
{ \
|
||||
destOffset = i + (a); \
|
||||
srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \
|
||||
if (srcOffset < size) \
|
||||
*(u32*)(tileData + destOffset) = *(u32*)(tileData + srcOffset); \
|
||||
else \
|
||||
*(u32*)(tileData + destOffset) = fillValue32; \
|
||||
distanceLoop++; \
|
||||
}
|
||||
|
||||
#define MOVE_TILES_UP(a) \
|
||||
{ \
|
||||
destOffset = i + (a); \
|
||||
srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \
|
||||
if (srcOffset < size) \
|
||||
*(u32*)(tileData - destOffset) = *(u32*)(tileData - srcOffset); \
|
||||
else \
|
||||
*(u32*)(tileData - destOffset) = fillValue32; \
|
||||
distanceLoop++; \
|
||||
}
|
||||
|
||||
void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
|
||||
{
|
||||
s32 i, id1, id2, size;
|
||||
u32 distanceLoop, toFill, width;
|
||||
u8 *tileData;
|
||||
struct WindowTemplate window;
|
||||
struct WindowTemplate window = gWindows[windowId].window;
|
||||
u8 *tileData = gWindows[windowId].tileData;
|
||||
u32 fillValue32 = (fillValue << 24) | (fillValue << 16) | (fillValue << 8) | fillValue;
|
||||
s32 size = window.height * window.width * 32;
|
||||
u32 width = window.width;
|
||||
s32 i;
|
||||
s32 srcOffset, destOffset;
|
||||
u32 distanceLoop;
|
||||
|
||||
tileData = gWindows[windowId].tileData;
|
||||
toFill = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 8) | fillValue;
|
||||
window = gWindows[windowId].window;
|
||||
size = 0x20 * (window.height * window.width);
|
||||
width = window.width;
|
||||
if (direction != 1)
|
||||
switch (direction)
|
||||
{
|
||||
s32 signedDirection = direction;
|
||||
if (signedDirection <= 1)
|
||||
{
|
||||
if (signedDirection == 0)
|
||||
{
|
||||
for (i = 0; i < size; i += 0x20)
|
||||
{
|
||||
distanceLoop = distance;
|
||||
id1 = i + 0;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 4;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 8;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 12;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 16;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 20;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 24;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 28;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData + id1) = *(u32*)(tileData + id2);
|
||||
else
|
||||
*(u32*)(tileData + id1) = toFill;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
tileData += size - 4;
|
||||
for (i = 0; i < size; i += 0x20)
|
||||
case 0:
|
||||
for (i = 0; i < size; i += 32)
|
||||
{
|
||||
distanceLoop = distance;
|
||||
id1 = i + 0;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 4;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 8;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 12;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 16;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 20;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 24;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
|
||||
distanceLoop++;
|
||||
id1 = i + 28;
|
||||
id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
|
||||
if (id2 < size)
|
||||
*(u32*)(tileData - id1) = *(u32*)(tileData - id2);
|
||||
else
|
||||
*(u32*)(tileData - id1) = toFill;
|
||||
MOVE_TILES_DOWN(0)
|
||||
MOVE_TILES_DOWN(4)
|
||||
MOVE_TILES_DOWN(8)
|
||||
MOVE_TILES_DOWN(12)
|
||||
MOVE_TILES_DOWN(16)
|
||||
MOVE_TILES_DOWN(20)
|
||||
MOVE_TILES_DOWN(24)
|
||||
MOVE_TILES_DOWN(28)
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
tileData += size - 4;
|
||||
for (i = 0; i < size; i += 32)
|
||||
{
|
||||
distanceLoop = distance;
|
||||
MOVE_TILES_UP(0)
|
||||
MOVE_TILES_UP(4)
|
||||
MOVE_TILES_UP(8)
|
||||
MOVE_TILES_UP(12)
|
||||
MOVE_TILES_UP(16)
|
||||
MOVE_TILES_UP(20)
|
||||
MOVE_TILES_UP(24)
|
||||
MOVE_TILES_UP(28)
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
__attribute__((naked))
|
||||
void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
|
||||
{
|
||||
asm(".syntax unified\n\
|
||||
push {r4-r7,lr}\n\
|
||||
mov r7, r10\n\
|
||||
mov r6, r9\n\
|
||||
mov r5, r8\n\
|
||||
push {r5-r7}\n\
|
||||
sub sp, 0x8\n\
|
||||
lsls r0, 24\n\
|
||||
lsrs r0, 24\n\
|
||||
lsls r1, 24\n\
|
||||
lsrs r1, 24\n\
|
||||
mov r8, r1\n\
|
||||
lsls r2, 24\n\
|
||||
lsrs r2, 24\n\
|
||||
str r2, [sp]\n\
|
||||
lsls r3, 24\n\
|
||||
lsrs r3, 24\n\
|
||||
ldr r2, =gWindows\n\
|
||||
lsls r1, r0, 1\n\
|
||||
adds r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r4, r1, r2\n\
|
||||
adds r2, 0x8\n\
|
||||
adds r1, r2\n\
|
||||
ldr r5, [r1]\n\
|
||||
lsls r7, r3, 24\n\
|
||||
lsls r0, r3, 16\n\
|
||||
orrs r7, r0\n\
|
||||
lsls r0, r3, 8\n\
|
||||
orrs r7, r0\n\
|
||||
orrs r7, r3\n\
|
||||
ldr r1, [r4]\n\
|
||||
ldr r2, [r4, 0x4]\n\
|
||||
ldrb r3, [r4, 0x4]\n\
|
||||
lsrs r0, r1, 24\n\
|
||||
muls r0, r3\n\
|
||||
lsls r6, r0, 5\n\
|
||||
lsrs r1, 24\n\
|
||||
mov r12, r1\n\
|
||||
mov r0, r8\n\
|
||||
cmp r0, 0x1\n\
|
||||
bne _08003CE8\n\
|
||||
b _08003E9E\n\
|
||||
_08003CE8:\n\
|
||||
cmp r0, 0x1\n\
|
||||
ble _08003CEE\n\
|
||||
b _08004046\n\
|
||||
_08003CEE:\n\
|
||||
cmp r0, 0\n\
|
||||
beq _08003CF4\n\
|
||||
b _08004046\n\
|
||||
_08003CF4:\n\
|
||||
movs r4, 0\n\
|
||||
cmp r4, r6\n\
|
||||
blt _08003CFC\n\
|
||||
b _08004046\n\
|
||||
_08003CFC:\n\
|
||||
movs r1, 0x8\n\
|
||||
negs r1, r1\n\
|
||||
mov r9, r1\n\
|
||||
movs r2, 0x7\n\
|
||||
mov r8, r2\n\
|
||||
mov r10, r5\n\
|
||||
_08003D08:\n\
|
||||
ldr r3, [sp]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r2, r8\n\
|
||||
ands r0, r2\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003D34\n\
|
||||
adds r0, r5, r1\n\
|
||||
ldr r0, [r0]\n\
|
||||
mov r1, r10\n\
|
||||
str r0, [r1]\n\
|
||||
b _08003D38\n\
|
||||
.pool\n\
|
||||
_08003D34:\n\
|
||||
mov r2, r10\n\
|
||||
str r7, [r2]\n\
|
||||
_08003D38:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0x4\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003D64\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003D68\n\
|
||||
_08003D64:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003D68:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x8\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003D96\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003D9A\n\
|
||||
_08003D96:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003D9A:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0xC\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003DC8\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003DCC\n\
|
||||
_08003DC8:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003DCC:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x10\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003DFA\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003DFE\n\
|
||||
_08003DFA:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003DFE:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x14\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003E2C\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003E30\n\
|
||||
_08003E2C:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003E30:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x18\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003E5E\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003E62\n\
|
||||
_08003E5E:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003E62:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x1C\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
adds r0, r1, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r3, r1\n\
|
||||
orrs r0, r3\n\
|
||||
lsls r0, 2\n\
|
||||
adds r1, r4, r0\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003E8C\n\
|
||||
adds r0, r5, r2\n\
|
||||
adds r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003E90\n\
|
||||
_08003E8C:\n\
|
||||
adds r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003E90:\n\
|
||||
movs r2, 0x20\n\
|
||||
add r10, r2\n\
|
||||
adds r4, 0x20\n\
|
||||
cmp r4, r6\n\
|
||||
bge _08003E9C\n\
|
||||
b _08003D08\n\
|
||||
_08003E9C:\n\
|
||||
b _08004046\n\
|
||||
_08003E9E:\n\
|
||||
subs r0, r6, 0x4\n\
|
||||
adds r5, r0\n\
|
||||
movs r4, 0\n\
|
||||
cmp r4, r6\n\
|
||||
blt _08003EAA\n\
|
||||
b _08004046\n\
|
||||
_08003EAA:\n\
|
||||
movs r0, 0x8\n\
|
||||
negs r0, r0\n\
|
||||
mov r9, r0\n\
|
||||
movs r1, 0x7\n\
|
||||
mov r8, r1\n\
|
||||
mov r10, r5\n\
|
||||
_08003EB6:\n\
|
||||
ldr r3, [sp]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r2, r9\n\
|
||||
ands r0, r2\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r2, r8\n\
|
||||
ands r0, r2\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003EDC\n\
|
||||
subs r0, r5, r1\n\
|
||||
ldr r0, [r0]\n\
|
||||
mov r1, r10\n\
|
||||
str r0, [r1]\n\
|
||||
b _08003EE0\n\
|
||||
_08003EDC:\n\
|
||||
mov r2, r10\n\
|
||||
str r7, [r2]\n\
|
||||
_08003EE0:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0x4\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003F0C\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003F10\n\
|
||||
_08003F0C:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003F10:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x8\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003F3E\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003F42\n\
|
||||
_08003F3E:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003F42:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0xC\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003F70\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003F74\n\
|
||||
_08003F70:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003F74:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x10\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003FA2\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003FA6\n\
|
||||
_08003FA2:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003FA6:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x14\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08003FD4\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08003FD8\n\
|
||||
_08003FD4:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08003FD8:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x18\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
str r1, [sp, 0x4]\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r0, r1\n\
|
||||
ldr r1, [sp, 0x4]\n\
|
||||
orrs r1, r0\n\
|
||||
lsls r1, 2\n\
|
||||
adds r1, r4, r1\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08004006\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _0800400A\n\
|
||||
_08004006:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_0800400A:\n\
|
||||
adds r3, 0x1\n\
|
||||
adds r2, r4, 0\n\
|
||||
adds r2, 0x1C\n\
|
||||
adds r0, r3, 0\n\
|
||||
mov r1, r9\n\
|
||||
ands r0, r1\n\
|
||||
mov r1, r12\n\
|
||||
muls r1, r0\n\
|
||||
adds r0, r1, 0\n\
|
||||
mov r1, r8\n\
|
||||
ands r3, r1\n\
|
||||
orrs r0, r3\n\
|
||||
lsls r0, 2\n\
|
||||
adds r1, r4, r0\n\
|
||||
cmp r1, r6\n\
|
||||
bge _08004034\n\
|
||||
subs r0, r5, r2\n\
|
||||
subs r1, r5, r1\n\
|
||||
ldr r1, [r1]\n\
|
||||
str r1, [r0]\n\
|
||||
b _08004038\n\
|
||||
_08004034:\n\
|
||||
subs r0, r5, r2\n\
|
||||
str r7, [r0]\n\
|
||||
_08004038:\n\
|
||||
movs r2, 0x20\n\
|
||||
negs r2, r2\n\
|
||||
add r10, r2\n\
|
||||
adds r4, 0x20\n\
|
||||
cmp r4, r6\n\
|
||||
bge _08004046\n\
|
||||
b _08003EB6\n\
|
||||
_08004046:\n\
|
||||
add sp, 0x8\n\
|
||||
pop {r3-r5}\n\
|
||||
mov r8, r3\n\
|
||||
mov r9, r4\n\
|
||||
mov r10, r5\n\
|
||||
pop {r4-r7}\n\
|
||||
pop {r0}\n\
|
||||
bx r0\n\
|
||||
.syntax divided");
|
||||
}
|
||||
#endif // NONMATCHING
|
||||
|
||||
void CallWindowFunction(u8 windowId, void ( *func)(u8, u8, u8, u8, u8, u8))
|
||||
void CallWindowFunction(u8 windowId, WindowFunc func)
|
||||
{
|
||||
struct WindowTemplate window = gWindows[windowId].window;
|
||||
func(window.bg, window.tilemapLeft, window.tilemapTop, window.width, window.height, window.paletteNum);
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include "scanline_effect.h"
|
||||
#include "m4a.h"
|
||||
#include "string_util.h"
|
||||
#include "unk_text_util.h"
|
||||
#include "dynamic_placeholder_text_util.h"
|
||||
#include "overworld.h"
|
||||
#include "sound.h"
|
||||
#include "menu.h"
|
||||
@@ -208,7 +208,7 @@ void sub_814F1E4(void)
|
||||
ChangeBgY(1, 0, 0);
|
||||
LoadPalette(gUnknown_846F4D0, 0, 0x20);
|
||||
Menu_LoadStdPalAt(0xf0);
|
||||
UnkTextUtil_Reset();
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 0xF);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
SetMainCallback2(sub_814F19C);
|
||||
@@ -229,7 +229,7 @@ void sub_814F32C(void)
|
||||
Free(GetBgTilemapBuffer(i));
|
||||
}
|
||||
Free(gUnknown_3002040);
|
||||
SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
|
||||
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
|
||||
}
|
||||
|
||||
void sub_814F364(s16 * unk0, s16 * unk1)
|
||||
@@ -359,7 +359,7 @@ void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx)
|
||||
break;
|
||||
// default: UB
|
||||
}
|
||||
AddTextPrinterParametrized2(windowId, fontId,x, y, fontId == 0 ? 0 : 1, 0, &textColor, -1, str);
|
||||
AddTextPrinterParameterized4(windowId, fontId,x, y, fontId == 0 ? 0 : 1, 0, &textColor, -1, str);
|
||||
}
|
||||
|
||||
u32 sub_814F714(struct UnkStruct_x20 * unk20, u32 * arg1)
|
||||
|
||||
Reference in New Issue
Block a user