Merge branch 'master' of github.com:pret/pokeemerald into Edwearth-learn_move
This commit is contained in:
2761
src/contest.c
Normal file
2761
src/contest.c
Normal file
File diff suppressed because it is too large
Load Diff
807
src/easy_chat.c
Normal file
807
src/easy_chat.c
Normal file
@@ -0,0 +1,807 @@
|
||||
|
||||
// Includes
|
||||
#include "global.h"
|
||||
#include "malloc.h"
|
||||
#include "constants/songs.h"
|
||||
#include "sound.h"
|
||||
#include "overworld.h"
|
||||
#include "task.h"
|
||||
#include "main.h"
|
||||
#include "link.h"
|
||||
#include "field_weather.h"
|
||||
#include "window.h"
|
||||
#include "palette.h"
|
||||
#include "event_data.h"
|
||||
#include "easy_chat.h"
|
||||
|
||||
// Static type declarations
|
||||
|
||||
#define EZCHAT_TASK_STATE 0
|
||||
#define EZCHAT_TASK_KIND 1
|
||||
#define EZCHAT_TASK_WORDS 2
|
||||
#define EZCHAT_TASK_MAINCALLBACK 4
|
||||
#define EZCHAT_TASK_UNK06 6
|
||||
#define EZCHAT_TASK_SIZE 7
|
||||
|
||||
// Static RAM declarations
|
||||
|
||||
EWRAM_DATA struct
|
||||
{
|
||||
u8 kind;
|
||||
u8 unk_01;
|
||||
u8 unk_02;
|
||||
u8 unk_03;
|
||||
u8 unk_04;
|
||||
s8 unk_05;
|
||||
s8 unk_06;
|
||||
u8 unk_07;
|
||||
u8 unk_08;
|
||||
u8 unk_09;
|
||||
u8 unk_0a;
|
||||
u8 unk_0b;
|
||||
u8 unk_0c;
|
||||
u8 unk_0d;
|
||||
u8 unk_0e[0x4];
|
||||
u8 sizeParam;
|
||||
u8 unk_13;
|
||||
u8 unk_14[0x20];
|
||||
const u8 *src;
|
||||
const u16 *words;
|
||||
u16 ecWordBuffer[9];
|
||||
} *gUnknown_0203A118 = NULL;
|
||||
|
||||
// Static ROM declarations
|
||||
|
||||
static void sub_811A2C0(u8);
|
||||
static void sub_811A278(void);
|
||||
static bool8 sub_811A428(u8);
|
||||
static void sub_811A2FC(u8);
|
||||
static void sub_811A4D0(MainCallback);
|
||||
static bool32 sub_811A88C(u16);
|
||||
static void sub_811A8A4(u16);
|
||||
void sub_811A8F0(void);
|
||||
static bool8 EasyChat_AllocateResources(u8, u16 *, u8);
|
||||
static void EasyChat_FreeResources(void);
|
||||
static u16 sub_811AAAC(void);
|
||||
static u16 sub_811AB68(void);
|
||||
u16 sub_811ACDC(void);
|
||||
u16 sub_811AE44(void);
|
||||
u16 sub_811AF00(void);
|
||||
u16 sub_811AF8C(void);
|
||||
u16 sub_811AFEC(void);
|
||||
u16 sub_811B040(void);
|
||||
u16 sub_811B08C(void);
|
||||
u16 sub_811B0BC(void);
|
||||
u16 sub_811B0E8(void);
|
||||
u16 sub_811B0F8(void);
|
||||
u16 sub_811B150(void);
|
||||
u16 sub_811B1B4(void);
|
||||
u8 sub_811BA68(void);
|
||||
u8 sub_811BCC8(u8);
|
||||
void sub_811BDF0(u8 *);
|
||||
void sub_811BF78(void);
|
||||
bool8 sub_811BF8C(void);
|
||||
bool8 sub_811BFA4(void);
|
||||
void sub_811C13C(void);
|
||||
/*static*/ void sub_811C158(u16);
|
||||
/*static*/ bool8 sub_811C170(void);
|
||||
bool8 sub_811F28C(void);
|
||||
void sub_811F2B8(void);
|
||||
u8 sub_811F3AC(void);
|
||||
|
||||
// .rodata
|
||||
|
||||
extern const struct {
|
||||
u16 word;
|
||||
MainCallback callback;
|
||||
} gUnknown_08597530[4];
|
||||
extern const struct {
|
||||
u8 unk_00;
|
||||
u8 unk_01;
|
||||
u8 unk_02;
|
||||
u8 unk_03;
|
||||
u8 *data;
|
||||
u8 filler_08[16];
|
||||
} gUnknown_08597550[];
|
||||
|
||||
// .text
|
||||
|
||||
void sub_811A20C(u8 kind, u16 *words, MainCallback callback, u8 sizeParam)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
ResetTasks();
|
||||
taskId = CreateTask(sub_811A2C0, 0);
|
||||
gTasks[taskId].data[EZCHAT_TASK_KIND] = kind;
|
||||
gTasks[taskId].data[EZCHAT_TASK_SIZE] = sizeParam;
|
||||
SetWordTaskArg(taskId, EZCHAT_TASK_WORDS, (u32)words);
|
||||
SetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK, (u32)callback);
|
||||
SetMainCallback2(sub_811A278);
|
||||
}
|
||||
|
||||
static void sub_811A278(void)
|
||||
{
|
||||
RunTasks();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
static void sub_811A290(void)
|
||||
{
|
||||
TransferPlttBuffer();
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
}
|
||||
|
||||
static void sub_811A2A4(u8 taskId, TaskFunc taskFunc)
|
||||
{
|
||||
gTasks[taskId].func = taskFunc;
|
||||
gTasks[taskId].data[EZCHAT_TASK_STATE] = 0;
|
||||
}
|
||||
|
||||
static void sub_811A2C0(u8 taskId)
|
||||
{
|
||||
if (!is_c1_link_related_active())
|
||||
{
|
||||
while (sub_811A428(taskId));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (sub_811A428(taskId) == TRUE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
sub_811A2A4(taskId, sub_811A2FC);
|
||||
}
|
||||
|
||||
static void sub_811A2FC(u8 taskId)
|
||||
{
|
||||
u16 v0;
|
||||
s16 *data;
|
||||
|
||||
data = gTasks[taskId].data;
|
||||
switch (data[EZCHAT_TASK_STATE])
|
||||
{
|
||||
case 0:
|
||||
SetVBlankCallback(sub_811A290);
|
||||
BlendPalettes(0xFFFFFFFF, 16, 0);
|
||||
BeginNormalPaletteFade(-1, -1, 16, 0, 0);
|
||||
data[EZCHAT_TASK_STATE] = 5;
|
||||
break;
|
||||
case 1:
|
||||
v0 = sub_811AAAC();
|
||||
if (sub_811A88C(v0))
|
||||
{
|
||||
BeginNormalPaletteFade(-1, -2, 0, 16, 0);
|
||||
data[EZCHAT_TASK_STATE] = 3;
|
||||
data[EZCHAT_TASK_UNK06] = v0;
|
||||
}
|
||||
else if (v0 == 0x18)
|
||||
{
|
||||
BeginNormalPaletteFade(-1, -1, 0, 16, 0);
|
||||
data[EZCHAT_TASK_STATE] = 4;
|
||||
}
|
||||
else if (v0 != 0)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
sub_811C158(v0);
|
||||
data[EZCHAT_TASK_STATE] ++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (!sub_811C170())
|
||||
{
|
||||
data[EZCHAT_TASK_STATE] = 1;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
sub_811A8A4(data[EZCHAT_TASK_UNK06]);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
data[EZCHAT_TASK_STATE] = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static bool8 sub_811A428(u8 taskId)
|
||||
{
|
||||
s16 *data;
|
||||
|
||||
data = gTasks[taskId].data;
|
||||
switch (data[EZCHAT_TASK_STATE])
|
||||
{
|
||||
case 0:
|
||||
SetVBlankCallback(NULL);
|
||||
ResetSpriteData();
|
||||
FreeAllSpritePalettes();
|
||||
ResetPaletteFade();
|
||||
break;
|
||||
case 1:
|
||||
if (!sub_811F28C())
|
||||
{
|
||||
sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (!EasyChat_AllocateResources(data[EZCHAT_TASK_KIND], (u16 *)GetWordTaskArg(taskId, EZCHAT_TASK_WORDS), data[EZCHAT_TASK_SIZE]))
|
||||
{
|
||||
sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (!sub_811BF8C())
|
||||
{
|
||||
sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (sub_811BFA4())
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
data[EZCHAT_TASK_STATE] ++;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void sub_811A4D0(MainCallback callback)
|
||||
{
|
||||
sub_811C13C();
|
||||
EasyChat_FreeResources();
|
||||
sub_811F2B8();
|
||||
FreeAllWindowBuffers();
|
||||
SetMainCallback2(callback);
|
||||
}
|
||||
|
||||
void easy_chat_input_maybe(void)
|
||||
{
|
||||
int i;
|
||||
u16 *words;
|
||||
struct MauvilleManBard *bard;
|
||||
u8 sizeParam = 3;
|
||||
switch (gSpecialVar_0x8004)
|
||||
{
|
||||
case 0:
|
||||
words = gSaveBlock1Ptr->unk2BB0;
|
||||
break;
|
||||
case 1:
|
||||
words = gSaveBlock1Ptr->unk2BBC;
|
||||
break;
|
||||
case 2:
|
||||
words = gSaveBlock1Ptr->unk2BC8;
|
||||
break;
|
||||
case 3:
|
||||
words = gSaveBlock1Ptr->unk2BD4;
|
||||
break;
|
||||
case 4:
|
||||
words = gSaveBlock1Ptr->mail[gSpecialVar_0x8005].words;
|
||||
break;
|
||||
case 6:
|
||||
bard = &gSaveBlock1Ptr->oldMan.bard;
|
||||
for (i = 0; i < 6; i ++)
|
||||
{
|
||||
bard->temporaryLyrics[i] = bard->songLyrics[i];
|
||||
}
|
||||
words = bard->temporaryLyrics;
|
||||
break;
|
||||
case 5:
|
||||
words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].bravoTrainer.words;
|
||||
sizeParam = gSpecialVar_0x8006;
|
||||
break;
|
||||
case 7:
|
||||
words = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanclubOpinions.words[gSpecialVar_0x8006];
|
||||
sizeParam = 1;
|
||||
break;
|
||||
case 8:
|
||||
words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].unkShow04.words;
|
||||
sizeParam = 0;
|
||||
break;
|
||||
case 9:
|
||||
words = (u16 *)gStringVar3;
|
||||
words[0] = gSaveBlock1Ptr->easyChatPairs[0].words[0];
|
||||
words[1] = gSaveBlock1Ptr->easyChatPairs[0].words[1];
|
||||
break;
|
||||
case 10:
|
||||
words = gSaveBlock1Ptr->gabbyAndTyData.quote;
|
||||
*words = -1;
|
||||
sizeParam = 1;
|
||||
break;
|
||||
case 11:
|
||||
words = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].bravoTrainer.words[gSpecialVar_0x8006];
|
||||
sizeParam = 0;
|
||||
break;
|
||||
case 12:
|
||||
words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanclubOpinions.words18;
|
||||
sizeParam = 1;
|
||||
break;
|
||||
case 13:
|
||||
words = (u16 *)gStringVar3;
|
||||
InitializeEasyChatWordArray(words, 2);
|
||||
break;
|
||||
case 14:
|
||||
words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanClubSpecial.words;
|
||||
words[0] = -1;
|
||||
sizeParam = 2;
|
||||
break;
|
||||
case 15:
|
||||
words = &gSaveBlock1Ptr->lilycoveLady.quiz.unk_016;
|
||||
break;
|
||||
case 16:
|
||||
return;
|
||||
case 17:
|
||||
words = gSaveBlock1Ptr->lilycoveLady.quiz.unk_002;
|
||||
break;
|
||||
case 18:
|
||||
words = &gSaveBlock1Ptr->lilycoveLady.quiz.unk_014;
|
||||
break;
|
||||
case 19:
|
||||
words = (u16 *)&gSaveBlock2Ptr->field_DC[0].field_0[0x28];
|
||||
break;
|
||||
case 20:
|
||||
words = sub_801B058();
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
overworld_free_bg_tilemaps();
|
||||
sub_811A20C(gSpecialVar_0x8004, words, CB2_ReturnToFieldContinueScript, sizeParam);
|
||||
}
|
||||
|
||||
static void sub_811A7E4(void)
|
||||
{
|
||||
LilycoveLady *lilycoveLady;
|
||||
|
||||
UpdatePaletteFade();
|
||||
switch (gMain.state)
|
||||
{
|
||||
case 0:
|
||||
FadeScreen(1, 0);
|
||||
break;
|
||||
case 1:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
|
||||
lilycoveLady->quiz.unk_016 = -1;
|
||||
overworld_free_bg_tilemaps();
|
||||
sub_811A8F0();
|
||||
}
|
||||
return;
|
||||
}
|
||||
gMain.state ++;
|
||||
}
|
||||
|
||||
void sub_811A858(void)
|
||||
{
|
||||
SetMainCallback2(sub_811A7E4);
|
||||
}
|
||||
|
||||
static int sub_811A868(u16 word)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(gUnknown_08597530); i ++)
|
||||
{
|
||||
if (word == gUnknown_08597530[i].word)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static bool32 sub_811A88C(u16 word)
|
||||
{
|
||||
return sub_811A868(word) == -1 ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
static void sub_811A8A4(u16 word)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = sub_811A868(word);
|
||||
ResetTasks();
|
||||
sub_811A4D0(gUnknown_08597530[i].callback);
|
||||
}
|
||||
|
||||
void sub_811A8CC(void)
|
||||
{
|
||||
sub_811A20C(0xF, &gSaveBlock1Ptr->lilycoveLady.quiz.unk_016, CB2_ReturnToFieldContinueScript, 3);
|
||||
}
|
||||
|
||||
void sub_811A8F0(void)
|
||||
{
|
||||
sub_811A20C(0x10, gSaveBlock1Ptr->lilycoveLady.quiz.unk_002, CB2_ReturnToFieldContinueScript, 3);
|
||||
}
|
||||
|
||||
void sub_811A914(void)
|
||||
{
|
||||
sub_811A20C(0x12, &gSaveBlock1Ptr->lilycoveLady.quiz.unk_014, CB2_ReturnToFieldContinueScript, 3);
|
||||
}
|
||||
|
||||
void sub_811A938(void)
|
||||
{
|
||||
sub_811A20C(0x11, gSaveBlock1Ptr->lilycoveLady.quiz.unk_002, CB2_ReturnToFieldContinueScript, 3);
|
||||
}
|
||||
|
||||
static bool8 EasyChat_AllocateResources(u8 kind, u16 *words, u8 sizeParam)
|
||||
{
|
||||
u8 r6;
|
||||
int i;
|
||||
|
||||
gUnknown_0203A118 = malloc(sizeof(*gUnknown_0203A118));
|
||||
if (gUnknown_0203A118 == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
gUnknown_0203A118->kind = kind;
|
||||
gUnknown_0203A118->words = words;
|
||||
gUnknown_0203A118->unk_05 = 0;
|
||||
gUnknown_0203A118->unk_06 = 0;
|
||||
gUnknown_0203A118->unk_09 = 0;
|
||||
gUnknown_0203A118->sizeParam = sizeParam;
|
||||
gUnknown_0203A118->unk_13 = 0;
|
||||
r6 = sub_811BCC8(kind);
|
||||
if (kind == 0x10)
|
||||
{
|
||||
sub_811BDF0(gUnknown_0203A118->unk_14);
|
||||
gUnknown_0203A118->src = gUnknown_0203A118->unk_14;
|
||||
gUnknown_0203A118->unk_04 = 7;
|
||||
}
|
||||
else
|
||||
{
|
||||
gUnknown_0203A118->unk_04 = 0;
|
||||
gUnknown_0203A118->src = gUnknown_08597550[r6].data;
|
||||
}
|
||||
gUnknown_0203A118->unk_02 = gUnknown_08597550[r6].unk_01;
|
||||
gUnknown_0203A118->unk_03 = gUnknown_08597550[r6].unk_02;
|
||||
gUnknown_0203A118->unk_07 = gUnknown_0203A118->unk_02 * gUnknown_0203A118->unk_03;
|
||||
gUnknown_0203A118->unk_01 = r6;
|
||||
if (gUnknown_0203A118->unk_07 > 9)
|
||||
{
|
||||
gUnknown_0203A118->unk_07 = 9;
|
||||
}
|
||||
if (words != NULL)
|
||||
{
|
||||
CpuCopy16(words, gUnknown_0203A118->ecWordBuffer, gUnknown_0203A118->unk_07 * sizeof(u16));
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < gUnknown_0203A118->unk_07; i ++)
|
||||
{
|
||||
gUnknown_0203A118->ecWordBuffer[i] = -1;
|
||||
}
|
||||
gUnknown_0203A118->words = gUnknown_0203A118->ecWordBuffer;
|
||||
}
|
||||
gUnknown_0203A118->unk_0d = (sub_811F3AC() - 1) / 2 + 1;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void EasyChat_FreeResources(void)
|
||||
{
|
||||
if (gUnknown_0203A118 != NULL)
|
||||
FREE_AND_SET_NULL(gUnknown_0203A118);
|
||||
}
|
||||
|
||||
static u16 sub_811AAAC(void)
|
||||
{
|
||||
switch (gUnknown_0203A118->unk_04)
|
||||
{
|
||||
case 0:
|
||||
return sub_811AB68();
|
||||
case 1:
|
||||
return sub_811ACDC();
|
||||
case 2:
|
||||
return sub_811AE44();
|
||||
case 3:
|
||||
return sub_811AF00();
|
||||
case 4:
|
||||
return sub_811AF8C();
|
||||
case 5:
|
||||
return sub_811B040();
|
||||
case 6:
|
||||
return sub_811AFEC();
|
||||
case 7:
|
||||
return sub_811B08C();
|
||||
case 8:
|
||||
return sub_811B0BC();
|
||||
case 9:
|
||||
return sub_811B0E8();
|
||||
case 10:
|
||||
return sub_811B0F8();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool32 sub_811AB44(void)
|
||||
{
|
||||
switch (sub_811BA68())
|
||||
{
|
||||
case 2:
|
||||
case 7:
|
||||
case 8:
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING
|
||||
static u16 sub_811AB68(void)
|
||||
{
|
||||
if (gMain.newKeys & A_BUTTON)
|
||||
{
|
||||
sub_811BF78();
|
||||
gUnknown_0203A118->unk_04 = 2;
|
||||
gUnknown_0203A118->unk_0a = 0;
|
||||
gUnknown_0203A118->unk_0b = 0;
|
||||
gUnknown_0203A118->unk_0c = 0;
|
||||
return 9;
|
||||
}
|
||||
else if (gMain.newKeys & B_BUTTON)
|
||||
{ // FIXME: See note below
|
||||
return sub_811B150();
|
||||
}
|
||||
else if (gMain.newKeys & START_BUTTON)
|
||||
{ // FIXME: See note below
|
||||
return sub_811B1B4();
|
||||
}
|
||||
else if (gMain.newKeys & DPAD_UP)
|
||||
{
|
||||
gUnknown_0203A118->unk_06--;
|
||||
}
|
||||
else if (gMain.newKeys & DPAD_LEFT)
|
||||
{ // FIXME: See note below
|
||||
gUnknown_0203A118->unk_05--;
|
||||
}
|
||||
else if (gMain.newKeys & DPAD_DOWN)
|
||||
{ // FIXME: See note below
|
||||
gUnknown_0203A118->unk_06++;
|
||||
}
|
||||
else if (gMain.newKeys & DPAD_RIGHT)
|
||||
{ // FIXME: See note below
|
||||
gUnknown_0203A118->unk_05++;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (gUnknown_0203A118->unk_06 < 0)
|
||||
{
|
||||
gUnknown_0203A118->unk_06 = gUnknown_08597550[gUnknown_0203A118->unk_01].unk_02;
|
||||
}
|
||||
if (gUnknown_0203A118->unk_06 > gUnknown_08597550[gUnknown_0203A118->unk_01].unk_02)
|
||||
{
|
||||
gUnknown_0203A118->unk_06 = 0;
|
||||
}
|
||||
if (gUnknown_0203A118->unk_06 == gUnknown_08597550[gUnknown_0203A118->unk_01].unk_02)
|
||||
{
|
||||
if (gUnknown_0203A118->unk_05 > 2)
|
||||
{
|
||||
gUnknown_0203A118->unk_05 = 2;
|
||||
}
|
||||
gUnknown_0203A118->unk_04 = 1;
|
||||
return 3;
|
||||
}
|
||||
/*
|
||||
* FIXME: right, down, left, b, and start
|
||||
* should be inserted here, but aren't
|
||||
*/
|
||||
if (gUnknown_0203A118->unk_05 < 0)
|
||||
{
|
||||
gUnknown_0203A118->unk_05 = gUnknown_08597550[gUnknown_0203A118->unk_01].unk_01 - 1;
|
||||
}
|
||||
if (gUnknown_0203A118->unk_05 >= gUnknown_08597550[gUnknown_0203A118->unk_01].unk_01)
|
||||
{
|
||||
gUnknown_0203A118->unk_05 = 0;
|
||||
}
|
||||
if (sub_811AB44() && gUnknown_0203A118->unk_05 == 1 && gUnknown_0203A118->unk_06 == 4)
|
||||
{
|
||||
gUnknown_0203A118->unk_05 = 0;
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
#else
|
||||
__attribute__((naked)) static u16 sub_811AB68(void)
|
||||
{
|
||||
asm_unified("\tpush {r4-r7,lr}\n"
|
||||
"\tldr r0, =gMain\n"
|
||||
"\tldrh r1, [r0, 0x2E]\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tands r0, r1\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbeq _0811ABB8\n"
|
||||
"\tbl sub_811BF78\n"
|
||||
"\tldr r1, =gUnknown_0203A118\n"
|
||||
"\tldr r3, [r1]\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tmovs r0, 0x2\n"
|
||||
"\tstrb r0, [r3, 0x4]\n"
|
||||
"\tldr r0, [r1]\n"
|
||||
"\tstrb r2, [r0, 0xA]\n"
|
||||
"\tldr r0, [r1]\n"
|
||||
"\tstrb r2, [r0, 0xB]\n"
|
||||
"\tldr r0, [r1]\n"
|
||||
"\tstrb r2, [r0, 0xC]\n"
|
||||
"\tmovs r0, 0x9\n"
|
||||
"\tb _0811ACCC_return_r0\n"
|
||||
"\t.pool\n"
|
||||
"_0811AB9C:\n"
|
||||
"\tmovs r0, 0x20\n"
|
||||
"\tands r0, r1\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0811AC68_dpad_left\n"
|
||||
"\tmovs r0, 0x80\n"
|
||||
"\tands r0, r1\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0811AC58_dpad_down\n"
|
||||
"\tmovs r0, 0x10\n"
|
||||
"\tands r0, r1\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0811AC48_dpad_right\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tb _0811ACCC_return_r0\n"
|
||||
"_0811ABB8:\n"
|
||||
"\tmovs r0, 0x2\n"
|
||||
"\tands r0, r1\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0811AC78_b_button\n"
|
||||
"\tmovs r0, 0x8\n"
|
||||
"\tands r0, r1\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0811AC7E_start_button\n"
|
||||
"\tmovs r0, 0x40\n"
|
||||
"\tands r0, r1\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbeq _0811AB9C\n"
|
||||
"\tldr r2, =gUnknown_0203A118\n"
|
||||
"\tldr r1, [r2]\n"
|
||||
"\tldrb r0, [r1, 0x6]\n"
|
||||
"\tsubs r0, 0x1\n"
|
||||
"_0811ABD8:\n"
|
||||
"\tstrb r0, [r1, 0x6]\n"
|
||||
"_0811ABDA:\n"
|
||||
"\tadds r7, r2, 0\n"
|
||||
"\tadds r4, r7, 0\n"
|
||||
"\tldr r2, [r4]\n"
|
||||
"\tmovs r0, 0x6\n"
|
||||
"\tldrsb r0, [r2, r0]\n"
|
||||
"\tldr r6, =gUnknown_08597550\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbge _0811ABF8\n"
|
||||
"\tldrb r0, [r2, 0x1]\n"
|
||||
"\tlsls r1, r0, 1\n"
|
||||
"\tadds r1, r0\n"
|
||||
"\tlsls r1, 3\n"
|
||||
"\tadds r1, r6\n"
|
||||
"\tldrb r0, [r1, 0x2]\n"
|
||||
"\tstrb r0, [r2, 0x6]\n"
|
||||
"_0811ABF8:\n"
|
||||
"\tldr r3, [r4]\n"
|
||||
"\tmovs r2, 0x6\n"
|
||||
"\tldrsb r2, [r3, r2]\n"
|
||||
"\tadds r5, r6, 0\n"
|
||||
"\tldrb r1, [r3, 0x1]\n"
|
||||
"\tlsls r0, r1, 1\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tlsls r0, 3\n"
|
||||
"\tadds r0, r5\n"
|
||||
"\tldrb r0, [r0, 0x2]\n"
|
||||
"\tcmp r2, r0\n"
|
||||
"\tble _0811AC14\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tstrb r0, [r3, 0x6]\n"
|
||||
"_0811AC14:\n"
|
||||
"\tldr r3, [r4]\n"
|
||||
"\tmovs r2, 0x6\n"
|
||||
"\tldrsb r2, [r3, r2]\n"
|
||||
"\tldrb r1, [r3, 0x1]\n"
|
||||
"\tlsls r0, r1, 1\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tlsls r0, 3\n"
|
||||
"\tadds r1, r0, r5\n"
|
||||
"\tldrb r0, [r1, 0x2]\n"
|
||||
"\tcmp r2, r0\n"
|
||||
"\tbne _0811AC88\n"
|
||||
"\tmovs r0, 0x5\n"
|
||||
"\tldrsb r0, [r3, r0]\n"
|
||||
"\tcmp r0, 0x2\n"
|
||||
"\tble _0811AC36\n"
|
||||
"\tmovs r0, 0x2\n"
|
||||
"\tstrb r0, [r3, 0x5]\n"
|
||||
"_0811AC36:\n"
|
||||
"\tldr r1, [r4]\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tstrb r0, [r1, 0x4]\n"
|
||||
"\tmovs r0, 0x3\n"
|
||||
"\tb _0811ACCC_return_r0\n"
|
||||
"\t.pool\n"
|
||||
"_0811AC48_dpad_right:\n"
|
||||
"\tldr r2, =gUnknown_0203A118\n"
|
||||
"\tldr r1, [r2]\n"
|
||||
"\tldrb r0, [r1, 0x5]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tstrb r0, [r1, 0x5]\n"
|
||||
"\tb _0811ABDA\n"
|
||||
"\t.pool\n"
|
||||
"_0811AC58_dpad_down:\n"
|
||||
"\tldr r2, =gUnknown_0203A118\n"
|
||||
"\tldr r1, [r2]\n"
|
||||
"\tldrb r0, [r1, 0x6]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tb _0811ABD8\n"
|
||||
"\t.pool\n"
|
||||
"_0811AC68_dpad_left:\n"
|
||||
"\tldr r2, =gUnknown_0203A118\n"
|
||||
"\tldr r1, [r2]\n"
|
||||
"\tldrb r0, [r1, 0x5]\n"
|
||||
"\tsubs r0, 0x1\n"
|
||||
"\tstrb r0, [r1, 0x5]\n"
|
||||
"\tb _0811ABDA\n"
|
||||
"\t.pool\n"
|
||||
"_0811AC78_b_button:\n"
|
||||
"\tbl sub_811B150\n"
|
||||
"\tb _0811AC82\n"
|
||||
"_0811AC7E_start_button:\n"
|
||||
"\tbl sub_811B1B4\n"
|
||||
"_0811AC82:\n"
|
||||
"\tlsls r0, 16\n"
|
||||
"\tlsrs r0, 16\n"
|
||||
"\tb _0811ACCC_return_r0\n"
|
||||
"_0811AC88:\n"
|
||||
"\tmovs r0, 0x5\n"
|
||||
"\tldrsb r0, [r3, r0]\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbge _0811AC96\n"
|
||||
"\tldrb r0, [r1, 0x1]\n"
|
||||
"\tsubs r0, 0x1\n"
|
||||
"\tstrb r0, [r3, 0x5]\n"
|
||||
"_0811AC96:\n"
|
||||
"\tldr r3, [r4]\n"
|
||||
"\tmovs r2, 0x5\n"
|
||||
"\tldrsb r2, [r3, r2]\n"
|
||||
"\tldrb r1, [r3, 0x1]\n"
|
||||
"\tlsls r0, r1, 1\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tlsls r0, 3\n"
|
||||
"\tadds r0, r6\n"
|
||||
"\tldrb r0, [r0, 0x1]\n"
|
||||
"\tcmp r2, r0\n"
|
||||
"\tblt _0811ACB0\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tstrb r0, [r3, 0x5]\n"
|
||||
"_0811ACB0:\n"
|
||||
"\tbl sub_811AB44\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbeq _0811ACCA\n"
|
||||
"\tldr r2, [r7]\n"
|
||||
"\tldr r0, [r2, 0x4]\n"
|
||||
"\tldr r1, =0x00ffff00\n"
|
||||
"\tands r0, r1\n"
|
||||
"\tldr r1, =0x00040100\n"
|
||||
"\tcmp r0, r1\n"
|
||||
"\tbne _0811ACCA\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tstrb r0, [r2, 0x5]\n"
|
||||
"_0811ACCA:\n"
|
||||
"\tmovs r0, 0x2\n"
|
||||
"_0811ACCC_return_r0:\n"
|
||||
"\tpop {r4-r7}\n"
|
||||
"\tpop {r1}\n"
|
||||
"\tbx r1\n"
|
||||
"\t.pool");
|
||||
}
|
||||
#endif
|
||||
581
src/field_player_avatar.c
Normal file
581
src/field_player_avatar.c
Normal file
@@ -0,0 +1,581 @@
|
||||
#include "global.h"
|
||||
#include "global.fieldmap.h"
|
||||
#include "sprite.h"
|
||||
#include "event_object_movement.h"
|
||||
#include "bike.h"
|
||||
#include "metatile_behavior.h"
|
||||
#include "metatile_behaviors.h"
|
||||
#include "constants/flags.h"
|
||||
#include "event_data.h"
|
||||
#include "fieldmap.h"
|
||||
#include "overworld.h"
|
||||
#include "rotating_gate.h"
|
||||
#include "constants/event_object_movement_constants.h"
|
||||
#include "field_player_avatar.h"
|
||||
|
||||
extern void task_add_bump_boulder(u8, u8);
|
||||
static bool8 ShouldJumpLedge(s16, s16, u8);
|
||||
static bool8 sub_808B1BC(s16, s16, u8);
|
||||
static u8 sub_808B164(struct EventObject *, s16, s16, u8, u8);
|
||||
static u8 sub_808B238(s16, s16, u8);
|
||||
static void check_acro_bike_metatile(s16, s16, u8, u8 *);
|
||||
extern void PlayerNotOnBikeCollide(u8);
|
||||
extern void PlayerNotOnBikeCollideWithFarawayIslandMew(u8);
|
||||
extern void PlayerRun(u8);
|
||||
static void MovePlayerNotOnBike(u8, u16);
|
||||
static u8 CheckMovementInputNotOnBike(u8);
|
||||
extern void sub_808C5B0(void);
|
||||
extern void sub_808C4D8(void);
|
||||
static u8 CheckForPlayerAvatarCollision(u8);
|
||||
static u8 EventObjectCB2_NoMovement2();
|
||||
extern void sub_808C280(struct EventObject *);
|
||||
static bool8 TryInterruptEventObjectSpecialAnim(struct EventObject *, u8);
|
||||
void npc_clear_strange_bits(struct EventObject *);
|
||||
extern void DoPlayerAvatarTransition(void);
|
||||
static bool8 TryDoMetatileBehaviorForcedMovement();
|
||||
static void MovePlayerAvatarUsingKeypadInput(u8, u16, u16);
|
||||
static void PlayerAllowForcedMovementIfMovingSameDirection();
|
||||
static u8 sub_808B028(u8);
|
||||
static u8 GetForcedMovementByMetatileBehavior();
|
||||
static void PlayerNotOnBikeNotMoving(u8, u16);
|
||||
static void PlayerNotOnBikeTurningInPlace(u8, u16);
|
||||
static void PlayerNotOnBikeMoving(u8, u16);
|
||||
extern void sub_808C750(u8);
|
||||
|
||||
static bool8 (*const gUnknown_084973FC[])(u8) =
|
||||
{
|
||||
MetatileBehavior_IsTrickHouseSlipperyFloor,
|
||||
MetatileBehavior_IsIce_2,
|
||||
MetatileBehavior_IsWalkSouth,
|
||||
MetatileBehavior_IsWalkNorth,
|
||||
MetatileBehavior_IsWalkWest,
|
||||
MetatileBehavior_IsWalkEast,
|
||||
MetatileBehavior_IsSouthwardCurrent,
|
||||
MetatileBehavior_IsNorthwardCurrent,
|
||||
MetatileBehavior_IsWestwardCurrent,
|
||||
MetatileBehavior_IsEastwardCurrent,
|
||||
MetatileBehavior_IsSlideSouth,
|
||||
MetatileBehavior_IsSlideNorth,
|
||||
MetatileBehavior_IsSlideWest,
|
||||
MetatileBehavior_IsSlideEast,
|
||||
MetatileBehavior_IsWaterfall,
|
||||
MetatileBehavior_IsSecretBaseJumpMat,
|
||||
MetatileBehavior_IsSecretBaseSpinMat,
|
||||
MetatileBehavior_IsMuddySlope,
|
||||
};
|
||||
|
||||
static bool8 (*const gUnknown_08497444[])(void) =
|
||||
{
|
||||
ForcedMovement_None,
|
||||
ForcedMovement_Slip,
|
||||
ForcedMovement_Slip,
|
||||
ForcedMovement_WalkSouth,
|
||||
ForcedMovement_WalkNorth,
|
||||
ForcedMovement_WalkWest,
|
||||
ForcedMovement_WalkEast,
|
||||
ForcedMovement_PushedSouthByCurrent,
|
||||
ForcedMovement_PushedNorthByCurrent,
|
||||
ForcedMovement_PushedWestByCurrent,
|
||||
ForcedMovement_PushedEastByCurrent,
|
||||
ForcedMovement_SlideSouth,
|
||||
ForcedMovement_SlideNorth,
|
||||
ForcedMovement_SlideWest,
|
||||
ForcedMovement_SlideEast,
|
||||
ForcedMovement_PushedSouthByCurrent,
|
||||
ForcedMovement_0xBB,
|
||||
ForcedMovement_0xBC,
|
||||
ForcedMovement_MuddySlope,
|
||||
};
|
||||
|
||||
static void (*const gUnknown_08497490[])(u8, u16) =
|
||||
{
|
||||
PlayerNotOnBikeNotMoving,
|
||||
PlayerNotOnBikeTurningInPlace,
|
||||
PlayerNotOnBikeMoving,
|
||||
};
|
||||
|
||||
static bool8 (*const gUnknown_0849749C[])(u8) =
|
||||
{
|
||||
MetatileBehavior_IsBumpySlope,
|
||||
MetatileBehavior_IsIsolatedVerticalRail,
|
||||
MetatileBehavior_IsIsolatedHorizontalRail,
|
||||
MetatileBehavior_IsVerticalRail,
|
||||
MetatileBehavior_IsHorizontalRail,
|
||||
};
|
||||
|
||||
static const u8 gUnknown_084974B0[] = {9, 10, 11, 12, 13, 0, 0, 0};
|
||||
|
||||
void MovementType_Player(struct Sprite *sprite)
|
||||
{
|
||||
UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, EventObjectCB2_NoMovement2);
|
||||
}
|
||||
|
||||
static u8 EventObjectCB2_NoMovement2()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void player_step(u8 direction, u16 newKeys, u16 heldKeys)
|
||||
{
|
||||
struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
|
||||
|
||||
sub_808C280(playerEventObj);
|
||||
if (gPlayerAvatar.preventStep == FALSE)
|
||||
{
|
||||
Bike_TryAcroBikeHistoryUpdate(newKeys, heldKeys);
|
||||
if (TryInterruptEventObjectSpecialAnim(playerEventObj, direction) == 0)
|
||||
{
|
||||
npc_clear_strange_bits(playerEventObj);
|
||||
DoPlayerAvatarTransition();
|
||||
if (TryDoMetatileBehaviorForcedMovement() == 0)
|
||||
{
|
||||
MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys);
|
||||
PlayerAllowForcedMovementIfMovingSameDirection();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool8 TryInterruptEventObjectSpecialAnim(struct EventObject *playerEventObj, u8 direction)
|
||||
{
|
||||
#ifdef NONMATCHING
|
||||
u8 r5 = direction;
|
||||
u8 r6 = direction;
|
||||
#else
|
||||
u8 r5 = direction;
|
||||
register u8 r6 asm("r6") = direction;
|
||||
#endif
|
||||
//a very bad HACK
|
||||
|
||||
if (EventObjectIsMovementOverridden(playerEventObj)
|
||||
&& !EventObjectClearHeldMovementIfFinished(playerEventObj))
|
||||
{
|
||||
u8 heldMovementActionId = EventObjectGetHeldMovementActionId(playerEventObj);
|
||||
if (heldMovementActionId > MOVEMENT_ACTION_WALK_FAST_RIGHT && heldMovementActionId < MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN)
|
||||
{
|
||||
if (direction == DIR_NONE)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (playerEventObj->movementDirection != r5)
|
||||
{
|
||||
EventObjectClearHeldMovement(playerEventObj);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!sub_808B028(r6))
|
||||
{
|
||||
EventObjectClearHeldMovement(playerEventObj);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void npc_clear_strange_bits(struct EventObject *eventObj)
|
||||
{
|
||||
eventObj->inanimate = 0;
|
||||
eventObj->disableAnim = 0;
|
||||
eventObj->facingDirectionLocked = 0;
|
||||
gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_DASH;
|
||||
}
|
||||
|
||||
static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys)
|
||||
{
|
||||
if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE)
|
||||
|| (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE))
|
||||
MovePlayerOnBike(direction, newKeys, heldKeys);
|
||||
else
|
||||
MovePlayerNotOnBike(direction, heldKeys);
|
||||
}
|
||||
|
||||
static void PlayerAllowForcedMovementIfMovingSameDirection(void)
|
||||
{
|
||||
if (gPlayerAvatar.runningState == MOVING)
|
||||
gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5;
|
||||
}
|
||||
|
||||
static bool8 TryDoMetatileBehaviorForcedMovement()
|
||||
{
|
||||
return gUnknown_08497444[GetForcedMovementByMetatileBehavior()]();
|
||||
}
|
||||
|
||||
static u8 GetForcedMovementByMetatileBehavior(void)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_5))
|
||||
{
|
||||
u8 metatileBehavior = gEventObjects[gPlayerAvatar.eventObjectId].currentMetatileBehavior;
|
||||
|
||||
for (i = 0; i < 18; i++)
|
||||
{
|
||||
if (gUnknown_084973FC[i](metatileBehavior))
|
||||
return i + 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_None(void)
|
||||
{
|
||||
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_6)
|
||||
{
|
||||
struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
|
||||
|
||||
playerEventObj->facingDirectionLocked = 0;
|
||||
playerEventObj->enableAnim = 1;
|
||||
SetEventObjectDirection(playerEventObj, playerEventObj->facingDirection);
|
||||
gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_6;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static u8 DoForcedMovement(u8 direction, void (*b)(u8))
|
||||
{
|
||||
struct PlayerAvatar *playerAvatar = &gPlayerAvatar;
|
||||
u8 collisionType = CheckForPlayerAvatarCollision(direction);
|
||||
|
||||
playerAvatar->flags |= PLAYER_AVATAR_FLAG_6;
|
||||
if (collisionType != 0)
|
||||
{
|
||||
ForcedMovement_None();
|
||||
if (collisionType <= 4)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (collisionType == COLLISION_LEDGE_JUMP)
|
||||
PlayerJumpLedge(direction);
|
||||
playerAvatar->flags |= PLAYER_AVATAR_FLAG_6;
|
||||
playerAvatar->runningState = MOVING;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
playerAvatar->runningState = MOVING;
|
||||
b(direction);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
u8 DoForcedMovementInCurrentDirection(void (*a)(u8))
|
||||
{
|
||||
struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
|
||||
|
||||
playerEventObj->disableAnim = 1;
|
||||
return DoForcedMovement(playerEventObj->movementDirection, a);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_Slip(void)
|
||||
{
|
||||
return DoForcedMovementInCurrentDirection(PlayerGoSpeed2);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_WalkSouth(void)
|
||||
{
|
||||
return DoForcedMovement(DIR_SOUTH, PlayerGoSpeed1);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_WalkNorth(void)
|
||||
{
|
||||
return DoForcedMovement(DIR_NORTH, PlayerGoSpeed1);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_WalkWest(void)
|
||||
{
|
||||
return DoForcedMovement(DIR_WEST, PlayerGoSpeed1);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_WalkEast(void)
|
||||
{
|
||||
return DoForcedMovement(DIR_EAST, PlayerGoSpeed1);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_PushedSouthByCurrent(void)
|
||||
{
|
||||
return DoForcedMovement(DIR_SOUTH, PlayerGoSpeed3);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_PushedNorthByCurrent(void)
|
||||
{
|
||||
return DoForcedMovement(DIR_NORTH, PlayerGoSpeed3);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_PushedWestByCurrent(void)
|
||||
{
|
||||
return DoForcedMovement(DIR_WEST, PlayerGoSpeed3);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_PushedEastByCurrent(void)
|
||||
{
|
||||
return DoForcedMovement(DIR_EAST, PlayerGoSpeed3);
|
||||
}
|
||||
|
||||
u8 ForcedMovement_Slide(u8 direction, void (*b)(u8))
|
||||
{
|
||||
struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
|
||||
|
||||
playerEventObj->disableAnim = 1;
|
||||
playerEventObj->facingDirectionLocked = 1;
|
||||
return DoForcedMovement(direction, b);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_SlideSouth(void)
|
||||
{
|
||||
return ForcedMovement_Slide(DIR_SOUTH, PlayerGoSpeed2);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_SlideNorth(void)
|
||||
{
|
||||
return ForcedMovement_Slide(DIR_NORTH, PlayerGoSpeed2);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_SlideWest(void)
|
||||
{
|
||||
return ForcedMovement_Slide(DIR_WEST, PlayerGoSpeed2);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_SlideEast(void)
|
||||
{
|
||||
return ForcedMovement_Slide(DIR_EAST, PlayerGoSpeed2);
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_0xBB(void)
|
||||
{
|
||||
sub_808C4D8();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_0xBC(void)
|
||||
{
|
||||
sub_808C5B0();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 ForcedMovement_MuddySlope(void)
|
||||
{
|
||||
struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
|
||||
|
||||
if (playerEventObj->movementDirection != DIR_NORTH || GetPlayerSpeed() <= 3)
|
||||
{
|
||||
Bike_UpdateBikeCounterSpeed(0);
|
||||
playerEventObj->facingDirectionLocked = 1;
|
||||
return DoForcedMovement(1, PlayerGoSpeed2);
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void MovePlayerNotOnBike(u8 direction, u16 heldKeys)
|
||||
{
|
||||
gUnknown_08497490[CheckMovementInputNotOnBike(direction)](direction, heldKeys);
|
||||
}
|
||||
|
||||
static u8 CheckMovementInputNotOnBike(u8 direction)
|
||||
{
|
||||
if (direction == DIR_NONE)
|
||||
{
|
||||
gPlayerAvatar.runningState = NOT_MOVING;
|
||||
return 0;
|
||||
}
|
||||
else if (direction != GetPlayerMovementDirection() && gPlayerAvatar.runningState != MOVING)
|
||||
{
|
||||
gPlayerAvatar.runningState = TURN_DIRECTION;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
gPlayerAvatar.runningState = MOVING;
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
static void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys)
|
||||
{
|
||||
PlayerFaceDirection(GetPlayerFacingDirection());
|
||||
}
|
||||
|
||||
static void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys)
|
||||
{
|
||||
PlayerTurnInPlace(direction);
|
||||
}
|
||||
|
||||
static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys)
|
||||
{
|
||||
u8 r0 = CheckForPlayerAvatarCollision(direction);
|
||||
|
||||
if (r0 != 0)
|
||||
{
|
||||
if (r0 == 6)
|
||||
{
|
||||
PlayerJumpLedge(direction);
|
||||
return;
|
||||
}
|
||||
else if (r0 == 4 && IsPlayerCollidingWithFarawayIslandMew(direction) != 0)
|
||||
{
|
||||
PlayerNotOnBikeCollideWithFarawayIslandMew(direction);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
u8 r4 = r0 - 5;
|
||||
|
||||
if (r4 > 3)
|
||||
{
|
||||
PlayerNotOnBikeCollide(direction);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
|
||||
{
|
||||
// speed 2 is fast, same speed as running
|
||||
PlayerGoSpeed2(direction);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_4) && (heldKeys & B_BUTTON) && FlagGet(FLAG_SYS_B_DASH)
|
||||
&& IsRunningDisallowed(gEventObjects[gPlayerAvatar.eventObjectId].currentMetatileBehavior) == 0)
|
||||
{
|
||||
PlayerRun(direction);
|
||||
gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayerGoSpeed1(direction);
|
||||
}
|
||||
}
|
||||
|
||||
static u8 CheckForPlayerAvatarCollision(u8 direction)
|
||||
{
|
||||
s16 x, y;
|
||||
struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
|
||||
|
||||
x = playerEventObj->currentCoords.x;
|
||||
y = playerEventObj->currentCoords.y;
|
||||
MoveCoords(direction, &x, &y);
|
||||
return CheckForEventObjectCollision(playerEventObj, x, y, direction, MapGridGetMetatileBehaviorAt(x, y));
|
||||
}
|
||||
|
||||
static u8 sub_808B028(u8 direction)
|
||||
{
|
||||
s16 x, y;
|
||||
struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
|
||||
|
||||
x = playerEventObj->currentCoords.x;
|
||||
y = playerEventObj->currentCoords.y;
|
||||
MoveCoords(direction, &x, &y);
|
||||
return sub_808B164(playerEventObj, x, y, direction, MapGridGetMetatileBehaviorAt(x, y));
|
||||
}
|
||||
|
||||
u8 CheckForEventObjectCollision(struct EventObject *a, s16 x, s16 y, u8 direction, u8 e)
|
||||
{
|
||||
u8 collision;
|
||||
|
||||
collision = GetCollisionAtCoords(a, x, y, direction);
|
||||
if (collision == 3 && sub_808B1BC(x, y, direction))
|
||||
return 5;
|
||||
if (ShouldJumpLedge(x, y, direction))
|
||||
{
|
||||
IncrementGameStat(GAME_STAT_JUMPED_DOWN_LEDGES);
|
||||
return COLLISION_LEDGE_JUMP;
|
||||
}
|
||||
if (collision == 4 && sub_808B238(x, y, direction))
|
||||
return 7;
|
||||
|
||||
if (collision == 0)
|
||||
{
|
||||
if (CheckForRotatingGatePuzzleCollision(direction, x, y))
|
||||
return 8;
|
||||
check_acro_bike_metatile(x, y, e, &collision);
|
||||
}
|
||||
return collision;
|
||||
}
|
||||
|
||||
static u8 sub_808B164(struct EventObject *a, s16 x, s16 y, u8 direction, u8 e)
|
||||
{
|
||||
u8 collision = GetCollisionAtCoords(a, x, y, direction);
|
||||
|
||||
if (collision == 0)
|
||||
{
|
||||
if (CheckForRotatingGatePuzzleCollisionWithoutAnimation(direction, x, y) != 0)
|
||||
return 8;
|
||||
check_acro_bike_metatile(x, y, e, &collision);
|
||||
}
|
||||
return collision;
|
||||
}
|
||||
|
||||
static bool8 sub_808B1BC(s16 x, s16 y, u8 direction)
|
||||
{
|
||||
if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
|
||||
&& MapGridGetZCoordAt(x, y) == 3
|
||||
&& GetEventObjectIdByXYZ(x, y, 3) == 16)
|
||||
{
|
||||
sub_808C750(direction);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static bool8 ShouldJumpLedge(s16 x, s16 y, u8 z)
|
||||
{
|
||||
if (GetLedgeJumpDirection(x, y, z) != 0)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static u8 sub_808B238(s16 x, s16 y, u8 direction)
|
||||
{
|
||||
if (FlagGet(FLAG_SYS_USE_STRENGTH))
|
||||
{
|
||||
u8 eventObjectId = GetEventObjectIdByXY(x, y);
|
||||
|
||||
if (eventObjectId != 16 && gEventObjects[eventObjectId].graphicsId == 0x57)
|
||||
{
|
||||
x = gEventObjects[eventObjectId].currentCoords.x;
|
||||
y = gEventObjects[eventObjectId].currentCoords.y;
|
||||
MoveCoords(direction, &x, &y);
|
||||
if (GetCollisionAtCoords(&gEventObjects[eventObjectId], x, y, direction) == 0
|
||||
&& MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(x, y)) == 0)
|
||||
{
|
||||
task_add_bump_boulder(eventObjectId, direction);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void check_acro_bike_metatile(s16 unused1, s16 unused2, u8 c, u8 *d)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
if (gUnknown_0849749C[i](c))
|
||||
{
|
||||
*d = gUnknown_084974B0[i];
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,17 +7,49 @@
|
||||
#include "text.h"
|
||||
#include "strings.h"
|
||||
#include "window.h"
|
||||
#include "menu.h"
|
||||
#include "bg.h"
|
||||
#include "main.h"
|
||||
#include "palette.h"
|
||||
#include "overworld.h"
|
||||
#include "field_screen.h"
|
||||
#include "field_weather.h"
|
||||
#include "script.h"
|
||||
#include "international_string_util.h"
|
||||
#include "walda_phrase.h"
|
||||
#include "sound.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
IWRAM_DATA u8 gUnknown_03000F78[0x188];
|
||||
|
||||
struct OptionAndDescription
|
||||
{
|
||||
const u8 *optionTxt;
|
||||
const u8 *descriptionTxt;
|
||||
};
|
||||
extern const u8 gText_PartyFull[];
|
||||
extern const u8 gText_Box[];
|
||||
extern const u8 gText_JustOnePkmn[];
|
||||
|
||||
extern u8 gUnknown_02039D00;
|
||||
|
||||
// This file's functions.
|
||||
void StorageSystemCreatePrimaryMenu(u8 whichMenu, s16 *windowIdPtr);
|
||||
void sub_80C7D74(u8);
|
||||
u8 sub_80CAEA0(void);
|
||||
void SetBoxWallpaper(u8 boxId, u8 wallpaperId);
|
||||
void SetCurrentBox(u8 boxId);
|
||||
void ClearMonInBox(u8 boxId, u8 boxPos);
|
||||
void ResetWaldaWallpaper(void);
|
||||
void sub_80C7958(u8 curBox);
|
||||
void sub_80C7B14(void);
|
||||
void sub_80C7BB4(void);
|
||||
void sub_80CA028(void);
|
||||
void sub_80C7B80(void);
|
||||
void sub_80D2AA4(void);
|
||||
void sub_80C7BE4(void);
|
||||
void sub_80CAA14(void);
|
||||
void sub_80C7CF4(struct Sprite *sprite);
|
||||
struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority);
|
||||
|
||||
// const rom data
|
||||
const struct OptionAndDescription gUnknown_085716C0[] =
|
||||
const struct PSS_MenuStringPtrs gUnknown_085716C0[] =
|
||||
{
|
||||
{gText_WithdrawPokemon, gText_WithdrawMonDescription},
|
||||
{gText_DepositPokemon, gText_DepositMonDescription},
|
||||
@@ -74,6 +106,10 @@ static const union AffineAnimCmd *const sSpriteAffineAnimTable_8571730[] =
|
||||
const u8 gUnknown_08571734[] = {4, 0xF, 0xE};
|
||||
const u8 gUnknown_08571737[] = _("/30");
|
||||
|
||||
const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/unknown/unknown_57173C.gbapal");
|
||||
const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp");
|
||||
const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp");
|
||||
|
||||
// code
|
||||
u8 CountMonsInBox(u8 boxId)
|
||||
{
|
||||
@@ -166,24 +202,473 @@ static u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n)
|
||||
return str;
|
||||
}
|
||||
|
||||
/* can't match
|
||||
static void sub_80C7128(u16 *dst, u16 dstToAdd, u16 dstToMul, const u16 *src, u16 srcToAdd, u16 srcToMul, u32 size, u16 count, u16 srcBy)
|
||||
static void sub_80C7128(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
size <<= 0x11;
|
||||
dst += (dstToMul * 32) + dstToAdd;
|
||||
src += (srcToMul * srcBy) + srcToAdd;
|
||||
|
||||
i = 0;
|
||||
if (i < count)
|
||||
dest_width *= 2;
|
||||
dest += dest_top * 0x20 + dest_left;
|
||||
src += src_top * src_width + src_left;
|
||||
for (i = 0; i < dest_height; i++)
|
||||
{
|
||||
size >>= 1;
|
||||
for (i = 0; i < count; i++)
|
||||
CpuCopy16(src, dest, dest_width);
|
||||
dest += 0x20;
|
||||
src += src_width;
|
||||
}
|
||||
}
|
||||
|
||||
#define MAX_DMA_BLOCK_SIZE 0x1000
|
||||
#define Dma3FillLarge_(value, dest, size, bit) \
|
||||
{ \
|
||||
void *_dest = dest; \
|
||||
u32 _size = size; \
|
||||
while (1) \
|
||||
{ \
|
||||
if (_size <= MAX_DMA_BLOCK_SIZE) \
|
||||
{ \
|
||||
DmaFill##bit(3, value, _dest, _size); \
|
||||
break; \
|
||||
} \
|
||||
DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
|
||||
_dest += MAX_DMA_BLOCK_SIZE; \
|
||||
_size -= MAX_DMA_BLOCK_SIZE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
|
||||
#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
|
||||
|
||||
void sub_80C71A4(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
dest += dest_top * 0x20 + dest_left;
|
||||
width *= 2;
|
||||
for (i = 0; i < height; dest += 0x20, i++)
|
||||
Dma3FillLarge16_(0, dest, width);
|
||||
}
|
||||
|
||||
void Task_PokemonStorageSystem(u8 taskId)
|
||||
{
|
||||
struct Task *task = gTasks + taskId;
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
StorageSystemCreatePrimaryMenu(task->data[1], &task->data[15]);
|
||||
sub_81973A4();
|
||||
NewMenuHelpers_DrawDialogueFrame(0, 0);
|
||||
FillWindowPixelBuffer(0, 0x11);
|
||||
AddTextPrinterParameterized(0, 1, gUnknown_085716C0[task->data[1]].desc, TEXT_SPEED_FF, NULL, 2, 1, 3);
|
||||
CopyWindowToVram(0, 3);
|
||||
CopyWindowToVram(task->data[15], 3);
|
||||
task->data[0]++;
|
||||
break;
|
||||
case 1:
|
||||
if (IsWeatherNotFadingIn())
|
||||
{
|
||||
CpuSet(src, dst, size >> 0x10);
|
||||
dst += 0x20;
|
||||
src += srcBy;
|
||||
task->data[0]++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
task->data[2] = ProcessMenuInput();
|
||||
switch(task->data[2])
|
||||
{
|
||||
case -2:
|
||||
task->data[3] = task->data[1];
|
||||
if (gMain.newKeys & DPAD_UP && --task->data[3] < 0)
|
||||
task->data[3] = 4;
|
||||
|
||||
if (gMain.newKeys & DPAD_DOWN && ++task->data[3] > 4)
|
||||
task->data[3] = 0;
|
||||
if (task->data[1] != task->data[3])
|
||||
{
|
||||
task->data[1] = task->data[3];
|
||||
FillWindowPixelBuffer(0, 0x11);
|
||||
AddTextPrinterParameterized(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3);
|
||||
}
|
||||
break;
|
||||
case -1:
|
||||
case 4:
|
||||
sub_819746C(task->data[15], TRUE);
|
||||
ScriptContext2_Disable();
|
||||
EnableBothScriptContexts();
|
||||
RemoveWindow(task->data[15]);
|
||||
DestroyTask(taskId);
|
||||
break;
|
||||
default:
|
||||
if (task->data[2] == 0 && CountPartyMons() == PARTY_SIZE)
|
||||
{
|
||||
FillWindowPixelBuffer(0, 0x11);
|
||||
AddTextPrinterParameterized(0, 1, gText_PartyFull, 0, NULL, 2, 1, 3);
|
||||
task->data[0] = 3;
|
||||
}
|
||||
else if (task->data[2] == 1 && CountPartyMons() == 1)
|
||||
{
|
||||
FillWindowPixelBuffer(0, 0x11);
|
||||
AddTextPrinterParameterized(0, 1, gText_JustOnePkmn, 0, NULL, 2, 1, 3);
|
||||
task->data[0] = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
FadeScreen(1, 0);
|
||||
task->data[0] = 4;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
|
||||
{
|
||||
FillWindowPixelBuffer(0, 0x11);
|
||||
AddTextPrinterParameterized(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3);
|
||||
task->data[0] = 2;
|
||||
}
|
||||
else if (gMain.newKeys & DPAD_UP)
|
||||
{
|
||||
if (--task->data[1] < 0)
|
||||
task->data[1] = 4;
|
||||
MoveMenuCursor(-1);
|
||||
task->data[1] = GetMenuCursorPos();
|
||||
FillWindowPixelBuffer(0, 0x11);
|
||||
AddTextPrinterParameterized(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3);
|
||||
task->data[0] = 2;
|
||||
}
|
||||
else if (gMain.newKeys & DPAD_DOWN)
|
||||
{
|
||||
if (++task->data[1] > 3)
|
||||
task->data[1] = 0;
|
||||
MoveMenuCursor(1);
|
||||
task->data[1] = GetMenuCursorPos();
|
||||
FillWindowPixelBuffer(0, 0x11);
|
||||
AddTextPrinterParameterized(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3);
|
||||
task->data[0] = 2;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
overworld_free_bg_tilemaps();
|
||||
sub_80C7D74(task->data[2]);
|
||||
RemoveWindow(task->data[15]);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ShowPokemonStorageSystem(void)
|
||||
{
|
||||
u8 taskId = CreateTask(Task_PokemonStorageSystem, 80);
|
||||
gTasks[taskId].data[0] = 0;
|
||||
gTasks[taskId].data[1] = 0;
|
||||
ScriptContext2_Enable();
|
||||
}
|
||||
|
||||
void mapldr_0808C6D8(void)
|
||||
{
|
||||
u8 taskId;
|
||||
MainCallback vblankCb = gMain.vblankCallback;
|
||||
|
||||
SetVBlankCallback(NULL);
|
||||
taskId = CreateTask(Task_PokemonStorageSystem, 80);
|
||||
gTasks[taskId].data[0] = 0;
|
||||
gTasks[taskId].data[1] = gUnknown_02039D00;
|
||||
Task_PokemonStorageSystem(taskId);
|
||||
SetVBlankCallback(vblankCb);
|
||||
pal_fill_black();
|
||||
}
|
||||
|
||||
void StorageSystemCreatePrimaryMenu(u8 whichMenu, s16 *windowIdPtr)
|
||||
{
|
||||
s16 windowId;
|
||||
struct WindowTemplate winTemplate = gUnknown_085716E8;
|
||||
winTemplate.width = GetMaxWidthInMenuTable((void *)gUnknown_085716C0, ARRAY_COUNT(gUnknown_085716C0));
|
||||
windowId = AddWindow(&winTemplate);
|
||||
|
||||
NewMenuHelpers_DrawStdWindowFrame(windowId, FALSE);
|
||||
PrintMenuTable(windowId, ARRAY_COUNT(gUnknown_085716C0), (void *)gUnknown_085716C0);
|
||||
InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, ARRAY_COUNT(gUnknown_085716C0), whichMenu);
|
||||
*windowIdPtr = windowId;
|
||||
}
|
||||
|
||||
void sub_80C7678(void)
|
||||
{
|
||||
gUnknown_02039D00 = sub_80CAEA0();
|
||||
gFieldCallback = mapldr_0808C6D8;
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
}
|
||||
|
||||
s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode)
|
||||
{
|
||||
s16 i;
|
||||
s16 direction;
|
||||
if (mode == 0 || mode == 1)
|
||||
{
|
||||
direction = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
direction = -1;
|
||||
}
|
||||
if (mode == 1 || mode == 3)
|
||||
{
|
||||
for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction)
|
||||
{
|
||||
if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
else
|
||||
{
|
||||
for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction)
|
||||
{
|
||||
if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0 && !GetBoxMonData(box + i, MON_DATA_IS_EGG))
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void ResetPokemonStorageSystem(void)
|
||||
{
|
||||
u16 boxId;
|
||||
u16 boxMon;
|
||||
|
||||
SetCurrentBox(0);
|
||||
for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)
|
||||
{
|
||||
for (boxMon = 0; boxMon < IN_BOX_COUNT; boxMon++)
|
||||
ClearMonInBox(boxId, boxMon);
|
||||
}
|
||||
for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)
|
||||
{
|
||||
u8 *dest = StringCopy(GetBoxNamePtr(boxId), gText_Box);
|
||||
ConvertIntToDecimalStringN(dest, boxId + 1, STR_CONV_MODE_LEFT_ALIGN, 2);
|
||||
}
|
||||
for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)
|
||||
{
|
||||
SetBoxWallpaper(boxId, boxId % 4);
|
||||
}
|
||||
ResetWaldaWallpaper();
|
||||
}
|
||||
|
||||
void sub_80C77E8(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3, bool32 loadPal)
|
||||
{
|
||||
struct SpritePalette palette =
|
||||
{
|
||||
gBoxSelectionPopupPalette, palTag
|
||||
};
|
||||
struct SpriteSheet sheets[] =
|
||||
{
|
||||
{gBoxSelectionPopupCenterTiles, 0x800, tileTag},
|
||||
{gBoxSelectionPopupSidesTiles, 0x180, tileTag + 1},
|
||||
{}
|
||||
};
|
||||
|
||||
if (loadPal)
|
||||
LoadSpritePalette(&palette);
|
||||
|
||||
LoadSpriteSheets(sheets);
|
||||
gUnknown_02039D04 = a0;
|
||||
a0->unk_0240 = tileTag;
|
||||
a0->unk_0242 = palTag;
|
||||
a0->unk_0246 = a3;
|
||||
a0->unk_023c = loadPal;
|
||||
}
|
||||
|
||||
void sub_80C7890(void)
|
||||
{
|
||||
if (gUnknown_02039D04->unk_023c)
|
||||
FreeSpritePaletteByTag(gUnknown_02039D04->unk_0242);
|
||||
FreeSpriteTilesByTag(gUnknown_02039D04->unk_0240);
|
||||
FreeSpriteTilesByTag(gUnknown_02039D04->unk_0240 + 1);
|
||||
}
|
||||
|
||||
void sub_80C78D4(u8 curBox)
|
||||
{
|
||||
sub_80C7958(curBox);
|
||||
}
|
||||
|
||||
void sub_80C78E4(void)
|
||||
{
|
||||
sub_80C7B14();
|
||||
}
|
||||
|
||||
u8 sub_80C78F0(void)
|
||||
{
|
||||
if (gMain.newKeys & B_BUTTON)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return 201;
|
||||
}
|
||||
if (gMain.newKeys & A_BUTTON)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return gUnknown_02039D04->curBox;
|
||||
}
|
||||
if (gMain.newKeys & DPAD_LEFT)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
sub_80C7BB4();
|
||||
}
|
||||
else if (gMain.newKeys & DPAD_RIGHT)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
sub_80C7B80();
|
||||
}
|
||||
return 200;
|
||||
}
|
||||
|
||||
void sub_80C7958(u8 curBox)
|
||||
{
|
||||
u16 i;
|
||||
u8 spriteId;
|
||||
struct SpriteTemplate template;
|
||||
struct OamData oamData = {};
|
||||
oamData.size = 3;
|
||||
oamData.paletteNum = 1;
|
||||
template = (struct SpriteTemplate){
|
||||
0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
|
||||
};
|
||||
|
||||
gUnknown_02039D04->curBox = curBox;
|
||||
template.tileTag = gUnknown_02039D04->unk_0240;
|
||||
template.paletteTag = gUnknown_02039D04->unk_0242;
|
||||
|
||||
spriteId = CreateSprite(&template, 0xA0, 0x60, 0);
|
||||
gUnknown_02039D04->unk_0000 = gSprites + spriteId;
|
||||
|
||||
oamData.shape = ST_OAM_V_RECTANGLE;
|
||||
oamData.size = 1;
|
||||
template.tileTag = gUnknown_02039D04->unk_0240 + 1;
|
||||
template.anims = sSpriteAnimTable_8571710;
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
u16 r5;
|
||||
spriteId = CreateSprite(&template, 0x7c, 0x50, gUnknown_02039D04->unk_0246);
|
||||
gUnknown_02039D04->unk_0004[i] = gSprites + spriteId;
|
||||
r5 = 0;
|
||||
if (i & 2)
|
||||
{
|
||||
gUnknown_02039D04->unk_0004[i]->pos1.x = 0xc4;
|
||||
r5 = 2;
|
||||
}
|
||||
if (i & 1)
|
||||
{
|
||||
gUnknown_02039D04->unk_0004[i]->pos1.y = 0x70;
|
||||
gUnknown_02039D04->unk_0004[i]->oam.size = 0;
|
||||
r5++;
|
||||
}
|
||||
StartSpriteAnim(gUnknown_02039D04->unk_0004[i], r5);
|
||||
}
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
gUnknown_02039D04->unk_0020[i] = sub_80CD2E8(72 * i + 0x7c, 0x58, i, 0, gUnknown_02039D04->unk_0246);
|
||||
if (gUnknown_02039D04->unk_0020[i])
|
||||
{
|
||||
gUnknown_02039D04->unk_0020[i]->data[0] = (i == 0 ? -1 : 1);
|
||||
gUnknown_02039D04->unk_0020[i]->callback = sub_80C7CF4;
|
||||
}
|
||||
}
|
||||
sub_80C7BE4();
|
||||
}
|
||||
|
||||
void sub_80C7B14(void)
|
||||
{
|
||||
u16 i;
|
||||
if (gUnknown_02039D04->unk_0000)
|
||||
{
|
||||
DestroySprite(gUnknown_02039D04->unk_0000);
|
||||
gUnknown_02039D04->unk_0000 = NULL;
|
||||
}
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (gUnknown_02039D04->unk_0004[i])
|
||||
{
|
||||
DestroySprite(gUnknown_02039D04->unk_0004[i]);
|
||||
gUnknown_02039D04->unk_0004[i] = NULL;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
if (gUnknown_02039D04->unk_0020[i])
|
||||
DestroySprite(gUnknown_02039D04->unk_0020[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80C7B80(void)
|
||||
{
|
||||
if (++gUnknown_02039D04->curBox >= TOTAL_BOXES_COUNT)
|
||||
gUnknown_02039D04->curBox = 0;
|
||||
sub_80C7BE4();
|
||||
}
|
||||
|
||||
void sub_80C7BB4(void)
|
||||
{
|
||||
gUnknown_02039D04->curBox = (gUnknown_02039D04->curBox == 0 ? TOTAL_BOXES_COUNT - 1 : gUnknown_02039D04->curBox - 1);
|
||||
sub_80C7BE4();
|
||||
}
|
||||
|
||||
void sub_80C7BE4(void)
|
||||
{
|
||||
u8 text[16];
|
||||
struct WindowTemplate winTemplate;
|
||||
u8 windowId;
|
||||
u8 *boxName = GetBoxNamePtr(gUnknown_02039D04->curBox);
|
||||
u8 nPokemonInBox = CountMonsInBox(gUnknown_02039D04->curBox);
|
||||
u32 winTileData;
|
||||
s32 center;
|
||||
|
||||
memset(&winTemplate, 0, sizeof(winTemplate));
|
||||
winTemplate.width = 8;
|
||||
winTemplate.height = 4;
|
||||
|
||||
windowId = AddWindow(&winTemplate);
|
||||
FillWindowPixelBuffer(windowId, 0x44);
|
||||
|
||||
center = GetStringCenterAlignXOffset(1, boxName, 0x40);
|
||||
box_print(windowId, 1, center, 1, gUnknown_08571734, TEXT_SPEED_FF, boxName);
|
||||
|
||||
ConvertIntToDecimalStringN(text, nPokemonInBox, 1, 2);
|
||||
StringAppend(text, gUnknown_08571737);
|
||||
center = GetStringCenterAlignXOffset(1, text, 0x40);
|
||||
box_print(windowId, 1, center, 0x11, gUnknown_08571734, TEXT_SPEED_FF, text);
|
||||
|
||||
winTileData = GetWindowAttribute(windowId, WINDOW_TILE_DATA);
|
||||
CpuCopy32((void *)winTileData, (void *)OBJ_VRAM0 + 0x100 + (GetSpriteTileStartByTag(gUnknown_02039D04->unk_0240) * 32), 0x400);
|
||||
|
||||
RemoveWindow(windowId);
|
||||
}
|
||||
|
||||
void sub_80C7CF4(struct Sprite *sprite)
|
||||
{
|
||||
if (++sprite->data[1] > 3)
|
||||
{
|
||||
sprite->data[1] = 0;
|
||||
sprite->pos2.x += sprite->data[0];
|
||||
if (++sprite->data[2] > 5)
|
||||
{
|
||||
sprite->data[2] = 0;
|
||||
sprite->pos2.x = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80C7D28(void)
|
||||
{
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
sub_80D2AA4();
|
||||
TransferPlttBuffer();
|
||||
SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_02039D08->bg2_X);
|
||||
}
|
||||
|
||||
void c2_Box(void)
|
||||
{
|
||||
RunTasks();
|
||||
do_scheduled_bg_tilemap_copies_to_vram();
|
||||
sub_80CA028();
|
||||
sub_80CAA14();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "daycare.h"
|
||||
#include "data2.h"
|
||||
#include "contest.h"
|
||||
#include "contest_effect.h"
|
||||
|
||||
extern struct UnkSummaryStruct* gUnknown_0203CF1C;
|
||||
extern struct BgTemplate gUnknown_0861CBB4;
|
||||
@@ -41,7 +42,6 @@ extern struct UnkStruct_61CC04 gUnknown_0861CC10;
|
||||
extern struct UnkStruct_61CC04 gUnknown_0861CBEC;
|
||||
extern struct UnkStruct_61CC04 gUnknown_0861CBF8;
|
||||
extern u16 gSummaryScreenWindow_Tilemap[];
|
||||
extern struct ContestMove gContestMoves[];
|
||||
extern struct ContestEffect gContestEffects[];
|
||||
extern struct WindowTemplate gUnknown_0861CC24;
|
||||
extern u8 gUnknown_0861CD2C[][3];
|
||||
|
||||
1366
src/slot_machine.c
Normal file
1366
src/slot_machine.c
Normal file
File diff suppressed because it is too large
Load Diff
4
src/tv.c
4
src/tv.c
@@ -1448,8 +1448,8 @@ void ContestLiveUpdates_BeforeInterview_5(u8 a0, u8 a1)
|
||||
sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
|
||||
if (sCurTVShowSlot != -1)
|
||||
{
|
||||
show->contestLiveUpdates.winningSpecies = gUnknown_02039E00[a1].unk_00;
|
||||
StringCopy(show->contestLiveUpdates.winningTrainerName, gUnknown_02039E00[a1].unk_0d);
|
||||
show->contestLiveUpdates.winningSpecies = gContestMons[a1].species;
|
||||
StringCopy(show->contestLiveUpdates.winningTrainerName, gContestMons[a1].trainerName);
|
||||
StripExtCtrlCodes(show->contestLiveUpdates.winningTrainerName);
|
||||
show->contestLiveUpdates.appealFlags2 = a0;
|
||||
if (a1 + 1 > gUnknown_02039F30)
|
||||
|
||||
Reference in New Issue
Block a user