Merge branch 'master' of github.com:pret/pokefirered into misc_doc

This commit is contained in:
PikalaxALT 2021-03-24 08:15:08 -04:00
commit 6b64fbc522
23 changed files with 3255 additions and 4336 deletions

View File

@ -537,7 +537,7 @@ void GetIsDoomDesireHitTurn(u8 taskId);
// flying.c
void AnimTask_AnimateGustTornadoPalette(u8 taskId);
void sub_80B1D3C(struct Sprite *sprite);
void DestroyAnimSpriteAfterTimer(struct Sprite *sprite);
void AnimTask_DrillPeckHitSplats(u8 taskId);
// poison.c

View File

@ -1,212 +1,8 @@
#ifndef GUARD_BERRY_CRUSH_H
#define GUARD_BERRY_CRUSH_H
enum {
BCTEXT_AREYOUREADY,
BCTEXT_WAITFOROTHERS,
BCTEXT_GAINEDPOWDER,
BCTEXT_RECORDINGRESULTS,
BCTEXT_ASKPLAYAGAIN,
BCTEXT_CANCEL_NOBERRIES,
BCTEXT_CANCEL_DROPPEDOUT,
BCTEXT_TIMEUP,
BCTEXT_COMMSTANDBY,
};
#include "main.h"
enum {
BCCMD_BeginNormalPaletteFade = 1,
BCCMD_WaitPaletteFade,
BCCMD_PrintMessage,
BCCMD_InitGfx,
BCCMD_TeardownGfx,
BCCMD_SignalReadyToBegin,
BCCMD_AskPickBerry,
BCCMD_GoToBerryPouch,
BCCMD_WaitForOthersToPickBerries,
BCCMD_DropBerriesIntoCrusher,
BCCMD_DropLid,
BCCMD_Countdown,
BCCMD_PlayGame_Master,
BCCMD_PlayGame_Slave,
BCCMD_FinishGame,
BCCMD_HandleTimeUp,
BCCMD_TabulateResults,
BCCMD_ShowResults,
BCCMD_SaveTheGame,
BCCMD_AskPlayAgain,
BCCMD_CommunicatePlayAgainResponses,
BCCMD_FadeOutToPlayAgain,
BCCMD_PlayAgainFailureMessage,
BCCMD_GracefulExit,
BCCMD_Quit,
};
struct BerryCrushGame_Player
{
u16 berryId;
u16 unk2;
union
{
u8 as_2d_bytes[2][8];
u16 as_hwords[8];
} unk4;
u8 unk14[12];
};
struct BerryCrushGame_5C
{
u16 unk00;
u8 unk02_0:1;
u8 unk02_1:1;
u8 pushedAButton:1;
u8 unk02_3:5;
s8 unk03;
u16 unk04;
u16 unk06;
u16 unk08;
u16 unk0A;
};
struct __attribute__((packed, aligned(2))) BerryCrushGame_4E
{
u16 unk0;
struct BerryCrushGame_5C data;
};
union BerryCrushGame_68
{
struct BerryCrushGame_68_x
{
struct BerryCrushGame_68_x_SubStruct
{
s32 unk00;
u16 unk04;
s16 unk06;
u16 unk08;
u16 unk0A;
// 0: Number of A presses
// 1: Neatness
u16 stats[2][5];
u8 filler20[16];
} unk00;
u8 unk30[12];
struct BerryCrushGame_Player others[4];
u8 fillerBC[20];
} as_four_players;
struct BerryCrushGame_68_y
{
u8 filler00[28];
struct BerryCrushGame_Player players[5];
u8 fillerBC[20];
} as_five_players;
};
struct BerryCrushPlayerSeatCoords
{
u8 unk0;
u8 unk1;
u8 unk2;
s16 unk4;
s16 unk6;
s16 unk8;
s16 unkA;
};
struct BerryCrushGame_138
{
u8 animBerryIdx;
u8 unk1;
u8 unk2;
u8 unk3;
s16 minutes;
s16 secondsInt;
s16 secondsFrac;
const struct BerryCrushPlayerSeatCoords * seatCoords[5];
struct Sprite *coreSprite;
struct Sprite *impactSprites[5];
struct Sprite *berrySprites[5];
struct Sprite *sparkleSprites[11];
struct Sprite *timerSprites[2];
u8 unk80;
u8 filler81;
u8 unk82;
u8 unk83[5];
};
struct BerryCrushGame
{
MainCallback savedCallback;
u32 (*cmdCallback)(struct BerryCrushGame *, u8 *);
u8 localId;
u8 playerCount;
u8 taskId;
u8 textSpeed;
u8 cmdState;
u8 unkD;
u8 nextCmd;
u8 afterPalFadeCmd;
u16 unk10;
u16 gameState;
u16 unk14;
u16 pressingSpeed;
s16 unk18;
s16 unk1A;
int powder;
s32 unk20;
u8 unk24;
u8 unk25_0:1;
u8 unk25_1:1;
u8 unk25_2:1;
u8 unk25_3:1;
u8 unk25_4:1;
u8 unk25_5:3;
u16 unk26;
u16 timer;
s16 depth;
s16 vibration;
s16 unk2E;
s16 unk30;
s16 unk32;
s16 unk34;
u8 commandParams[10];
u16 sendCmd[7];
u16 recvCmd[7];
struct BerryCrushGame_5C localState;
union BerryCrushGame_68 unk68;
struct BerryCrushGame_138 spritesManager;
u8 bg1Buffer[0x1000];
u8 unk11C0[0x1000];
u8 bg2Buffer[0x1000];
u8 bg3Buffer[0x1000];
};
#define BERRYCRUSH_PLAYER_NAME(game, i) \
((u8 *)(game) \
+ offsetof(struct BerryCrushGame, unk68) \
+ offsetof(struct BerryCrushGame_68_x, unk30) \
+ sizeof(struct BerryCrushGame_Player) * (i))
struct BerryCrushGame *GetBerryCrushGame(void);
void StartBerryCrush(MainCallback callback);
u32 ExitBerryCrushWithCallback(MainCallback callback);
void CB2_BerryCrush_GoToBerryPouch(void);
void BerryCrush_SetVBlankCallback(void);
void BerryCrush_UnsetVBlankCallback(void);
void BerryCrush_UpdateSav2Records(void);
void BerryCrush_RunOrScheduleCommand(u16 command, u8 runMode, u8 *params);
void BerryCrush_SetPaletteFadeParams(u8 *params, bool8 communicateAfter, u32 selectedPals, s8 delay, u8 startY, u8 targetY, u16 palette);
int sub_814D9CC(struct BerryCrushGame *arg0);
int BerryCrush_InitBgs(void);
int BerryCrush_TeardownBgs(void);
void BerryCrush_CreateBerrySprites(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1);
void BerryCrushFreeBerrySpriteGfx(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1);
void sub_814DC5C(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1);
bool32 sub_814DE50(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1);
bool32 sub_814E644(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1);
void sub_814E80C(struct BerryCrushGame *arg0);
void sub_814DA04(struct BerryCrushGame *arg0);
void BerryCrush_HideTimerSprites(struct BerryCrushGame_138 *arg0);
void SpriteCB_DropBerryIntoCrusher(struct Sprite * sprite);
void ShowBerryCrushRankings(void);
#endif //GUARD_BERRY_CRUSH_H
#endif // GUARD_BERRY_CRUSH_H

View File

