From 3a8006e30cb16cf5ea98f4ae0703ee1d1f3f1c05 Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Fri, 10 Jan 2020 06:25:57 +0800 Subject: s32 to sio32 --- src/librfu_s32id.c | 164 --------------------------------------------------- src/librfu_sio32id.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+), 164 deletions(-) delete mode 100644 src/librfu_s32id.c create mode 100644 src/librfu_sio32id.c (limited to 'src') diff --git a/src/librfu_s32id.c b/src/librfu_s32id.c deleted file mode 100644 index ed51dcd12..000000000 --- a/src/librfu_s32id.c +++ /dev/null @@ -1,164 +0,0 @@ -#include "librfu.h" - -static void Sio32IDIntr(void); -static void Sio32IDInit(void); -static s32 Sio32IDMain(void); - -struct RfuS32Id gRfuS32Id; - -static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO -static const char Sio32IDLib_Var[] = "Sio32ID_030820"; - -s32 AgbRFU_checkID(u8 r5) -{ - u16 r8; - vu16 *r4; - s32 r6; - - if (REG_IME == 0) - return -1; - r8 = REG_IE; - gSTWIStatus->state = 10; - STWI_set_Callback_ID(Sio32IDIntr); - Sio32IDInit(); - r4 = ®_TMCNT_L(gSTWIStatus->timerSelect); - r5 *= 8; - while (--r5 != 0xFF) - { - r6 = Sio32IDMain(); - if (r6 != 0) - break; - r4[1] = 0; - r4[0] = 0; - r4[1] = TIMER_1024CLK | TIMER_ENABLE; - while (r4[0] < 32) - ; - r4[1] = 0; - r4[0] = 0; - } - REG_IME = 0; - REG_IE = r8; - REG_IME = 1; - gSTWIStatus->state = 0; - STWI_set_Callback_ID(NULL); - return r6; -} - -static void Sio32IDInit(void) -{ - REG_IME = 0; - REG_IE &= ~((8 << gSTWIStatus->timerSelect) | INTR_FLAG_SERIAL); - REG_IME = 1; - REG_RCNT = 0; - REG_SIOCNT = SIO_32BIT_MODE; - REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; - CpuFill32(0, &gRfuS32Id, sizeof(struct RfuS32Id)); - REG_IF = INTR_FLAG_SERIAL; -} - -static s32 Sio32IDMain(void) -{ - u8 r12; - - switch (r12 = gRfuS32Id.unk1) - { - case 0: - gRfuS32Id.unk0 = 1; - REG_SIOCNT |= SIO_38400_BPS; - REG_IME = r12; - REG_IE |= INTR_FLAG_SERIAL; - REG_IME = 1; - gRfuS32Id.unk1 = 1; - *(vu8 *)®_SIOCNT |= SIO_ENABLE; - break; - case 1: - if (gRfuS32Id.unkA == 0) - { - if (gRfuS32Id.unk0 == 1) - { - if (gRfuS32Id.unk2 == 0) - { - REG_IME = gRfuS32Id.unk2; - REG_SIOCNT |= SIO_ENABLE; - REG_IME = r12; - } - } - else if (gRfuS32Id.unk4 != 0x8001 && !gRfuS32Id.unk2) - { - REG_IME = gRfuS32Id.unk2; - REG_IE &= ~INTR_FLAG_SERIAL; - REG_IME = r12; - REG_SIOCNT = gRfuS32Id.unk2; - REG_SIOCNT = SIO_32BIT_MODE; - REG_IF = INTR_FLAG_SERIAL; - REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; - REG_IME = gRfuS32Id.unk2; - REG_IE |= INTR_FLAG_SERIAL; - REG_IME = r12; - } - break; - } - else - { - gRfuS32Id.unk1 = 2; - // fallthrough - } - default: - return gRfuS32Id.unkA; - } - return 0; -} - -static void Sio32IDIntr(void) -{ - u32 r5; - u16 r0; -#ifndef NONMATCHING - register u32 r1 asm("r1"); - register u16 r0_ asm("r0"); -#else - u32 r1; - u16 r0_; -#endif - - r5 = REG_SIODATA32; - if (gRfuS32Id.unk0 != 1) - REG_SIOCNT |= SIO_ENABLE; - r1 = 16 * gRfuS32Id.unk0; // to handle side effect of inline asm - r1 = (r5 << r1) >> 16; - r5 = (r5 << 16 * (1 - gRfuS32Id.unk0)) >> 16; - if (gRfuS32Id.unkA == 0) - { - if (r1 == gRfuS32Id.unk6) - { - if (gRfuS32Id.unk2 > 3) - { - gRfuS32Id.unkA = r5; - } - else if (r1 == (u16)~gRfuS32Id.unk4) - { - r0_ = ~gRfuS32Id.unk6; - if (r5 == r0_) - ++gRfuS32Id.unk2; - } - } - else - { - gRfuS32Id.unk2 = gRfuS32Id.unkA; - } - } - if (gRfuS32Id.unk2 < 4) - gRfuS32Id.unk4 = *(gRfuS32Id.unk2 + Sio32ConnectionData); - else - gRfuS32Id.unk4 = 0x8001; - gRfuS32Id.unk6 = ~r5; - REG_SIODATA32 = (gRfuS32Id.unk4 << 16 * (1 - gRfuS32Id.unk0)) - + (gRfuS32Id.unk6 << 16 * gRfuS32Id.unk0); - if (gRfuS32Id.unk0 == 1 && (gRfuS32Id.unk2 || r5 == 0x494E)) - { - for (r0 = 0; r0 < 600; ++r0) - ; - if (gRfuS32Id.unkA == 0) - REG_SIOCNT |= SIO_ENABLE; - } -} diff --git a/src/librfu_sio32id.c b/src/librfu_sio32id.c new file mode 100644 index 000000000..fc5701986 --- /dev/null +++ b/src/librfu_sio32id.c @@ -0,0 +1,164 @@ +#include "librfu.h" + +static void Sio32IDIntr(void); +static void Sio32IDInit(void); +static s32 Sio32IDMain(void); + +struct RfuSIO32Id gRfuSIO32Id; + +static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO +static const char Sio32IDLib_Var[] = "Sio32ID_030820"; + +s32 AgbRFU_checkID(u8 r5) +{ + u16 r8; + vu16 *r4; + s32 r6; + + if (REG_IME == 0) + return -1; + r8 = REG_IE; + gSTWIStatus->state = 10; + STWI_set_Callback_ID(Sio32IDIntr); + Sio32IDInit(); + r4 = ®_TMCNT_L(gSTWIStatus->timerSelect); + r5 *= 8; + while (--r5 != 0xFF) + { + r6 = Sio32IDMain(); + if (r6 != 0) + break; + r4[1] = 0; + r4[0] = 0; + r4[1] = TIMER_1024CLK | TIMER_ENABLE; + while (r4[0] < 32) + ; + r4[1] = 0; + r4[0] = 0; + } + REG_IME = 0; + REG_IE = r8; + REG_IME = 1; + gSTWIStatus->state = 0; + STWI_set_Callback_ID(NULL); + return r6; +} + +static void Sio32IDInit(void) +{ + REG_IME = 0; + REG_IE &= ~((8 << gSTWIStatus->timerSelect) | INTR_FLAG_SERIAL); + REG_IME = 1; + REG_RCNT = 0; + REG_SIOCNT = SIO_32BIT_MODE; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; + CpuFill32(0, &gRfuSIO32Id, sizeof(struct RfuSIO32Id)); + REG_IF = INTR_FLAG_SERIAL; +} + +static s32 Sio32IDMain(void) +{ + u8 r12; + + switch (r12 = gRfuSIO32Id.unk1) + { + case 0: + gRfuSIO32Id.unk0 = 1; + REG_SIOCNT |= SIO_38400_BPS; + REG_IME = r12; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = 1; + gRfuSIO32Id.unk1 = 1; + *(vu8 *)®_SIOCNT |= SIO_ENABLE; + break; + case 1: + if (gRfuSIO32Id.unkA == 0) + { + if (gRfuSIO32Id.unk0 == 1) + { + if (gRfuSIO32Id.unk2 == 0) + { + REG_IME = gRfuSIO32Id.unk2; + REG_SIOCNT |= SIO_ENABLE; + REG_IME = r12; + } + } + else if (gRfuSIO32Id.unk4 != 0x8001 && !gRfuSIO32Id.unk2) + { + REG_IME = gRfuSIO32Id.unk2; + REG_IE &= ~INTR_FLAG_SERIAL; + REG_IME = r12; + REG_SIOCNT = gRfuSIO32Id.unk2; + REG_SIOCNT = SIO_32BIT_MODE; + REG_IF = INTR_FLAG_SERIAL; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; + REG_IME = gRfuSIO32Id.unk2; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = r12; + } + break; + } + else + { + gRfuSIO32Id.unk1 = 2; + // fallthrough + } + default: + return gRfuSIO32Id.unkA; + } + return 0; +} + +static void Sio32IDIntr(void) +{ + u32 r5; + u16 r0; +#ifndef NONMATCHING + register u32 r1 asm("r1"); + register u16 r0_ asm("r0"); +#else + u32 r1; + u16 r0_; +#endif + + r5 = REG_SIODATA32; + if (gRfuSIO32Id.unk0 != 1) + REG_SIOCNT |= SIO_ENABLE; + r1 = 16 * gRfuSIO32Id.unk0; // to handle side effect of inline asm + r1 = (r5 << r1) >> 16; + r5 = (r5 << 16 * (1 - gRfuSIO32Id.unk0)) >> 16; + if (gRfuSIO32Id.unkA == 0) + { + if (r1 == gRfuSIO32Id.unk6) + { + if (gRfuSIO32Id.unk2 > 3) + { + gRfuSIO32Id.unkA = r5; + } + else if (r1 == (u16)~gRfuSIO32Id.unk4) + { + r0_ = ~gRfuSIO32Id.unk6; + if (r5 == r0_) + ++gRfuSIO32Id.unk2; + } + } + else + { + gRfuSIO32Id.unk2 = gRfuSIO32Id.unkA; + } + } + if (gRfuSIO32Id.unk2 < 4) + gRfuSIO32Id.unk4 = *(gRfuSIO32Id.unk2 + Sio32ConnectionData); + else + gRfuSIO32Id.unk4 = 0x8001; + gRfuSIO32Id.unk6 = ~r5; + REG_SIODATA32 = (gRfuSIO32Id.unk4 << 16 * (1 - gRfuSIO32Id.unk0)) + + (gRfuSIO32Id.unk6 << 16 * gRfuSIO32Id.unk0); + if (gRfuSIO32Id.unk0 == 1 && (gRfuSIO32Id.unk2 || r5 == 0x494E)) + { + for (r0 = 0; r0 < 600; ++r0) + ; + if (gRfuSIO32Id.unkA == 0) + REG_SIOCNT |= SIO_ENABLE; + } +} -- cgit v1.2.3 From 61c6609000743d31e315a678a2b800e3cc74a9df Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Fri, 10 Jan 2020 08:40:17 +0800 Subject: pc_screen_effect --- src/pc_screen_effect.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/pc_screen_effect.c (limited to 'src') diff --git a/src/pc_screen_effect.c b/src/pc_screen_effect.c new file mode 100644 index 000000000..5cc09df71 --- /dev/null +++ b/src/pc_screen_effect.c @@ -0,0 +1,156 @@ +#include "global.h" +#include "task.h" +#include "gpu_regs.h" +#include "palette.h" + +static void sub_80A0AC0(TaskFunc func, u16 a2, UNUSED u16 a3, u8 priority); +static void sub_80A0B0C(u8 taskId); +static void sub_80A0C78(u8 taskId); + +void sub_80A0A48(u16 a1, u16 a2, u8 a3) +{ + sub_80A0AC0(sub_80A0B0C, a1, a2, a3); +} + +void sub_80A0A70(u16 a1, u16 a2, u8 a3) +{ + sub_80A0AC0(sub_80A0C78, a1, a2, a3); +} + +bool8 sub_80A0A98(void) +{ + return FuncIsActiveTask(sub_80A0B0C); +} + +bool8 sub_80A0AAC(void) +{ + return FuncIsActiveTask(sub_80A0C78); +} + +static void sub_80A0AC0(TaskFunc func, u16 a2, UNUSED u16 a3, u8 priority) +{ + u8 taskId = CreateTask(func, priority); + + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = a2 == 0 ? 16 : a2; + gTasks[taskId].data[2] = a2 == 0 ? 20 : a2; + gTasks[taskId].func(taskId); +} + +static void sub_80A0B0C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[3] = 120; + task->data[4] = 120; + task->data[5] = 80; + task->data[6] = 81; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4])); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6])); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); + SetGpuReg(REG_OFFSET_WINOUT, 0); + break; + case 1: + task->data[7] = GetGpuReg(REG_OFFSET_BLDCNT); + task->data[8] = GetGpuReg(REG_OFFSET_BLDY); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN); + SetGpuReg(REG_OFFSET_BLDY, 16); + break; + case 2: + task->data[3] -= task->data[1]; + task->data[4] += task->data[1]; + if (task->data[3] <= 0 || task->data[4] >= DISPLAY_WIDTH) + { + task->data[3] = 0; + task->data[4] = DISPLAY_WIDTH; + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_BLDCNT, task->data[7]); + BlendPalettes(0xFFFFFFFF, 0, RGB_BLACK); + gPlttBufferFaded[0] = 0; + } + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4])); + if (task->data[3]) + return; + break; + case 3: + task->data[5] -= task->data[2]; + task->data[6] += task->data[2]; + if (task->data[5] <= 0 || task->data[6] >= DISPLAY_HEIGHT) + { + task->data[5] = 0; + task->data[6] = DISPLAY_HEIGHT; + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + } + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6])); + if (task->data[5]) + return; + break; + default: + SetGpuReg(REG_OFFSET_BLDCNT, task->data[7]); + DestroyTask(taskId); + return; + } + ++task->data[0]; +} + +static void sub_80A0C78(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + gPlttBufferFaded[0] = 0; + break; + case 1: + task->data[3] = 0; + task->data[4] = DISPLAY_WIDTH; + task->data[5] = 0; + task->data[6] = DISPLAY_HEIGHT; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4])); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6])); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); + SetGpuReg(REG_OFFSET_WINOUT, 0); + break; + case 2: + task->data[5] += task->data[2]; + task->data[6] -= task->data[2]; + if (task->data[5] >= 80 || task->data[6] <= 81) + { + task->data[5] = 80; + task->data[6] = 81; + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN); + SetGpuReg(REG_OFFSET_BLDY, 16); + } + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6])); + if (task->data[5] != 80) + return; + break; + case 3: + task->data[3] += task->data[1]; + task->data[4] -= task->data[1]; + if (task->data[3] >= 120 || task->data[4] <= 120) + { + task->data[3] = 120; + task->data[4] = 120; + BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); + gPlttBufferFaded[0] = 0; + } + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4])); + if (task->data[3] != 120) + return; + break; + default: + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + DestroyTask(taskId); + return; + } + ++task->data[0]; +} -- cgit v1.2.3 From dd381f49827a1e08b460336cf3bc496961d3eaec Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Fri, 10 Jan 2020 14:12:32 +0800 Subject: use headers in main.c --- src/main.c | 57 +++++++++++++++++---------------------------------------- 1 file changed, 17 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index 60f762a62..5d2db95be 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,9 @@ #include "global.h" +#include "bg.h" +#include "gpu_regs.h" +#include "link.h" +#include "link_rfu.h" +#include "load_save.h" #include "main.h" #include "m4a.h" #include "random.h" @@ -6,48 +11,20 @@ #include "gba/flash_internal.h" #include "battle.h" #include "help_system.h" +#include "sound.h" +#include "new_menu_helpers.h" +#include "malloc.h" +#include "overworld.h" +#include "sprite.h" +#include "play_time.h" +#include "pokemon.h" +#include "intro.h" +#include "battle_controllers.h" +#include "scanline_effect.h" +#include "save_failed_screen.h" +#include "battle.h" -extern u16 GetGpuReg(u8); -extern void SetGpuReg(u8, u16); -extern void RFUVSync(void); -extern void LinkVSync(void); -extern void sub_80FCF34(void); -extern void LinkVSync(void); -extern void InitGpuRegManager(void); -extern void InitRFU(void); -extern void CheckForFlashMemory(void); -extern void InitMapMusic(void); -extern void ResetBgs(void); -extern void SetDefaultFontsPointer(void); -extern void InitHeap(void *heapStart, u32 heapSize); // malloc.h -extern void rfu_REQ_stopMode(void); -extern void rfu_waitREQComplete(void); -extern bool32 sub_80582E0(void); -extern bool32 sub_8058274(void); -extern void ClearSpriteCopyRequests(void); -extern void PlayTimeCounter_Update(void); -extern void MapMusicMain(void); -extern void EnableInterrupts(u16); -extern void sub_800DD28(void); -extern u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)); -extern void ScanlineEffect_Stop(void); -extern void sub_80F50F4(void); -extern bool32 sub_80F5118(void); - -extern struct SoundInfo gSoundInfo; -extern u32 gFlashMemoryPresent; extern u32 intr_main[]; -extern u8 gHeap[]; -extern struct SaveBlock1 gSaveBlock1; -extern struct SaveBlock2 gSaveBlock2; -extern struct PokemonStorage gPokemonStorage; -extern u32 gBattleTypeFlags; -extern u8 gUnknown_03002748; -extern u32 *gUnknown_0203CF5C; - -void Timer3Intr(void); -bool8 HandleLinkConnection(void); -void c2_copyright_1(void); static void VBlankIntr(void); static void HBlankIntr(void); -- cgit v1.2.3 From e300f2ece0bd3c5c0967ac635a48ccd8ef13cf50 Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Fri, 10 Jan 2020 12:56:31 +0800 Subject: script_pokemon_util_80BF8FC --- src/party_menu_specials.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++ src/scrcmd.c | 1 - 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 src/party_menu_specials.c (limited to 'src') diff --git a/src/party_menu_specials.c b/src/party_menu_specials.c new file mode 100644 index 000000000..751684bd5 --- /dev/null +++ b/src/party_menu_specials.c @@ -0,0 +1,111 @@ +#include "global.h" +#include "data.h" +#include "script.h" +#include "overworld.h" +#include "battle.h" +#include "palette.h" +#include "pokemon.h" +#include "party_menu.h" +#include "field_fadetransition.h" +#include "pokemon_summary_screen.h" +#include "event_data.h" +#include "string_util.h" +#include "constants/moves.h" + +static void sub_80BF97C(u8 taskId); + +void Special_ChooseMonFromParty(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + taskId = CreateTask(sub_80BF97C, 10); + gTasks[taskId].data[0] = PARTY_MENU_TYPE_CHOOSE_MON; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); +} + +void Special_SelectMoveTutorMon(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + taskId = CreateTask(sub_80BF97C, 10); + gTasks[taskId].data[0] = PARTY_MENU_TYPE_MOVE_RELEARNER; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); +} + +static void sub_80BF97C(u8 taskId) +{ + if (!gPaletteFade.active) + { + gPaletteFade.bufferTransferDisabled = TRUE; + ChoosePartyMonByMenuType((u8)gTasks[taskId].data[0]); + DestroyTask(taskId); + } +} + +void Special_SelectMove(void) +{ + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gSpecialVar_0x8004, gPlayerPartyCount - 1, CB2_ReturnToField, 0); + sub_8138B38(3); + gFieldCallback = FieldCallback_ReturnToEventScript2; +} + +void Special_GetNumMovesSelectedMonHas(void) +{ + u8 i; + + gSpecialVar_Result = 0; + for (i = 0; i < MAX_MON_MOVES; ++i) + if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_MOVE1 + i) != MOVE_NONE) + ++gSpecialVar_Result; +} + +void Special_BufferMoveDeleterNicknameAndMove(void) +{ + struct Pokemon *mon = &gPlayerParty[gSpecialVar_0x8004]; + u16 move = GetMonData(mon, MON_DATA_MOVE1 + gSpecialVar_0x8005); + + GetMonNickname(mon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[move]); +} + +static void ShiftMoveSlot(struct Pokemon *mon, u8 slotTo, u8 slotFrom) +{ + u16 move1 = GetMonData(mon, MON_DATA_MOVE1 + slotTo); + u16 move0 = GetMonData(mon, MON_DATA_MOVE1 + slotFrom); + u8 pp1 = GetMonData(mon, MON_DATA_PP1 + slotTo); + u8 pp0 = GetMonData(mon, MON_DATA_PP1 + slotFrom); + u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); + u8 ppBonusMask1 = gPPUpGetMask[slotTo]; + u8 ppBonusMove1 = (ppBonuses & ppBonusMask1) >> (slotTo * 2); + u8 ppBonusMask2 = gPPUpGetMask[slotFrom]; + u8 ppBonusMove2 = (ppBonuses & ppBonusMask2) >> (slotFrom * 2); + + ppBonuses &= ~ppBonusMask1; + ppBonuses &= ~ppBonusMask2; + ppBonuses |= (ppBonusMove1 << (slotFrom * 2)) + (ppBonusMove2 << (slotTo * 2)); + SetMonData(mon, MON_DATA_MOVE1 + slotTo, &move0); + SetMonData(mon, MON_DATA_MOVE1 + slotFrom, &move1); + SetMonData(mon, MON_DATA_PP1 + slotTo, &pp0); + SetMonData(mon, MON_DATA_PP1 + slotFrom, &pp1); + SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); +} + +void Special_MoveDeleterForgetMove(void) +{ + u16 i; + + SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], MOVE_NONE, gSpecialVar_0x8005); + RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005); + for (i = gSpecialVar_0x8005; i < MAX_MON_MOVES - 1; ++i) + ShiftMoveSlot(&gPlayerParty[gSpecialVar_0x8004], i, i + 1); +} + +void Special_IsSelectedMonEgg(void) +{ + if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_IS_EGG)) + gSpecialVar_Result = TRUE; + else + gSpecialVar_Result = FALSE; +} diff --git a/src/scrcmd.c b/src/scrcmd.c index fad30a6a8..6d2b1f430 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -34,7 +34,6 @@ #include "coins.h" #include "battle_setup.h" #include "shop.h" -#include "script_pokemon_80F8.h" #include "slot_machine.h" #include "field_effect.h" #include "fieldmap.h" -- cgit v1.2.3 From a52fe6c9a0037c90350059bd438bafdb8f0e5ec6 Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Sat, 11 Jan 2020 04:20:27 +0800 Subject: sub_810C4EC --- src/vs_seeker.c | 91 +++++---------------------------------------------------- 1 file changed, 8 insertions(+), 83 deletions(-) (limited to 'src') diff --git a/src/vs_seeker.c b/src/vs_seeker.c index 46a0649d7..6c4dba398 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -637,7 +637,6 @@ void sub_810C444(void) } } -#ifdef NONMATCHING bool8 sub_810C4EC(void) { if (CheckBagHasItem(ITEM_VS_SEEKER, 1) == TRUE) @@ -648,18 +647,18 @@ bool8 sub_810C4EC(void) if (FlagGet(FLAG_SYS_VS_SEEKER_CHARGING) == TRUE) { - u16 x; - do { - x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF; - } while (0); + u8 x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF; + u32 r4 = 0xFF; + if (x < 100) { x++; - gSaveBlock1Ptr->trainerRematchStepCounter = ((u16)(x << 8)) | (gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF); + #ifndef NONMATCHING // fool the compiler that r4 has been changed + asm("":"=r"(r4)); + #endif + gSaveBlock1Ptr->trainerRematchStepCounter = (gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) | (x << 8); } - do { - x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF; - } while (0); + x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & r4; if (x == 100) { FlagClear(FLAG_SYS_VS_SEEKER_CHARGING); @@ -671,80 +670,6 @@ bool8 sub_810C4EC(void) return FALSE; } -#else -NAKED -bool8 sub_810C4EC(void) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmovs r0, 0xB5\n" - "\tlsls r0, 1\n" - "\tmovs r1, 0x1\n" - "\tbl CheckBagHasItem\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbne _0810C516\n" - "\tldr r0, _0810C568 @ =gSaveBlock1Ptr\n" - "\tldr r0, [r0]\n" - "\tmovs r2, 0xC7\n" - "\tlsls r2, 3\n" - "\tadds r1, r0, r2\n" - "\tldrh r2, [r1]\n" - "\tldrb r0, [r1]\n" - "\tcmp r0, 0x63\n" - "\tbhi _0810C516\n" - "\tadds r0, r2, 0x1\n" - "\tstrh r0, [r1]\n" - "_0810C516:\n" - "\tldr r7, _0810C56C @ =0x00000801\n" - "\tadds r0, r7, 0\n" - "\tbl FlagGet\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbne _0810C570\n" - "\tldr r6, _0810C568 @ =gSaveBlock1Ptr\n" - "\tldr r0, [r6]\n" - "\tmovs r5, 0xC7\n" - "\tlsls r5, 3\n" - "\tadds r3, r0, r5\n" - "\tldrh r2, [r3]\n" - "\tlsrs r1, r2, 8\n" - "\tmovs r4, 0xFF\n" - "\tcmp r1, 0x63\n" - "\tbhi _0810C548\n" - "\tadds r1, 0x1\n" - "\tlsls r1, 24\n" - "\tmovs r0, 0xFF\n" - "\tands r0, r2\n" - "\tlsrs r1, 16\n" - "\torrs r0, r1\n" - "\tstrh r0, [r3]\n" - "_0810C548:\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldrh r0, [r0]\n" - "\tlsrs r0, 8\n" - "\tands r0, r4\n" - "\tcmp r0, 0x64\n" - "\tbne _0810C570\n" - "\tadds r0, r7, 0\n" - "\tbl FlagClear\n" - "\tbl sub_810C640\n" - "\tbl sub_810D0D0\n" - "\tmovs r0, 0x1\n" - "\tb _0810C572\n" - "\t.align 2, 0\n" - "_0810C568: .4byte gSaveBlock1Ptr\n" - "_0810C56C: .4byte 0x00000801\n" - "_0810C570:\n" - "\tmovs r0, 0\n" - "_0810C572:\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif void sub_810C578(void) { -- cgit v1.2.3 From 214c651acd3588dce2258a24a89b08d43c1fa477 Mon Sep 17 00:00:00 2001 From: jiangzhengwenjz Date: Sat, 11 Jan 2020 08:01:53 +0800 Subject: GetVsSeekerResponseInArea --- src/vs_seeker.c | 261 +++++--------------------------------------------------- 1 file changed, 23 insertions(+), 238 deletions(-) (limited to 'src') diff --git a/src/vs_seeker.c b/src/vs_seeker.c index 46a0649d7..969f05982 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -920,13 +920,17 @@ u8 CanUseVsSeeker(void) } } -// Nonmatching due to register roulette -#ifdef NONMATCHING static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) { u16 r8 = 0; u8 sp0 = 0; s32 vsSeekerIdx; + u8 *r2; +#ifndef NONMATCHING + register u32 r3 asm("r3"); + register s32 r0_ asm("r0"); + asm("":::"r10", "r8", "r6", "r4"); +#endif for (vsSeekerIdx = 0; sVsSeeker->trainerInfo[vsSeekerIdx].localId != 0xFF; vsSeekerIdx++) { @@ -936,6 +940,7 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) if (!HasTrainerBeenFought(r8)) { StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], gUnknown_8453F60); + sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx += 0; sVsSeeker->trainerHasNotYetBeenFought = 1; } else @@ -944,7 +949,15 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) if (r7 == 0) { 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 { @@ -957,7 +970,15 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) 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 { @@ -985,242 +1006,6 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) return 1; return 0; } -#else -NAKED -static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x8\n" - "\tstr r0, [sp, 0x4]\n" - "\tmovs r0, 0\n" - "\tmov r8, r0\n" - "\tmov r0, sp\n" - "\tmov r1, r8\n" - "\tstrb r1, [r0]\n" - "\tmovs r2, 0\n" - "\tmov r9, r2\n" - "\tldr r4, _0810CA14 @ =sVsSeeker\n" - "\tldr r0, [r4]\n" - "\tldrb r0, [r0, 0x6]\n" - "\tcmp r0, 0xFF\n" - "\tbne _0810C9D0\n" - "\tb _0810CB2C\n" - "_0810C9D0:\n" - "\tadds r6, r4, 0\n" - "\tmovs r3, 0x86\n" - "\tlsls r3, 3\n" - "\tmov r10, r3\n" - "\tmovs r5, 0\n" - "_0810C9DA:\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tbl IsTrainerVisibleOnScreen\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbeq _0810C9EC\n" - "\tb _0810CB18\n" - "_0810C9EC:\n" - "\tldr r0, [r4]\n" - "\tadds r0, r5\n" - "\tldrh r0, [r0, 0x4]\n" - "\tmov r8, r0\n" - "\tbl HasTrainerBeenFought\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _0810CA20\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldr r1, _0810CA18 @ =gUnknown_8453F60\n" - "\tbl StartTrainerObjectMovementScript\n" - "\tldr r2, [r6]\n" - "\tldr r0, _0810CA1C @ =0x00000431\n" - "\tadds r2, r0\n" - "\tldrb r0, [r2]\n" - "\tmovs r1, 0x1\n" - "\tb _0810CB14\n" - "\t.align 2, 0\n" - "_0810CA14: .4byte sVsSeeker\n" - "_0810CA18: .4byte gUnknown_8453F60\n" - "_0810CA1C: .4byte 0x00000431\n" - "_0810CA20:\n" - "\tldr r0, [sp, 0x4]\n" - "\tmov r1, r8\n" - "\tmov r2, sp\n" - "\tbl GetNextAvailableRematchTrainer\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tcmp r7, 0\n" - "\tbne _0810CA50\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldr r1, _0810CA48 @ =sMovementScript_TrainerNoRematch\n" - "\tbl StartTrainerObjectMovementScript\n" - "\tldr r2, [r6]\n" - "\tldr r3, _0810CA4C @ =0x00000431\n" - "\tadds r2, r3\n" - "\tldrb r0, [r2]\n" - "\tmovs r1, 0x2\n" - "\tb _0810CB14\n" - "\t.align 2, 0\n" - "_0810CA48: .4byte sMovementScript_TrainerNoRematch\n" - "_0810CA4C: .4byte 0x00000431\n" - "_0810CA50:\n" - "\tbl Random\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmovs r1, 0x64\n" - "\tbl __umodsi3\n" - "\tlsls r0, 16\n" - "\tlsrs r4, r0, 16\n" - "\tmov r0, r9\n" - "\tmov r1, r8\n" - "\tbl GetCurVsSeekerResponse\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x2\n" - "\tbne _0810CA76\n" - "\tmovs r4, 0x64\n" - "\tb _0810CA7C\n" - "_0810CA76:\n" - "\tcmp r0, 0x1\n" - "\tbne _0810CA7C\n" - "\tmovs r4, 0\n" - "_0810CA7C:\n" - "\tcmp r4, 0x1D\n" - "\tbhi _0810CAA0\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldr r1, _0810CA98 @ =sMovementScript_TrainerNoRematch\n" - "\tbl StartTrainerObjectMovementScript\n" - "\tldr r2, [r6]\n" - "\tldr r0, _0810CA9C @ =0x00000431\n" - "\tadds r2, r0\n" - "\tldrb r0, [r2]\n" - "\tmovs r1, 0x2\n" - "\tb _0810CB14\n" - "\t.align 2, 0\n" - "_0810CA98: .4byte sMovementScript_TrainerNoRematch\n" - "_0810CA9C: .4byte 0x00000431\n" - "_0810CAA0:\n" - "\tldr r0, _0810CB54 @ =gSaveBlock1Ptr\n" - "\tldr r1, [r0]\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldr r2, _0810CB58 @ =0x0000063a\n" - "\tadds r1, r2\n" - "\tldrb r0, [r0, 0x6]\n" - "\tadds r1, r0\n" - "\tstrb r7, [r1]\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldrb r1, [r0, 0x7]\n" - "\tlsls r0, r1, 3\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tldr r1, _0810CB5C @ =gObjectEvents\n" - "\tadds r0, r1\n" - "\tbl npc_coords_shift_still\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldr r1, _0810CB60 @ =gUnknown_8453F64\n" - "\tbl StartTrainerObjectMovementScript\n" - "\tldr r2, [r6]\n" - "\tmov r3, r10\n" - "\tadds r0, r2, r3\n" - "\tldrb r1, [r0]\n" - "\tlsls r1, 1\n" - "\tmovs r3, 0x80\n" - "\tlsls r3, 3\n" - "\tadds r0, r2, r3\n" - "\tadds r0, r1\n" - "\tmov r1, r8\n" - "\tstrh r1, [r0]\n" - "\tadds r2, r5\n" - "\tldrb r0, [r2, 0xC]\n" - "\tbl GetRunningBehaviorFromGraphicsId\n" - "\tldr r1, [r6]\n" - "\tmov r3, r10\n" - "\tadds r2, r1, r3\n" - "\tmovs r3, 0x84\n" - "\tlsls r3, 3\n" - "\tadds r1, r3\n" - "\tldrb r2, [r2]\n" - "\tadds r1, r2\n" - "\tstrb r0, [r1]\n" - "\tldr r1, [r6]\n" - "\tadd r1, r10\n" - "\tldrb r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1]\n" - "\tldr r2, [r6]\n" - "\tldr r0, _0810CB64 @ =0x00000431\n" - "\tadds r2, r0\n" - "\tldrb r0, [r2]\n" - "\tmovs r1, 0x4\n" - "_0810CB14:\n" - "\torrs r0, r1\n" - "\tstrb r0, [r2]\n" - "_0810CB18:\n" - "\tadds r5, 0x10\n" - "\tmovs r1, 0x1\n" - "\tadd r9, r1\n" - "\tldr r4, _0810CB68 @ =sVsSeeker\n" - "\tldr r0, [r4]\n" - "\tadds r0, r5\n" - "\tldrb r0, [r0, 0x6]\n" - "\tcmp r0, 0xFF\n" - "\tbeq _0810CB2C\n" - "\tb _0810C9DA\n" - "_0810CB2C:\n" - "\tldr r2, _0810CB68 @ =sVsSeeker\n" - "\tldr r0, [r2]\n" - "\tldr r3, _0810CB64 @ =0x00000431\n" - "\tadds r0, r3\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x4\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0810CB70\n" - "\tmovs r0, 0x15\n" - "\tbl PlaySE\n" - "\tldr r0, _0810CB6C @ =0x00000801\n" - "\tbl FlagSet\n" - "\tbl sub_810C640\n" - "\tmovs r0, 0x2\n" - "\tb _0810CB7E\n" - "\t.align 2, 0\n" - "_0810CB54: .4byte gSaveBlock1Ptr\n" - "_0810CB58: .4byte 0x0000063a\n" - "_0810CB5C: .4byte gObjectEvents\n" - "_0810CB60: .4byte gUnknown_8453F64\n" - "_0810CB64: .4byte 0x00000431\n" - "_0810CB68: .4byte sVsSeeker\n" - "_0810CB6C: .4byte 0x00000801\n" - "_0810CB70:\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _0810CB7C\n" - "\tmovs r0, 0\n" - "\tb _0810CB7E\n" - "_0810CB7C:\n" - "\tmovs r0, 0x1\n" - "_0810CB7E:\n" - "\tadd sp, 0x8\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif void sub_810CB90(void) { -- cgit v1.2.3