Merge branch 'master' into slot_machine

This commit is contained in:
PikalaxALT
2019-07-29 21:10:54 -04:00
2917 changed files with 162856 additions and 112104 deletions
+15 -14
View File
@@ -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
View File
@@ -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
+809
View File
@@ -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;
}
}
}
+576
View File
@@ -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
View File
@@ -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)
+191
View File
@@ -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;
}
}
+130
View File
@@ -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);
}
+52 -136
View File
@@ -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)
+216
View File
@@ -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);
}
+38
View File
@@ -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;
}
}
+88
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+31
View File
@@ -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
+140
View File
@@ -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,
};
+187
View File
@@ -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}},
};
+844
View File
@@ -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),
}
};
+420
View File
@@ -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
+308
View File
@@ -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
View File
@@ -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);
}
+662
View File
@@ -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
View File
@@ -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
View File
@@ -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;
+70
View File
@@ -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
View File
@@ -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);
}
+397
View File
@@ -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
View File
@@ -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);
}
+117
View File
@@ -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;
}
+26
View File
@@ -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
View File
@@ -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);
}
}
+48
View File
@@ -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;
}
+39
View File
@@ -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);
}
+137
View File
@@ -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();
}
+111
View File
@@ -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;
}
+47
View File
@@ -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();
}
+101
View File
@@ -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);
}
}
+1 -2
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+53
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+684
View File
@@ -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;
}
+783
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+879
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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:
+251
View File
@@ -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;
}
+659
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);
}
+1 -1
View File
@@ -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();
+8 -8
View File
@@ -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);
+765
View File
@@ -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
View File
@@ -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);
}
+65
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+135 -134
View File
@@ -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);
}
+2 -2
View File
@@ -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)
+3 -3
View File
@@ -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;
+29
View File
@@ -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);
}
+80
View File
@@ -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
View File
@@ -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;
+108
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+2 -3
View File
@@ -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
View File
@@ -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);
}
+6 -6
View File
@@ -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
View File
@@ -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;
}
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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];
}
+322
View File
@@ -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
View File
@@ -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
View File
@@ -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);
+4 -4
View File
@@ -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)