@ -82,14 +82,6 @@ struct BackupMapLayout
u16 *map;
};
union __attribute__((packed)) ObjectEventRange {
u8 as_byte;
struct __attribute__((packed)) {
u8 x:4;
u8 y:4;
} __attribute__((aligned (1))) as_nybbles;
} __attribute__((aligned (1)));
struct ObjectEventTemplate
{
/*0x00*/ u8 localId;
@ -239,8 +231,9 @@ struct ObjectEvent
/*0x10*/ struct Coords16 currentCoords;
/*0x14*/ struct Coords16 previousCoords;
/*0x18*/ u8 facingDirection:4;
/*0x18*/ u8 movementDirection:4;
/*0x19*/ union ObjectEventRange range;
u8 movementDirection:4;
u16 rangeX:4;
u16 rangeY:4;
/*0x1A*/ u8 fieldEffectSpriteId;
/*0x1B*/ u8 warpArrowSpriteId;
/*0x1C*/ u8 movementActionId;

View File

@ -291,8 +291,6 @@ SECTIONS {
src/pokemon_jump_5.o(.text);
src/pokemon_jump_6.o(.text);
src/berry_crush.o(.text);
src/berry_crush_2.o(.text);
src/berry_crush_3.o(.text);
src/wireless_communication_status_screen.o(.text);
src/braille_text.o(.text);
src/text_window.o(.text);
@ -594,8 +592,7 @@ SECTIONS {
src/pokemon_jump_4.o(.rodata);
src/pokemon_jump_5.o(.rodata);
src/pokemon_jump_6.o(.rodata);
src/berry_crush_2.o(.rodata);
src/berry_crush_3.o(.rodata);
src/berry_crush.o(.rodata);
src/wireless_communication_status_screen.o(.rodata);
src/braille_text.o(.rodata);
src/text_window_graphics.o(.rodata);

View File

@ -3464,7 +3464,7 @@ void AnimSmokeBallEscapeCloud(struct Sprite *sprite)
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
sprite->callback = sub_80B1D3C;
sprite->callback = DestroyAnimSpriteAfterTimer;
}
static void sub_80E1990(u8 taskId)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -17,14 +17,8 @@
#if defined(FIRERED)
#define TITLE_TEXT gString_PokemonFireRed_Staff
asm(".set TITLE_TEXT, gString_PokemonFireRed_Staff");
#elif defined(LEAFGREEN)
#define TITLE_TEXT gString_PokemonLeafGreen_Staff
asm(".set TITLE_TEXT, gString_PokemonLeafGreen_Staff");
#endif
#if !defined(NONMATCHING) && MODERN
#define static
#endif
enum CreditsSceneIdx
@ -808,7 +802,6 @@ static bool32 DoOverworldMapScrollScene(UNUSED u8 unused)
}
}
#ifdef NONMATCHING
static s32 RollCredits(void)
{
u16 win0v[8];
@ -841,45 +834,40 @@ static s32 RollCredits(void)
{
win0v[0]--;
win0v[1]++;
SetGpuReg(REG_OFFSET_WIN0V, win0v[1] + (win0v[0] << 8));
SetGpuReg(REG_OFFSET_WIN0V, (win0v[0] << 8) + win0v[1]);
}
return 0;
case CREDITSSCENE_LOAD_PLAYER_SPRITE_AT_INDIGO:
if (sCreditsMgr->timer == 0)
{
LoadPlayerOrRivalSprite(0);
sCreditsMgr->timer = 100;
sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_TITLE_STAFF;
}
else
if (sCreditsMgr->timer)
{
sCreditsMgr->timer--;
return 0;
}
LoadPlayerOrRivalSprite(0);
sCreditsMgr->timer = 100;
sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_TITLE_STAFF;
return 0;
case CREDITSSCENE_PRINT_TITLE_STAFF:
if (sCreditsMgr->timer == 0)
{
sCreditsMgr->timer = 360;
AddTextPrinterParameterized4(sCreditsMgr->windowId, 1, 0x08, 0x29, 1, 2, sTextColor_Header, 0, TITLE_TEXT);
sCreditsMgr->mainseqno = CREDITSSCENE_WAIT_TITLE_STAFF;
}
else
if (sCreditsMgr->timer)
{
sCreditsMgr->timer--;
return 0;
}
sCreditsMgr->timer = 360;
AddTextPrinterParameterized4(sCreditsMgr->windowId, 1, 0x08, 0x29, 1, 2, sTextColor_Header, 0, TITLE_TEXT);
sCreditsMgr->mainseqno = CREDITSSCENE_WAIT_TITLE_STAFF;
return 0;
case CREDITSSCENE_WAIT_TITLE_STAFF:
if (sCreditsMgr->timer != 0)
if (sCreditsMgr->timer)
{
sCreditsMgr->timer--;
return 0;
}
else
{
DestroyCreditsWindow();
sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD;
sCreditsMgr->timer = 0;
sCreditsMgr->scrcmdidx = 0;
}
DestroyCreditsWindow();
sCreditsMgr->mainseqno = CREDITSSCENE_EXEC_CMD;
sCreditsMgr->timer = 0;
sCreditsMgr->scrcmdidx = 0;
return 0;
case CREDITSSCENE_EXEC_CMD:
if (sCreditsMgr->timer != 0)
@ -887,53 +875,49 @@ static s32 RollCredits(void)
sCreditsMgr->timer--;
return sCreditsMgr->canSpeedThrough;
}
else
switch (sCreditsScript[sCreditsMgr->scrcmdidx].cmd)
{
switch (sCreditsScript[sCreditsMgr->scrcmdidx].cmd)
{
case CREDITSSCRCMD_PRINT:
BeginNormalPaletteFade(0x00008000, 0, 0, 16, RGB_BLACK);
sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_ADDPRINTER1;
FillWindowPixelBuffer(sCreditsMgr->windowId, PIXEL_FILL(0));
return sCreditsMgr->canSpeedThrough;
case CREDITSSCRCMD_MAPNEXT:
sCreditsMgr->mainseqno = CREDITSSCENE_MAPNEXT_DESTROYWINDOW;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
FadeSelectedPals(1, 0, 0x3FFFFFFF);
break;
case CREDITSSCRCMD_MAP:
sCreditsMgr->mainseqno = CREDITSSCENE_MAP_LOADMAP_CREATESPRITES;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
break;
case CREDITSSCRCMD_MON:
sCreditsMgr->mainseqno = CREDITSSCENE_MON_DESTROY_ASSETS;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
FadeScreen(FADE_TO_BLACK, 0);
break;
case CREDITSSCRCMD_THEENDGFX:
sCreditsMgr->mainseqno = CREDITSSCENE_THEEND_DESTROY_ASSETS;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 16, RGB_BLACK);
break;
case CREDITSSCRCMD_WAITBUTTON:
sCreditsMgr->mainseqno = CREDITSSCENE_WAITBUTTON;
break;
}
sCreditsMgr->timer = sCreditsScript[sCreditsMgr->scrcmdidx].duration;
sCreditsMgr->scrcmdidx++;
return 0;
case CREDITSSCRCMD_PRINT:
BeginNormalPaletteFade(0x00008000, 0, 0, 16, RGB_BLACK);
sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_ADDPRINTER1;
FillWindowPixelBuffer(sCreditsMgr->windowId, PIXEL_FILL(0));
return sCreditsMgr->canSpeedThrough;
case CREDITSSCRCMD_MAPNEXT:
sCreditsMgr->mainseqno = CREDITSSCENE_MAPNEXT_DESTROYWINDOW;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
FadeSelectedPals(1, 0, 0x3FFFFFFF);
break;
case CREDITSSCRCMD_MAP:
sCreditsMgr->mainseqno = CREDITSSCENE_MAP_LOADMAP_CREATESPRITES;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
break;
case CREDITSSCRCMD_MON:
sCreditsMgr->mainseqno = CREDITSSCENE_MON_DESTROY_ASSETS;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
FadeScreen(FADE_TO_BLACK, 0);
break;
case CREDITSSCRCMD_THEENDGFX:
sCreditsMgr->mainseqno = CREDITSSCENE_THEEND_DESTROY_ASSETS;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 16, RGB_BLACK);
break;
case CREDITSSCRCMD_WAITBUTTON:
sCreditsMgr->mainseqno = CREDITSSCENE_WAITBUTTON;
break;
}
sCreditsMgr->timer = sCreditsScript[sCreditsMgr->scrcmdidx].duration;
sCreditsMgr->scrcmdidx++;
return 0;
case CREDITSSCENE_PRINT_ADDPRINTER1:
if (!gPaletteFade.active)
{
win0v[0] = sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unk_8; // unused
AddTextPrinterParameterized4(sCreditsMgr->windowId, 1, 2, 6, 0, 0, sTextColor_Header, -1, sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unk_0);
sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_ADDPRINTER2;
}
if (gPaletteFade.active)
return sCreditsMgr->canSpeedThrough;
win0v[0] = sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unk_8; // unused
AddTextPrinterParameterized4(sCreditsMgr->windowId, 1, 2, 6, 0, 0, sTextColor_Header, -1, sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unk_0);
sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_ADDPRINTER2;
return sCreditsMgr->canSpeedThrough;
case CREDITSSCENE_PRINT_ADDPRINTER2:
win0v[0] = sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unk_8;
AddTextPrinterParameterized4(sCreditsMgr->windowId, 2, 8, 6, 0, 0, sTextColor_Header, -1, sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unk_4);
AddTextPrinterParameterized4(sCreditsMgr->windowId, 2, 8, 6, 0, 0, sTextColor_Regular, -1, sCreditsTexts[sCreditsScript[sCreditsMgr->scrcmdidx].param].unk_4);
sCreditsMgr->mainseqno = CREDITSSCENE_PRINT_DELAY;
return sCreditsMgr->canSpeedThrough;
case CREDITSSCENE_PRINT_DELAY:
@ -1022,14 +1006,17 @@ static s32 RollCredits(void)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_WHITE);
sCreditsMgr->mainseqno = CREDITSSCENE_TERMINATE;
return 0;
}
else if (sCreditsMgr->timer == 0)
if (sCreditsMgr->timer)
{
sCreditsMgr->timer--;
}
else
{
sCreditsMgr->mainseqno = CREDITSSCENE_TERMINATE;
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_WHITE);
}
else
sCreditsMgr->timer--;
return 0;
case CREDITSSCENE_TERMINATE:
if (!gPaletteFade.active)
@ -1038,714 +1025,6 @@ static s32 RollCredits(void)
}
return 2;
}
#else
NAKED
static s32 RollCredits(void)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tsub sp, 0x24\n"
"\tldr r1, _080F3BEC @ =sCreditsMgr\n"
"\tldr r0, [r1]\n"
"\tldrb r0, [r0]\n"
"\tadds r7, r1, 0\n"
"\tcmp r0, 0x12\n"
"\tbls _080F3BE2\n"
"\tb _080F4180_default_return2\n"
"_080F3BE2:\n"
"\tlsls r0, 2\n"
"\tldr r1, _080F3BF0 @ =_080F3BF4\n"
"\tadds r0, r1\n"
"\tldr r0, [r0]\n"
"\tmov pc, r0\n"
"\t.align 2, 0\n"
"_080F3BEC: .4byte sCreditsMgr\n"
"_080F3BF0: .4byte _080F3BF4\n"
"\t.align 2, 0\n"
"_080F3BF4:\n"
"\t.4byte _080F3C40_case00\n"
"\t.4byte _080F3C64_case01\n"
"\t.4byte _080F3C98_case02\n"
"\t.4byte _080F3CEE_case03\n"
"\t.4byte _080F3D0A_case04\n"
"\t.4byte _080F3D48_case05\n"
"\t.4byte _080F3D6A_case06\n"
"\t.4byte _080F3EB4_case07\n"
"\t.4byte _080F3F24_case08\n"
"\t.4byte _080F3F84_case09\n"
"\t.4byte _080F3FC4_case0A\n"
"\t.4byte _080F3FF0_case0B\n"
"\t.4byte _080F400A_case0C\n"
"\t.4byte _080F4084_case0D\n"
"\t.4byte _080F40B8_case0E\n"
"\t.4byte _080F40D0_case0F\n"
"\t.4byte _080F4100_case10\n"
"\t.4byte _080F4118_case11\n"
"\t.4byte _080F4170_case12\n"
"_080F3C40_case00:\n"
"\tbl SwitchWin1OffWin0On\n"
"\tmovs r0, 0x40\n"
"\tmovs r1, 0xF0\n"
"\tbl SetGpuReg\n"
"\tldr r1, _080F3C5C @ =0x00004f51\n"
"\tmovs r0, 0x44\n"
"\tbl SetGpuReg\n"
"\tldr r0, _080F3C60 @ =sCreditsMgr\n"
"\tldr r1, [r0]\n"
"\tmovs r0, 0x1\n"
"\tb _080F413C_setfield0_return0\n"
"\t.align 2, 0\n"
"_080F3C5C: .4byte 0x00004f51\n"
"_080F3C60: .4byte sCreditsMgr\n"
"_080F3C64_case01:\n"
"\tbl InitBgDarkenEffect\n"
"\tbl CreateCreditsWindow\n"
"\tmovs r0, 0xF0\n"
"\tbl Menu_LoadStdPalAt\n"
"\tldr r0, _080F3C8C @ =gPlttBufferUnfaded\n"
"\tmovs r2, 0xFF\n"
"\tlsls r2, 1\n"
"\tadds r0, r2\n"
"\tmovs r1, 0\n"
"\tstrh r1, [r0]\n"
"\tldr r0, _080F3C90 @ =gPlttBufferFaded\n"
"\tadds r0, r2\n"
"\tstrh r1, [r0]\n"
"\tldr r0, _080F3C94 @ =sCreditsMgr\n"
"\tldr r1, [r0]\n"
"\tmovs r0, 0x2\n"
"\tb _080F413C_setfield0_return0\n"
"\t.align 2, 0\n"
"_080F3C8C: .4byte gPlttBufferUnfaded\n"
"_080F3C90: .4byte gPlttBufferFaded\n"
"_080F3C94: .4byte sCreditsMgr\n"
"_080F3C98_case02:\n"
"\tmovs r0, 0x44\n"
"\tbl GetGpuReg\n"
"\tadd r1, sp, 0x14\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 24\n"
"\tstrh r0, [r1]\n"
"\tmovs r0, 0x44\n"
"\tbl GetGpuReg\n"
"\tadd r2, sp, 0x14\n"
"\tmovs r1, 0xFF\n"
"\tands r1, r0\n"
"\tstrh r1, [r2, 0x2]\n"
"\tadds r0, r2, 0\n"
"\tldrh r0, [r0]\n"
"\tcmp r0, 0x24\n"
"\tbne _080F3CCC\n"
"\tldr r0, _080F3CC8 @ =sCreditsMgr\n"
"\tldr r1, [r0]\n"
"\tmovs r0, 0\n"
"\tstrh r0, [r1, 0x4]\n"
"\tmovs r0, 0x3\n"
"\tb _080F413C_setfield0_return0\n"
"\t.align 2, 0\n"
"_080F3CC8: .4byte sCreditsMgr\n"
"_080F3CCC:\n"
"\tadd r1, sp, 0x14\n"
"\tsubs r0, 0x1\n"
"\tstrh r0, [r1]\n"
"\tadds r2, r1, 0\n"
"\tadds r0, r1, 0\n"
"\tldrh r1, [r0, 0x2]\n"
"\tadds r1, 0x1\n"
"\tstrh r1, [r2, 0x2]\n"
"\tldrh r0, [r0]\n"
"\tlsls r0, 8\n"
"\tadds r1, r0\n"
"\tlsls r1, 16\n"
"\tlsrs r1, 16\n"
"\tmovs r0, 0x44\n"
"\tbl SetGpuReg\n"
"\tb _080F3D06_return0\n"
"_080F3CEE_case03:\n"
"\tldr r1, [r7]\n"
"\tldrh r0, [r1, 0x4]\n"
"\tcmp r0, 0\n"
"\tbne _080F3D52_decfield4_return0\n"
"\tmovs r0, 0\n"
"\tbl LoadPlayerOrRivalSprite\n"
"\tldr r0, [r7]\n"
"\tmovs r1, 0x64\n"
"\tstrh r1, [r0, 0x4]\n"
"\tmovs r1, 0x4\n"
"\tstrb r1, [r0]\n"
"_080F3D06_return0:\n"
"\tmovs r0, 0\n"
"\tb _080F4182_return\n"
"_080F3D0A_case04:\n"
"\tldr r1, [r7]\n"
"\tldrh r0, [r1, 0x4]\n"
"\tadds r2, r0, 0\n"
"\tcmp r2, 0\n"
"\tbne _080F3D52_decfield4_return0\n"
"\tmovs r0, 0xB4\n"
"\tlsls r0, 1\n"
"\tstrh r0, [r1, 0x4]\n"
"\tldrb r0, [r1, 0xA]\n"
"\tmovs r1, 0x1\n"
"\tstr r1, [sp]\n"
"\tmovs r1, 0x2\n"
"\tstr r1, [sp, 0x4]\n"
"\tldr r1, _080F3D40 @ =sTextColor_Header\n"
"\tstr r1, [sp, 0x8]\n"
"\tstr r2, [sp, 0xC]\n"
"\tldr r1, _080F3D44 @ =TITLE_TEXT\n"
"\tstr r1, [sp, 0x10]\n"
"\tmovs r1, 0x1\n"
"\tmovs r2, 0x8\n"
"\tmovs r3, 0x29\n"
"\tbl AddTextPrinterParameterized4\n"
"\tldr r1, [r7]\n"
"\tmovs r0, 0x5\n"
"\tb _080F413C_setfield0_return0\n"
"\t.align 2, 0\n"
"_080F3D40: .4byte sTextColor_Header\n"
"_080F3D44: .4byte TITLE_TEXT\n"
"_080F3D48_case05:\n"
"\tldr r1, [r7]\n"
"\tldrh r0, [r1, 0x4]\n"
"\tadds r4, r0, 0\n"
"\tcmp r4, 0\n"
"\tbeq _080F3D58\n"
"_080F3D52_decfield4_return0:\n"
"\tsubs r0, 0x1\n"
"\tstrh r0, [r1, 0x4]\n"
"\tb _080F3D06_return0\n"
"_080F3D58:\n"
"\tbl DestroyCreditsWindow\n"
"\tldr r0, [r7]\n"
"\tmovs r1, 0x6\n"
"\tstrb r1, [r0]\n"
"\tldr r0, [r7]\n"
"\tstrh r4, [r0, 0x4]\n"
"\tstrh r4, [r0, 0x6]\n"
"\tb _080F3D06_return0\n"
"_080F3D6A_case06:\n"
"\tldr r2, [r7]\n"
"\tldrh r0, [r2, 0x4]\n"
"\tcmp r0, 0\n"
"\tbeq _080F3D7A\n"
"\tsubs r0, 0x1\n"
"\tstrh r0, [r2, 0x4]\n"
"\tldrb r0, [r2, 0x8]\n"
"\tb _080F4182_return\n"
"_080F3D7A:\n"
"\tldr r1, _080F3D94 @ =sCreditsScript\n"
"\tldrh r0, [r2, 0x6]\n"
"\tlsls r0, 2\n"
"\tadds r0, r1\n"
"\tldrb r0, [r0]\n"
"\tcmp r0, 0x5\n"
"\tbls _080F3D8A\n"
"\tb _080F3E94\n"
"_080F3D8A:\n"
"\tlsls r0, 2\n"
"\tldr r1, _080F3D98 @ =_080F3D9C\n"
"\tadds r0, r1\n"
"\tldr r0, [r0]\n"
"\tmov pc, r0\n"
"\t.align 2, 0\n"
"_080F3D94: .4byte sCreditsScript\n"
"_080F3D98: .4byte _080F3D9C\n"
"\t.align 2, 0\n"
"_080F3D9C:\n"
"\t.4byte _080F3DB4\n"
"\t.4byte _080F3DE0\n"
"\t.4byte _080F3E10\n"
"\t.4byte _080F3E30\n"
"\t.4byte _080F3E58\n"
"\t.4byte _080F3E8C\n"
"_080F3DB4:\n"
"\tmovs r0, 0x80\n"
"\tlsls r0, 8\n"
"\tmovs r1, 0\n"
"\tstr r1, [sp]\n"
"\tmovs r2, 0\n"
"\tmovs r3, 0x10\n"
"\tbl BeginNormalPaletteFade\n"
"\tldr r4, _080F3DDC @ =sCreditsMgr\n"
"\tldr r1, [r4]\n"
"\tmovs r0, 0x7\n"
"\tstrb r0, [r1]\n"
"\tldr r0, [r4]\n"
"\tldrb r0, [r0, 0xA]\n"
"\tmovs r1, 0\n"
"\tbl FillWindowPixelBuffer\n"
"\tldr r0, [r4]\n"
"\tldrb r0, [r0, 0x8]\n"
"\tb _080F4182_return\n"
"\t.align 2, 0\n"
"_080F3DDC: .4byte sCreditsMgr\n"
"_080F3DE0:\n"
"\tldr r2, _080F3E04 @ =sCreditsMgr\n"
"\tldr r1, [r2]\n"
"\tmovs r0, 0xA\n"
"\tstrb r0, [r1]\n"
"\tldr r2, [r2]\n"
"\tldr r1, _080F3E08 @ =sCreditsScript\n"
"\tldrh r0, [r2, 0x6]\n"
"\tlsls r0, 2\n"
"\tadds r0, r1\n"
"\tldrb r0, [r0, 0x1]\n"
"\tstrb r0, [r2, 0x9]\n"
"\tldr r2, _080F3E0C @ =0x3fffffff\n"
"\tmovs r0, 0x1\n"
"\tmovs r1, 0\n"
"\tbl FadeSelectedPals\n"
"\tb _080F3E94\n"
"\t.align 2, 0\n"
"_080F3E04: .4byte sCreditsMgr\n"
"_080F3E08: .4byte sCreditsScript\n"
"_080F3E0C: .4byte 0x3fffffff\n"
"_080F3E10:\n"
"\tldr r2, _080F3E28 @ =sCreditsMgr\n"
"\tldr r1, [r2]\n"
"\tmovs r0, 0xC\n"
"\tstrb r0, [r1]\n"
"\tldr r2, [r2]\n"
"\tldr r1, _080F3E2C @ =sCreditsScript\n"
"\tldrh r0, [r2, 0x6]\n"
"\tlsls r0, 2\n"
"\tadds r0, r1\n"
"\tldrb r0, [r0, 0x1]\n"
"\tstrb r0, [r2, 0x9]\n"
"\tb _080F3E94\n"
"\t.align 2, 0\n"
"_080F3E28: .4byte sCreditsMgr\n"
"_080F3E2C: .4byte sCreditsScript\n"
"_080F3E30:\n"
"\tldr r2, _080F3E50 @ =sCreditsMgr\n"
"\tldr r1, [r2]\n"
"\tmovs r0, 0xD\n"
"\tstrb r0, [r1]\n"
"\tldr r2, [r2]\n"
"\tldr r1, _080F3E54 @ =sCreditsScript\n"
"\tldrh r0, [r2, 0x6]\n"
"\tlsls r0, 2\n"
"\tadds r0, r1\n"
"\tldrb r0, [r0, 0x1]\n"
"\tstrb r0, [r2, 0x9]\n"
"\tmovs r0, 0x1\n"
"\tmovs r1, 0\n"
"\tbl FadeScreen\n"
"\tb _080F3E94\n"
"\t.align 2, 0\n"
"_080F3E50: .4byte sCreditsMgr\n"
"_080F3E54: .4byte sCreditsScript\n"
"_080F3E58:\n"
"\tldr r2, _080F3E84 @ =sCreditsMgr\n"
"\tldr r1, [r2]\n"
"\tmovs r3, 0\n"
"\tmovs r0, 0xF\n"
"\tstrb r0, [r1]\n"
"\tldr r2, [r2]\n"
"\tldr r1, _080F3E88 @ =sCreditsScript\n"
"\tldrh r0, [r2, 0x6]\n"
"\tlsls r0, 2\n"
"\tadds r0, r1\n"
"\tldrb r0, [r0, 0x1]\n"
"\tstrb r0, [r2, 0x9]\n"
"\tmovs r0, 0x1\n"
"\tnegs r0, r0\n"
"\tstr r3, [sp]\n"
"\tmovs r1, 0x4\n"
"\tmovs r2, 0\n"
"\tmovs r3, 0x10\n"
"\tbl BeginNormalPaletteFade\n"
"\tb _080F3E94\n"
"\t.align 2, 0\n"
"_080F3E84: .4byte sCreditsMgr\n"
"_080F3E88: .4byte sCreditsScript\n"
"_080F3E8C:\n"
"\tldr r0, _080F3EAC @ =sCreditsMgr\n"
"\tldr r1, [r0]\n"
"\tmovs r0, 0x11\n"
"\tstrb r0, [r1]\n"
"_080F3E94:\n"
"\tldr r0, _080F3EAC @ =sCreditsMgr\n"
"\tldr r1, [r0]\n"
"\tldr r2, _080F3EB0 @ =sCreditsScript\n"
"\tldrh r0, [r1, 0x6]\n"
"\tlsls r0, 2\n"
"\tadds r0, r2\n"
"\tldrh r0, [r0, 0x2]\n"
"\tstrh r0, [r1, 0x4]\n"
"\tldrh r0, [r1, 0x6]\n"
"\tadds r0, 0x1\n"
"\tstrh r0, [r1, 0x6]\n"
"\tb _080F3D06_return0\n"
"\t.align 2, 0\n"
"_080F3EAC: .4byte sCreditsMgr\n"
"_080F3EB0: .4byte sCreditsScript\n"
"_080F3EB4_case07:\n"
"\tldr r0, _080F3F14 @ =gPaletteFade\n"
"\tldrb r1, [r0, 0x7]\n"
"\tmovs r0, 0x80\n"
"\tands r0, r1\n"
"\tlsls r0, 24\n"
"\tlsrs r6, r0, 24\n"
"\tcmp r6, 0\n"
"\tbne _080F3FBA_returnfield8\n"
"\tadd r3, sp, 0x14\n"
"\tldr r5, _080F3F18 @ =sCreditsTexts\n"
"\tldr r4, _080F3F1C @ =sCreditsScript\n"
"\tldr r2, [r7]\n"
"\tldrh r0, [r2, 0x6]\n"
"\tlsls r0, 2\n"
"\tadds r0, r4\n"
"\tldrb r1, [r0, 0x1]\n"
"\tlsls r0, r1, 1\n"
"\tadds r0, r1\n"
"\tlsls r0, 2\n"
"\tadds r0, r5\n"
"\tldrb r0, [r0, 0x8]\n"
"\tstrh r0, [r3]\n"
"\tldrb r0, [r2, 0xA]\n"
"\tstr r6, [sp]\n"
"\tstr r6, [sp, 0x4]\n"
"\tldr r1, _080F3F20 @ =sTextColor_Header\n"
"\tstr r1, [sp, 0x8]\n"
"\tmovs r1, 0x1\n"
"\tnegs r1, r1\n"
"\tstr r1, [sp, 0xC]\n"
"\tldrh r1, [r2, 0x6]\n"
"\tlsls r1, 2\n"
"\tadds r1, r4\n"
"\tldrb r2, [r1, 0x1]\n"
"\tlsls r1, r2, 1\n"
"\tadds r1, r2\n"
"\tlsls r1, 2\n"
"\tadds r1, r5\n"
"\tldr r1, [r1]\n"
"\tstr r1, [sp, 0x10]\n"
"\tmovs r1, 0x1\n"
"\tmovs r2, 0x2\n"
"\tmovs r3, 0x6\n"
"\tbl AddTextPrinterParameterized4\n"
"\tldr r1, [r7]\n"
"\tmovs r0, 0x8\n"
"\tb _080F3FB8_setfield0_returnfield8\n"
"\t.align 2, 0\n"
"_080F3F14: .4byte gPaletteFade\n"
"_080F3F18: .4byte sCreditsTexts\n"
"_080F3F1C: .4byte sCreditsScript\n"
"_080F3F20: .4byte sTextColor_Header\n"
"_080F3F24_case08:\n"
"\tadd r4, sp, 0x14\n"
"\tldr r3, _080F3F78 @ =sCreditsTexts\n"
"\tldr r5, _080F3F7C @ =sCreditsScript\n"
"\tldr r2, [r7]\n"
"\tldrh r0, [r2, 0x6]\n"
"\tlsls r0, 2\n"
"\tadds r0, r5\n"
"\tldrb r1, [r0, 0x1]\n"
"\tlsls r0, r1, 1\n"
"\tadds r0, r1\n"
"\tlsls r0, 2\n"
"\tadds r0, r3\n"
"\tldrb r0, [r0, 0x8]\n"
"\tmovs r1, 0\n"
"\tstrh r0, [r4]\n"
"\tldrb r0, [r2, 0xA]\n"
"\tstr r1, [sp]\n"
"\tstr r1, [sp, 0x4]\n"
"\tldr r1, _080F3F80 @ =sTextColor_Regular\n"
"\tstr r1, [sp, 0x8]\n"
"\tmovs r1, 0x1\n"
"\tnegs r1, r1\n"
"\tstr r1, [sp, 0xC]\n"
"\tldrh r1, [r2, 0x6]\n"
"\tlsls r1, 2\n"
"\tadds r1, r5\n"
"\tldrb r2, [r1, 0x1]\n"
"\tlsls r1, r2, 1\n"
"\tadds r1, r2\n"
"\tlsls r1, 2\n"
"\tadds r3, 0x4\n"
"\tadds r1, r3\n"
"\tldr r1, [r1]\n"
"\tstr r1, [sp, 0x10]\n"
"\tmovs r1, 0x2\n"
"\tmovs r2, 0x8\n"
"\tmovs r3, 0x6\n"
"\tbl AddTextPrinterParameterized4\n"
"\tldr r1, [r7]\n"
"\tmovs r0, 0x9\n"
"\tb _080F3FB8_setfield0_returnfield8\n"
"\t.align 2, 0\n"
"_080F3F78: .4byte sCreditsTexts\n"
"_080F3F7C: .4byte sCreditsScript\n"
"_080F3F80: .4byte sTextColor_Regular\n"
"_080F3F84_case09:\n"
"\tldr r0, [r7]\n"
"\tldrb r0, [r0, 0xA]\n"
"\tmovs r1, 0x2\n"
"\tbl CopyWindowToVram\n"
"\tldr r1, [r7]\n"
"\tldr r2, _080F3FC0 @ =sCreditsScript\n"
"\tldrh r0, [r1, 0x6]\n"
"\tlsls r0, 2\n"
"\tadds r0, r2\n"
"\tldrh r0, [r0, 0x2]\n"
"\tmovs r2, 0\n"
"\tstrh r0, [r1, 0x4]\n"
"\tldrh r0, [r1, 0x6]\n"
"\tadds r0, 0x1\n"
"\tstrh r0, [r1, 0x6]\n"
"\tmovs r0, 0x80\n"
"\tlsls r0, 8\n"
"\tstr r2, [sp]\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0x10\n"
"\tmovs r3, 0\n"
"\tbl BeginNormalPaletteFade\n"
"\tldr r1, [r7]\n"
"\tmovs r0, 0x6\n"
"_080F3FB8_setfield0_returnfield8:\n"
"\tstrb r0, [r1]\n"
"_080F3FBA_returnfield8:\n"
"\tldr r0, [r7]\n"
"\tldrb r0, [r0, 0x8]\n"
"\tb _080F4182_return\n"
"\t.align 2, 0\n"
"_080F3FC0: .4byte sCreditsScript\n"
"_080F3FC4_case0A:\n"
"\tldr r0, _080F3FE8 @ =gPaletteFade\n"
"\tldrb r1, [r0, 0x7]\n"
"\tmovs r0, 0x80\n"
"\tands r0, r1\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tcmp r4, 0\n"
"\tbeq _080F3FD6\n"
"\tb _080F3D06_return0\n"
"_080F3FD6:\n"
"\tbl DestroyCreditsWindow\n"
"\tldr r1, _080F3FEC @ =sCreditsMgr\n"
"\tldr r0, [r1]\n"
"\tstrb r4, [r0, 0x1]\n"
"\tldr r1, [r1]\n"
"\tmovs r0, 0xB\n"
"\tb _080F413C_setfield0_return0\n"
"\t.align 2, 0\n"
"_080F3FE8: .4byte gPaletteFade\n"
"_080F3FEC: .4byte sCreditsMgr\n"
"_080F3FF0_case0B:\n"
"\tldr r0, [r7]\n"
"\tldrb r0, [r0, 0x9]\n"
"\tbl DoOverworldMapScrollScene\n"
"\tcmp r0, 0\n"
"\tbne _080F3FFE\n"
"\tb _080F3D06_return0\n"
"_080F3FFE:\n"
"\tldr r1, [r7]\n"
"\tmovs r0, 0x1\n"
"\tstrb r0, [r1, 0x8]\n"
"\tldr r1, [r7]\n"
"\tmovs r0, 0x6\n"
"\tb _080F413C_setfield0_return0\n"
"_080F400A_case0C:\n"
"\tldr r0, _080F4050 @ =gPaletteFade\n"
"\tldrb r1, [r0, 0x7]\n"
"\tmovs r0, 0x80\n"
"\tands r0, r1\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tcmp r4, 0\n"
"\tbeq _080F401C\n"
"\tb _080F3D06_return0\n"
"_080F401C:\n"
"\tbl DestroyCreditsWindow\n"
"\tldr r1, _080F4054 @ =sCreditsMgr\n"
"\tldr r0, [r1]\n"
"\tstrb r4, [r0, 0x1]\n"
"\tadds r4, r1, 0\n"
"_080F4028:\n"
"\tldr r0, [r4]\n"
"\tldrb r0, [r0, 0x9]\n"
"\tbl DoOverworldMapScrollScene\n"
"\tcmp r0, 0\n"
"\tbeq _080F4028\n"
"\tldr r0, _080F4054 @ =sCreditsMgr\n"
"\tldr r0, [r0]\n"
"\tldrb r0, [r0, 0x9]\n"
"\tcmp r0, 0x6\n"
"\tbeq _080F4058\n"
"\tcmp r0, 0x6\n"
"\tble _080F404A\n"
"\tcmp r0, 0x9\n"
"\tbeq _080F405E\n"
"\tcmp r0, 0xC\n"
"\tbeq _080F4064\n"
"_080F404A:\n"
"\tadd r1, sp, 0x14\n"
"\tmovs r0, 0x1\n"
"\tb _080F4068\n"
"\t.align 2, 0\n"
"_080F4050: .4byte gPaletteFade\n"
"_080F4054: .4byte sCreditsMgr\n"
"_080F4058:\n"
"\tadd r1, sp, 0x14\n"
"\tmovs r0, 0x2\n"
"\tb _080F4068\n"
"_080F405E:\n"
"\tadd r1, sp, 0x14\n"
"\tmovs r0, 0x3\n"
"\tb _080F4068\n"
"_080F4064:\n"
"\tadd r1, sp, 0x14\n"
"\tmovs r0, 0x4\n"
"_080F4068:\n"
"\tstrh r0, [r1]\n"
"\tadd r0, sp, 0x14\n"
"\tldrb r0, [r0]\n"
"\tbl LoadPlayerOrRivalSprite\n"
"\tldr r2, _080F4080 @ =sCreditsMgr\n"
"\tldr r1, [r2]\n"
"\tmovs r0, 0x1\n"
"\tstrb r0, [r1, 0x8]\n"
"\tldr r1, [r2]\n"
"\tmovs r0, 0x6\n"
"\tb _080F413C_setfield0_return0\n"
"\t.align 2, 0\n"
"_080F4080: .4byte sCreditsMgr\n"
"_080F4084_case0D:\n"
"\tldr r0, _080F40B0 @ =gPaletteFade\n"
"\tldrb r1, [r0, 0x7]\n"
"\tmovs r0, 0x80\n"
"\tands r0, r1\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tcmp r4, 0\n"
"\tbeq _080F4096\n"
"\tb _080F3D06_return0\n"
"_080F4096:\n"
"\tbl DestroyPlayerOrRivalSprite\n"
"\tbl DestroyCreditsWindow\n"
"\tldr r1, _080F40B4 @ =sCreditsMgr\n"
"\tldr r0, [r1]\n"
"\tstrb r4, [r0, 0x1]\n"
"\tldr r0, [r1]\n"
"\tstrb r4, [r0, 0x8]\n"
"\tldr r1, [r1]\n"
"\tmovs r0, 0xE\n"
"\tb _080F413C_setfield0_return0\n"
"\t.align 2, 0\n"
"_080F40B0: .4byte gPaletteFade\n"
"_080F40B4: .4byte sCreditsMgr\n"
"_080F40B8_case0E:\n"
"\tbl DoCreditsMonScene\n"
"\tcmp r0, 0\n"
"\tbne _080F40C2\n"
"\tb _080F3D06_return0\n"
"_080F40C2:\n"
"\tldr r0, _080F40CC @ =sCreditsMgr\n"
"\tldr r1, [r0]\n"
"\tmovs r0, 0x6\n"
"\tb _080F413C_setfield0_return0\n"
"\t.align 2, 0\n"
"_080F40CC: .4byte sCreditsMgr\n"
"_080F40D0_case0F:\n"
"\tldr r0, _080F40F8 @ =gPaletteFade\n"
"\tldrb r1, [r0, 0x7]\n"
"\tmovs r0, 0x80\n"
"\tands r0, r1\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tcmp r4, 0\n"
"\tbeq _080F40E2\n"
"\tb _080F3D06_return0\n"
"_080F40E2:\n"
"\tbl DestroyCreditsWindow\n"
"\tldr r1, _080F40FC @ =sCreditsMgr\n"
"\tldr r0, [r1]\n"
"\tstrb r4, [r0, 0x1]\n"
"\tldr r0, [r1]\n"
"\tstrb r4, [r0, 0x8]\n"
"\tldr r1, [r1]\n"
"\tmovs r0, 0x10\n"
"\tb _080F413C_setfield0_return0\n"
"\t.align 2, 0\n"
"_080F40F8: .4byte gPaletteFade\n"
"_080F40FC: .4byte sCreditsMgr\n"
"_080F4100_case10:\n"
"\tbl DoCopyrightOrTheEndGfxScene\n"
"\tcmp r0, 0\n"
"\tbne _080F410A\n"
"\tb _080F3D06_return0\n"
"_080F410A:\n"
"\tldr r0, _080F4114 @ =sCreditsMgr\n"
"\tldr r1, [r0]\n"
"\tmovs r0, 0x6\n"
"\tb _080F413C_setfield0_return0\n"
"\t.align 2, 0\n"
"_080F4114: .4byte sCreditsMgr\n"
"_080F4118_case11:\n"
"\tldr r0, _080F4140 @ =gMain\n"
"\tldrh r1, [r0, 0x2E]\n"
"\tmovs r0, 0x1\n"
"\tands r0, r1\n"
"\tcmp r0, 0\n"
"\tbeq _080F414C\n"
"\tmovs r0, 0x1\n"
"\tnegs r0, r0\n"
"\tldr r1, _080F4144 @ =0x00007fff\n"
"\tstr r1, [sp]\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0\n"
"\tmovs r3, 0x10\n"
"\tbl BeginNormalPaletteFade\n"
"\tldr r0, _080F4148 @ =sCreditsMgr\n"
"\tldr r1, [r0]\n"
"\tmovs r0, 0x12\n"
"_080F413C_setfield0_return0:\n"
"\tstrb r0, [r1]\n"
"\tb _080F3D06_return0\n"
"\t.align 2, 0\n"
"_080F4140: .4byte gMain\n"
"_080F4144: .4byte 0x00007fff\n"
"_080F4148: .4byte sCreditsMgr\n"
"_080F414C:\n"
"\tldr r1, [r7]\n"
"\tldrh r0, [r1, 0x4]\n"
"\tcmp r0, 0\n"
"\tbeq _080F4156\n"
"\tb _080F3D52_decfield4_return0\n"
"_080F4156:\n"
"\tmovs r0, 0x12\n"
"\tstrb r0, [r1]\n"
"\tsubs r0, 0x13\n"
"\tldr r1, _080F416C @ =0x00007fff\n"
"\tstr r1, [sp]\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0\n"
"\tmovs r3, 0x10\n"
"\tbl BeginNormalPaletteFade\n"
"\tb _080F3D06_return0\n"
"\t.align 2, 0\n"
"_080F416C: .4byte 0x00007fff\n"
"_080F4170_case12:\n"
"\tldr r0, _080F418C @ =gPaletteFade\n"
"\tldrb r1, [r0, 0x7]\n"
"\tmovs r0, 0x80\n"
"\tands r0, r1\n"
"\tcmp r0, 0\n"
"\tbne _080F4180_default_return2\n"
"\tbl DestroyCreditsWindow\n"
"_080F4180_default_return2:\n"
"\tmovs r0, 0x2\n"
"_080F4182_return:\n"
"\tadd sp, 0x24\n"
"\tpop {r4-r7}\n"
"\tpop {r1}\n"
"\tbx r1\n"
"\t.align 2, 0\n"
"_080F418C: .4byte gPaletteFade");
}
#endif //NONMATCHING
static void VBlankCB(void)
{

View File

@ -675,7 +675,7 @@ static void sub_81543C4(u8 spriteId)
#define sKeepPosX data[1]
#else
#define sKeepPosX data[10]
#endif // NONMATCHING
#endif // BUGFIX
static void sub_81543E8(struct Sprite * sprite)
{

View File

@ -552,7 +552,7 @@ static void sub_80ADD4C(struct Sprite *sprite)
gOamMatrices[matrixNum].b = sineVal;
gOamMatrices[matrixNum].c = -sineVal;
sprite->data[0] = gBattleAnimArgs[3];
sprite->callback = sub_80B1D3C;
sprite->callback = DestroyAnimSpriteAfterTimer;
}
static void AnimZapCannonSpark(struct Sprite *sprite)

View File

@ -20,10 +20,6 @@
#define NUM_FIELD_MAP_OBJECT_TEMPLATES 0x51
#if !defined(NONMATCHING) && MODERN
#define static
#endif
static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16);
static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *);
static u8 GetCollisionInDirection(struct ObjectEvent *, u8);
@ -1326,53 +1322,61 @@ static u8 GetObjectEventIdByLocalId(u8 localId)
return OBJECT_EVENTS_COUNT;
}
#ifdef NONMATCHING
static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, u8 mapNum, u8 mapGroup)
{
struct ObjectEvent *objectEvent;
struct ObjectEventTemplate *template2 = template;
const struct MapHeader *mapHeader;
u8 objectEventId;
u8 var0;
u8 elevation;
s16 x;
s16 y;
s16 var;
s16 x2;
s16 y2;
s16 elevation2;
s16 x3;
s16 y3;
if(template->inConnection == 0xFF)
var0 = 0;
elevation = 0;
x2 = 0;
y2 = 0;
x3 = 0;
y3 = 0;
if (template->inConnection == 0xFF)
{
var = 1;
mapNum = template2->trainerType;
mapGroup = template2->trainerRange_berryTreeId & 0xFF;
elevation2 = template2->elevation;
x = template2->x;
y = template2->y;
x2 = template2->x;
y2 = template2->y;
template = &Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->events->objectEvents[elevation2 - 1];
var0 = 1;
elevation = template->elevation;
mapNum = template->trainerType;
mapGroup = template->trainerRange_berryTreeId & 0xFF;
x2 = template->x;
y2 = template->y;
x3 = template->x;
y3 = template->y;
mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum);
template = &(mapHeader->events->objectEvents[elevation - 1]);
}
if (GetAvailableObjectEventId(template->localId, mapNum, mapGroup, &objectEventId)
&& !sub_805E238(template, var, x2, y2))
|| !sub_805E238(template, var0, x3, y3))
return OBJECT_EVENTS_COUNT;
objectEvent = &gObjectEvents[objectEventId];
ClearObjectEvent(objectEvent);
if (var)
{
x = x2 * 0x10000 + 0x7000;
y = y2 * 0x10000 + 0x7000;
}
else
if (var0)
{
x = x2 + 7;
y = y2 + 7;
}
else
{
x = template->x + 7;
y = template->y + 7;
}
objectEvent->active = TRUE;
objectEvent->triggerGroundEffectsOnMove = TRUE;
objectEvent->graphicsId = template->graphicsId;
objectEvent->movementType = template->movementType;
objectEvent->localId = template->localId;
objectEvent->mapNum = mapNum;
// objectEvent++; objectEvent--; is a trick used in pokeruby and pokeemerald here
objectEvent->mapGroup = mapGroup;
objectEvent->initialCoords.x = x;
objectEvent->initialCoords.y = y;
@ -1382,258 +1386,27 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template,
objectEvent->previousCoords.y = y;
objectEvent->currentElevation = template->elevation;
objectEvent->previousElevation = template->elevation;
objectEvent->range.as_nybbles.x = template->movementRangeX;
objectEvent->range.as_nybbles.y = template->movementRangeY;
objectEvent->rangeX = template->movementRangeX;
objectEvent->rangeY = template->movementRangeY;
objectEvent->trainerType = template->trainerType;
objectEvent->trainerRange_berryTreeId = template->trainerRange_berryTreeId;
objectEvent->mapNum = mapNum; // oops (yes this is required for matching)
objectEvent->previousMovementDirection = gInitialMovementTypeFacingDirections[template->movementType];
SetObjectEventDirection(objectEvent, objectEvent->previousMovementDirection);
SetObjectEventDynamicGraphicsId(objectEvent);
/*#ifndef NONMATCHING
asm("":::"r5", "r6"); is a trick used in pokeruby and pokeemerald here
#endif*/
if (gRangedMovementTypes[objectEvent->movementType])
{
if (objectEvent->range.as_nybbles.x == 0)
if (objectEvent->rangeX == 0)
{
objectEvent->range.as_nybbles.x++;
objectEvent->rangeX++;
}
if (objectEvent->range.as_nybbles.y == 0)
if (objectEvent->rangeY == 0)
{
objectEvent->range.as_nybbles.y++;
objectEvent->rangeY++;
}
}
return objectEventId;
}
#else
NAKED
static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, u8 mapNum, u8 mapGroup)
{
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, 0xC\n\
adds r5, r0, 0\n\
lsls r1, 24\n\
lsrs r7, r1, 24\n\
lsls r2, 24\n\
lsrs r6, r2, 24\n\
movs r0, 0\n\
mov r10, r0\n\
mov r8, r0\n\
mov r9, r0\n\
movs r1, 0\n\
str r1, [sp, 0x4]\n\
str r0, [sp, 0x8]\n\
ldrb r0, [r5, 0x2]\n\
cmp r0, 0xFF\n\
bne _0805E0DA\n\
movs r1, 0x1\n\
mov r10, r1\n\
ldrb r4, [r5, 0x8]\n\
ldrb r7, [r5, 0xC]\n\
ldrb r6, [r5, 0xE]\n\
ldrh r0, [r5, 0x4]\n\
mov r8, r0\n\
ldrh r5, [r5, 0x6]\n\
mov r9, r5\n\
mov r1, r8\n\
str r1, [sp, 0x4]\n\
mov r0, r9\n\
str r0, [sp, 0x8]\n\
adds r0, r6, 0\n\
adds r1, r7, 0\n\
bl Overworld_GetMapHeaderByGroupAndId\n\
ldr r1, [r0, 0x4]\n\
lsls r0, r4, 1\n\
adds r0, r4\n\
lsls r0, 3\n\
subs r0, 0x18\n\
ldr r1, [r1, 0x4]\n\
adds r5, r1, r0\n\
_0805E0DA:\n\
ldrb r0, [r5]\n\
adds r1, r7, 0\n\
adds r2, r6, 0\n\
mov r3, sp\n\
bl GetAvailableObjectEventId\n\
lsls r0, 24\n\
cmp r0, 0\n\
bne _0805E106\n\
ldr r1, [sp, 0x4]\n\
lsls r2, r1, 16\n\
asrs r2, 16\n\
ldr r0, [sp, 0x8]\n\
lsls r3, r0, 16\n\
asrs r3, 16\n\
adds r0, r5, 0\n\
mov r1, r10\n\
bl sub_805E238\n\
lsls r0, 24\n\
cmp r0, 0\n\
bne _0805E10A\n\
_0805E106:\n\
movs r0, 0x10\n\
b _0805E220\n\
_0805E10A:\n\
mov r0, sp\n\
ldrb r1, [r0]\n\
lsls r0, r1, 3\n\
adds r0, r1\n\
lsls r0, 2\n\
ldr r1, _0805E13C @ =gObjectEvents\n\
adds r4, r0, r1\n\
adds r0, r4, 0\n\
bl ClearObjectEvent\n\
mov r1, r10\n\
cmp r1, 0\n\
beq _0805E140\n\
mov r1, r8\n\
lsls r0, r1, 16\n\
movs r1, 0xE0\n\
lsls r1, 11\n\
adds r0, r1\n\
lsrs r3, r0, 16\n\
mov r1, r9\n\
lsls r0, r1, 16\n\
movs r1, 0xE0\n\
lsls r1, 11\n\
adds r0, r1\n\
b _0805E14E\n\
.align 2, 0\n\
_0805E13C: .4byte gObjectEvents\n\
_0805E140:\n\
ldrh r0, [r5, 0x4]\n\
adds r0, 0x7\n\
lsls r0, 16\n\
lsrs r3, r0, 16\n\
ldrh r0, [r5, 0x6]\n\
adds r0, 0x7\n\
lsls r0, 16\n\
_0805E14E:\n\
lsrs r2, r0, 16\n\
ldrb r0, [r4]\n\
movs r1, 0x1\n\
orrs r0, r1\n\
movs r1, 0x4\n\
orrs r0, r1\n\
strb r0, [r4]\n\
ldrb r0, [r5, 0x1]\n\
strb r0, [r4, 0x5]\n\
ldrb r0, [r5, 0x9]\n\
strb r0, [r4, 0x6]\n\
ldrb r0, [r5]\n\
strb r0, [r4, 0x8]\n\
strb r7, [r4, 0x9]\n\
strb r6, [r4, 0xA]\n\
strh r3, [r4, 0xC]\n\
strh r2, [r4, 0xE]\n\
strh r3, [r4, 0x10]\n\
strh r2, [r4, 0x12]\n\
strh r3, [r4, 0x14]\n\
strh r2, [r4, 0x16]\n\
ldrb r0, [r5, 0x8]\n\
movs r6, 0xF\n\
adds r1, r6, 0\n\
ands r1, r0\n\
ldrb r2, [r4, 0xB]\n\
movs r0, 0x10\n\
negs r0, r0\n\
mov r8, r0\n\
ands r0, r2\n\
orrs r0, r1\n\
strb r0, [r4, 0xB]\n\
ldrb r1, [r5, 0x8]\n\
lsls r1, 4\n\
ands r0, r6\n\
orrs r0, r1\n\
strb r0, [r4, 0xB]\n\
ldrb r1, [r5, 0xA]\n\
lsls r1, 28\n\
movs r0, 0xF\n\
mov r9, r0\n\
lsrs r1, 28\n\
ldrb r2, [r4, 0x19]\n\
mov r0, r8\n\
ands r0, r2\n\
orrs r0, r1\n\
strb r0, [r4, 0x19]\n\
ldrb r1, [r5, 0xA]\n\
lsrs r1, 4\n\
lsls r1, 4\n\
ands r0, r6\n\
orrs r0, r1\n\
strb r0, [r4, 0x19]\n\
ldrh r0, [r5, 0xC]\n\
strb r0, [r4, 0x7]\n\
ldrh r0, [r5, 0xE]\n\
strb r0, [r4, 0x1D]\n\
ldr r1, _0805E230 @ =gInitialMovementTypeFacingDirections\n\
ldrb r0, [r5, 0x9]\n\
adds r0, r1\n\
ldrb r1, [r0]\n\
adds r0, r4, 0\n\
adds r0, 0x20\n\
strb r1, [r0]\n\
ldrb r1, [r0]\n\
adds r0, r4, 0\n\
bl SetObjectEventDirection\n\
adds r0, r4, 0\n\
bl SetObjectEventDynamicGraphicsId\n\
ldr r1, _0805E234 @ =gRangedMovementTypes\n\
ldrb r0, [r4, 0x6]\n\
adds r0, r1\n\
ldrb r0, [r0]\n\
cmp r0, 0\n\
beq _0805E21C\n\
ldrb r2, [r4, 0x19]\n\
adds r0, r6, 0\n\
ands r0, r2\n\
cmp r0, 0\n\
bne _0805E204\n\
lsls r0, r2, 28\n\
lsrs r0, 28\n\
adds r0, 0x1\n\
mov r1, r9\n\
ands r0, r1\n\
mov r1, r8\n\
ands r1, r2\n\
orrs r1, r0\n\
strb r1, [r4, 0x19]\n\
_0805E204:\n\
ldrb r2, [r4, 0x19]\n\
movs r0, 0xF0\n\
ands r0, r2\n\
cmp r0, 0\n\
bne _0805E21C\n\
lsrs r1, r2, 4\n\
adds r1, 0x1\n\
lsls r1, 4\n\
adds r0, r6, 0\n\
ands r0, r2\n\
orrs r0, r1\n\
strb r0, [r4, 0x19]\n\
_0805E21C:\n\
mov r0, sp\n\
ldrb r0, [r0]\n\
_0805E220:\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 {r1}\n\
bx r1\n\
.align 2, 0\n\
_0805E230: .4byte gInitialMovementTypeFacingDirections\n\
_0805E234: .4byte gRangedMovementTypes\n\
");
}
#endif
static bool8 sub_805E238(struct ObjectEventTemplate *template, u8 var, s16 x, s16 y)
{
@ -2163,9 +1936,7 @@ static void sub_805EE3C(u8 objectEventId, s16 x, s16 y)
#undef i
objectEvent = &gObjectEvents[objectEventId];
#ifndef NONMATCHING
asm("":::"r5");
#endif
objectEvent++;objectEvent--; // fakematch
subspriteTables = NULL;
graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
spriteFrameImage.size = graphicsInfo->size;
@ -5140,19 +4911,19 @@ static bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *objectEv
s16 top;
s16 bottom;
if (objectEvent->range.as_nybbles.x != 0)
if (objectEvent->rangeX != 0)
{
left = objectEvent->initialCoords.x - objectEvent->range.as_nybbles.x;
right = objectEvent->initialCoords.x + objectEvent->range.as_nybbles.x;
left = objectEvent->initialCoords.x - objectEvent->rangeX;
right = objectEvent->initialCoords.x + objectEvent->rangeX;
if (left > x || right < x)
{
return TRUE;
}
}
if (objectEvent->range.as_nybbles.y != 0)
if (objectEvent->rangeY != 0)
{
top = objectEvent->initialCoords.y - objectEvent->range.as_nybbles.y;
bottom = objectEvent->initialCoords.y + objectEvent->range.as_nybbles.y;
top = objectEvent->initialCoords.y - objectEvent->rangeY;
bottom = objectEvent->initialCoords.y + objectEvent->rangeY;
if (top > y || bottom < y)
{
return TRUE;

View File

@ -19,6 +19,7 @@
#include "constants/metatile_labels.h"
#define CUT_GRASS_SPRITE_COUNT 8
#define CUT_SIDE 3
static EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL;
static EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE;
@ -133,25 +134,18 @@ bool8 SetUpFieldMove_Cut(void)
gPostMenuFieldCallback = FieldCallback_CutTree;
return TRUE;
}
else
{
// FIXME: this fakematch
#ifndef NONMATCHING
register s32 neg1 asm("r8");
#else
s32 neg1;
#endif
struct MapPosition *pos;
PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
for (i = 0, pos = &gPlayerFacingPosition, neg1 = 0xFFFF; i < 3; i++)
for (i = 0; i < CUT_SIDE; i++)
{
y = i + neg1 + pos->y;
for (j = 0; j < 3; j++)
y = gPlayerFacingPosition.y - 1 + i;
for (j = 0; j < CUT_SIDE; j++)
{
x = j + neg1 + pos->x;
if (MapGridGetZCoordAt(x, y) == pos->height)
x = gPlayerFacingPosition.x - 1 + j;
if (MapGridGetZCoordAt(x, y) == gPlayerFacingPosition.height)
{
if (MetatileAtCoordsIsGrassTile(x, y) == TRUE)
{
@ -207,26 +201,20 @@ bool8 FldEff_CutGrass(void)
{
u8 i, j;
s16 x, y;
// FIXME: this fakematch
#ifndef NONMATCHING
register s32 neg1 asm("r9");
#else
s32 neg1;
#endif
struct MapPosition *pos;
u8 pos;
i = 0;
PlaySE(SE_M_CUT);
pos = gFieldEffectArguments[1] - 1;
PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
for (i = 0, pos = &gPlayerFacingPosition, neg1 = 0xFFFF; i < 3; i++)
for (i = 0; i < CUT_SIDE; i++)
{
y = i + neg1 + pos->y;
for (j = 0; j < 3; j++)
y = gPlayerFacingPosition.y - 1 + i;
for (j = 0; j < CUT_SIDE; j++)
{
x = j + neg1 + pos->x;
if (MapGridGetZCoordAt(x, y) == pos->height)
x = gPlayerFacingPosition.x - 1 + j;
if (MapGridGetZCoordAt(x, y) == gPlayerFacingPosition.height)
{
if (MetatileAtCoordsIsGrassTile(x, y) == TRUE)
{

View File

@ -26,7 +26,7 @@ static void sub_80B198C(u8 taskId);
static void sub_80B1A9C(struct Sprite *sprite);
static void sub_80B1BF8(struct Sprite *sprite);
static void sub_80B1CC0(struct Sprite *sprite);
static void sub_80B1F94(struct Sprite *sprite);
static void AnimFallingFeather_Step(struct Sprite *sprite);
static void sub_80B268C(struct Sprite *sprite);
static void sub_80B2820(struct Sprite *sprite);
static void sub_80B2A50(struct Sprite *sprite);
@ -532,7 +532,7 @@ static void sub_80B1CC0(struct Sprite *sprite)
}
}
void sub_80B1D3C(struct Sprite *sprite)
void DestroyAnimSpriteAfterTimer(struct Sprite *sprite)
{
if (sprite->data[0]-- <= 0)
{
@ -631,15 +631,14 @@ static void AnimFallingFeather(struct Sprite *sprite)
gOamMatrices[matrixNum].b = sinVal;
gOamMatrices[matrixNum].c = -sinVal;
}
sprite->callback = sub_80B1F94;
sprite->callback = AnimFallingFeather_Step;
}
static void sub_80B1F94(struct Sprite *sprite)
static void AnimFallingFeather_Step(struct Sprite *sprite)
{
u8 matrixNum, sinIndex;
s16 sinVal = 0;
struct FeatherDanceData *data = (struct FeatherDanceData *)sprite->data;
if (data->unk0_0a)
{
if (data->unk1-- % 256 == 0)
@ -653,13 +652,13 @@ static void sub_80B1F94(struct Sprite *sprite)
switch (data->unk2 / 64)
{
case 0:
if (data->unk0_1 << 24 >> 24 == 1) // the shifts have to be here
if ((u8)data->unk0_1 == 1) //casts to u8 here are necessary for matching
{
data->unk0_0d = 1;
data->unk0_0a = 1;
data->unk1 = 0;
}
else if (data->unk0_1 << 24 >> 24 == 3)
else if ((u8)data->unk0_1 == 3)
{
data->unk0_0b ^= 1;
data->unk0_0a = 1;
@ -706,13 +705,13 @@ static void sub_80B1F94(struct Sprite *sprite)
data->unk0_1 = 0;
break;
case 1:
if (data->unk0_1 << 24 >> 24 == 0)
if ((u8)data->unk0_1 == 0)
{
data->unk0_0d = 1;
data->unk0_0a = 1;
data->unk1 = 0;
}
else if (data->unk0_1 << 24 >> 24 == 2)
else if ((u8)data->unk0_1 == 2)
{
data->unk0_0a = 1;
data->unk1 = 0;
@ -757,13 +756,13 @@ static void sub_80B1F94(struct Sprite *sprite)
data->unk0_1 = 1;
break;
case 2:
if (data->unk0_1 << 24 >> 24 == 3)
if ((u8)data->unk0_1 == 3)
{
data->unk0_0d = 1;
data->unk0_0a = 1;
data->unk1 = 0;
}
else if (data->unk0_1 << 24 >> 24 == 1)
else if ((u8)data->unk0_1 == 1)
{
data->unk0_0a = 1;
data->unk1 = 0;
@ -808,11 +807,11 @@ static void sub_80B1F94(struct Sprite *sprite)
data->unk0_1 = 2;
break;
case 3:
if (data->unk0_1 << 24 >> 24 == 2)
if ((u8)data->unk0_1 == 2)
{
data->unk0_0d = 1;
}
else if (data->unk0_1 << 24 >> 24 == 0)
else if ((u8)data->unk0_1 == 0)
{
data->unk0_0b ^= 1;
data->unk0_0a = 1;
@ -858,26 +857,28 @@ static void sub_80B1F94(struct Sprite *sprite)
data->unk0_1 = 3;
break;
}
#ifndef NONMATCHING
asm("":::"r8");
#endif
sprite->pos2.x = (data->unkC[data->unk0_0b] * gSineTable[data->unk2]) >> 8;
sprite->pos2.x = ((s32)data->unkC[data->unk0_0b] * gSineTable[data->unk2]) >> 8;
matrixNum = sprite->oam.matrixNum;
sinIndex = (-sprite->pos2.x >> 1) + data->unkA;
sinVal = gSineTable[sinIndex];
gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[sinIndex + 64];
gOamMatrices[matrixNum].b = sinVal;
gOamMatrices[matrixNum].c = -sinVal;
data->unk8 += data->unk6;
sprite->pos1.y = data->unk8 >> 8;
if (data->unk4 & 0x8000)
data->unk2 = (data->unk2 - (data->unk4 & 0x7FFF)) & 0xFF;
else
data->unk2 = (data->unk2 + (data->unk4 & 0x7FFF)) & 0xFF;
if (sprite->pos1.y + sprite->pos2.y >= data->unkE_1)
{
sprite->data[0] = 0;
sprite->callback = sub_80B1D3C;
sprite->callback = DestroyAnimSpriteAfterTimer;
}
}
}
@ -983,7 +984,7 @@ static void sub_80B268C(struct Sprite *sprite)
x = (((u16 *)&fData)[7] << 1);
y = (((u16 *)tData)[7] & 1);
((u16 *)tData)[7] = y | x;
sprite->callback = sub_80B1F94;
sprite->callback = AnimFallingFeather_Step;
}
static void AnimWhirlwindLine(struct Sprite *sprite)

View File

@ -507,8 +507,8 @@ static void sub_812E768(const struct Bitmap *src, struct Bitmap *dst, u16 srcX,
{
s32 loopSrcY, loopDstY, loopSrcX, loopDstX, xEnd, yEnd, multiplierSrcY, multiplierDstY;
u16 toOrr;
const u8 *pixelsSrc;
u16 *pixelsDst;
u8 *pixelsSrc;
u8 *pixelsDst;
if (dst->width - dstX < width)
xEnd = dst->width - dstX + srcX;
@ -525,51 +525,49 @@ static void sub_812E768(const struct Bitmap *src, struct Bitmap *dst, u16 srcX,
{
for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
{
#ifndef NONMATCHING
asm("":::"r4");
#endif
pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B);
pixelsDst = (u16 *)(dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + ((( loopDstY >> 3) * multiplierDstY) << 5) + ((u32)( loopDstY << 0x1d) >> 0x1B));
pixelsSrc = (u8 *)(src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B));
pixelsDst = (u8 *)(dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + ((( loopDstY >> 3) * multiplierDstY) << 5) + ((u32)( loopDstY << 0x1d) >> 0x1B));
if ((uintptr_t)pixelsDst & 0x1)
if ((u32)pixelsDst & 0x1)
{
pixelsDst = (void *)pixelsDst - 1;
pixelsDst--;
if (loopDstX & 0x1)
{
toOrr = *pixelsDst & 0x0fff;
toOrr = *(vu16 *)pixelsDst & 0x0fff;
if (loopSrcX & 0x1)
*pixelsDst = toOrr | ((*pixelsSrc & 0xf0) << 8);
toOrr |= ((*pixelsSrc & 0xf0) << 8);
else
*pixelsDst = toOrr | ((*pixelsSrc & 0x0f) << 12);
toOrr |= ((*pixelsSrc & 0x0f) << 12);
}
else
{
toOrr = *pixelsDst & 0xf0ff;
toOrr = *(vu16 *)pixelsDst & 0xf0ff;
if (loopSrcX & 0x1)
*pixelsDst = toOrr | ((*pixelsSrc & 0xf0) << 4);
toOrr |= ((*pixelsSrc & 0xf0) << 4);
else
*pixelsDst = toOrr | ((*pixelsSrc & 0x0f) << 8);
toOrr |= ((*pixelsSrc & 0x0f) << 8);
}
}
else
{
if (loopDstX & 1)
{
toOrr = *pixelsDst & 0xff0f;
toOrr = *(vu16 *)pixelsDst & 0xff0f;
if (loopSrcX & 1)
*pixelsDst = toOrr | ((*pixelsSrc & 0xf0) << 0);
toOrr |= ((*pixelsSrc & 0xf0) << 0);
else
*pixelsDst = toOrr | ((*pixelsSrc & 0x0f) << 4);
toOrr |= ((*pixelsSrc & 0x0f) << 4);
}
else
{
toOrr = *pixelsDst & 0xfff0;
toOrr = *(vu16 *)pixelsDst & 0xfff0;
if (loopSrcX & 1)
*pixelsDst = toOrr | ((*pixelsSrc & 0xf0) >> 4);
toOrr |= ((*pixelsSrc & 0xf0) >> 4);
else
*pixelsDst = toOrr | ((*pixelsSrc & 0x0f) >> 0);
toOrr |= ((*pixelsSrc & 0x0f) >> 0);
}
}
*(vu16 *)pixelsDst = toOrr;
}
}
}

View File

@ -1123,7 +1123,7 @@ void task_add_00_mystery_gift(void)
void task00_mystery_gift(u8 taskId)
{
struct MysteryGiftTaskData * data = (void *)gTasks[taskId].data;
u32 sp0;
u32 sp0, flag;
const u8 * r1;
switch (data->state)
@ -1291,7 +1291,8 @@ void task00_mystery_gift(u8 taskId)
}
break;
case 9:
switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, mevent_client_get_buffer()))
flag = mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, mevent_client_get_buffer());
switch (flag)
{
case 0:
mevent_client_set_param(0);
@ -1318,7 +1319,8 @@ void task00_mystery_gift(u8 taskId)
}
break;
case 11:
switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, gText_ThrowAwayWonderCard))
flag = mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, gText_ThrowAwayWonderCard);
switch (flag)
{
case 0:
if (CheckReceivedGiftFromWonderCard() == TRUE)
@ -1345,7 +1347,8 @@ void task00_mystery_gift(u8 taskId)
}
break;
case 12:
switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, gText_HaventReceivedCardsGift))
flag = mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, gText_HaventReceivedCardsGift);
switch (flag)
{
case 0:
mevent_client_set_param(0);
@ -1382,12 +1385,6 @@ void task00_mystery_gift(u8 taskId)
}
break;
case 15:
{
#ifndef NONMATCHING
register bool32 flag asm("r1");
#else
bool32 flag;
#endif
r1 = mevent_message(&sp0, data->IsCardOrNews, data->source, data->prevPromptWindowId);
if (r1 == NULL)
{
@ -1425,7 +1422,6 @@ void task00_mystery_gift(u8 taskId)
}
}
break;
}
case 16:
if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gText_CommunicationError))
{

View File

@ -850,7 +850,7 @@ static void AnimHitSplatPersistent(struct Sprite *sprite)
InitSpritePosToAnimTarget(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[4];
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
StoreSpriteCallbackInData6(sprite, sub_80B1D3C);
StoreSpriteCallbackInData6(sprite, DestroyAnimSpriteAfterTimer);
}
static void AnimHitSplatHandleInvert(struct Sprite *sprite)

View File

@ -194,7 +194,7 @@ static void CreateConfirmLeaveTradeRoomPrompt(void);
static void InitLinkRoomStartMenuScript(void);
static void InitMenuBasedScript(const u8 *script);
static void sub_80581DC(const u8 *script);
static void sub_8058230(void);
static void RunTerminateLinkScript(void);
static void SpawnLinkPlayerObjectEvent(u8 i, s16 x, s16 y, u8 gender);
static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s16 y);
static u8 GetSpriteForLinkedPlayer(u8 linkPlayerId);
@ -2673,7 +2673,7 @@ static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlay
if (trainer->isLocalPlayer)
{
SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);
sub_8058230();
RunTerminateLinkScript();
}
return;
}
@ -3170,7 +3170,7 @@ static void InitMenuBasedScript(const u8 *script)
ScriptContext2_Enable();
}
static void sub_8058230(void)
static void RunTerminateLinkScript(void)
{
ScriptContext1_SetupScript(TradeCenter_TerminateLink);
ScriptContext2_Enable();
@ -3260,7 +3260,14 @@ static void ZeroObjectEvent(struct ObjectEvent *objEvent)
memset(objEvent, 0, sizeof(struct ObjectEvent));
}
static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 a4)
// Note: Emerald reuses the direction and range variables during Link mode
// as special gender and direction values. The types and placement
// conflict with the usual Event Object struct, thus the definitions.
#define linkGender(obj) obj->singleMovementActive
// not even one can reference *byte* aligned bitfield members...
#define linkDirection(obj) ((u8*)obj)[offsetof(typeof(*obj), fieldEffectSpriteId) - 1] // -> rangeX
static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 gender)
{
u8 objEventId = GetFirstInactiveObjectEventId();
struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];
@ -3275,8 +3282,8 @@ static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 a4)
linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FREE;
objEvent->active = TRUE;
objEvent->singleMovementActive = a4;
objEvent->range.as_byte = 2;
linkGender(objEvent) = gender;
linkDirection(objEvent) = DIR_NORTH;
objEvent->spriteId = MAX_SPRITES;
InitLinkPlayerObjectEventPos(objEvent, x, y);
@ -3293,17 +3300,17 @@ static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s1
ObjectEventUpdateZCoord(objEvent);
}
static void SetLinkPlayerObjectRange(u8 linkPlayerId, u8 range)
static void SetLinkPlayerObjectRange(u8 linkPlayerId, u8 dir)
{
if (gLinkPlayerObjectEvents[linkPlayerId].active)
{
u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
objEvent->range.as_byte = range;
linkDirection(objEvent) = dir;
}
}
static void DestroyLinkPlayerOBject(u8 linkPlayerId)
static void DestroyLinkPlayerObject(u8 linkPlayerId)
{
struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];
u8 objEventId = linkPlayerObjEvent->objEventId;
@ -3334,7 +3341,7 @@ static u8 GetLinkPlayerFacingDirection(u8 linkPlayerId)
{
u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
return objEvent->range.as_byte;
return linkDirection(objEvent);
}
static u8 GetLinkPlayerElevation(u8 linkPlayerId)
@ -3393,35 +3400,35 @@ static void SetPlayerFacingDirection(u8 linkPlayerId, u8 facing)
}
}
static u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
static u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
{
return sLinkPlayerFacingHandlers[a3](linkPlayerObjEvent, objEvent, a3);
return sLinkPlayerFacingHandlers[dir](linkPlayerObjEvent, objEvent, dir);
}
static u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
static u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
{
return FACING_UP;
}
// Duplicate Function
static u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
static u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
{
return sLinkPlayerFacingHandlers[a3](linkPlayerObjEvent, objEvent, a3);
return sLinkPlayerFacingHandlers[dir](linkPlayerObjEvent, objEvent, dir);
}
static bool8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
static bool8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
{
return FALSE;
}
static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
{
s16 x, y;
objEvent->range.as_byte = FlipVerticalAndClearForced(a3, objEvent->range.as_byte);
ObjectEventMoveDestCoords(objEvent, objEvent->range.as_byte, &x, &y);
linkDirection(objEvent) = FlipVerticalAndClearForced(dir, linkDirection(objEvent));
ObjectEventMoveDestCoords(objEvent, linkDirection(objEvent), &x, &y);
if (LinkPlayerDetectCollision(linkPlayerObjEvent->objEventId, objEvent->range.as_byte, x, y))
if (LinkPlayerDetectCollision(linkPlayerObjEvent->objEventId, linkDirection(objEvent), x, y))
{
return FALSE;
}
@ -3434,9 +3441,9 @@ static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayer
}
}
static bool8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
static bool8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
{
objEvent->range.as_byte = FlipVerticalAndClearForced(a3, objEvent->range.as_byte);
linkDirection(objEvent) = FlipVerticalAndClearForced(dir, linkDirection(objEvent));
return FALSE;
}
@ -3450,7 +3457,7 @@ static void MovementStatusHandler_TryAdvanceScript(struct LinkPlayerObjectEvent
{
objEvent->directionSequenceIndex--;
linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FROZEN;
MoveCoords(objEvent->range.as_byte, &objEvent->initialCoords.x, &objEvent->initialCoords.y);
MoveCoords(linkDirection(objEvent), &objEvent->initialCoords.x, &objEvent->initialCoords.y);
if (!objEvent->directionSequenceIndex)
{
ShiftStillObjectEventCoords(objEvent);
@ -3510,12 +3517,12 @@ static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion)
if (gameVersion == VERSION_FIRE_RED || gameVersion == VERSION_LEAF_GREEN)
{
objEvent->spriteId = AddPseudoObjectEvent(
GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, objEvent->singleMovementActive),
GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, linkGender(objEvent)),
SpriteCB_LinkPlayer, 0, 0, 0);
}
else
{
objEvent->spriteId = AddPseudoObjectEvent(GetRSAvatarGraphicsIdByGender(objEvent->singleMovementActive), SpriteCB_LinkPlayer, 0, 0, 0);
objEvent->spriteId = AddPseudoObjectEvent(GetRSAvatarGraphicsIdByGender(linkGender(objEvent)), SpriteCB_LinkPlayer, 0, 0, 0);
}
sprite = &gSprites[objEvent->spriteId];
@ -3535,9 +3542,9 @@ static void SpriteCB_LinkPlayer(struct Sprite *sprite)
sprite->oam.priority = ZCoordToPriority(objEvent->previousElevation);
if (!linkPlayerObjEvent->movementMode != MOVEMENT_MODE_FREE)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objEvent->range.as_byte));
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(linkDirection(objEvent)));
else
StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(objEvent->range.as_byte));
StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(linkDirection(objEvent)));
UpdateObjectEventSpriteVisibility(sprite, 0);
if (objEvent->triggerGroundEffectsOnMove)

View File

@ -1038,14 +1038,8 @@ void PSA_UseItem_CleanUpForCancel(void)
static void InitItemIconSpriteState(struct PokemonSpecialAnimScene * scene, struct Sprite * sprite, u8 closeness)
{
u16 species;
u16 species, x, y;
u32 personality;
#ifndef NONMATCHING
register int x asm("r4"); // FIXME
#else
int x;
#endif
u8 y;
if (closeness == 3)
{
sprite->pos1.x = 120;
@ -1060,22 +1054,33 @@ static void InitItemIconSpriteState(struct PokemonSpecialAnimScene * scene, stru
sprite->pos1.y += 4;
species = PSA_GetMonSpecies();
personality = PSA_GetMonPersonality();
if (PSA_GetAnimType() == 4)
switch (PSA_GetAnimType())
{
x = Menu2_GetMonSpriteAnchorCoord(species, personality, 0);
y = Menu2_GetMonSpriteAnchorCoord(species, personality, 1);
case 4:
{
x = Menu2_GetMonSpriteAnchorCoord(species, personality, 0);
y = Menu2_GetMonSpriteAnchorCoord(species, personality, 1);
if (x == 0xFF)
x = 0;
if (y == 0xFF)
y = 0;
sprite->data[6] = x;
sprite->data[7] = y;
break;
}
default:
{
x = Menu2_GetMonSpriteAnchorCoord(species, personality, 3);
y = Menu2_GetMonSpriteAnchorCoord(species, personality, 4);
if (x == 0xFF)
x = 0;
if (y == 0xFF)
y = 0;
sprite->data[6] = x;
sprite->data[7] = y;
break;
}
}
else
{
x = Menu2_GetMonSpriteAnchorCoord(species, personality, 3);
y = Menu2_GetMonSpriteAnchorCoord(species, personality, 4);
}
if (x == 0xFF)
x = 0;
if (y == 0xFF)
y = 0;
sprite->data[6] = x;
sprite->data[7] = y;
ItemSpriteZoom_UpdateYPos(sprite, closeness);
}
@ -1254,23 +1259,14 @@ static void StopMakingOutwardSpiralDots(void)
static void Task_UseItem_OutwardSpiralDots(u8 taskId)
{
s16 *data = gTasks[taskId].data;
struct Sprite * sprite;
int x;
#ifndef NONMATCHING
register int y asm("r10"); // FIXME
#else
int y;
#endif
int x2;
int y2;
int ampl;
u8 spriteId;
switch (tState)
{
case 0:
if (tTimer == 0)
{
sprite = PSA_GetSceneWork()->itemIconSprite;
u32 spriteId, x, y, x2, y2, ampl;
struct Sprite * sprite = PSA_GetSceneWork()->itemIconSprite;
x = sprite->pos1.x + sprite->pos2.x;
y = sprite->pos1.y + sprite->pos2.y;
ampl = (PSAScene_RandomFromTask(taskId) % 21) + 70;

View File

@ -582,18 +582,16 @@ void sub_8113ABC(const u16 *a0)
bool8 sub_8113AE8(const u16 *a0)
{
#ifndef NONMATCHING
register const u16 *r0 asm("r0") = a0;
#else
const u16 *r0 = a0;
#endif
if (r0 == NULL || r0[1] > sQuestLogCursor)
if (a0 == NULL) // checks must be separate to match
return FALSE;
if (r0[1] > sQuestLogCursor)
return FALSE;
sQuestLogEventTextBufferCBs[a0[0] & 0xFFF](a0);
gUnknown_203B044.id = a0[0];
gUnknown_203B044.unk_1 = (a0[0] & 0xF000) >> 12;
sQuestLogEventTextBufferCBs[(r0[0] & 0xFFF)](a0);
gUnknown_203B044.id = r0[0];
gUnknown_203B044.unk_1 = (r0[0] & 0xF000) >> 12;
if (gUnknown_203B044.unk_1 != 0)
gUnknown_203B044.unk_2 = 1;
return TRUE;

View File

@ -93,8 +93,8 @@ void SetSav1ObjectEventsFromQuestLog(const struct QuestLog * questLog, const str
{
gObjectEvents[i].initialCoords.x = templates[j].x + 7;
gObjectEvents[i].initialCoords.y = templates[j].y + 7;
gObjectEvents[i].range.as_nybbles.x = templates[j].movementRangeX;
gObjectEvents[i].range.as_nybbles.y = templates[j].movementRangeY;
gObjectEvents[i].rangeX = templates[j].movementRangeX;
gObjectEvents[i].rangeY = templates[j].movementRangeY;
}
}

View File

@ -219,15 +219,15 @@ static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 ap
}
// preserve mapobj_unk_19 before clearing.
unk19_temp = trainerObj->range.as_nybbles.x;
unk19b_temp = trainerObj->range.as_nybbles.y;
trainerObj->range.as_nybbles.x = 0;
trainerObj->range.as_nybbles.y = 0;
unk19_temp = trainerObj->rangeX;
unk19b_temp = trainerObj->rangeY;
trainerObj->rangeX = 0;
trainerObj->rangeY = 0;
collision = GetCollisionAtCoords(trainerObj, x, y, direction);
trainerObj->range.as_nybbles.x = unk19_temp;
trainerObj->range.as_nybbles.y = unk19b_temp;
trainerObj->rangeX = unk19_temp;
trainerObj->rangeY = unk19b_temp;
if (collision == 4)
return approachDistance;

View File

@ -651,6 +651,9 @@ void VsSeekerResetObjectMovementAfterChargeComplete(void)
bool8 UpdateVsSeekerStepCounter(void)
{
u8 x;
x = 0;
if (CheckBagHasItem(ITEM_VS_SEEKER, 1) == TRUE)
{
if ((gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) < 100)
@ -659,19 +662,12 @@ bool8 UpdateVsSeekerStepCounter(void)
if (FlagGet(FLAG_SYS_VS_SEEKER_CHARGING) == TRUE)
{
u8 x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF;
u32 r4 = 0xFF;
if (x < 100)
if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) < 100)
{
x++;
#ifndef NONMATCHING // fool the compiler that r4 has been changed
asm("":"=r"(r4));
#endif
x = (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) + 1);
gSaveBlock1Ptr->trainerRematchStepCounter = (gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) | (x << 8);
}
x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & r4;
if (x == 100)
if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) == 100)
{
FlagClear(FLAG_SYS_VS_SEEKER_CHARGING);
VsSeekerResetChargingStepCounter();
@ -860,16 +856,15 @@ static u8 CanUseVsSeeker(void)
static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0)
{
u16 r8 = 0;
u16 rval = 0;
u8 r7;
u8 sp0 = 0;
u8 r0 = 0;
s32 vsSeekerIdx;
u8 *r2;
#ifndef NONMATCHING
register u32 r3 asm("r3");
register s32 r0_ asm("r0");
asm("":::"r10", "r8", "r6", "r4");
#endif
vsSeekerIdx = 0;
for (vsSeekerIdx = 0; sVsSeeker->trainerInfo[vsSeekerIdx].localId != 0xFF; vsSeekerIdx++)
while (sVsSeeker->trainerInfo[vsSeekerIdx].localId != 0xFF)
{
if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[vsSeekerIdx]) == 1)
{
@ -877,59 +872,42 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0)
if (!HasTrainerBeenFought(r8))
{
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerUnfought);
sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx += 0;
sVsSeeker->trainerHasNotYetBeenFought = 1;
vsSeekerIdx++;
continue;
}
r7 = GetNextAvailableRematchTrainer(a0, r8, &sp0);
if (r7 == 0)
{
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);
sVsSeeker->trainerDoesNotWantRematch = 1;
}
else
{
u8 r7 = GetNextAvailableRematchTrainer(a0, r8, &sp0);
if (r7 == 0)
rval = Random() % 100;
r0 = GetCurVsSeekerResponse(vsSeekerIdx, r8);
if (r0 == 2)
rval = 100;
else if (r0 == 1)
rval = 0;
if (rval < 30)
{
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);
#ifdef NONMATCHING
sVsSeeker->trainerDoesNotWantRematch = 1;
#else
r2 = (u8 *)sVsSeeker;
r3 = 0x431;
asm("":::"r1");
r2 = &r2[r3];
*(r2) |= 2;
#endif
}
else
{
u16 rval = Random() % 100;
u8 r0 = GetCurVsSeekerResponse(vsSeekerIdx, r8);
if (r0 == 2)
rval = 100;
else if (r0 == 1)
rval = 0;
if (rval < 30)
{
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);
#ifdef NONMATCHING
sVsSeeker->trainerDoesNotWantRematch = 1;
#else
r2 = (u8 *)sVsSeeker;
r0_ = 0x431;
asm("":::"r1");
r2 = &r2[r0_];
*(r2) |= 2;
#endif
}
else
{
gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[vsSeekerIdx].localId] = r7;
ShiftStillObjectEventCoords(&gObjectEvents[sVsSeeker->trainerInfo[vsSeekerIdx].objectEventId]);
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerRematch);
sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = r8;
sVsSeeker->runningBehaviourEtcArray[sVsSeeker->numRematchableTrainers] = GetRunningBehaviorFromGraphicsId(sVsSeeker->trainerInfo[vsSeekerIdx].graphicsId);
sVsSeeker->numRematchableTrainers++;
sVsSeeker->trainerWantsRematch = 1;
}
gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[vsSeekerIdx].localId] = r7;
ShiftStillObjectEventCoords(&gObjectEvents[sVsSeeker->trainerInfo[vsSeekerIdx].objectEventId]);
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerRematch);
sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = r8;
sVsSeeker->runningBehaviourEtcArray[sVsSeeker->numRematchableTrainers] = GetRunningBehaviorFromGraphicsId(sVsSeeker->trainerInfo[vsSeekerIdx].graphicsId);
sVsSeeker->numRematchableTrainers++;
sVsSeeker->trainerWantsRematch = 1;
}
}
}
vsSeekerIdx++;
}
if (sVsSeeker->trainerWantsRematch)