diff options
Diffstat (limited to 'src')
38 files changed, 7034 insertions, 1562 deletions
diff --git a/src/battle_6.c b/src/battle_6.c new file mode 100644 index 000000000..bc540ce72 --- /dev/null +++ b/src/battle_6.c @@ -0,0 +1,57 @@ +#include "global.h" +#include "asm.h" +#include "menu_cursor.h" +#include "text.h" + +extern u16 gUnknown_030042A4; +extern u16 gUnknown_030042A0; + +extern struct Window gUnknown_03004210; + +extern void (*gUnknown_03004330[])(void); + +extern u8 gUnknown_02024A60; +extern u8 gUnknown_02024E60[]; +extern u8 gUnknown_020238CC[]; + +extern u16 gUnknown_030042C0; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_03004288; +extern u16 gUnknown_03004280; +extern u16 gUnknown_030041B0; +extern u16 gUnknown_030041B8; + +extern const u8 gUnknown_08400CA8[]; +extern const u8 gUnknown_08400CF3[]; + +#if ENGLISH +#define SUB_803037C_TILE_DATA_OFFSET 440 +#elif GERMAN +#define SUB_803037C_TILE_DATA_OFFSET 444 +#endif + +void sub_803037C(void) { + int r4; + + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 160; + FillWindowRect(&gUnknown_03004210, 10, 2, 15, 27, 18); + FillWindowRect(&gUnknown_03004210, 10, 2, 35, 16, 38); + + gUnknown_03004330[gUnknown_02024A60] = sub_802C098; + + InitWindow(&gUnknown_03004210, gUnknown_08400CF3, 400, 18, 35); + sub_8002F44(&gUnknown_03004210); + sub_814A5C0(0, 0xFFFF, 12, 11679, 0); + + for (r4 = 0; r4 < 4; r4++) + { + nullsub_8(r4); + } + + sub_802E3E4(gUnknown_02024E60[gUnknown_02024A60], 0); + + get_battle_strings_((u8 *) gUnknown_08400CA8); + InitWindow(&gUnknown_03004210, gUnknown_020238CC, SUB_803037C_TILE_DATA_OFFSET, 2, 35); + sub_8002F44(&gUnknown_03004210); +} diff --git a/src/battle_ai.c b/src/battle_ai.c index bd320904f..9bbaf908e 100644 --- a/src/battle_ai.c +++ b/src/battle_ai.c @@ -334,6 +334,10 @@ void BattleAI_SetupAIData(void) AI_THINKING_STRUCT->aiFlags = 0x20000000; else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) AI_THINKING_STRUCT->aiFlags = 0x80000000; +#ifdef GERMAN + else if (gBattleTypeFlags & 0x900 || gTrainerBattleOpponent == 0x400) + AI_THINKING_STRUCT->aiFlags = 7; +#endif else // otherwise, just set aiFlags to whatever flags the trainer has set in their data. AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags; } diff --git a/src/battle_anim_81258BC.c b/src/battle_anim_81258BC.c new file mode 100644 index 000000000..42a685f4a --- /dev/null +++ b/src/battle_anim_81258BC.c @@ -0,0 +1,50 @@ +#include "global.h" +#include "asm.h" +#include "text.h" +#include "menu_cursor.h" + +extern struct Window gUnknown_03004210; +extern u8 gUnknown_020238CC[]; +extern u8 gUnknown_02024E60[]; + +extern const u8 gUnknown_08400CBB[]; +extern u8 gUnknown_02024A60; +extern const u8 gUnknown_08400D15[]; + +extern void* gUnknown_03004330[]; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; + +void bx_battle_menu_t6_2(void); + +#if ENGLISH +#define SUB_812BB10_TILE_DATA_OFFSET 440 +#elif GERMAN +#define SUB_812BB10_TILE_DATA_OFFSET 444 +#endif + +void sub_812BB10(void) { + int i; + + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 160; + gUnknown_03004210.paletteNum = 0; + FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); + FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); + gUnknown_03004330[gUnknown_02024A60] = bx_battle_menu_t6_2; + + InitWindow(&gUnknown_03004210, gUnknown_08400D15, 400, 18, 35); + sub_8002F44(&gUnknown_03004210); + sub_814A5C0(0, 0xFFFF, 12, 11679, 0); + + for (i = 0; i < 4; i++) + { + nullsub_8(i); + } + + sub_802E3E4(gUnknown_02024E60[gUnknown_02024A60], 0); + get_battle_strings_((u8 *) gUnknown_08400CBB); + + InitWindow(&gUnknown_03004210, gUnknown_020238CC, SUB_812BB10_TILE_DATA_OFFSET, 2, 35); + sub_8002F44(&gUnknown_03004210); +}
\ No newline at end of file diff --git a/src/battle_interface.c b/src/battle_interface.c new file mode 100644 index 000000000..d097598b5 --- /dev/null +++ b/src/battle_interface.c @@ -0,0 +1,3082 @@ +#include "global.h" +#include "asm.h" +#include "sprite.h" +#include "string_util.h" +#include "text.h" +#include "decompress.h" +#include "sound.h" +#include "songs.h" +#include "battle.h" +#include "palette.h" + +struct UnknownStruct5 +{ + u8 unk0; + u32 unk4; + u32 unk8; + u32 unkC; + u32 unk10; +}; + +struct UnknownStruct6 +{ + u8 bit_0:1; + u8 bit_1:1; + u8 bit_2:1; + u8 bit_3:1; + u8 bit_4:1; + u8 bit_5:1; + u8 bit_6:1; + u8 bit_7:1; +}; + +struct UnknownStruct7 +{ + u8 filler0[0x180]; +}; + +struct UnknownStruct9 +{ + s32 unk0; + u32 unk4; + u32 unk8; + u32 unkC_0:5; + u32 unk10; +}; + +extern u8 ewram[]; +#define ewram520 ((struct UnknownStruct7 *)(ewram + 0x00520)) +#define ewram16088 (*(u8 *) (ewram + 0x16088)) +#define ewram16089 (*(u8 *) (ewram + 0x16089)) +#define ewram17800 ((struct UnknownStruct6 *)(ewram + 0x17800)) +#define ewram17850 ((struct UnknownStruct5 *)(ewram + 0x17850)) + +extern u8 gUnknown_020238CC[]; +extern u8 gUnknown_02024A68; +extern u16 gUnknown_02024A6A[]; +extern u8 gUnknown_02024A72[]; +extern u8 gUnknown_03004340[]; + +extern u16 gBattleTypeFlags; +extern u8 gNumSafariBalls; + +extern u32 gExperienceTables[8][101]; +extern const struct SpriteTemplate gSpriteTemplate_820A4EC[]; +extern const struct SpriteTemplate gSpriteTemplate_820A51C[]; +extern const struct SpriteTemplate gSpriteTemplate_820A54C; +extern const struct SpriteTemplate gSpriteTemplate_820A56C[]; +extern const struct SubspriteTable gSubspriteTables_820A684[]; +extern const struct SubspriteTable gSubspriteTables_820A6E4[]; +extern const struct SubspriteTable gSubspriteTables_820A6EC[]; +extern const struct SpriteSheet gUnknown_0820A754[]; +extern const struct SpritePalette gUnknown_0820A764[]; +extern const struct SpritePalette gUnknown_0820A774[]; +extern const struct SpriteSheet gUnknown_0820A784[]; +extern const struct SpriteTemplate gSpriteTemplate_820A7A4[]; +extern const struct SpriteTemplate gSpriteTemplate_820A7D4[]; +extern void *const gUnknown_0820A804[]; +extern void *const gUnknown_0820A80C[]; +extern void *const gUnknown_0820A814[]; +extern void *const gUnknown_0820A83C[]; +extern void *const gUnknown_0820A848[]; +extern void *const gUnknown_0820A854[]; +extern void *const gUnknown_0820A85C[]; +extern void *const gUnknown_0820A87C[]; +extern void *const gUnknown_0820A894[]; +extern void *const gUnknown_0820A8B4[]; +extern void *const gUnknown_0820A8DC[]; +extern void *const gUnknown_0820A904[]; +extern const u8 gUnknown_0820A81C[]; +extern const u8 gUnknown_0820A864[]; +extern const u8 gUnknown_0820A89C[]; +extern const u8 gUnknown_0820A8B0[]; +extern const struct BaseStats gBaseStats[]; +extern const u8 BattleText_SafariBalls[]; +extern const u8 BattleText_SafariBallsLeft[]; +extern const u8 BattleText_HighlightRed[]; +extern const u8 gUnknown_08D1216C[][32]; + +extern const u8 *const gNatureNames[]; +extern const u16 gBattleInterfaceStatusIcons_DynPal[]; + +#define ABS(n) ((n) >= 0 ? (n) : -(n)) +// Used for computing copy destination addresses +#define MACRO1(n) ((n) - (n) / 8 * 8) + 64 * ((n) / 8) + +extern int sub_8040D3C(); +extern u8 sub_8090D90(); +extern void load_gfxc_health_bar(); + +static void sub_8043D5C(struct Sprite *); +static const void *sub_8043CDC(u8); +void sub_8044210(u8, s16, u8); +static void draw_status_ailment_maybe(u8); +void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c); +extern void sub_8045180(struct Sprite *); +static void sub_8045110(struct Sprite *); +static void sub_8045048(struct Sprite *); +static void sub_8044F70(u8 taskId); +static void sub_8044E74(u8 taskId); +static void sub_8044ECC(u8 taskId); +static u8 sub_80457E8(u8, u8); +s32 sub_8045C78(u8, u8, u8, u8); +static int sub_8045F58(s32, s32, int, int *, u8, u16); +static u8 GetScaledExpFraction(int, int, int, u8); +static void sub_8045D58(u8, u8); +static u8 sub_804602C(int, int, int, int *, u8 *, u8); +static void sub_8046128(struct UnknownStruct9 *a, int *b, void *c); + +static int do_nothing(s16 unused1, s16 unused2, int unused3) +{ + return 9; +} + +#ifdef NONMATCHING +void sub_8043740(s16 a, u16 *b, u8 c) +{ + u8 sp0[4]; + s8 i; + s8 j; + s32 r9; + + for (i = 0; i < 4; i++) + sp0[i] = 0; + + //_0804377C + //i = 3; + //r9 = -1; + for (i = 3, r9 = -1;;) + { + if (a > 0) + { + sp0[i] = a % 10; + a /= 10; + i--; + } + else + break; + asm(""::"r"(r9)); + } + + //_080437AA + for (; i > r9; i--) + { + //asm("":"=r"(r9)); + sp0[i] = -1; + } + //_080437CE + if (sp0[3] == 0xFF) + sp0[3] = 0; + + //_080437DA + if (c == 0) + { + for (i = 0, j = 0; i < 4; i++) + { + if (sp0[j] == 0xFF) + { + b[j] = (b[j] & 0xFC00) | 0x1E; + b[i + 0x20] = (b[i + 0x20] & 0xFC00) | 0x1E; + } + else + { + b[j] = (b[j] & 0xFC00) | (sp0[j] + 0x14); + b[i + 0x20] = (b[i + 0x20] & 0xFC00) | (sp0[i] + 0x34); + } + j++; + } + + } + //_0804386A + else + { + for (i = 0; i < 4; i++) + { + if (sp0[i] == 0xFF) + { + b[i] = (b[i] & 0xFC00) | 0x1E; + b[i + 0x20] = (b[i + 0x20] & 0xFC00) | 0x1E; + } + else + { + b[i] = (b[i] & 0xFC00) | (sp0[i] + 0x14); + b[i + 0x20] = (b[i + 0x20] & 0xFC00) | (sp0[i] + 0x34); + } + } + } + asm(""::"r"(r9)); +} +#else +__attribute__((naked)) +void sub_8043740(s16 a, u16 *b, u8 c) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + adds r7, r1, 0\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + mov r10, r2\n\ + movs r3, 0\n\ + movs r2, 0\n\ +_0804375C:\n\ + lsls r0, r3, 24\n\ + asrs r0, 24\n\ + mov r3, sp\n\ + adds r1, r3, r0\n\ + strb r2, [r1]\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _0804375C\n\ + movs r3, 0x3\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + mov r9, r0\n\ + mov r8, sp\n\ +_0804377C:\n\ + lsls r0, r5, 16\n\ + asrs r6, r0, 16\n\ + cmp r6, 0\n\ + ble _080437AA\n\ + lsls r4, r3, 24\n\ + asrs r4, 24\n\ + mov r1, sp\n\ + adds r5, r1, r4\n\ + adds r0, r6, 0\n\ + movs r1, 0xA\n\ + bl __modsi3\n\ + strb r0, [r5]\n\ + adds r0, r6, 0\n\ + movs r1, 0xA\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + subs r4, 0x1\n\ + lsls r4, 24\n\ + lsrs r3, r4, 24\n\ + b _0804377C\n\ +_080437AA:\n\ + lsls r1, r3, 24\n\ + asrs r0, r1, 24\n\ + cmp r0, r9\n\ + ble _080437CE\n\ + movs r4, 0xFF\n\ + movs r3, 0x1\n\ + negs r3, r3\n\ +_080437B8:\n\ + asrs r2, r1, 24\n\ + mov r5, sp\n\ + adds r1, r5, r2\n\ + ldrb r0, [r1]\n\ + orrs r0, r4\n\ + strb r0, [r1]\n\ + subs r2, 0x1\n\ + lsls r1, r2, 24\n\ + asrs r0, r1, 24\n\ + cmp r0, r3\n\ + bgt _080437B8\n\ +_080437CE:\n\ + mov r1, r8\n\ + ldrb r0, [r1, 0x3]\n\ + cmp r0, 0xFF\n\ + bne _080437DA\n\ + movs r0, 0\n\ + strb r0, [r1, 0x3]\n\ +_080437DA:\n\ + mov r2, r10\n\ + cmp r2, 0\n\ + bne _0804386A\n\ + movs r3, 0\n\ + movs r1, 0\n\ + movs r6, 0xFC\n\ + lsls r6, 8\n\ + movs r5, 0x1E\n\ + mov r12, r5\n\ +_080437EC:\n\ + lsls r1, 24\n\ + asrs r2, r1, 24\n\ + mov r0, sp\n\ + adds r5, r0, r2\n\ + ldrb r0, [r5]\n\ + mov r8, r1\n\ + cmp r0, 0xFF\n\ + bne _08043822\n\ + lsls r1, r2, 1\n\ + adds r1, r7\n\ + ldrh r2, [r1]\n\ + adds r0, r6, 0\n\ + ands r0, r2\n\ + mov r2, r12\n\ + orrs r0, r2\n\ + strh r0, [r1]\n\ + lsls r3, 24\n\ + asrs r1, r3, 23\n\ + adds r1, r7\n\ + adds r1, 0x40\n\ + ldrh r2, [r1]\n\ + adds r0, r6, 0\n\ + ands r0, r2\n\ + mov r5, r12\n\ + orrs r0, r5\n\ + strh r0, [r1]\n\ + b _08043852\n\ +_08043822:\n\ + lsls r2, 1\n\ + adds r2, r7\n\ + ldrh r0, [r2]\n\ + adds r1, r6, 0\n\ + ands r1, r0\n\ + ldrb r0, [r5]\n\ + adds r0, 0x14\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ + lsls r4, r3, 24\n\ + asrs r3, r4, 24\n\ + lsls r2, r3, 1\n\ + adds r2, r7\n\ + adds r2, 0x40\n\ + ldrh r0, [r2]\n\ + adds r1, r6, 0\n\ + ands r1, r0\n\ + mov r5, sp\n\ + adds r0, r5, r3\n\ + ldrb r0, [r0]\n\ + adds r0, 0x34\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ + adds r3, r4, 0\n\ +_08043852:\n\ + movs r0, 0x80\n\ + lsls r0, 17\n\ + add r0, r8\n\ + lsrs r1, r0, 24\n\ + movs r2, 0x80\n\ + lsls r2, 17\n\ + adds r0, r3, r2\n\ + lsrs r3, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _080437EC\n\ + b _080438CE\n\ +_0804386A:\n\ + movs r3, 0\n\ + movs r4, 0xFC\n\ + lsls r4, 8\n\ + movs r6, 0x1E\n\ +_08043872:\n\ + lsls r1, r3, 24\n\ + asrs r2, r1, 24\n\ + mov r3, sp\n\ + adds r5, r3, r2\n\ + ldrb r0, [r5]\n\ + adds r3, r1, 0\n\ + cmp r0, 0xFF\n\ + bne _0804389E\n\ + lsls r1, r2, 1\n\ + adds r1, r7\n\ + ldrh r2, [r1]\n\ + adds r0, r4, 0\n\ + ands r0, r2\n\ + orrs r0, r6\n\ + strh r0, [r1]\n\ + adds r1, 0x40\n\ + ldrh r2, [r1]\n\ + adds r0, r4, 0\n\ + ands r0, r2\n\ + orrs r0, r6\n\ + strh r0, [r1]\n\ + b _080438C0\n\ +_0804389E:\n\ + lsls r2, 1\n\ + adds r2, r7\n\ + ldrh r0, [r2]\n\ + adds r1, r4, 0\n\ + ands r1, r0\n\ + ldrb r0, [r5]\n\ + adds r0, 0x14\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ + adds r2, 0x40\n\ + ldrh r0, [r2]\n\ + adds r1, r4, 0\n\ + ands r1, r0\n\ + ldrb r0, [r5]\n\ + adds r0, 0x34\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ +_080438C0:\n\ + movs r5, 0x80\n\ + lsls r5, 17\n\ + adds r0, r3, r5\n\ + lsrs r3, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _08043872\n\ +_080438CE:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +void unref_sub_80438E0(s16 a, s16 b, u16 *c) +{ + c[4] = 0x1E; + sub_8043740(b, c, 0); + sub_8043740(a, c + 5, 1); +} + +u8 battle_make_oam_normal_battle(u8 a) +{ + int sp0 = 0; + u8 spriteId1; + u8 spriteId2; + u8 spriteId3; + struct Sprite *sprite; + + if (!IsDoubleBattle()) + { + if (battle_side_get_owner(a) == 0) + { + spriteId1 = CreateSprite(&gSpriteTemplate_820A4EC[0], 240, 160, 1); + spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A4EC[0], 240, 160, 1); + + gSprites[spriteId1].oam.shape = 0; + gSprites[spriteId2].oam.shape = 0; + gSprites[spriteId2].oam.tileNum += 64; + } + else + { + spriteId1 = CreateSprite(&gSpriteTemplate_820A51C[0], 240, 160, 1); + spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A51C[0], 240, 160, 1); + + gSprites[spriteId2].oam.tileNum += 32; + sp0 = 2; + } + //_080439F2 + + gSprites[spriteId1].oam.affineParam = spriteId2; + gSprites[spriteId2].data5 = spriteId1; + gSprites[spriteId2].callback = sub_8043D5C; + } + //_08043A28 + else + { + if (battle_side_get_owner(a) == 0) + { + spriteId1 = CreateSprite(&gSpriteTemplate_820A4EC[battle_get_per_side_status(a) / 2], 240, 160, 1); + spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A4EC[battle_get_per_side_status(a) / 2], 240, 160, 1); + + gSprites[spriteId1].oam.affineParam = spriteId2; + gSprites[spriteId2].data5 = spriteId1; + gSprites[spriteId2].oam.tileNum += 32; + gSprites[spriteId2].callback = sub_8043D5C; + sp0 = 1; + } + //_08043ACC + else + { + spriteId1 = CreateSprite(&gSpriteTemplate_820A51C[battle_get_per_side_status(a) / 2], 240, 160, 1); + spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A51C[battle_get_per_side_status(a) / 2], 240, 160, 1); + + gSprites[spriteId1].oam.affineParam = spriteId2; + gSprites[spriteId2].data5 = spriteId1; + gSprites[spriteId2].oam.tileNum += 32; + gSprites[spriteId2].callback = sub_8043D5C; + sp0 = 2; + } + //_08043B4E + } + //_08043B50 + + spriteId3 = CreateSpriteAtEnd(&gSpriteTemplate_820A56C[gUnknown_02024A72[a]], 140, 60, 0); + sprite = &gSprites[spriteId3]; + SetSubspriteTables(sprite, &gSubspriteTables_820A684[battle_side_get_owner(a)]); + sprite->subspriteMode = 2; + sprite->oam.priority = 1; + CpuCopy32(sub_8043CDC(1), (void *)(OBJ_VRAM0 + sprite->oam.tileNum * 32), 64); + + gSprites[spriteId1].data5 = spriteId3; + gSprites[spriteId1].data6 = a; + gSprites[spriteId1].invisible = TRUE; + gSprites[spriteId2].invisible = TRUE; + sprite->data5 = spriteId1; + sprite->data6 = sp0; + sprite->invisible = TRUE; + + return spriteId1; +} + +u8 battle_make_oam_safari_battle(void) +{ + u8 spriteId1 = CreateSprite(&gSpriteTemplate_820A54C, 240, 160, 1); + u8 spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A54C, 240, 160, 1); + + gSprites[spriteId1].oam.shape = 0; + gSprites[spriteId2].oam.shape = 0; + gSprites[spriteId2].oam.tileNum += 0x40; + gSprites[spriteId1].oam.affineParam = spriteId2; + gSprites[spriteId2].data5 = spriteId1; + gSprites[spriteId2].callback = sub_8043D5C; + return spriteId1; +} + +static const void *sub_8043CDC(u8 a) +{ + return gUnknown_08D1216C[a]; +} + +void sub_8043CEC(struct Sprite *sprite) +{ + u8 r5 = sprite->data5; + + switch (sprite->data6) + { + case 0: + sprite->pos1.x = gSprites[r5].pos1.x + 16; + sprite->pos1.y = gSprites[r5].pos1.y; + break; + case 1: + sprite->pos1.x = gSprites[r5].pos1.x + 16; + sprite->pos1.y = gSprites[r5].pos1.y; + break; + default: + case 2: + sprite->pos1.x = gSprites[r5].pos1.x + 8; + sprite->pos1.y = gSprites[r5].pos1.y; + break; + } + sprite->pos2.x = gSprites[r5].pos2.x; + sprite->pos2.y = gSprites[r5].pos2.y; +} + +static void sub_8043D5C(struct Sprite *sprite) +{ + u8 data5 = sprite->data5; + + sprite->pos1.x = gSprites[data5].pos1.x + 64; + sprite->pos1.y = gSprites[data5].pos1.y; + sprite->pos2.x = gSprites[data5].pos2.x; + sprite->pos2.y = gSprites[data5].pos2.y; +} + +void sub_8043D84(u8 a, u8 b, u32 c, u32 d, u32 e) +{ + ewram17850[a].unk0 = b; + ewram17850[a].unk4 = c; + ewram17850[a].unk8 = d; + ewram17850[a].unkC = e; + ewram17850[a].unk10 = 0xFFFF8000; +} + +void sub_8043DB0(u8 a) +{ + gSprites[a].invisible = TRUE; + gSprites[gSprites[a].data5].invisible = TRUE; + gSprites[gSprites[a].oam.affineParam].invisible = TRUE; +} + +void sub_8043DFC(u8 a) +{ + gSprites[a].invisible = FALSE; + gSprites[gSprites[a].data5].invisible = FALSE; + gSprites[gSprites[a].oam.affineParam].invisible = FALSE; +} + +static void sub_8043E50(u8 spriteId, s16 x, s16 y) +{ + gSprites[spriteId].pos1.x = x; + gSprites[spriteId].pos1.y = y; +} + +void unref_sub_8043E70(u8 a) +{ + DestroySprite(&gSprites[gSprites[a].oam.affineParam]); + DestroySprite(&gSprites[gSprites[a].data5]); + DestroySprite(&gSprites[a]); +} + +void nullsub_11() +{ +} + +void sub_8043EB4(u8 priority) +{ + s32 i; + + for (i = 0; i < gUnknown_02024A68; i++) + { + u8 spriteId1; + u8 spriteId2; + u8 spriteId3; + + spriteId1 = gUnknown_03004340[i]; + spriteId2 = gSprites[spriteId1].oam.affineParam; + spriteId3 = gSprites[spriteId1].data5; + gSprites[spriteId1].oam.priority = priority; + gSprites[spriteId2].oam.priority = priority; + gSprites[spriteId3].oam.priority = priority; + } +} + +void sub_8043F44(u8 a) +{ + s16 x = 0; + s16 y = 0; + + if (!IsDoubleBattle()) + { + if (battle_side_get_owner(a) != 0) + { + x = 44; + y = 30; + } + else + { + x = 158; + y = 88; + } + } + else + { + switch (battle_get_per_side_status(a)) + { + case 0: + x = 159; + y = 77; + break; + case 2: + x = 171; + y = 102; + break; + case 1: + x = 44; + y = 19; + break; + case 3: + x = 32; + y = 44; + break; + } + } + sub_8043E50(gUnknown_03004340[a], x, y); +} + +#if ENGLISH +#define CHAR_LV_SEPARATOR CHAR_COLON +#elif GERMAN +#define CHAR_LV_SEPARATOR CHAR_PERIOD +#endif + +static void sub_8043FC0(u8 a, u8 b) +{ + u8 str[30]; + void *const *r7; + u8 *ptr; + s32 i; + s32 two; + + // TODO: Make this a local variable + memcpy(str, gUnknown_0820A81C, sizeof(str)); + if (!IsDoubleBattle()) + { + if (battle_side_get_owner(gSprites[a].data6) == 0) + r7 = gUnknown_0820A804; + else + r7 = gUnknown_0820A80C; + } + else + { + if (battle_side_get_owner(gSprites[a].data6) == 0) + r7 = gUnknown_0820A814; + else + r7 = gUnknown_0820A80C; + } + + ptr = str + 6; + if (b == 100) + { + ptr = ConvertIntToDecimalStringN(ptr, 100, 0, 3); + } + else + { + *(ptr++) = EXT_CTRL_CODE_BEGIN; + *(ptr++) = 0x11; + *(ptr++) = 1; + *(ptr++) = EXT_CTRL_CODE_BEGIN; + *(ptr++) = 0x14; + *(ptr++) = 4; + *(ptr++) = CHAR_LV_SEPARATOR; + *(ptr++) = EXT_CTRL_CODE_BEGIN; + *(ptr++) = 0x14; + *(ptr++) = 0; + ptr = ConvertIntToDecimalStringN(ptr, b, 0, 2); + } + + *(ptr++) = EXT_CTRL_CODE_BEGIN; + *(ptr++) = 0x13; + *(ptr++) = 0xF; + *(ptr++) = EOS; + sub_80034D4((u8 *)0x02000000, str); + + two = 2; + for (i = 0; i < two; i++) + CpuCopy32((void *)(0x02000020 + i * 64), r7[i] + gSprites[a].oam.tileNum * 32, 32); +} + +#ifdef NONMATCHING +void sub_80440EC(u8 a, s16 b, u8 c) +{ + u8 str[0x14]; + u8 *ptr; + s32 foo; + void *const *r4; + s32 i; + + // TODO: make this a local variable + memcpy(str, gUnknown_0820A864, sizeof(str)); + foo = gSprites[a].data6; + + if (IsDoubleBattle() == TRUE || battle_side_get_owner(foo) == 1) + { + //_08044136 + sub_8044210(a, b, c); + return; + } + // + ptr = str + 6; + if (c == 0) + { + if (battle_side_get_owner(gSprites[a].data6) == 0) + r4 = gUnknown_0820A83C; + else + r4 = gUnknown_0820A848; + c = 3; + ptr = sub_8003504(ptr, b, 0x13, 1); + *(ptr++) = 0xBA; + *(ptr++) = 0xFF; + sub_80034D4((u8 *)0x02000000, str); + } + else + { + if (battle_side_get_owner(gSprites[a].data6) == 0) + r4 = gUnknown_0820A854; + else + r4 = gUnknown_0820A85C; + c = 2; + sub_8003504(ptr, b, 0xF, 1); + sub_80034D4((u8 *)0x02000000, str); + } + //asm(""::"r"(a)); + //_080441B6 + for (i = 0; i < c; i++) // _080440BC + { + void *temp = r4[i] + gSprites[a].oam.tileNum * 32; + CpuCopy32((void *)(0x02000020 + i * 0x40), temp, 0x20); + } +} +#else +__attribute__((naked)) +void sub_80440EC(u8 a, s16 b, u8 c) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0x14\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + lsls r1, 16\n\ + lsrs r6, r1, 16\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + mov r8, r2\n\ + ldr r1, _08044144 @ =gUnknown_0820A864\n\ + mov r0, sp\n\ + movs r2, 0x14\n\ + bl memcpy\n\ + ldr r1, _08044148 @ =gSprites\n\ + lsls r0, r7, 4\n\ + adds r0, r7\n\ + lsls r0, 2\n\ + adds r4, r0, r1\n\ + movs r0, 0x3A\n\ + ldrsh r5, [r4, r0]\n\ + bl IsDoubleBattle\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _08044136\n\ + lsls r0, r5, 24\n\ + lsrs r0, 24\n\ + bl battle_side_get_owner\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0804414C\n\ +_08044136:\n\ + lsls r1, r6, 16\n\ + asrs r1, 16\n\ + adds r0, r7, 0\n\ + mov r2, r8\n\ + bl sub_8044210\n\ + b _080441F0\n\ + .align 2, 0\n\ +_08044144: .4byte gUnknown_0820A864\n\ +_08044148: .4byte gSprites\n\ +_0804414C:\n\ + mov r5, sp\n\ + adds r5, 0x6\n\ + mov r0, r8\n\ + cmp r0, 0\n\ + bne _08044190\n\ + ldrh r0, [r4, 0x3A]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl battle_side_get_owner\n\ + lsls r0, 24\n\ + ldr r4, _08044188 @ =gUnknown_0820A848\n\ + cmp r0, 0\n\ + bne _0804416A\n\ + ldr r4, _0804418C @ =gUnknown_0820A83C\n\ +_0804416A:\n\ + movs r0, 0x3\n\ + mov r8, r0\n\ + lsls r1, r6, 16\n\ + asrs r1, 16\n\ + adds r0, r5, 0\n\ + movs r2, 0x13\n\ + movs r3, 0x1\n\ + bl sub_8003504\n\ + adds r5, r0, 0\n\ + movs r0, 0xBA\n\ + strb r0, [r5]\n\ + movs r0, 0xFF\n\ + strb r0, [r5, 0x1]\n\ + b _080441B6\n\ + .align 2, 0\n\ +_08044188: .4byte gUnknown_0820A848\n\ +_0804418C: .4byte gUnknown_0820A83C\n\ +_08044190:\n\ + ldrh r0, [r4, 0x3A]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl battle_side_get_owner\n\ + lsls r0, 24\n\ + ldr r4, _080441FC @ =gUnknown_0820A85C\n\ + cmp r0, 0\n\ + bne _080441A4\n\ + ldr r4, _08044200 @ =gUnknown_0820A854\n\ +_080441A4:\n\ + movs r0, 0x2\n\ + mov r8, r0\n\ + lsls r1, r6, 16\n\ + asrs r1, 16\n\ + adds r0, r5, 0\n\ + movs r2, 0xF\n\ + movs r3, 0x1\n\ + bl sub_8003504\n\ +_080441B6:\n\ + movs r0, 0x80\n\ + lsls r0, 18\n\ + mov r1, sp\n\ + bl sub_80034D4\n\ + mov r0, r8\n\ + cmp r0, 0\n\ + beq _080441F0\n\ + ldr r1, _08044204 @ =gSprites\n\ + lsls r0, r7, 4\n\ + adds r0, r7\n\ + lsls r0, 2\n\ + adds r6, r0, r1\n\ + adds r7, r4, 0\n\ + ldr r5, _08044208 @ =0x02000020\n\ + mov r4, r8\n\ +_080441D6:\n\ + ldrh r0, [r6, 0x4]\n\ + lsls r0, 22\n\ + lsrs r0, 17\n\ + ldm r7!, {r1}\n\ + adds r1, r0\n\ + adds r0, r5, 0\n\ + ldr r2, _0804420C @ =REG_BG0CNT\n\ + bl CpuSet\n\ + adds r5, 0x40\n\ + subs r4, 0x1\n\ + cmp r4, 0\n\ + bne _080441D6\n\ +_080441F0:\n\ + add sp, 0x14\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080441FC: .4byte gUnknown_0820A85C\n\ +_08044200: .4byte gUnknown_0820A854\n\ +_08044204: .4byte gSprites\n\ +_08044208: .4byte 0x02000020\n\ +_0804420C: .4byte 0x04000008\n\ + .syntax divided\n"); +} +#endif + +void sub_8044210(u8 a, s16 b, u8 c) +{ + u8 str[0x14]; + u8 *ptr; + void *const *r7; + int r10; + int r4; + int i; + + // TODO: make this a local variable + memcpy(str, gUnknown_0820A89C, sizeof(str)); + r4 = gSprites[a].data6; + if ((ewram17800[r4].bit_4) == 0) + return; + ptr = str + 6; + if (c == 0) + { + r7 = gUnknown_0820A87C; + r10 = 6; + ptr = sub_8003504(ptr, b, 0x2B, 1); + *(ptr++) = CHAR_SLASH; + *(ptr++) = EOS; + } + else + { + r7 = gUnknown_0820A894; + r10 = 2; + sub_8003504(ptr, b, 0xF, 1); + if (battle_side_get_owner(r4) == 0) + { + CpuCopy32(sub_8043CDC(0x74), (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x34) * 32), 32); + } + } + r4 = gSprites[a].data5; + sub_80034D4((u8 *)0x02000000, str); + for (i = 0; i < r10; i++) + { + CpuCopy32((void *)(0x02000020 + i * 0x40), r7[i] + gSprites[r4].oam.tileNum * 32, 0x20); + } +} + +#ifdef NONMATCHING +void sub_8044338(u8 a, struct Pokemon *pkmn) +{ + u8 str[0x14]; + u8 *r6; + s32 r8; + u8 nature; // = GetNature(pkmn); + s32 r7; + u8 i; + u8 r5; + + // TODO: make this a local variable + memcpy(str, gUnknown_0820A864, sizeof(str)); + r6 = ewram520[battle_get_per_side_status(gSprites[a].data6)].filler0; + r8 = 5; + nature = GetNature(pkmn); + StringCopy(str + 6, gNatureNames[nature]); + sub_80034D4(r6, str); + r7 = 6; + for (i = 0; i < (u32)r8; i++, r7++) //_080443AA + { + u8 val; + + if ((u8)(str[r7] - 0x37) <= 0x13 || (u8)(str[r7] + 0x79) <= 0x13) + val = 0x2C; + //_080443DC + else if ((u8)(str[r7] - 0x4B) <= 4 || (u8)(str[r7] + 0x65) <= 4) + val = 0x2D; + else + val = 0x2B; + + CpuCopy32(sub_8043CDC(val), r6 + i * 64, 32); + } + //r7 = 1; + //sp18 = a * 16; + for (r7 = 1; r7 < r8 + 1; r7++) + { + int foo; + + foo = gSprites[a].oam.tileNum + MACRO1(r7); + CpuCopy32(r6, (u8 *)0x06010000 + foo * 32, 32); + r6 += 32; + + foo = gSprites[a].oam.tileNum + 8 + MACRO1(r7); + CpuCopy32(r6, (u8 *)0x06010000 + foo * 32, 32); + r6 += 32; + } + //_08044486 + r5 = gSprites[a].data5; + ConvertIntToDecimalStringN(str + 6, ewram[0x16089], 1, 2); + ConvertIntToDecimalStringN(str + 9, ewram[0x16088], 1, 2); + str[5] = 0; + str[8] = 0xBA; + sub_80034D4((u8 *)0x02000000, str); + + for (r7 = 0; r7 < 5; r7++) + { + if (r7 <= 1) + { + int foo = (gSprites[r5].oam.tileNum + 2 + r7); + CpuCopy32((u8 *)0x02000020 + r7 * 0x40, (u8 *)0x06010000 + foo * 32, 32); + } + else + { + int foo = (r7 + gSprites[r5].oam.tileNum); + CpuCopy32((u8 *)0x02000020 + r7 * 0x40, (u8 *)0x060100C0 + foo * 32, 32); + } + } +} +#else +__attribute__((naked)) +void sub_8044338(u8 a, struct Pokemon *pkmn) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x20\n\ + adds r4, r1, 0\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x14]\n\ + ldr r1, _080443CC @ =gUnknown_0820A864\n\ + mov r0, sp\n\ + movs r2, 0x14\n\ + bl memcpy\n\ + ldr r1, _080443D0 @ =gSprites\n\ + ldr r2, [sp, 0x14]\n\ + lsls r0, r2, 4\n\ + adds r0, r2\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x3A]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl battle_get_per_side_status\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + lsls r1, 7\n\ + ldr r3, _080443D4 @ =0x02000520\n\ + adds r6, r1, r3\n\ + movs r0, 0x5\n\ + mov r8, r0\n\ + adds r0, r4, 0\n\ + bl GetNature\n\ + lsls r0, 24\n\ + mov r4, sp\n\ + adds r4, 0x6\n\ + ldr r1, _080443D8 @ =gNatureNames\n\ + lsrs r0, 22\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + adds r0, r4, 0\n\ + bl StringCopy\n\ + adds r0, r6, 0\n\ + mov r1, sp\n\ + bl sub_80034D4\n\ + movs r7, 0x6\n\ + movs r5, 0\n\ + mov r1, sp\n\ + adds r1, 0x9\n\ + str r1, [sp, 0x1C]\n\ +_080443AA:\n\ + mov r2, sp\n\ + adds r0, r2, r7\n\ + ldrb r1, [r0]\n\ + adds r0, r1, 0\n\ + subs r0, 0x37\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x13\n\ + bls _080443C8\n\ + adds r0, r1, 0\n\ + adds r0, 0x79\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x13\n\ + bhi _080443DC\n\ +_080443C8:\n\ + movs r0, 0x2C\n\ + b _080443FA\n\ + .align 2, 0\n\ +_080443CC: .4byte gUnknown_0820A864\n\ +_080443D0: .4byte gSprites\n\ +_080443D4: .4byte 0x02000520\n\ +_080443D8: .4byte gNatureNames\n\ +_080443DC:\n\ + adds r0, r1, 0\n\ + subs r0, 0x4B\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x4\n\ + bls _080443F4\n\ + adds r0, r1, 0\n\ + adds r0, 0x65\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x4\n\ + bhi _080443F8\n\ +_080443F4:\n\ + movs r0, 0x2D\n\ + b _080443FA\n\ +_080443F8:\n\ + movs r0, 0x2B\n\ +_080443FA:\n\ + bl sub_8043CDC\n\ + lsls r1, r5, 6\n\ + adds r1, r6, r1\n\ + ldr r2, _080444F8 @ =REG_BG0CNT\n\ + bl CpuSet\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + adds r7, 0x1\n\ + cmp r5, r8\n\ + bcc _080443AA\n\ + movs r7, 0x1\n\ + ldr r3, [sp, 0x14]\n\ + lsls r3, 4\n\ + str r3, [sp, 0x18]\n\ + movs r0, 0x1\n\ + add r0, r8\n\ + mov r9, r0\n\ + cmp r7, r9\n\ + bge _08044486\n\ + ldr r1, _080444FC @ =gSprites\n\ + ldr r2, _080444F8 @ =REG_BG0CNT\n\ + mov r10, r2\n\ + ldr r2, [sp, 0x14]\n\ + adds r0, r3, r2\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + mov r8, r0\n\ +_08044436:\n\ + mov r3, r8\n\ + ldrh r0, [r3, 0x4]\n\ + lsls r0, 22\n\ + lsrs r0, 22\n\ + adds r5, r7, 0\n\ + cmp r7, 0\n\ + bge _08044446\n\ + adds r5, r7, 0x7\n\ +_08044446:\n\ + asrs r5, 3\n\ + lsls r4, r5, 3\n\ + subs r4, r7, r4\n\ + adds r0, r4\n\ + lsls r5, 6\n\ + adds r0, r5\n\ + lsls r0, 5\n\ + ldr r2, _08044500 @ =0x06010000\n\ + adds r1, r0, r2\n\ + adds r0, r6, 0\n\ + mov r2, r10\n\ + bl CpuSet\n\ + adds r6, 0x20\n\ + mov r3, r8\n\ + ldrh r0, [r3, 0x4]\n\ + lsls r0, 22\n\ + lsrs r0, 22\n\ + adds r4, 0x8\n\ + adds r0, r4\n\ + adds r0, r5\n\ + lsls r0, 5\n\ + ldr r2, _08044500 @ =0x06010000\n\ + adds r1, r0, r2\n\ + adds r0, r6, 0\n\ + mov r2, r10\n\ + bl CpuSet\n\ + adds r6, 0x20\n\ + adds r7, 0x1\n\ + cmp r7, r9\n\ + blt _08044436\n\ +_08044486:\n\ + ldr r6, _080444FC @ =gSprites\n\ + ldr r3, [sp, 0x18]\n\ + ldr r1, [sp, 0x14]\n\ + adds r0, r3, r1\n\ + lsls r0, 2\n\ + adds r0, r6\n\ + ldrh r5, [r0, 0x38]\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + ldr r4, _08044504 @ =0x02000000\n\ + ldr r2, _08044508 @ =0x00016089\n\ + adds r0, r4, r2\n\ + ldrb r1, [r0]\n\ + mov r0, sp\n\ + adds r0, 0x6\n\ + movs r2, 0x1\n\ + movs r3, 0x2\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r3, _0804450C @ =0x00016088\n\ + adds r4, r3\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp, 0x1C]\n\ + movs r2, 0x1\n\ + movs r3, 0x2\n\ + bl ConvertIntToDecimalStringN\n\ + mov r1, sp\n\ + movs r0, 0\n\ + strb r0, [r1, 0x5]\n\ + movs r0, 0xBA\n\ + strb r0, [r1, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 18\n\ + bl sub_80034D4\n\ + movs r7, 0\n\ + lsls r0, r5, 4\n\ + adds r0, r5\n\ + lsls r0, 2\n\ + adds r5, r0, r6\n\ + ldr r4, _08044510 @ =0x02000020\n\ +_080444DA:\n\ + cmp r7, 0x1\n\ + bgt _08044514\n\ + ldrh r1, [r5, 0x4]\n\ + lsls r1, 22\n\ + lsrs r1, 22\n\ + adds r0, r7, 0x2\n\ + adds r1, r0\n\ + lsls r1, 5\n\ + ldr r0, _08044500 @ =0x06010000\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + ldr r2, _080444F8 @ =REG_BG0CNT\n\ + bl CpuSet\n\ + b _0804452A\n\ + .align 2, 0\n\ +_080444F8: .4byte 0x04000008\n\ +_080444FC: .4byte gSprites\n\ +_08044500: .4byte 0x06010000\n\ +_08044504: .4byte 0x02000000\n\ +_08044508: .4byte 0x00016089\n\ +_0804450C: .4byte 0x00016088\n\ +_08044510: .4byte 0x02000020\n\ +_08044514:\n\ + ldrh r1, [r5, 0x4]\n\ + lsls r1, 22\n\ + lsrs r1, 22\n\ + adds r1, r7, r1\n\ + lsls r1, 5\n\ + ldr r2, _08044544 @ =0x060100c0\n\ + adds r1, r2\n\ + adds r0, r4, 0\n\ + ldr r2, _08044548 @ =REG_BG0CNT\n\ + bl CpuSet\n\ +_0804452A:\n\ + adds r4, 0x40\n\ + adds r7, 0x1\n\ + cmp r7, 0x4\n\ + ble _080444DA\n\ + add sp, 0x20\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08044544: .4byte 0x060100c0\n\ +_08044548: .4byte 0x04000008\n\ + .syntax divided\n"); +} +#endif + +void sub_804454C(void) +{ + s32 i; + u8 spriteId; + + for (i = 0; i < gUnknown_02024A68; i++) + { + if (gSprites[gUnknown_03004340[i]].callback == SpriteCallbackDummy + && battle_side_get_owner(i) != 1 + && (IsDoubleBattle() || battle_side_get_owner(i) != 0)) + { + u8 r6; + + ewram17800[i].bit_4 ^= 1; + r6 = ewram17800[i].bit_4; + if (battle_side_get_owner(i) == 0) + { + + if (!IsDoubleBattle()) + continue; + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + continue; + + if (r6 == 1) + { + spriteId = gSprites[gUnknown_03004340[i]].data5; + + CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); + sub_8044210(gUnknown_03004340[i], GetMonData(&gPlayerParty[gUnknown_02024A6A[i]], MON_DATA_HP), 0); + sub_8044210(gUnknown_03004340[i], GetMonData(&gPlayerParty[gUnknown_02024A6A[i]], MON_DATA_MAX_HP), 1); + } + else + { + draw_status_ailment_maybe(gUnknown_03004340[i]); + sub_8045A5C(gUnknown_03004340[i], &gPlayerParty[gUnknown_02024A6A[i]], 5); + CpuCopy32(sub_8043CDC(0x75), (void *)(OBJ_VRAM0 + 0x680 + gSprites[gUnknown_03004340[i]].oam.tileNum * 32), 32); + } + } + else + { + if (r6 == 1) + { + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + { + sub_8044338(gUnknown_03004340[i], &gEnemyParty[gUnknown_02024A6A[i]]); + } + else + { + spriteId = gSprites[gUnknown_03004340[i]].data5; + + CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); + sub_8044210(gUnknown_03004340[i], GetMonData(&gEnemyParty[gUnknown_02024A6A[i]], MON_DATA_HP), 0); + sub_8044210(gUnknown_03004340[i], GetMonData(&gEnemyParty[gUnknown_02024A6A[i]], MON_DATA_MAX_HP), 1); + } + } + else + { + draw_status_ailment_maybe(gUnknown_03004340[i]); + sub_8045A5C(gUnknown_03004340[i], &gEnemyParty[gUnknown_02024A6A[i]], 5); + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + sub_8045A5C(gUnknown_03004340[i], &gEnemyParty[gUnknown_02024A6A[i]], 4); + } + } + gSprites[gUnknown_03004340[i]].data7 ^= 1; + } + } +} + +struct UnknownStruct8 +{ + u16 unk0; + u32 unk4; +}; + +// This function almost matches except for just two instructions around 0x08044B52 that are swapped. +#ifdef NONMATCHING +u8 sub_8044804(u8 a, const struct UnknownStruct8 *b, u8 c, u8 d) +{ + u8 r7; + s16 x; + s16 y; + s16 r8; + s16 r5; + + int i; + u8 sp[6]; + s8 sp14; + u8 sp18; + u8 taskId; + + if (c == 0 || battle_get_per_side_status(a) != 3) + { + if (battle_side_get_owner(a) == 0) + { + r7 = 0; + x = 136; + y = 96; + r8 = 100; + r5 = -5; + } + else + { + r7 = 1; + if (c == 0 || !IsDoubleBattle()) + { + x = 104; + y = 40; + } + else + { + x = 104; + y = 16; + } + r8 = -100; + r5 = 5; + } + } + else + { + r7 = 1; + x = 104; + y = 40; + r8 = -100; + r5 = 5; + } + //_08044884 + + sp14 = 0; + for (i = 0; i < 6; i++) //_080448A0 + { + if (b[i].unk0 != 0xFFFF) + sp14++; + } + + LoadCompressedObjectPic(&gUnknown_0820A754[r7]); + LoadSpriteSheet(&gUnknown_0820A784[r7]); + LoadSpritePalette(&gUnknown_0820A764[r7]); + LoadSpritePalette(&gUnknown_0820A774[r7]); + + sp18 = CreateSprite(&gSpriteTemplate_820A7A4[r7], x, y, 10); + SetSubspriteTables(&gSprites[sp18], gSubspriteTables_820A6E4); + gSprites[sp18].pos2.x = r8; + gSprites[sp18].data0 = r5; + if (r7 != 0) + { + gSprites[sp18].pos1.x -= 96; + gSprites[sp18].oam.matrixNum = 8; + } + else + { + gSprites[sp18].pos1.x += 0x60; + } + //_0804495A + for (i = 0; i < 6; i++) //_08044970 + { + sp[i] = CreateSpriteAtEnd(&gSpriteTemplate_820A7D4[r7], x, y - 4, 9); + if (d == 0) + { + gSprites[sp[i]].callback = sub_8045180; + } + //_080449A0 + if (r7 == 0) + { + gSprites[sp[i]].pos2.x = 0; + gSprites[sp[i]].pos2.y = 0; + } + //_080449BE + gSprites[sp[i]].data0 = sp18; + if (r7 == 0) + { + gSprites[sp[i]].pos1.x += 10 * i + 24; + gSprites[sp[i]].data1 = i * 7 + 10; + gSprites[sp[i]].pos2.x = 120; + } + //_08044A18 + else + { + gSprites[sp[i]].pos1.x -= 10 * (5 - i) + 24; + gSprites[sp[i]].data1 = (6 - i) * 7 + 10; + gSprites[sp[i]].pos2.x = -120; + } + //_08044A56 + gSprites[sp[i]].data2 = r7; + } + //_08044A76 + if (battle_side_get_owner(a) == 0) + { + for (i = 0; i < 6; i++) //_08044A9A + { + if (gBattleTypeFlags & BATTLE_TYPE_40) // && b[i] != 0xFFFF && b[i] + { + if (b[i].unk0 == 0xFFFF) + { + //_08044AE6 + gSprites[sp[i]].oam.tileNum += 1; + gSprites[sp[i]].data7 = 1; + // to _08044B52 + } + else if (b[i].unk0 == 0) + { + gSprites[sp[i]].oam.tileNum += 3; + // to _08044B46 + } + else if (b[i].unk4 != 0) + { + gSprites[sp[i]].oam.tileNum += 2; + } + } + //_08044ADC + else + { + if (i >= sp14) + { + //_08044AE6 + gSprites[sp[i]].oam.tileNum += 1; + gSprites[sp[i]].data7 = 1; + // to _08044B52 + } + else if (b[i].unk0 == 0) + { + //_08044B14 + gSprites[sp[i]].oam.tileNum += 3; + // to _08044B46 + } + else if (b[i].unk4 != 0) + { + gSprites[sp[i]].oam.tileNum += 2; + } + } + } + } + //_08044B5E + else + { + // Mismatch occurrs in this loop initialization + for (i = 0; i < 6; i++) + { + if (gBattleTypeFlags & BATTLE_TYPE_40) + { + if (b[i].unk0 == 0xFFFF) + { + gSprites[sp[5 - i]].oam.tileNum += 1; + gSprites[sp[5 - i]].data7 = 1; + } + else if (b[i].unk0 == 0) + { + gSprites[sp[5 - i]].oam.tileNum += 3; + } + else if (b[i].unk4 != 0) + { + gSprites[sp[5 - i]].oam.tileNum += 2; + } + } + else + { + if (i >= sp14) + { + gSprites[sp[5 - i]].oam.tileNum += 1; + gSprites[sp[5 - i]].data7 = 1; + } + else if (b[i].unk0 == 0) + { + gSprites[sp[5 - i]].oam.tileNum += 3; + } + else if (b[i].unk4 != 0) + { + gSprites[sp[5 - i]].oam.tileNum += 2; + } + } + // This corrects the initialization order, but messes up the counter update order + asm(""::"r"(&b[i])); + } + } + //_08044C38 + taskId = CreateTask(TaskDummy, 5); + gTasks[taskId].data[0] = a; + gTasks[taskId].data[1] = sp18; + for (i = 0; i < 6; i++) + gTasks[taskId].data[3 + i] = sp[i]; + gTasks[taskId].data[10] = d; + PlaySE12WithPanning(SE_TB_START, 0); + return taskId; +} +#else +__attribute__((naked)) +u8 sub_8044804(u8 a, const struct UnknownStruct8 *b, u8 c, u8 d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x28\n\ + str r1, [sp, 0xC]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x8]\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r4, r2, 0\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + str r3, [sp, 0x10]\n\ + cmp r4, 0\n\ + beq _08044834\n\ + bl battle_get_per_side_status\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x3\n\ + beq _08044878\n\ +_08044834:\n\ + ldr r0, [sp, 0x8]\n\ + bl battle_side_get_owner\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08044854\n\ + movs r7, 0\n\ + movs r1, 0x88\n\ + movs r2, 0x60\n\ + movs r0, 0x64\n\ + mov r8, r0\n\ + ldr r5, _08044850 @ =0x0000fffb\n\ + b _08044884\n\ + .align 2, 0\n\ +_08044850: .4byte 0x0000fffb\n\ +_08044854:\n\ + movs r7, 0x1\n\ + cmp r4, 0\n\ + beq _08044864\n\ + bl IsDoubleBattle\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0804486A\n\ +_08044864:\n\ + movs r1, 0x68\n\ + movs r2, 0x28\n\ + b _0804486E\n\ +_0804486A:\n\ + movs r1, 0x68\n\ + movs r2, 0x10\n\ +_0804486E:\n\ + ldr r3, _08044874 @ =0x0000ff9c\n\ + mov r8, r3\n\ + b _08044882\n\ + .align 2, 0\n\ +_08044874: .4byte 0x0000ff9c\n\ +_08044878:\n\ + movs r7, 0x1\n\ + movs r1, 0x68\n\ + movs r2, 0x28\n\ + ldr r5, _08044930 @ =0x0000ff9c\n\ + mov r8, r5\n\ +_08044882:\n\ + movs r5, 0x5\n\ +_08044884:\n\ + movs r6, 0\n\ + str r6, [sp, 0x14]\n\ + lsls r4, r7, 3\n\ + ldr r0, _08044934 @ =gUnknown_0820A754\n\ + mov r10, r0\n\ + lsls r3, r7, 1\n\ + mov r9, r3\n\ + lsls r1, 16\n\ + str r1, [sp, 0x20]\n\ + lsls r2, 16\n\ + str r2, [sp, 0x24]\n\ + ldr r2, _08044938 @ =0x0000ffff\n\ + ldr r1, [sp, 0xC]\n\ + movs r6, 0x5\n\ +_080448A0:\n\ + ldrh r0, [r1]\n\ + cmp r0, r2\n\ + beq _080448B4\n\ + ldr r3, [sp, 0x14]\n\ + lsls r0, r3, 24\n\ + movs r3, 0x80\n\ + lsls r3, 17\n\ + adds r0, r3\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x14]\n\ +_080448B4:\n\ + adds r1, 0x8\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080448A0\n\ + mov r6, r10\n\ + adds r0, r4, r6\n\ + bl LoadCompressedObjectPic\n\ + ldr r0, _0804493C @ =gUnknown_0820A784\n\ + adds r0, r4, r0\n\ + bl LoadSpriteSheet\n\ + ldr r0, _08044940 @ =gUnknown_0820A764\n\ + adds r0, r4, r0\n\ + bl LoadSpritePalette\n\ + ldr r0, _08044944 @ =gUnknown_0820A774\n\ + adds r0, r4, r0\n\ + bl LoadSpritePalette\n\ + mov r1, r9\n\ + adds r0, r1, r7\n\ + lsls r0, 3\n\ + ldr r1, _08044948 @ =gSpriteTemplate_820A7A4\n\ + adds r0, r1\n\ + ldr r2, [sp, 0x20]\n\ + asrs r1, r2, 16\n\ + ldr r3, [sp, 0x24]\n\ + asrs r2, r3, 16\n\ + movs r3, 0xA\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x18]\n\ + lsls r0, 4\n\ + ldr r6, [sp, 0x18]\n\ + adds r0, r6\n\ + lsls r0, 2\n\ + ldr r1, _0804494C @ =gSprites\n\ + adds r4, r0, r1\n\ + ldr r1, _08044950 @ =gSubspriteTables_820A6E4\n\ + adds r0, r4, 0\n\ + bl SetSubspriteTables\n\ + mov r0, r8\n\ + strh r0, [r4, 0x24]\n\ + strh r5, [r4, 0x2E]\n\ + cmp r7, 0\n\ + beq _08044954\n\ + ldrh r0, [r4, 0x20]\n\ + subs r0, 0x60\n\ + strh r0, [r4, 0x20]\n\ + ldrb r1, [r4, 0x3]\n\ + movs r0, 0x3F\n\ + negs r0, r0\n\ + ands r0, r1\n\ + movs r1, 0x10\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x3]\n\ + b _0804495A\n\ + .align 2, 0\n\ +_08044930: .4byte 0x0000ff9c\n\ +_08044934: .4byte gUnknown_0820A754\n\ +_08044938: .4byte 0x0000ffff\n\ +_0804493C: .4byte gUnknown_0820A784\n\ +_08044940: .4byte gUnknown_0820A764\n\ +_08044944: .4byte gUnknown_0820A774\n\ +_08044948: .4byte gSpriteTemplate_820A7A4\n\ +_0804494C: .4byte gSprites\n\ +_08044950: .4byte gSubspriteTables_820A6E4\n\ +_08044954:\n\ + ldrh r0, [r4, 0x20]\n\ + adds r0, 0x60\n\ + strh r0, [r4, 0x20]\n\ +_0804495A:\n\ + movs r6, 0\n\ + ldr r1, _08044A04 @ =gSprites\n\ + mov r10, r1\n\ + mov r4, sp\n\ + mov r2, r9\n\ + adds r0, r2, r7\n\ + lsls r0, 3\n\ + str r0, [sp, 0x1C]\n\ + movs r3, 0xA\n\ + mov r9, r3\n\ + mov r8, r6\n\ +_08044970:\n\ + ldr r0, _08044A08 @ =gSpriteTemplate_820A7D4\n\ + ldr r5, [sp, 0x24]\n\ + ldr r1, _08044A0C @ =0xfffc0000\n\ + adds r2, r5, r1\n\ + ldr r3, [sp, 0x1C]\n\ + adds r0, r3, r0\n\ + ldr r5, [sp, 0x20]\n\ + asrs r1, r5, 16\n\ + asrs r2, 16\n\ + movs r3, 0x9\n\ + bl CreateSpriteAtEnd\n\ + strb r0, [r4]\n\ + ldr r0, [sp, 0x10]\n\ + cmp r0, 0\n\ + bne _080449A0\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + ldr r2, _08044A10 @ =gSprites + 0x1C\n\ + adds r1, r2\n\ + ldr r0, _08044A14 @ =sub_8045180\n\ + str r0, [r1]\n\ +_080449A0:\n\ + ldr r5, _08044A04 @ =gSprites\n\ + cmp r7, 0\n\ + bne _080449BE\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + add r0, r10\n\ + strh r7, [r0, 0x24]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + add r0, r10\n\ + strh r7, [r0, 0x26]\n\ +_080449BE:\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + movs r1, 0\n\ + mov r3, sp\n\ + ldrh r3, [r3, 0x18]\n\ + strh r3, [r0, 0x2E]\n\ + cmp r7, 0\n\ + bne _08044A18\n\ + ldrb r0, [r4]\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + ldrh r0, [r1, 0x20]\n\ + adds r0, 0x18\n\ + add r0, r8\n\ + strh r0, [r1, 0x20]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + mov r1, r9\n\ + strh r1, [r0, 0x30]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + movs r1, 0x78\n\ + b _08044A56\n\ + .align 2, 0\n\ +_08044A04: .4byte gSprites\n\ +_08044A08: .4byte gSpriteTemplate_820A7D4\n\ +_08044A0C: .4byte 0xfffc0000\n\ +_08044A10: .4byte gSprites + 0x1C\n\ +_08044A14: .4byte sub_8045180\n\ +_08044A18:\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r5\n\ + ldrh r3, [r2, 0x20]\n\ + subs r3, 0x18\n\ + movs r1, 0x5\n\ + subs r1, r6\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 1\n\ + subs r3, r0\n\ + strh r3, [r2, 0x20]\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r5\n\ + movs r1, 0x6\n\ + subs r1, r6\n\ + lsls r0, r1, 3\n\ + subs r0, r1\n\ + adds r0, 0xA\n\ + strh r0, [r2, 0x30]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + ldr r1, _08044AC4 @ =0x0000ff88\n\ +_08044A56:\n\ + strh r1, [r0, 0x24]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + strh r7, [r0, 0x32]\n\ + adds r4, 0x1\n\ + movs r2, 0x7\n\ + add r9, r2\n\ + movs r3, 0xA\n\ + add r8, r3\n\ + adds r6, 0x1\n\ + cmp r6, 0x5\n\ + bgt _08044A76\n\ + b _08044970\n\ +_08044A76:\n\ + ldr r0, [sp, 0x8]\n\ + bl battle_side_get_owner\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08044B5E\n\ + movs r6, 0\n\ + ldr r5, _08044AC8 @ =gBattleTypeFlags\n\ + mov r10, r5\n\ + ldr r0, _08044ACC @ =0x0000ffff\n\ + mov r9, r0\n\ + ldr r7, _08044AD0 @ =gSprites\n\ + ldr r1, _08044AD4 @ =0x000003ff\n\ + mov r12, r1\n\ + ldr r2, _08044AD8 @ =0xfffffc00\n\ + mov r8, r2\n\ + mov r4, sp\n\ + ldr r5, [sp, 0xC]\n\ +_08044A9A:\n\ + mov r3, r10\n\ + ldrh r1, [r3]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08044ADC\n\ + ldrh r0, [r5]\n\ + cmp r0, r9\n\ + beq _08044AE6\n\ + cmp r0, 0\n\ + bne _08044B2E\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x3\n\ + b _08044B46\n\ + .align 2, 0\n\ +_08044AC4: .4byte 0x0000ff88\n\ +_08044AC8: .4byte gBattleTypeFlags\n\ +_08044ACC: .4byte 0x0000ffff\n\ +_08044AD0: .4byte gSprites\n\ +_08044AD4: .4byte 0x000003ff\n\ +_08044AD8: .4byte 0xfffffc00\n\ +_08044ADC:\n\ + ldr r1, [sp, 0x14]\n\ + lsls r0, r1, 24\n\ + asrs r0, 24\n\ + cmp r6, r0\n\ + blt _08044B14\n\ +_08044AE6:\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x1\n\ + mov r0, r12\n\ + ands r1, r0\n\ + mov r0, r8\n\ + ands r0, r3\n\ + orrs r0, r1\n\ + strh r0, [r2, 0x4]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r7\n\ + movs r1, 0x1\n\ + strh r1, [r0, 0x3C]\n\ + b _08044B52\n\ +_08044B14:\n\ + ldrh r0, [r5]\n\ + cmp r0, 0\n\ + bne _08044B2E\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x3\n\ + b _08044B46\n\ +_08044B2E:\n\ + ldr r0, [r5, 0x4]\n\ + cmp r0, 0\n\ + beq _08044B52\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x2\n\ +_08044B46:\n\ + mov r0, r12\n\ + ands r1, r0\n\ + mov r0, r8\n\ + ands r0, r3\n\ + orrs r0, r1\n\ + strh r0, [r2, 0x4]\n\ +_08044B52:\n\ + adds r4, 0x1\n\ + adds r5, 0x8\n\ + adds r6, 0x1\n\ + cmp r6, 0x5\n\ + ble _08044A9A\n\ + b _08044C38\n\ +_08044B5E:\n\ + movs r6, 0\n\ + ldr r1, _08044BA4 @ =gBattleTypeFlags\n\ + mov r10, r1\n\ + ldr r2, _08044BA8 @ =0x0000ffff\n\ + mov r9, r2\n\ + ldr r7, _08044BAC @ =gSprites\n\ + ldr r3, _08044BB0 @ =0x000003ff\n\ + mov r12, r3\n\ + ldr r5, _08044BB4 @ =0xfffffc00\n\ + mov r8, r5\n\ + ldr r5, [sp, 0xC]\n\ + mov r4, sp\n\ + adds r4, 0x5\n\ +_08044B78:\n\ + mov r0, r10\n\ + ldrh r1, [r0]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08044BB8\n\ + ldrh r0, [r5]\n\ + cmp r0, r9\n\ + beq _08044BC2\n\ + cmp r0, 0\n\ + bne _08044C0A\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x3\n\ + b _08044C22\n\ + .align 2, 0\n\ +_08044BA4: .4byte gBattleTypeFlags\n\ +_08044BA8: .4byte 0x0000ffff\n\ +_08044BAC: .4byte gSprites\n\ +_08044BB0: .4byte 0x000003ff\n\ +_08044BB4: .4byte 0xfffffc00\n\ +_08044BB8:\n\ + ldr r1, [sp, 0x14]\n\ + lsls r0, r1, 24\n\ + asrs r0, 24\n\ + cmp r6, r0\n\ + blt _08044BF0\n\ +_08044BC2:\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x1\n\ + mov r0, r12\n\ + ands r1, r0\n\ + mov r0, r8\n\ + ands r0, r3\n\ + orrs r0, r1\n\ + strh r0, [r2, 0x4]\n\ + ldrb r1, [r4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r7\n\ + movs r1, 0x1\n\ + strh r1, [r0, 0x3C]\n\ + b _08044C2E\n\ +_08044BF0:\n\ + ldrh r0, [r5]\n\ + cmp r0, 0\n\ + bne _08044C0A\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x3\n\ + b _08044C22\n\ +_08044C0A:\n\ + ldr r0, [r5, 0x4]\n\ + cmp r0, 0\n\ + beq _08044C2E\n\ + ldrb r0, [r4]\n\ + lsls r2, r0, 4\n\ + adds r2, r0\n\ + lsls r2, 2\n\ + adds r2, r7\n\ + ldrh r3, [r2, 0x4]\n\ + lsls r1, r3, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x2\n\ +_08044C22:\n\ + mov r0, r12\n\ + ands r1, r0\n\ + mov r0, r8\n\ + ands r0, r3\n\ + orrs r0, r1\n\ + strh r0, [r2, 0x4]\n\ +_08044C2E:\n\ + subs r4, 0x1\n\ + adds r5, 0x8\n\ + adds r6, 0x1\n\ + cmp r6, 0x5\n\ + ble _08044B78\n\ +_08044C38:\n\ + ldr r0, _08044C98 @ =TaskDummy\n\ + movs r1, 0x5\n\ + bl CreateTask\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldr r2, _08044C9C @ =gTasks\n\ + lsls r3, r4, 2\n\ + adds r1, r3, r4\n\ + lsls r1, 3\n\ + adds r0, r1, r2\n\ + mov r5, sp\n\ + ldrh r5, [r5, 0x8]\n\ + strh r5, [r0, 0x8]\n\ + mov r6, sp\n\ + ldrh r6, [r6, 0x18]\n\ + strh r6, [r0, 0xA]\n\ + movs r6, 0\n\ + adds r0, r2, 0\n\ + adds r0, 0xE\n\ + adds r1, r0\n\ +_08044C62:\n\ + mov r5, sp\n\ + adds r0, r5, r6\n\ + ldrb r0, [r0]\n\ + strh r0, [r1]\n\ + adds r1, 0x2\n\ + adds r6, 0x1\n\ + cmp r6, 0x5\n\ + ble _08044C62\n\ + adds r0, r3, r4\n\ + lsls r0, 3\n\ + adds r0, r2\n\ + ldrh r6, [r5, 0x10]\n\ + strh r6, [r0, 0x1C]\n\ + movs r0, 0x72\n\ + movs r1, 0\n\ + bl PlaySE12WithPanning\n\ + adds r0, r4, 0\n\ + add sp, 0x28\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\ +_08044C98: .4byte TaskDummy\n\ +_08044C9C: .4byte gTasks\n\ + .syntax divided\n"); +} +#endif + +void sub_8044CA0(u8 taskId) +{ + u8 sp[6]; + u8 r9; + u8 r10; + u8 sp8; + s32 i; + + r9 = gTasks[taskId].data[10]; + r10 = gTasks[taskId].data[1]; + sp8 = gTasks[taskId].data[0]; + for (i = 0; i < 6; i++) + sp[i] = gTasks[taskId].data[3 + i]; + + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x10; + gTasks[taskId].data[15] = 16; + for (i = 0; i < 6; i++) + gSprites[sp[i]].oam.objMode = 1; + gSprites[r10].oam.objMode = 1; + if (r9 != 0) + { + for (i = 0; i < 6; i++) + { + if (battle_side_get_owner(sp8) != 0) + { + gSprites[sp[5 - i]].data1 = 7 * i; + gSprites[sp[5 - i]].data3 = 0; + gSprites[sp[5 - i]].data4 = 0; + gSprites[sp[5 - i]].callback = sub_8045110; + } + else + { + gSprites[sp[i]].data1 = 7 * i; + gSprites[sp[i]].data3 = 0; + gSprites[sp[i]].data4 = 0; + gSprites[sp[i]].callback = sub_8045110; + } + } + gSprites[r10].data0 /= 2; + gSprites[r10].data1 = 0; + gSprites[r10].callback = sub_8045048; + SetSubspriteTables(&gSprites[r10], gSubspriteTables_820A6EC); + gTasks[taskId].func = sub_8044E74; + } + else + { + gTasks[taskId].func = sub_8044F70; + } +} + +static void sub_8044E74(u8 taskId) +{ + u16 temp = gTasks[taskId].data[11]++; + + if ((temp & 1) == 0) + { + gTasks[taskId].data[15]--; + if (gTasks[taskId].data[15] < 0) + return; + REG_BLDALPHA = (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8); + } + if (gTasks[taskId].data[15] == 0) + gTasks[taskId].func = sub_8044ECC; +} + +static void sub_8044ECC(u8 taskId) +{ + u8 sp[6]; + s32 i; + + gTasks[taskId].data[15]--; + if (gTasks[taskId].data[15] == -1) + { + u8 var = gTasks[taskId].data[1]; + + for (i = 0; i < 6; i++) + sp[i] = gTasks[taskId].data[3 + i]; + DestroySpriteAndFreeResources(&gSprites[var]); + DestroySpriteAndFreeResources(&gSprites[sp[0]]); + for (i = 1; i < 6; i++) + DestroySprite(&gSprites[sp[i]]); + } + else if (gTasks[taskId].data[15] == -3) + { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyTask(taskId); + } +} + +static void sub_8044F70(u8 taskId) +{ + u8 sp[6]; + s32 i; + + gTasks[taskId].data[15]--; + // Same as above function except with this check. + if (gTasks[taskId].data[15] >= 0) + { + REG_BLDALPHA = (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8); + } + else if (gTasks[taskId].data[15] == -1) + { + u8 var = gTasks[taskId].data[1]; + + for (i = 0; i < 6; i++) + sp[i] = gTasks[taskId].data[3 + i]; + DestroySpriteAndFreeResources(&gSprites[var]); + DestroySpriteAndFreeResources(&gSprites[sp[0]]); + for (i = 1; i < 6; i++) + DestroySprite(&gSprites[sp[i]]); + } + else if (gTasks[taskId].data[15] == -3) + { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyTask(taskId); + } +} + +void sub_8045030(struct Sprite *sprite) +{ + if (sprite->pos2.x != 0) + sprite->pos2.x += sprite->data0; +} + +static void sub_8045048(struct Sprite *sprite) +{ + sprite->data1 += 32; + if (sprite->data0 > 0) + sprite->pos2.x += sprite->data1 >> 4; + else + sprite->pos2.x -= sprite->data1 >> 4; + sprite->data1 &= 0xF; +} + +void sub_804507C(struct Sprite *sprite) +{ + u8 r3; + u16 r2; + s8 pan; + + if (sprite->data1 > 0) + { + sprite->data1--; + return; + } + r3 = sprite->data2; + r2 = sprite->data3; + r2 += 56; + sprite->data3 = r2 & 0xFFF0; + if (r3 != 0) + { + sprite->pos2.x += r2 >> 4; + if (sprite->pos2.x > 0) + sprite->pos2.x = 0; + } + else + { + sprite->pos2.x -= r2 >> 4; + if (sprite->pos2.x < 0) + sprite->pos2.x = 0; + } + if (sprite->pos2.x == 0) + { + pan = 63; + if (r3 != 0) + pan = -64; + if (sprite->data7 != 0) + PlaySE2WithPanning(SE_TB_KARA, pan); + else + PlaySE1WithPanning(SE_TB_KON, pan); + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_8045110(struct Sprite *sprite) +{ + u8 r0; + u16 r2; + + if (sprite->data1 > 0) + { + sprite->data1--; + return; + } + r0 = sprite->data2; + r2 = sprite->data3; + r2 += 56; + sprite->data3 = r2 & 0xFFF0; + if (r0 != 0) + sprite->pos2.x += r2 >> 4; + else + sprite->pos2.x -= r2 >> 4; + if (sprite->pos2.x + sprite->pos1.x > 248 + || sprite->pos2.x + sprite->pos1.x < -8) + { + sprite->invisible = TRUE; + sprite->callback = SpriteCallbackDummy; + } +} + +void sub_8045180(struct Sprite *sprite) +{ + u8 spriteId = sprite->data0; + + sprite->pos2.x = gSprites[spriteId].pos2.x; + sprite->pos2.y = gSprites[spriteId].pos2.y; +} + +static void sub_80451A0(u8 a, struct Pokemon *pkmn) +{ + u8 nickname[POKEMON_NAME_LENGTH]; + u8 gender; + u16 species; + u8 language; + u8 *ptr; + s32 i; + s32 _7; + u8 *const *r1; + + StringCopy(gUnknown_020238CC, gUnknown_0820A8B0); + GetMonData(pkmn, MON_DATA_NICKNAME, nickname); + StringGetEnd10(nickname); + ptr = StringCopy(gUnknown_020238CC + 3, nickname); + ptr[0] = EXT_CTRL_CODE_BEGIN; + ptr[1] = 3; + ptr[2] = 2; + ptr[3] = EXT_CTRL_CODE_BEGIN; + ptr[4] = 1; + ptr += 5; + gender = GetMonGender(pkmn); + species = GetMonData(pkmn, MON_DATA_SPECIES); + language = GetMonData(pkmn, MON_DATA_LANGUAGE); + if (sub_8040D3C(species, nickname, language)) + gender = 100; + switch (gender) + { + default: + ptr[0] = 0xB; + ptr[1] = EOS; + ptr += 1; + break; + case MON_MALE: + ptr[0] = 0xB; + ptr[1] = CHAR_MALE; + ptr[2] = EOS; + ptr += 2; + break; + case MON_FEMALE: + ptr[0] = 0xA; + ptr[1] = CHAR_FEMALE; + ptr[2] = EOS; + ptr += 2; + break; + } + ptr[0] = EXT_CTRL_CODE_BEGIN; + ptr[1] = 0x13; + ptr[2] = 0x37; + ptr[3] = EOS; + ptr = (u8 *)0x02000520 + battle_get_per_side_status(gSprites[a].data6) * 0x180; + sub_80034D4(ptr, gUnknown_020238CC); + + i = 0; + _7 = 7; + if (GetMonData(pkmn, MON_DATA_LANGUAGE) == 1 + && GetMonData(pkmn, MON_DATA_IS_EGG) == 0) + { + u8 *p = gUnknown_020238CC; + + while (*p != EOS) + { + if (*p == EXT_CTRL_CODE_BEGIN) + { + p += GetExtCtrlCodeLength(p[1]) + 1; + } + else + { + u8 r0; + + if ((*p >= 0x37 && *p <= 0x4A) || (*p >= 0x87 && *p <= 0x9A)) + r0 = 0x2C; + else if ((*p >= 0x4B && *p <= 0x4F) || (*p >= 0x9B && *p <= 0x9F)) + r0 = 0x2D; + else + r0 = 0x2B; + + CpuCopy32(sub_8043CDC(r0), ptr + 0x40 * i, 32); + i++; + p++; + } + } + } + + for (; i < _7; i++) + CpuCopy32(sub_8043CDC(0x2B), ptr + 64 * i, 32); + + if (battle_side_get_owner(gSprites[a].data6) == 0 && !IsDoubleBattle()) + { + r1 = (u8 *const *)gUnknown_0820A8B4; + for (i = 0; i < _7; i++) + { + u8 *r4 = r1[i]; + + r4 += gSprites[a].oam.tileNum * 32; + CpuCopy32(ptr, r4, 32); + ptr += 32; + + r4 += 0x100; + CpuCopy32(ptr, r4, 32); + ptr += 32; + } + } + else + { + if (battle_side_get_owner(gSprites[a].data6) == 0) + r1 = (u8 *const *)gUnknown_0820A904; + else + r1 = (u8 *const *)gUnknown_0820A8DC; + for (i = 0; i < _7; i++) + { + u8 *r4 = r1[i]; + + r4 += gSprites[a].oam.tileNum * 32; + CpuCopy32(ptr, r4, 32); + ptr += 32; + + r4 += 0x100; + CpuCopy32(ptr, r4, 32); + ptr += 32; + } + } +} + +static void sub_8045458(u8 a, u8 b) +{ + u8 r4; + + if (gBattleTypeFlags & 0x200) + return; + if (gBattleTypeFlags & 8) + return; + + r4 = gSprites[a].data6; + if (battle_side_get_owner(r4) != 0) + { + u16 species = GetMonData(&gEnemyParty[gUnknown_02024A6A[r4]], MON_DATA_SPECIES); + if (sub_8090D90(SpeciesToNationalPokedexNum(species), 1) != 0) + { + r4 = gSprites[a].data5; + if (b != 0) + CpuCopy32(sub_8043CDC(0x46), (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32), 32); + else + CpuFill32(0, (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32), 32); + } + } +} + +static void draw_status_ailment_maybe(u8 a) +{ + s32 r4; + s32 r4_2; + u8 r7; + u8 r10; + s16 r8; + const u8 *r6; + u8 r0; + s32 i; + + r7 = gSprites[a].data6; + r10 = gSprites[a].data5; + if (battle_side_get_owner(r7) == 0) + { + r4 = GetMonData(&gPlayerParty[gUnknown_02024A6A[r7]], MON_DATA_STATUS); + if (!IsDoubleBattle()) + r8 = 0x1A; + else + r8 = 0x12; + } + else + { + r4 = GetMonData(&gEnemyParty[gUnknown_02024A6A[r7]], MON_DATA_STATUS); + r8 = 0x11; + } + if (r4 & 7) + { + r6 = sub_8043CDC(sub_80457E8(0x1B, r7)); + r0 = 2; + } + else if (r4 & 0x88) + { + r6 = sub_8043CDC(sub_80457E8(0x15, r7)); + r0 = 0; + } + else if (r4 & 0x10) + { + r6 = sub_8043CDC(sub_80457E8(0x21, r7)); + r0 = 4; + } + else if (r4 & 0x20) + { + r6 = sub_8043CDC(sub_80457E8(0x1E, r7)); + r0 = 3; + } + else if (r4 & 0x40) + { + r6 = sub_8043CDC(sub_80457E8(0x18, r7)); + r0 = 1; + } + else + { + r6 = sub_8043CDC(0x27); + + for (i = 0; i < 3; i++) + CpuCopy32(r6, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8 + i) * 32), 32); + + if (!ewram17800[r7].bit_4) + CpuCopy32(sub_8043CDC(1), (void *)(OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32), 64); + + sub_8045458(a, 1); + return; + } + + r4_2 = gSprites[a].oam.paletteNum * 16; + r4_2 += r7 + 12; + // I don't like writing the array index like this, but I can't get it to match otherwise. + FillPalette(r0[gBattleInterfaceStatusIcons_DynPal], r4_2 + 0x100, 2); + CpuCopy16(gPlttBufferUnfaded + 0x100 + r4_2, (void *)(OBJ_PLTT + r4_2 * 2), 2); + CpuCopy32(r6, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8) * 32), 96); + if (IsDoubleBattle() == TRUE || battle_side_get_owner(r7) == TRUE) + { + if (!ewram17800[r7].bit_4) + { + CpuCopy32(sub_8043CDC(0), (void *)(OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32), 32); + CpuCopy32(sub_8043CDC(0x41), (void *)(OBJ_VRAM0 + (gSprites[r10].oam.tileNum + 1) * 32), 32); + } + } + sub_8045458(a, 0); +} + +static u8 sub_80457E8(u8 a, u8 b) +{ + u8 ret = a; + + switch (a) + { + case 21: + if (b == 0) + ret = 21; + else if (b == 1) + ret = 71; + else if (b == 2) + ret = 86; + else + ret = 101; + break; + case 24: + if (b == 0) + ret = 24; + else if (b == 1) + ret = 74; + else if (b == 2) + ret = 89; + else + ret = 104; + break; + case 27: + if (b == 0) + ret = 27; + else if (b == 1) + ret = 77; + else if (b == 2) + ret = 92; + else + ret = 107; + break; + case 30: + if (b == 0) + ret = 30; + else if (b == 1) + ret = 80; + else if (b == 2) + ret = 95; + else + ret = 110; + break; + case 33: + if (b == 0) + ret = 33; + else if (b == 1) + ret = 83; + else if (b == 2) + ret = 98; + else + ret = 113; + break; + } + return ret; +} + +static void sub_80458B0(u8 a) +{ + u8 *r6; + u8 r8; + u8 i; + s32 r7; + u8 *addr; + + r6 = (u8 *)0x02000520 + battle_get_per_side_status(gSprites[a].data6) * 0x180; + r8 = 7; + sub_80034D4(r6, BattleText_SafariBalls); + for (i = 0; i < r8; i++) + CpuCopy32(sub_8043CDC(0x2B), r6 + i * 64, 32); + for (r7 = 3; r7 < 3 + r8; r7++) + { + addr = (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + MACRO1(r7)) * 32); + CpuCopy32(r6, addr, 32); + r6 += 32; + + addr = (void *)(OBJ_VRAM0 + (8 + gSprites[a].oam.tileNum + MACRO1(r7)) * 32); + CpuCopy32(r6, addr, 32); + r6 += 32; + } + +} + +static void sub_8045998(u8 a) +{ + u8 *r7; + u8 status; + s32 r6; + s32 i; + + r7 = StringCopy(gUnknown_020238CC, BattleText_SafariBallsLeft); + r7 = sub_8003504(r7, gNumSafariBalls, 10, 1); + StringAppend(r7, BattleText_HighlightRed); + status = battle_get_per_side_status(gSprites[a].data6); + r7 = (u8 *)0x02000520 + status * 0x180; + r6 = 5; + sub_80034D4(r7, gUnknown_020238CC); + r7 = (u8 *)0x02000520 + status * 0x180 + 32; + for (i = 6; i < 6 + r6; i++) + { + CpuCopy32(r7, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x18 + MACRO1(i)) * 32), 32); + r7 += 64; + } +} + +void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) +{ + u8 r10; + u32 maxhp; + u32 currhp; + + r10 = gSprites[a].data6; + if (battle_side_get_owner(r10) == 0) + { + if (c == 3 || c == 0) + sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL)); + if (c == 1 || c == 0) + sub_80440EC(a, GetMonData(pkmn, MON_DATA_HP), 0); + if (c == 2 || c == 0) + sub_80440EC(a, GetMonData(pkmn, MON_DATA_MAX_HP), 1); + if (c == 5 || c == 0) + { + load_gfxc_health_bar(0); + maxhp = GetMonData(pkmn, MON_DATA_MAX_HP); + currhp = GetMonData(pkmn, MON_DATA_HP); + sub_8043D84(r10, a, maxhp, currhp, 0); + sub_8045C78(r10, a, 0, 0); + } + if (!IsDoubleBattle() && (c == 6 || c == 0)) + { + u16 species; + u8 level; + u32 exp; + u32 var1; + u32 var2; + u32 currLevelExp; + + load_gfxc_health_bar(3); + species = GetMonData(pkmn, MON_DATA_SPECIES); + level = GetMonData(pkmn, MON_DATA_LEVEL); + exp = GetMonData(pkmn, MON_DATA_EXP); + currLevelExp = gExperienceTables[gBaseStats[species].growthRate][level]; + var1 = exp - currLevelExp; + var2 = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLevelExp; + sub_8043D84(r10, a, var2, var1, 0); + sub_8045C78(r10, a, 1, 0); + } + if (c == 4 || c == 0) + sub_80451A0(a, pkmn); + if (c == 9 || c == 0) + draw_status_ailment_maybe(a); + if (c == 10) + sub_80458B0(a); + if (c == 10 || c == 11) + sub_8045998(a); + } + else + { + if (c == 3 || c == 0) + sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL)); + if (c == 5 || c == 0) + { + load_gfxc_health_bar(0); + maxhp = GetMonData(pkmn, MON_DATA_MAX_HP); + currhp = GetMonData(pkmn, MON_DATA_HP); + sub_8043D84(r10, a, maxhp, currhp, 0); + sub_8045C78(r10, a, 0, 0); + } + if (c == 4 || c == 0) + sub_80451A0(a, pkmn); + if (c == 9 || c == 0) + draw_status_ailment_maybe(a); + } +} + +s32 sub_8045C78(u8 a, u8 unused1, u8 c, u8 unused2) +{ + s32 r6; + + if (c == 0) + { + r6 = sub_8045F58(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, 6, 1); + } + else + { + u16 r5; + s32 r8; + + r5 = GetScaledExpFraction(ewram17850[a].unk8, ewram17850[a].unkC, ewram17850[a].unk4, 8); + if (r5 == 0) + r5 = 1; + r8 = ewram17850[a].unkC; + r5 = ABS(r8 / r5); + r6 = sub_8045F58(ewram17850[a].unk4, ewram17850[a].unk8, r8, &ewram17850[a].unk10, 8, r5); + } + if (c == 1 || (c == 0 && (!ewram17800[a].bit_4))) + sub_8045D58(a, c); + if (r6 == -1) + ewram17850[a].unk10 = 0; + return r6; +} + +static void sub_8045D58(u8 a, u8 b) +{ + u8 sp8[7]; + u8 r0; + u8 r8; + u8 i; + + switch (b) + { + case 0: + r0 = sub_804602C(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, sp8, 6); + r8 = 3; + if (r0 <= 0x18) + { + r8 = 0x38; + if (r0 > 9) + r8 = 0x2F; + } + for (i = 0; i < 6; i++) + { + u8 r4 = gSprites[ewram17850[a].unk0].data5; + if (i < 2) + CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 2 + i) * 32), 32); + else + CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, (void *)(OBJ_VRAM0 + 64 + (i + gSprites[r4].oam.tileNum) * 32), 32); + } + break; + case 1: + sub_804602C(ewram17850[a].unk4, ewram17850[a].unk8, ewram17850[a].unkC, &ewram17850[a].unk10, sp8, 8); + r0 = GetMonData(&gPlayerParty[gUnknown_02024A6A[a]], MON_DATA_LEVEL); + if (r0 == 100) + { + for (i = 0; i < 8; i++) + sp8[i] = 0; + } + for (i = 0; i < 8; i++) + { + if (i < 4) + CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, (void *)(OBJ_VRAM0 + (gSprites[ewram17850[a].unk0].oam.tileNum + 0x24 + i) * 32), 32); + else + CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, (void *)(OBJ_VRAM0 + 0xB80 + (i + gSprites[ewram17850[a].unk0].oam.tileNum) * 32), 32); + } + break; + } +} + +static int sub_8045F58(s32 a, s32 b, int c, int *d, u8 e, u16 f) +{ + u8 r2 = e << 3; + int r6; + int ret; + + if (*d == -32768) + { + if (a < r2) + *d = b << 8; + else + *d = b; + } + //_08045F8A + b -= c; + if (b < 0) + b = 0; + else if (b > a) + b = a; + if (a < r2) + { + int var = *d >> 8; + + r6 = *d; + if (b == var && (r6 & 0xFF) == 0) + return -1; + } + else + { + r6 = *d; + if (b == r6) + return -1; + } + //_08045FC4 + if (a < r2) + { + int r0 = (a << 8) / r2; + + if (c < 0) + { + *d = r6 + r0; + ret = *d >> 8; + if (ret >= b) + { + *d = b << 8; + ret = b; + } + } + //_08045FE2 + else + { + *d = r6 - r0; + ret = *d >> 8; + if ((*d & 0xFF) > 0) + ret++; + if (ret <= b) + { + *d = b << 8; + ret = b; + } + } + } + else + { + //_08045FFE + if (c < 0) + { + *d += f; + if (*d > b) + *d = b; + ret = *d; + } + //_08046010 + else + { + *d -= f; + if (*d < b) + *d = b; + ret = *d; + } + } + return ret; +} + +static u8 sub_804602C(int a, int b, int c, int *d, u8 *e, u8 f) +{ + s32 r5 = b - c; + u8 r3; + u8 i; + u8 r2; + + if (r5 < 0) + r5 = 0; + else if (r5 > a) + r5 = a; + r3 = f << 3; + for (i = 0; i < f; i++) + e[i] = 0; + if (a < r3) + r2 = *d * r3 / a >> 8; + else + r2 = *d * r3 / a; + r3 = r2; + if (r3 == 0 && r5 > 0) + { + e[0] = 1; + r3 = 1; + } + else + { + for (i = 0; i < f; i++) + { + if (r2 >= 8) + { + e[i] = 8; + } + else + { + e[i] = r2; + break; + } + r2 -= 8; + } + } + return r3; +} + +s16 sub_80460C8(struct UnknownStruct9 *a, int *b, void *c, int d) +{ + u16 r7; + s16 r1; + + r7 = sub_8045F58(a->unk0, a->unk4, a->unk8, b, 6, 1); + sub_8046128(a, b, c); + if (a->unk0 < 0x30) + r1 = *b >> 8; + else + r1 = *b; + do_nothing(a->unk0, r1, d); + return r7; +} + +static void sub_8046128(struct UnknownStruct9 *a, int *b, void *c) +{ + u8 sp8[6]; + u16 sp10[6]; + u8 i; + + sub_804602C(a->unk0, a->unk4, a->unk8, b, (u8 *)sp8, 6); + for (i = 0; i < 6; i++) + sp10[i] = (a->unkC_0 << 12) | (a->unk10 + sp8[i]); + CpuCopy16(sp10, c, sizeof(sp10)); +} + +static u8 GetScaledExpFraction(int a, int b, int c, u8 d) +{ + u8 r7 = d * 8; + int r5 = a - b; + s8 r4; + s8 r0; + s32 result; + + if (r5 < 0) + r5 = 0; + else if (r5 > c) + r5 = c; + + r4 = a * r7 / c; + r0 = r5 * r7 / c; + result = r4 - r0; + return ABS(result); +} + +u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale) +{ + u8 result = hp * scale / maxhp; + + if (result == 0 && hp > 0) + return 1; + return result; +} + +int GetHPBarLevel(s16 hp, s16 maxhp) +{ + int result; + + if (hp == maxhp) + result = 4; + else + { + u8 fraction = GetScaledHPFraction(hp, maxhp, 48); + if (fraction > 24) + result = 3; + else if (fraction > 9) + result = 2; + else if (fraction > 0) + result = 1; + else + result = 0; + } + return result; +} diff --git a/src/battle_records.c b/src/battle_records.c new file mode 100644 index 000000000..3290bbebe --- /dev/null +++ b/src/battle_records.c @@ -0,0 +1,27 @@ +#include "global.h" +#include "menu.h" + +extern const u8 gOtherText_BattleResults[]; +extern const u8 gOtherText_WinLoseDraw[]; + +void PrintLinkBattleWinsLossesDraws(void *); + +void PrintLinkBattleRecord(void *, u8); + +void ShowLinkBattleRecords(void) { + s32 i; + MenuDrawTextWindow(1, 0, 28, 18); + sub_8072BD8((u8 *) gOtherText_BattleResults, 0, 1, 240); + + PrintLinkBattleWinsLossesDraws(gSaveBlock1.linkBattleRecords); +#if ENGLISH + MenuPrint(gOtherText_WinLoseDraw, 12, 6); +#elif GERMAN + MenuPrint_PixelCoords((u8 *) gOtherText_WinLoseDraw, 88, 48, 1); +#endif + + for (i = 0; i < 5; i++) + { + PrintLinkBattleRecord(gSaveBlock1.linkBattleRecords[i], 6 + (i + 1) * 2); + } +} diff --git a/src/berry.c b/src/berry.c index 636028adf..6c12af053 100644 --- a/src/berry.c +++ b/src/berry.c @@ -13,6 +13,51 @@ #define FIRST_BERRY ITEM_CHERI_BERRY #define LAST_BERRY ITEM_ENIGMA_BERRY +#ifdef ENGLISH +#define NAME_CHERI_BERRY _("CHERI") +#define NAME_CHESTO_BERRY _("CHESTO") +#define NAME_PECHA_BERRY _("PECHA") +#define NAME_RAWST_BERRY _("RAWST") +#define NAME_ASPEAR_BERRY _("ASPEAR") +#define NAME_LEPPA_BERRY _("LEPPA") +#define NAME_ORAN_BERRY _("ORAN") +#define NAME_PERSIM_BERRY _("PERSIM") +#define NAME_LUM_BERRY _("LUM") +#define NAME_SITRUS_BERRY _("SITRUS") +#define NAME_FIGY_BERRY _("FIGY") +#define NAME_WIKI_BERRY _("WIKI") +#define NAME_MAGO_BERRY _("MAGO") +#define NAME_AGUAV_BERRY _("AGUAV") +#define NAME_IAPAPA_BERRY _("IAPAPA") +#define NAME_RAZZ_BERRY _("RAZZ") +#define NAME_BLUK_BERRY _("BLUK") +#define NAME_NANAB_BERRY _("NANAB") +#define NAME_WEPEAR_BERRY _("WEPEAR") +#define NAME_PINAP_BERRY _("PINAP") +#define NAME_POMEG_BERRY _("POMEG") +#define NAME_KELPSY_BERRY _("KELPSY") +#define NAME_QUALOT_BERRY _("QUALOT") +#define NAME_HONDEW_BERRY _("HONDEW") +#define NAME_GREPA_BERRY _("GREPA") +#define NAME_TAMATO_BERRY _("TAMATO") +#define NAME_CORNN_BERRY _("CORNN") +#define NAME_MAGOST_BERRY _("MAGOST") +#define NAME_RABUTA_BERRY _("RABUTA") +#define NAME_NOMEL_BERRY _("NOMEL") +#define NAME_SPELON_BERRY _("SPELON") +#define NAME_PAMTRE_BERRY _("PAMTRE") +#define NAME_WATMEL_BERRY _("WATMEL") +#define NAME_DURIN_BERRY _("DURIN") +#define NAME_BELUE_BERRY _("BELUE") +#define NAME_LIECHI_BERRY _("LIECHI") +#define NAME_GANLON_BERRY _("GANLON") +#define NAME_SALAC_BERRY _("SALAC") +#define NAME_PETAYA_BERRY _("PETAYA") +#define NAME_APICOT_BERRY _("APICOT") +#define NAME_LANSAT_BERRY _("LANSAT") +#define NAME_STARF_BERRY _("STARF") +#define NAME_ENIGMA_BERRY _("ENIGMA") + const u8 gBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers."); const u8 gBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy."); const u8 gBerryDescriptionPart1_Chesto[] = _("The BERRY’s thick skin and fruit are"); @@ -99,11 +144,143 @@ const u8 gBerryDescriptionPart1_Starf[] = _("So strong, it was abandoned at the" const u8 gBerryDescriptionPart2_Starf[] = _("world’s edge. Considered a mirage."); const u8 gBerryDescriptionPart1_Enigma[] = _("A completely enigmatic BERRY."); const u8 gBerryDescriptionPart2_Enigma[] = _("Appears to have the power of stars."); +#elif defined(GERMAN) +#define NAME_CHERI_BERRY _("AMRENA") +#define NAME_CHESTO_BERRY _("MARON") +#define NAME_PECHA_BERRY _("PIRSIF") +#define NAME_RAWST_BERRY _("FRAGIA") +#define NAME_ASPEAR_BERRY _("WILBIR") +#define NAME_LEPPA_BERRY _("JONAGO") +#define NAME_ORAN_BERRY _("SINEL") +#define NAME_PERSIM_BERRY _("PERSIM") +#define NAME_LUM_BERRY _("PRUNUS") +#define NAME_SITRUS_BERRY _("TSITRU") +#define NAME_FIGY_BERRY _("GIEFE") +#define NAME_WIKI_BERRY _("WIKI") +#define NAME_MAGO_BERRY _("MAGO") +#define NAME_AGUAV_BERRY _("GAUVE") +#define NAME_IAPAPA_BERRY _("YAPA") +#define NAME_RAZZ_BERRY _("HIMMIH") +#define NAME_BLUK_BERRY _("MORB") +#define NAME_NANAB_BERRY _("NANAB") +#define NAME_WEPEAR_BERRY _("NIRBE") +#define NAME_PINAP_BERRY _("SANANA") +#define NAME_POMEG_BERRY _("GRANA") +#define NAME_KELPSY_BERRY _("SETANG") +#define NAME_QUALOT_BERRY _("QUALOT") +#define NAME_HONDEW_BERRY _("HONMEL") +#define NAME_GREPA_BERRY _("LABRUS") +#define NAME_TAMATO_BERRY _("TAMOT") +#define NAME_CORNN_BERRY _("SAIM") +#define NAME_MAGOST_BERRY _("MAGOST") +#define NAME_RABUTA_BERRY _("RABUTA") +#define NAME_NOMEL_BERRY _("TRONZI") +#define NAME_SPELON_BERRY _("KIWAN") +#define NAME_PAMTRE_BERRY _("PALLM") +#define NAME_WATMEL_BERRY _("WASMEL") +#define NAME_DURIN_BERRY _("DURIN") +#define NAME_BELUE_BERRY _("MYRTIL") +#define NAME_LIECHI_BERRY _("LYDZI") +#define NAME_GANLON_BERRY _("LINGAN") +#define NAME_SALAC_BERRY _("SALKA") +#define NAME_PETAYA_BERRY _("TAHAY") +#define NAME_APICOT_BERRY _("APIKO") +#define NAME_LANSAT_BERRY _("LANSAT") +#define NAME_STARF_BERRY _("KRAMBO") +#define NAME_ENIGMA_BERRY _("ENIGMA") + +const u8 gBerryDescriptionPart1_Cheri[] = _("Erblüht mit hübschen, zarten Blumen."); +const u8 gBerryDescriptionPart2_Cheri[] = _("Diese knallrote BEERE ist sehr scharf."); +const u8 gBerryDescriptionPart1_Chesto[] = _("Diese BEERE hat eine dicke Haut und"); +const u8 gBerryDescriptionPart2_Chesto[] = _("hartes Fruchtfleisch. Trocken!"); +const u8 gBerryDescriptionPart1_Pecha[] = _("Sehr süß und delikat."); +const u8 gBerryDescriptionPart2_Pecha[] = _("Sehr zart. Vorsichtig anfassen!"); +const u8 gBerryDescriptionPart1_Rawst[] = _("Wenn die Blätter lang und wellig sind,"); +const u8 gBerryDescriptionPart2_Rawst[] = _("wird die BEERE sehr bitter."); +const u8 gBerryDescriptionPart1_Aspear[] = _("Diese harte BEERE ist sehr"); +const u8 gBerryDescriptionPart2_Aspear[] = _("saftig und sauer im Geschmack!"); +const u8 gBerryDescriptionPart1_Leppa[] = _("Wächst langsamer als AMRENA und"); +const u8 gBerryDescriptionPart2_Leppa[] = _("andere. Je kleiner, desto delikater."); +const u8 gBerryDescriptionPart1_Oran[] = _("Eine BEERE unterschiedlichsten Ge-"); +const u8 gBerryDescriptionPart2_Oran[] = _("schmacks. Wächst an einem halben Tag."); +const u8 gBerryDescriptionPart1_Persim[] = _("Liebt Sonnenlicht. Die BEERE"); +const u8 gBerryDescriptionPart2_Persim[] = _("wächst im Sonnenlicht sehr schnell."); +const u8 gBerryDescriptionPart1_Lum[] = _("Langsamer Wuchs. Wird sie liebevoll ge-"); +const u8 gBerryDescriptionPart2_Lum[] = _("pflegt, kann sie 2 BEEREN tragen."); +const u8 gBerryDescriptionPart1_Sitrus[] = _("Eng verwandt mit SINEL. Diese große"); +const u8 gBerryDescriptionPart2_Sitrus[] = _("BEERE ist von rundem Geschmack."); +const u8 gBerryDescriptionPart1_Figy[] = _("Die BEERE sieht angekaut aus. Sie ist"); +const u8 gBerryDescriptionPart2_Figy[] = _("voller scharfer Substanzen."); +const u8 gBerryDescriptionPart1_Wiki[] = _("Die BEERE wächst unförmig,"); +const u8 gBerryDescriptionPart2_Wiki[] = _("damit PKMN sie besser greifen können."); +const u8 gBerryDescriptionPart1_Mago[] = _("Die BEERE hat Ausbeulungen. Je mehr"); +const u8 gBerryDescriptionPart2_Mago[] = _("Beulen, desto schmackhafter ist sie."); +const u8 gBerryDescriptionPart1_Aguav[] = _("Die Blume ist zart. Sie ist fähig,"); +const u8 gBerryDescriptionPart2_Aguav[] = _("ohne Licht wachsen zu können."); +const u8 gBerryDescriptionPart1_Iapapa[] = _("Die BEERE ist groß und sauer."); +const u8 gBerryDescriptionPart2_Iapapa[] = _("Sie braucht einen Tag zum Wachsen."); +const u8 gBerryDescriptionPart1_Razz[] = _("Diese rote BEERE schmeckt etwas"); +const u8 gBerryDescriptionPart2_Razz[] = _("scharf. Sie wächst in nur 4 Stunden."); +const u8 gBerryDescriptionPart1_Bluk[] = _("Die BEERE ist außen blau, verfärbt"); +const u8 gBerryDescriptionPart2_Bluk[] = _("sich im Mund aber schwarz."); +const u8 gBerryDescriptionPart1_Nanab[] = _("Diese BEERE war die 7., die auf der"); +const u8 gBerryDescriptionPart2_Nanab[] = _("Welt entdeckt wurde. Sie ist süß."); +const u8 gBerryDescriptionPart1_Wepear[] = _("Die Blume ist klein und weiß. Angenehm"); +const u8 gBerryDescriptionPart2_Wepear[] = _("bitter und sauer zugleich."); +const u8 gBerryDescriptionPart1_Pinap[] = _("Wind und Kälte verträgt sie nicht."); +const u8 gBerryDescriptionPart2_Pinap[] = _("Fruchtfleisch: Scharf. Haut: Sauer."); +const u8 gBerryDescriptionPart1_Pomeg[] = _("Egal wie viel Wasser sie bekommt, sie"); +const u8 gBerryDescriptionPart2_Pomeg[] = _("trägt immer bis zu 6 BEEREN."); +const u8 gBerryDescriptionPart1_Kelpsy[] = _("Eine Seltenheit. Geformt wie eine"); +const u8 gBerryDescriptionPart2_Kelpsy[] = _("Wurzel. Hat eine große Blume."); +const u8 gBerryDescriptionPart1_Qualot[] = _("Liebt das Wasser. Wächst besonders"); +const u8 gBerryDescriptionPart2_Qualot[] = _("gut in regenreichen Gegenden."); +const u8 gBerryDescriptionPart1_Hondew[] = _("Eine wertvolle und seltene BEERE."); +const u8 gBerryDescriptionPart2_Hondew[] = _("Sie ist sehr schmackhaft."); +const u8 gBerryDescriptionPart1_Grepa[] = _("Die BEERE ist zart und von runder"); +const u8 gBerryDescriptionPart2_Grepa[] = _("Form. Aber sie ist unglaublich sauer!"); +const u8 gBerryDescriptionPart1_Tamato[] = _("Die Schärfe der BEERE verbrennt die"); +const u8 gBerryDescriptionPart2_Tamato[] = _("Lippen. Sie braucht Zeit zum Wachsen."); +const u8 gBerryDescriptionPart1_Cornn[] = _("Eine BEERE aus alten Zeiten. Wächst"); +const u8 gBerryDescriptionPart2_Cornn[] = _("nur, wenn in großen Mengen gepflanzt."); +const u8 gBerryDescriptionPart1_Magost[] = _("Eine BEERE, die für ihren feinen, aus-"); +const u8 gBerryDescriptionPart2_Magost[] = _("gewogenen Geschmack bekannt ist."); +const u8 gBerryDescriptionPart1_Rabuta[] = _("Eine Seltenheit, die über und über mit"); +const u8 gBerryDescriptionPart2_Rabuta[] = _("Haaren bewachsen ist. Sehr bitter!"); +const u8 gBerryDescriptionPart1_Nomel[] = _("Sehr sauer. Ein Biss betäubt die"); +const u8 gBerryDescriptionPart2_Nomel[] = _("Geschmacksnerven für 3 Tage!"); +const u8 gBerryDescriptionPart1_Spelon[] = _("Die leuchtend rote BEERE ist sehr"); +const u8 gBerryDescriptionPart2_Spelon[] = _("scharf. Gibt scharfe Substanzen ab!"); +const u8 gBerryDescriptionPart1_Pamtre[] = _("Wird vom Meer angespült. Sie wächst"); +const u8 gBerryDescriptionPart2_Pamtre[] = _("an einem anderen Ort."); +const u8 gBerryDescriptionPart1_Watmel[] = _("Eine große BEERE, 25 cm groß."); +const u8 gBerryDescriptionPart2_Watmel[] = _("Außergewöhnlich süß."); +const u8 gBerryDescriptionPart1_Durin[] = _("Bitter schon ihr Anblick! Sie ist so"); +const u8 gBerryDescriptionPart2_Durin[] = _("bitter, dass niemand sie pur isst."); +const u8 gBerryDescriptionPart1_Belue[] = _("Sie glänzt, sieht zart aus, ist extrem"); +const u8 gBerryDescriptionPart2_Belue[] = _("sauer und braucht Zeit zum Wachsen."); +const u8 gBerryDescriptionPart1_Liechi[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +const u8 gBerryDescriptionPart2_Liechi[] = _("sie enthalte die Kraft des Meeres."); +const u8 gBerryDescriptionPart1_Ganlon[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +const u8 gBerryDescriptionPart2_Ganlon[] = _("sie enthalte die Kraft des Landes."); +const u8 gBerryDescriptionPart1_Salac[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +const u8 gBerryDescriptionPart2_Salac[] = _("sie enthalte die Kraft des Himmels."); +const u8 gBerryDescriptionPart1_Petaya[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +const u8 gBerryDescriptionPart2_Petaya[] = _("sie enthalte die Kraft allen Lebens."); +const u8 gBerryDescriptionPart1_Apicot[] = _("Eine rätselhafte BEERE. Man kann"); +const u8 gBerryDescriptionPart2_Apicot[] = _("nicht sagen, wie und was sie ist."); +const u8 gBerryDescriptionPart1_Lansat[] = _("Eine legendäre BEERE. Sie zu"); +const u8 gBerryDescriptionPart2_Lansat[] = _("tragen bringt Freude."); +const u8 gBerryDescriptionPart1_Starf[] = _("So stark, dass sie an den Rand der"); +const u8 gBerryDescriptionPart2_Starf[] = _("Welt verbannt wurde. Ein Märchen?"); +const u8 gBerryDescriptionPart1_Enigma[] = _("Eine enigmatische BEERE. Sie scheint"); +const u8 gBerryDescriptionPart2_Enigma[] = _("die Macht der Sterne zu besitzen."); +#endif const struct Berry gBerries[] = { { - .name = _("CHERI"), + .name = NAME_CHERI_BERRY, .firmness = BERRY_FIRMNESS_SOFT, .size = 20, .maxYield = 3, @@ -119,7 +296,7 @@ const struct Berry gBerries[] = .smoothness = 25, }, { - .name = _("CHESTO"), + .name = NAME_CHESTO_BERRY, .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 80, .maxYield = 3, @@ -135,7 +312,7 @@ const struct Berry gBerries[] = .smoothness = 25, }, { - .name = _("PECHA"), + .name = NAME_PECHA_BERRY, .firmness = BERRY_FIRMNESS_VERY_SOFT, .size = 40, .maxYield = 3, @@ -151,7 +328,7 @@ const struct Berry gBerries[] = .smoothness = 25, }, { - .name = _("RAWST"), + .name = NAME_RAWST_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 32, .maxYield = 3, @@ -167,7 +344,7 @@ const struct Berry gBerries[] = .smoothness = 25, }, { - .name = _("ASPEAR"), + .name = NAME_ASPEAR_BERRY, .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 50, .maxYield = 3, @@ -183,7 +360,7 @@ const struct Berry gBerries[] = .smoothness = 25, }, { - .name = _("LEPPA"), + .name = NAME_LEPPA_BERRY, .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 28, .maxYield = 3, @@ -199,7 +376,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("ORAN"), + .name = NAME_ORAN_BERRY, .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 35, .maxYield = 3, @@ -215,7 +392,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("PERSIM"), + .name = NAME_PERSIM_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 47, .maxYield = 3, @@ -231,7 +408,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("LUM"), + .name = NAME_LUM_BERRY, .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 34, .maxYield = 2, @@ -247,7 +424,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("SITRUS"), + .name = NAME_SITRUS_BERRY, .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 95, .maxYield = 3, @@ -263,7 +440,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("FIGY"), + .name = NAME_FIGY_BERRY, .firmness = BERRY_FIRMNESS_SOFT, .size = 100, .maxYield = 3, @@ -279,7 +456,7 @@ const struct Berry gBerries[] = .smoothness = 25, }, { - .name = _("WIKI"), + .name = NAME_WIKI_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 115, .maxYield = 3, @@ -295,7 +472,7 @@ const struct Berry gBerries[] = .smoothness = 25, }, { - .name = _("MAGO"), + .name = NAME_MAGO_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 126, .maxYield = 3, @@ -311,7 +488,7 @@ const struct Berry gBerries[] = .smoothness = 25, }, { - .name = _("AGUAV"), + .name = NAME_AGUAV_BERRY, .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 64, .maxYield = 3, @@ -327,7 +504,7 @@ const struct Berry gBerries[] = .smoothness = 25, }, { - .name = _("IAPAPA"), + .name = NAME_IAPAPA_BERRY, .firmness = BERRY_FIRMNESS_SOFT, .size = 223, .maxYield = 3, @@ -343,7 +520,7 @@ const struct Berry gBerries[] = .smoothness = 25, }, { - .name = _("RAZZ"), + .name = NAME_RAZZ_BERRY, .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 120, .maxYield = 6, @@ -359,7 +536,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("BLUK"), + .name = NAME_BLUK_BERRY, .firmness = BERRY_FIRMNESS_SOFT, .size = 108, .maxYield = 6, @@ -375,7 +552,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("NANAB"), + .name = NAME_NANAB_BERRY, .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 77, .maxYield = 6, @@ -391,7 +568,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("WEPEAR"), + .name = NAME_WEPEAR_BERRY, .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 74, .maxYield = 6, @@ -407,7 +584,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("PINAP"), + .name = NAME_PINAP_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 80, .maxYield = 6, @@ -423,7 +600,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("POMEG"), + .name = NAME_POMEG_BERRY, .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 135, .maxYield = 6, @@ -439,7 +616,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("KELPSY"), + .name = NAME_KELPSY_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 150, .maxYield = 6, @@ -455,7 +632,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("QUALOT"), + .name = NAME_QUALOT_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 110, .maxYield = 6, @@ -471,7 +648,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("HONDEW"), + .name = NAME_HONDEW_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 162, .maxYield = 6, @@ -487,7 +664,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("GREPA"), + .name = NAME_GREPA_BERRY, .firmness = BERRY_FIRMNESS_SOFT, .size = 149, .maxYield = 6, @@ -503,7 +680,7 @@ const struct Berry gBerries[] = .smoothness = 20, }, { - .name = _("TAMATO"), + .name = NAME_TAMATO_BERRY, .firmness = BERRY_FIRMNESS_SOFT, .size = 200, .maxYield = 4, @@ -519,7 +696,7 @@ const struct Berry gBerries[] = .smoothness = 30, }, { - .name = _("CORNN"), + .name = NAME_CORNN_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 75, .maxYield = 4, @@ -535,7 +712,7 @@ const struct Berry gBerries[] = .smoothness = 30, }, { - .name = _("MAGOST"), + .name = NAME_MAGOST_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 140, .maxYield = 4, @@ -551,7 +728,7 @@ const struct Berry gBerries[] = .smoothness = 30, }, { - .name = _("RABUTA"), + .name = NAME_RABUTA_BERRY, .firmness = BERRY_FIRMNESS_SOFT, .size = 226, .maxYield = 4, @@ -567,7 +744,7 @@ const struct Berry gBerries[] = .smoothness = 30, }, { - .name = _("NOMEL"), + .name = NAME_NOMEL_BERRY, .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 285, .maxYield = 4, @@ -583,7 +760,7 @@ const struct Berry gBerries[] = .smoothness = 30, }, { - .name = _("SPELON"), + .name = NAME_SPELON_BERRY, .firmness = BERRY_FIRMNESS_SOFT, .size = 133, .maxYield = 2, @@ -599,7 +776,7 @@ const struct Berry gBerries[] = .smoothness = 70, }, { - .name = _("PAMTRE"), + .name = NAME_PAMTRE_BERRY, .firmness = BERRY_FIRMNESS_VERY_SOFT, .size = 244, .maxYield = 2, @@ -615,7 +792,7 @@ const struct Berry gBerries[] = .smoothness = 70, }, { - .name = _("WATMEL"), + .name = NAME_WATMEL_BERRY, .firmness = BERRY_FIRMNESS_SOFT, .size = 250, .maxYield = 2, @@ -631,7 +808,7 @@ const struct Berry gBerries[] = .smoothness = 70, }, { - .name = _("DURIN"), + .name = NAME_DURIN_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 280, .maxYield = 2, @@ -647,7 +824,7 @@ const struct Berry gBerries[] = .smoothness = 70, }, { - .name = _("BELUE"), + .name = NAME_BELUE_BERRY, .firmness = BERRY_FIRMNESS_VERY_SOFT, .size = 300, .maxYield = 2, @@ -663,7 +840,7 @@ const struct Berry gBerries[] = .smoothness = 70, }, { - .name = _("LIECHI"), + .name = NAME_LIECHI_BERRY, .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 111, .maxYield = 2, @@ -679,7 +856,7 @@ const struct Berry gBerries[] = .smoothness = 80, }, { - .name = _("GANLON"), + .name = NAME_GANLON_BERRY, .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 33, .maxYield = 2, @@ -695,7 +872,7 @@ const struct Berry gBerries[] = .smoothness = 80, }, { - .name = _("SALAC"), + .name = NAME_SALAC_BERRY, .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 95, .maxYield = 2, @@ -711,7 +888,7 @@ const struct Berry gBerries[] = .smoothness = 80, }, { - .name = _("PETAYA"), + .name = NAME_PETAYA_BERRY, .firmness = BERRY_FIRMNESS_VERY_HARD, .size = 237, .maxYield = 2, @@ -727,7 +904,7 @@ const struct Berry gBerries[] = .smoothness = 80, }, { - .name = _("APICOT"), + .name = NAME_APICOT_BERRY, .firmness = BERRY_FIRMNESS_HARD, .size = 75, .maxYield = 2, @@ -743,7 +920,7 @@ const struct Berry gBerries[] = .smoothness = 80, }, { - .name = _("LANSAT"), + .name = NAME_LANSAT_BERRY, .firmness = BERRY_FIRMNESS_SOFT, .size = 97, .maxYield = 2, @@ -759,7 +936,7 @@ const struct Berry gBerries[] = .smoothness = 30, }, { - .name = _("STARF"), + .name = NAME_STARF_BERRY, .firmness = BERRY_FIRMNESS_SUPER_HARD, .size = 153, .maxYield = 2, @@ -775,7 +952,7 @@ const struct Berry gBerries[] = .smoothness = 30, }, { - .name = _("ENIGMA"), + .name = NAME_ENIGMA_BERRY, .firmness = BERRY_FIRMNESS_UNKNOWN, .size = 0, .maxYield = 2, diff --git a/src/birch_pc.c b/src/birch_pc.c new file mode 100644 index 000000000..89eafc0ce --- /dev/null +++ b/src/birch_pc.c @@ -0,0 +1,114 @@ +#include "global.h" +#include "asm.h" +#include "event_data.h" +#include "field_message_box.h" +#include "pokedex.h" +#include "species.h" + +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +extern const u8 gUnknown_081C4520[]; +extern const u8 gUnknown_081C456A[]; +extern const u8 gUnknown_081C45B0[]; +extern const u8 gUnknown_081C45F9[]; +extern const u8 gUnknown_081C4648[]; +extern const u8 gUnknown_081C467E[]; +extern const u8 gUnknown_081C46B9[]; +extern const u8 gUnknown_081C46FE[]; +extern const u8 gUnknown_081C4747[]; +extern const u8 gUnknown_081C4780[]; +extern const u8 gUnknown_081C47DF[]; +extern const u8 gUnknown_081C4828[]; +extern const u8 gUnknown_081C4863[]; +extern const u8 gUnknown_081C489C[]; +extern const u8 gUnknown_081C48EB[]; +extern const u8 gUnknown_081C4936[]; +extern const u8 gUnknown_081C49A2[]; +extern const u8 gUnknown_081C4A06[]; +extern const u8 gUnknown_081C4A4F[]; +extern const u8 gUnknown_081C4A91[]; +extern const u8 gUnknown_081C4ADA[]; + +bool16 ScriptGetPokedexInfo(void) +{ + if (!gSpecialVar_0x8004) + { + gSpecialVar_0x8005 = GetHoennPokedexCount(0); + gSpecialVar_0x8006 = GetHoennPokedexCount(1); + } + else + { + gSpecialVar_0x8005 = GetNationalPokedexCount(0); + gSpecialVar_0x8006 = GetNationalPokedexCount(1); + } + + return IsNationalPokedexEnabled(); +} + +const u8 *GetPokedexRatingText(u16 count) +{ + if (count < 10) + return gUnknown_081C4520; + if (count < 20) + return gUnknown_081C456A; + if (count < 30) + return gUnknown_081C45B0; + if (count < 40) + return gUnknown_081C45F9; + if (count < 50) + return gUnknown_081C4648; + if (count < 60) + return gUnknown_081C467E; + if (count < 70) + return gUnknown_081C46B9; + if (count < 80) + return gUnknown_081C46FE; + if (count < 90) + return gUnknown_081C4747; + if (count < 100) + return gUnknown_081C4780; + if (count < 110) + return gUnknown_081C47DF; + if (count < 120) + return gUnknown_081C4828; + if (count < 130) + return gUnknown_081C4863; + if (count < 140) + return gUnknown_081C489C; + if (count < 150) + return gUnknown_081C48EB; + if (count < 160) + return gUnknown_081C4936; + if (count < 170) + return gUnknown_081C49A2; + if (count < 180) + return gUnknown_081C4A06; + if (count < 190) + return gUnknown_081C4A4F; + if (count < 200) + return gUnknown_081C4A91; + if (count == 200) + { + if (sub_8090D90(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) + || sub_8090D90(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) + return gUnknown_081C4A91; + return gUnknown_081C4ADA; + } + if (count == 201) + { + if (sub_8090D90(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) + && sub_8090D90(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) + return gUnknown_081C4A91; + return gUnknown_081C4ADA; + } + if (count == 202) + return gUnknown_081C4ADA; + return gUnknown_081C4520; +} + +void ShowPokedexRatingMessage(void) +{ + ShowFieldMessage(GetPokedexRatingText(gSpecialVar_0x8004)); +} diff --git a/src/credits.c b/src/credits.c index 7685a033d..17d3507aa 100644 --- a/src/credits.c +++ b/src/credits.c @@ -7,6 +7,7 @@ #include "palette.h" #include "songs.h" #include "sound.h" +#include "trig.h" asm(".set REG_BASE, 0x4000000"); asm(".set OFFSET_REG_BLDCNT, 0x50"); @@ -141,14 +142,13 @@ struct CreditsEntry u8 *text; }; -extern u8 unk_2000000[]; +extern u8 ewram[]; -#define EWRAM_1F800 ((u16 *)(unk_2000000 + 0x1F800)) -#define HALL_OF_FAME_SHEET_0 ((u8 *)(unk_2000000 + 0x1E000)) -#define HALL_OF_FAME_SHEET_1 ((u8 *)(unk_2000000 + 0x1E800)) -#define HALL_OF_FAME_SHEET_2 ((u8 *)(unk_2000000 + 0x1F000)) - -extern struct Unk201C000 unk_201C000; +#define EWRAM_1F800 ((u16 *)(ewram + 0x1F800)) +#define HALL_OF_FAME_SHEET_0 ((u8 *)(ewram + 0x1E000)) +#define HALL_OF_FAME_SHEET_1 ((u8 *)(ewram + 0x1E800)) +#define HALL_OF_FAME_SHEET_2 ((u8 *)(ewram + 0x1F000)) +#define ewram1c000 (*(struct Unk201C000 *)(ewram + 0x1C000)) extern struct HallOfFame gHallOfFame; extern u8 unk_201e800[0x800]; @@ -162,7 +162,7 @@ extern u16 gUnknown_02039322; // TASK A extern u8 gUnknown_02039324; extern u8 gUnknown_02039325; extern u16 gUnknown_02039358; -extern u16 gUnknown_0203935A; +extern s16 gUnknown_0203935A; extern s16 gUnknown_0203935C; extern u8 gReservedSpritePaletteCount; @@ -328,7 +328,7 @@ void sub_81439D0(void) SetMainCallback2(sub_814395C); gUnknown_02039325 = 0; - c000 = &unk_201C000; + c000 = &ewram1c000; sub_81458DC(); @@ -818,11 +818,9 @@ static u8 sub_8144454(u8 page, u8 taskIdA) #define UNK_DEFINE_44 (0x44) -#define EWRAM_1C000 (*(struct Unk201C000 *)(unk_2000000 + 0x1C000)) - static void task_d_8144514(u8 taskIdD) { - struct Unk201C000 *r6 = &EWRAM_1C000; + struct Unk201C000 *r6 = &ewram1c000; u8 r2; switch (gTasks[taskIdD].data[TDD_STATE]) @@ -866,331 +864,87 @@ static void task_d_8144514(u8 taskIdD) } } -__attribute__((naked)) void task_c_8144664(u8 taskIdC) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - ldr r1, _0814468C @ =gTasks\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - movs r2, 0x8\n\ - ldrsh r0, [r0, r2]\n\ - adds r6, r1, 0\n\ - cmp r0, 0x32\n\ - bls _08144680\n\ - b _0814492C\n\ -_08144680:\n\ - lsls r0, 2\n\ - ldr r1, _08144690 @ =_08144694\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0814468C: .4byte gTasks\n\ -_08144690: .4byte _08144694\n\ - .align 2, 0\n\ -_08144694:\n\ - .4byte _08144760\n\ - .4byte _08144784\n\ - .4byte _081447D8\n\ - .4byte _081447F0\n\ - .4byte _0814482C\n\ - .4byte _08144850\n\ - .4byte _0814489C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _081448A8\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _081448C8\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _081448EC\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _0814492C\n\ - .4byte _08144920\n\ -_08144760:\n\ - lsls r4, r5, 2\n\ - adds r4, r5\n\ - lsls r4, 3\n\ - adds r4, r6\n\ - ldrh r0, [r4, 0x12]\n\ - lsls r0, 16\n\ - asrs r0, 17\n\ - movs r1, 0x7F\n\ - ands r0, r1\n\ - movs r1, 0xC\n\ - bl Sin\n\ - ldr r1, _08144780 @ =gUnknown_0203935A\n\ - strh r0, [r1]\n\ - b _081447A8\n\ - .align 2, 0\n\ -_08144780: .4byte gUnknown_0203935A\n\ -_08144784:\n\ - ldr r7, _081447B0 @ =gUnknown_0203935A\n\ - movs r3, 0\n\ - ldrsh r4, [r7, r3]\n\ - cmp r4, 0\n\ - beq _081447B4\n\ - lsls r4, r5, 2\n\ - adds r4, r5\n\ - lsls r4, 3\n\ - adds r4, r6\n\ - ldrh r0, [r4, 0x12]\n\ - lsls r0, 16\n\ - asrs r0, 17\n\ - movs r1, 0x7F\n\ - ands r0, r1\n\ - movs r1, 0xC\n\ - bl Sin\n\ - strh r0, [r7]\n\ -_081447A8:\n\ - ldrh r0, [r4, 0x12]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x12]\n\ - b _0814492C\n\ - .align 2, 0\n\ -_081447B0: .4byte gUnknown_0203935A\n\ -_081447B4:\n\ - ldr r3, _081447D4 @ =gSprites\n\ - lsls r1, r5, 2\n\ - adds r1, r5\n\ - lsls r1, 3\n\ - adds r1, r6\n\ - movs r0, 0xC\n\ - ldrsh r2, [r1, r0]\n\ - lsls r0, r2, 4\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - movs r2, 0x2\n\ - strh r2, [r0, 0x2E]\n\ - strh r4, [r1, 0x12]\n\ - b _08144848\n\ - .align 2, 0\n\ -_081447D4: .4byte gSprites\n\ -_081447D8:\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r1, r0, r6\n\ - ldrh r2, [r1, 0x12]\n\ - movs r3, 0x12\n\ - ldrsh r0, [r1, r3]\n\ - cmp r0, 0x3F\n\ - bgt _08144848\n\ - adds r0, r2, 0x1\n\ - strh r0, [r1, 0x12]\n\ - b _08144866\n\ -_081447F0:\n\ - ldr r3, _08144828 @ =gSprites\n\ - lsls r2, r5, 2\n\ - adds r2, r5\n\ - lsls r2, 3\n\ - adds r2, r6\n\ - movs r0, 0xC\n\ - ldrsh r1, [r2, r0]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - movs r1, 0x3\n\ - strh r1, [r0, 0x2E]\n\ - movs r0, 0xE\n\ - ldrsh r1, [r2, r0]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x2E]\n\ - movs r0, 0x78\n\ - strh r0, [r2, 0x10]\n\ - ldrh r0, [r2, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x8]\n\ - b _0814492C\n\ - .align 2, 0\n\ -_08144828: .4byte gSprites\n\ -_0814482C:\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r1, r0, r6\n\ - ldrh r2, [r1, 0x10]\n\ - movs r3, 0x10\n\ - ldrsh r0, [r1, r3]\n\ - cmp r0, 0\n\ - beq _08144844\n\ - subs r0, r2, 0x1\n\ - strh r0, [r1, 0x10]\n\ - b _0814492C\n\ -_08144844:\n\ - movs r0, 0x40\n\ - strh r0, [r1, 0x12]\n\ -_08144848:\n\ - ldrh r0, [r1, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r1, 0x8]\n\ - b _0814492C\n\ -_08144850:\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r4, r0, r6\n\ - ldrh r1, [r4, 0x12]\n\ - movs r2, 0x12\n\ - ldrsh r0, [r4, r2]\n\ - cmp r0, 0\n\ - ble _0814487C\n\ - subs r0, r1, 0x1\n\ - strh r0, [r4, 0x12]\n\ -_08144866:\n\ - movs r1, 0x7F\n\ - ands r0, r1\n\ - movs r1, 0x14\n\ - bl Sin\n\ - ldr r1, _08144878 @ =gUnknown_0203935A\n\ - strh r0, [r1]\n\ - b _0814492C\n\ - .align 2, 0\n\ -_08144878: .4byte gUnknown_0203935A\n\ -_0814487C:\n\ - ldr r2, _08144898 @ =gSprites\n\ - movs r3, 0xC\n\ - ldrsh r1, [r4, r3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x2E]\n\ - ldrh r0, [r4, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x8]\n\ - b _0814492C\n\ - .align 2, 0\n\ -_08144898: .4byte gSprites\n\ -_0814489C:\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r0, r6\n\ - movs r1, 0x32\n\ - b _0814492A\n\ -_081448A8:\n\ - ldr r3, _081448C4 @ =gSprites\n\ - lsls r1, r5, 2\n\ - adds r1, r5\n\ - lsls r1, 3\n\ - adds r1, r6\n\ - movs r0, 0xE\n\ - ldrsh r2, [r1, r0]\n\ - lsls r0, r2, 4\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - movs r2, 0x2\n\ - b _081448E0\n\ - .align 2, 0\n\ -_081448C4: .4byte gSprites\n\ -_081448C8:\n\ - ldr r3, _081448E8 @ =gSprites\n\ - lsls r1, r5, 2\n\ - adds r1, r5\n\ - lsls r1, 3\n\ - adds r1, r6\n\ - movs r0, 0xC\n\ - ldrsh r2, [r1, r0]\n\ - lsls r0, r2, 4\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - movs r2, 0x4\n\ -_081448E0:\n\ - strh r2, [r0, 0x2E]\n\ - movs r0, 0x32\n\ - strh r0, [r1, 0x8]\n\ - b _0814492C\n\ - .align 2, 0\n\ -_081448E8: .4byte gSprites\n\ -_081448EC:\n\ - ldr r3, _0814491C @ =gSprites\n\ - lsls r2, r5, 2\n\ - adds r2, r5\n\ - lsls r2, 3\n\ - adds r2, r6\n\ - movs r0, 0xC\n\ - ldrsh r1, [r2, r0]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - movs r1, 0x5\n\ - strh r1, [r0, 0x2E]\n\ - movs r0, 0xE\n\ - ldrsh r1, [r2, r0]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - movs r1, 0x3\n\ - strh r1, [r0, 0x2E]\n\ - movs r0, 0x32\n\ - strh r0, [r2, 0x8]\n\ - b _0814492C\n\ - .align 2, 0\n\ -_0814491C: .4byte gSprites\n\ -_08144920:\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r0, r6\n\ - movs r1, 0\n\ -_0814492A:\n\ - strh r1, [r0, 0x8]\n\ -_0814492C:\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); + switch (gTasks[taskIdC].data[0]) + { + case 0: + gUnknown_0203935A = Sin((gTasks[taskIdC].data[5] >> 1) & 0x7F, 12); + gTasks[taskIdC].data[5]++; + break; + case 1: + if (gUnknown_0203935A != 0) + { + gUnknown_0203935A = Sin((gTasks[taskIdC].data[5] >> 1) & 0x7F, 12); + gTasks[taskIdC].data[5]++; + } + else + { + gSprites[gTasks[taskIdC].data[2]].data0 = 2; + gTasks[taskIdC].data[5] = 0; + gTasks[taskIdC].data[0]++; + } + break; + case 2: + if (gTasks[taskIdC].data[5] < 64) + { + gTasks[taskIdC].data[5]++; + gUnknown_0203935A = Sin(gTasks[taskIdC].data[5] & 0x7F, 20); + } + else + { + gTasks[taskIdC].data[0]++; + } + break; + case 3: + gSprites[gTasks[taskIdC].data[2]].data0 = 3; + gSprites[gTasks[taskIdC].data[3]].data0 = 1; + gTasks[taskIdC].data[4] = 120; + gTasks[taskIdC].data[0]++; + break; + case 4: + if (gTasks[taskIdC].data[4] != 0) + { + gTasks[taskIdC].data[4]--; + } + else + { + gTasks[taskIdC].data[5] = 64; + gTasks[taskIdC].data[0]++; + } + break; + case 5: + if (gTasks[taskIdC].data[5] > 0) + { + gTasks[taskIdC].data[5]--; + gUnknown_0203935A = Sin(gTasks[taskIdC].data[5] & 0x7F, 20); + } + else + { + gSprites[gTasks[taskIdC].data[2]].data0 = 1; + gTasks[taskIdC].data[0]++; + } + break; + case 6: + gTasks[taskIdC].data[0] = 50; + break; + case 10: + gSprites[gTasks[taskIdC].data[3]].data0 = 2; + gTasks[taskIdC].data[0] = 50; + break; + case 20: + gSprites[gTasks[taskIdC].data[2]].data0 = 4; + gTasks[taskIdC].data[0] = 50; + break; + case 30: + gSprites[gTasks[taskIdC].data[2]].data0 = 5; + gSprites[gTasks[taskIdC].data[3]].data0 = 3; + gTasks[taskIdC].data[0] = 50; + break; + case 50: + gTasks[taskIdC].data[0] = 0; + break; + } } #define UNK_DEF_1F3 (499) diff --git a/src/dewford_trend.c b/src/dewford_trend.c index 55314b1c6..b90100d90 100644 --- a/src/dewford_trend.c +++ b/src/dewford_trend.c @@ -1,6 +1,7 @@ #include "global.h" #include "dewford_trend.h" #include "asm.h" +#include "easy_chat.h" #include "event_data.h" #include "link.h" #include "rng.h" @@ -24,12 +25,12 @@ void sub_80FA17C(void) for (i = 0; i < 5; i++) { - gSaveBlock1.easyChatPairs[i].words[0] = sub_80EB72C(10); + gSaveBlock1.easyChatPairs[i].words[0] = sub_80EB72C(EC_GROUP_CONDITIONS); if (Random() & 1) - gSaveBlock1.easyChatPairs[i].words[1] = sub_80EB72C(12); + gSaveBlock1.easyChatPairs[i].words[1] = sub_80EB72C(EC_GROUP_LIFESTYLE); else - gSaveBlock1.easyChatPairs[i].words[1] = sub_80EB72C(13); + gSaveBlock1.easyChatPairs[i].words[1] = sub_80EB72C(EC_GROUP_HOBBIES); gSaveBlock1.easyChatPairs[i].unk1_6 = Random() & 1; sub_80FA740(&gSaveBlock1.easyChatPairs[i]); diff --git a/src/easy_chat.c b/src/easy_chat.c new file mode 100644 index 000000000..380fe6e4d --- /dev/null +++ b/src/easy_chat.c @@ -0,0 +1,262 @@ +#include "global.h" +#include "easy_chat.h" +#include "asm.h" +#include "event_data.h" +#include "field_message_box.h" +#include "pokedex.h" +#include "rng.h" +#include "text.h" + +u8 sub_80EB8C0(void); +u8 sub_80EB868(u8); +u16 sub_80EAE88(u8); +void sub_80EB890(u8); +u16 sub_80EB784(u16 group); +u8 sub_80EAD7C(u8 group); +u8 sub_80EB680(u16 *, u16, u16, u16); +static u16 sub_80EB9D8(void); +static u16 sub_80EB960(void); +u16 sub_80EB72C(u16); + +extern void *gEasyChatGroupWords[]; +extern const u8 gEasyChatGroupSizes[]; + +extern u16 gSpecialVar_0x8004; + +u16 sub_80EB72C(u16 group) { + u16 local1; + + local1 = Random() % gEasyChatGroupSizes[group]; + + if (group == EC_GROUP_POKEMON || + group == EC_GROUP_POKEMON_2 || + group == EC_GROUP_MOVE_1 || + group == EC_GROUP_MOVE_2) + { + local1 = ((u16 *) gEasyChatGroupWords[group])[local1]; + } + + + return ((group & 0x7F) << 9) | (local1 & 0x1FF); +} + +u16 sub_80EB784(u16 group) { + if (!sub_80EAD7C(group)) + { + return -1; + } + + if (group != EC_GROUP_POKEMON) + { + if (group == EC_GROUP_TRENDY_SAYING) + { + return sub_80EB960(); + } + } + else + { + return sub_80EB9D8(); + } + + return sub_80EB72C(group); +} + +void sub_80EB7C4(void) { + u16 *words; + u16 arg1, arg2; + + + switch (gSpecialVar_0x8004) + { + case 0: + words = gSaveBlock1.unk2B1C; + arg1 = 2; + arg2 = 2; + break; + + case 1: + words = gSaveBlock1.unk2B28; + if (sub_80EB680(gSaveBlock1.unk2B28, 3, 2, 20)) + { + arg1 = 2; + arg2 = 3; + } + else + { + arg1 = 3; + arg2 = 2; + } + break; + + case 2: + words = gSaveBlock1.unk2B34; + arg1 = 3; + arg2 = 2; + break; + + case 3: + words = gSaveBlock1.unk2B40; + arg1 = 3; + arg2 = 2; + break; + + default: + return; + } + + ConvertEasyChatWordsToString(gStringVar4, words, arg1, arg2); + ShowFieldAutoScrollMessage(gStringVar4); +} + +void sub_80EB83C(void) { + u16 group, local2; + + if (Random() & 1) + { + group = EC_GROUP_HOBBIES; + } + else + { + group = EC_GROUP_LIFESTYLE; + } + + local2 = sub_80EB784(group); + sub_80EB3FC(gStringVar2, local2); +} + +u8 sub_80EB868(u8 arg0) { + int offset; + int index; + + index = arg0 / 8; + offset = arg0 & 7; + return (gSaveBlock1.unk2D8C[index] >> offset) & 1; +} + +void sub_80EB890(u8 arg0) { + int offset; + int index; + + if (arg0 > 32) + { + return; + } + + index = arg0 / 8; + offset = arg0 & 7; + gSaveBlock1.unk2D8C[index] |= 1 << offset; +} + +u8 sub_80EB8C0(void) { + u8 i, retval; + + i = 0; + retval = 0; + for (; i < 33; i++) + { + if (sub_80EB868(i)) + { + retval += 1; + } + } + + return retval; +} + +u16 sub_80EB8EC(void) { + u16 i; + u16 local1, local2; + + local1 = sub_80EB8C0(); + if (local1 == 33) + { + return -1; + } + + local2 = Random() % (33 - local1); + + for (i = 0; i <= 0x20; i++) + { + if (sub_80EB868(i) == 0) + { + if (local2 == 0) + { + sub_80EB890(i); + return (i & 0x1FF) | 0x2800; + } + + local2--; + } + } + + return -1; +} + +static u16 sub_80EB960(void) { + u16 i; + u16 local1; + + local1 = sub_80EB8C0(); + if (local1 == 0) + { + return -1; + } + + local1 = Random() % local1; + + for (i = 0; i <= 0x20; i++) + { + if (sub_80EB868(i)) + { + if (local1 == 0) + { + return (i & 0x1FF) | 0x2800; + } + + local1--; + } + } + + return -1; +} + +u8 sub_80EB9C8(void) { + return IsNationalPokedexEnabled(); +} + +static u16 sub_80EB9D8(void) { + u16 *speciesList; + u16 local1; + u16 i; + + local1 = sub_80EAE88(0); + + if (local1 == 0) + { + return -1; + } + + local1 = Random() % local1; + speciesList = (u16 *) gEasyChatGroupWords[EC_GROUP_POKEMON]; + + for (i = 0; i < gEasyChatGroupSizes[EC_GROUP_POKEMON]; i++) + { + const u16 dexNum = SpeciesToNationalPokedexNum(*speciesList); + + const u8 local2 = sub_8090D90(dexNum, 0); + + if (local2) + { + if (local1 == 0) + { + return *speciesList & 0x1FF; + } + + local1--; + } + + speciesList++; + } + + return -1; +} diff --git a/src/egg_hatch.c b/src/egg_hatch.c new file mode 100644 index 000000000..32fbe1547 --- /dev/null +++ b/src/egg_hatch.c @@ -0,0 +1,52 @@ +#include "global.h" +#include "pokemon.h" + +void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp) { + u16 species; + u32 personality, pokerus; + u8 i, friendship, language, gameMet, markings; + u16 moves[4]; + u32 ivs[6]; + + + species = GetMonData(egg, MON_DATA_SPECIES); + + for (i = 0; i < 4; i++) + { + moves[i] = GetMonData(egg, MON_DATA_MOVE1 + i); + } + + personality = GetMonData(egg, MON_DATA_PERSONALITY); + + for (i = 0; i < 6; i++) + { + ivs[i] = GetMonData(egg, MON_DATA_HP_IV + i); + } + + gameMet = GetMonData(egg, MON_DATA_MET_GAME); + markings = GetMonData(egg, MON_DATA_MARKINGS); + pokerus = GetMonData(egg, MON_DATA_POKERUS); + + CreateMon(temp, species, 5, 32, TRUE, personality, 0, 0); + + for (i = 0; i < 4; i++) + { + SetMonData(temp, MON_DATA_MOVE1 + i, (const u8 *) &moves[i]); + } + + for (i = 0; i < 6; i++) + { + SetMonData(temp, MON_DATA_HP_IV + i, (const u8 *) &ivs[i]); + } + + language = GAME_LANGUAGE; + SetMonData(temp, MON_DATA_LANGUAGE, &language); + SetMonData(temp, MON_DATA_MET_GAME, &gameMet); + SetMonData(temp, MON_DATA_MARKINGS, &markings); + + friendship = 120; + SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship); + SetMonData(temp, MON_DATA_POKERUS, (const u8 *) &pokerus); + + *egg = *temp; +} diff --git a/src/field_message_box.c b/src/field_message_box.c index 2a5f90d15..798725540 100644 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -15,7 +15,7 @@ static u8 sMessageBoxMode; static void Task_FieldMessageBox(u8 taskId); static void CreateFieldMessageBoxTask(void); static void DestroyFieldMessageBoxTask(void); -static void PrintFieldMessage(u8 *message); +static void PrintFieldMessage(const u8 *message); static void PrintFieldMessageFromStringVar4(void); void InitFieldMessageBox(void) @@ -67,7 +67,7 @@ static void DestroyFieldMessageBoxTask(void) DestroyTask(taskId); } -bool8 ShowFieldMessage(u8 *message) +bool8 ShowFieldMessage(const u8 *message) { if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) { @@ -81,7 +81,7 @@ bool8 ShowFieldMessage(u8 *message) } } -bool8 ShowFieldAutoScrollMessage(u8 *message) +bool8 ShowFieldAutoScrollMessage(const u8 *message) { if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) { @@ -95,14 +95,14 @@ bool8 ShowFieldAutoScrollMessage(u8 *message) } } -bool8 unref_sub_8064BB8(u8 *message) +bool8 unref_sub_8064BB8(const u8 *message) { sMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL; PrintFieldMessage(message); return TRUE; } -bool8 unref_sub_8064BD0(u8 *message) +bool8 unref_sub_8064BD0(const u8 *message) { if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) { @@ -116,7 +116,7 @@ bool8 unref_sub_8064BD0(u8 *message) } } -static void PrintFieldMessage(u8 *message) +static void PrintFieldMessage(const u8 *message) { StringExpandPlaceholders(gStringVar4, message); sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); diff --git a/src/field_specials.c b/src/field_specials.c new file mode 100644 index 000000000..9f5a314e2 --- /dev/null +++ b/src/field_specials.c @@ -0,0 +1,189 @@ +#include "global.h" +#include "asm.h" +#include "event_data.h" +#include "field_player_avatar.h" +#include "main.h" +#include "map_constants.h" +#include "rom4.h" +#include "script.h" +#include "songs.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" +#include "wallclock.h" + +#if ENGLISH +#define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD +#elif GERMAN +#define CHAR_DECIMAL_SEPARATOR CHAR_COMMA +#endif + +extern struct WarpData gUnknown_020297F0; +extern u16 gScriptResult; +extern u8 gUnknown_02039250; +extern u8 gUnknown_02039251; +extern u32 gUnknown_02039254; + +static void RecordCyclingRoadResults(u32, u8); + +void sub_810D6A4(void) { + SetMainCallback2(sub_8145D88); + ScriptContext2_Enable(); +} + +void sub_810D6B8(void) { + gMain.savedCallback = c2_exit_to_overworld_2_switch; + SetMainCallback2(CB2_ViewWallClock); + ScriptContext2_Enable(); +} + +void ResetCyclingRoadChallengeData(void) { + gUnknown_02039250 = 0; + gUnknown_02039251 = 0; + gUnknown_02039254 = 0; +} + +void BeginCyclingRoadChallenge(void) { + gUnknown_02039250 = 1; + gUnknown_02039251 = 0; + gUnknown_02039254 = gMain.vblankCounter1; +} + +u16 GetPlayerAvatarBike(void) { + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) + { + return 1; + } + + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) + { + return 2; + } + + return 0; +} + +void DetermineCyclingRoadResults(u32 arg0, u8 arg1) { + u8 result; + + if (arg1 <= 99) + { + ConvertIntToDecimalStringN(gStringVar1, arg1, STR_CONV_MODE_LEFT_ALIGN, 2); + StringAppend(gStringVar1, gOtherText_Times); + } + else + { + StringCopy(gStringVar1, gOtherText_99Times); + } + + if (arg0 < 3600) + { + ConvertIntToDecimalStringN(gStringVar2, arg0 / 60, STR_CONV_MODE_RIGHT_ALIGN, 2); + gStringVar2[2] = CHAR_DECIMAL_SEPARATOR; + ConvertIntToDecimalStringN(&gStringVar2[3], ((arg0 % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(gStringVar2, gOtherText_Seconds); + } + else + { + StringCopy(gStringVar2, gOtherText_1Minute); + } + + result = 0; + if (arg1 == 0) + { + result = 5; + } + else if (arg1 < 4) + { + result = 4; + } + else if (arg1 < 10) + { + result = 3; + } + else if (arg1 < 20) + { + result = 2; + } + else if (arg1 < 100) + { + result = 1; + } + + if (arg0 / 60 <= 10) + { + result += 5; + } + else if (arg0 / 60 <= 15) + { + result += 4; + } + else if (arg0 / 60 <= 20) + { + result += 3; + } + else if (arg0 / 60 <= 40) + { + result += 2; + } + else if (arg0 / 60 < 60) + { + result += 1; + } + + + gScriptResult = result; +} + +void FinishCyclingRoadChallenge(void) { + const u32 time = gMain.vblankCounter1 - gUnknown_02039254; + + DetermineCyclingRoadResults(time, gUnknown_02039251); + RecordCyclingRoadResults(time, gUnknown_02039251); +} + +static void RecordCyclingRoadResults(u32 arg0, u8 arg1) { + u16 high, low; + u32 record; + + high = VarGet(0x4028); + low = VarGet(0x4029); + record = high + (low << 16); + + if (record > arg0 || record == 0) + { + VarSet(0x4028, arg0); + VarSet(0x4029, arg0 >> 16); + VarSet(0x4027, arg1); + } +} + +u16 GetRecordedCyclingRoadResults(void) { + u16 high, low; + u32 record; + + high = VarGet(0x4028); + low = VarGet(0x4029); + record = high + (low << 16); + + if (record == 0) + { + return FALSE; + } + + DetermineCyclingRoadResults(record, VarGet(0x4027)); + return TRUE; +} + +void UpdateCyclingRoadState(void) { + if (gUnknown_020297F0.mapNum == MAP_ID_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE && gUnknown_020297F0.mapGroup == MAP_GROUP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE) + { + return; + } + + if (VarGet(0x40a9) == 2 || VarGet(0x40a9) == 3) + { + VarSet(0x40a9, 0); + sav1_set_battle_music_maybe(SE_STOP); + } +} diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c index 712bb8be9..d0ee712af 100644 --- a/src/fldeff_softboiled.c +++ b/src/fldeff_softboiled.c @@ -43,6 +43,13 @@ struct UnknownStruct3 { s16 unk2E; }; +#if ENGLISH +#define WINDOW_LEFT 3 +#define WINDOW_RIGHT 26 +#elif GERMAN +#define WINDOW_LEFT 0 +#define WINDOW_RIGHT 29 +#endif #define EWRAM_1000 (*(struct UnknownStruct2 *)(unk_2000000 + 0x1000)) #define EWRAM_1B000 (*(struct UnknownStruct1 *)(unk_2000000 + 0x1B000)) @@ -141,7 +148,7 @@ static void sub_8133E74(u8 taskId) { return; } - MenuZeroFillWindowRect(3, 14, 26, 19); + MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); sub_806D538(3, 0); gTasks[taskId].func = sub_806CB74; } @@ -153,9 +160,6 @@ static void sub_8133EB8(u8 taskId) { gTasks[taskId].func = sub_8133E74; } -#define WINDOW_LEFT 3 -#define WINDOW_RIGHT 26 - static void sub_8133EF8(void) { sub_806CCE4(); EWRAM_1B000.unk261 = 2; diff --git a/src/intro.c b/src/intro.c index a6b6b2734..ea6edba3d 100644 --- a/src/intro.c +++ b/src/intro.c @@ -310,6 +310,13 @@ static const union AnimCmd gSpriteAnim_840AF10[] = ANIMCMD_FRAME(128, 8), ANIMCMD_END, }; +#if GERMAN +static const union AnimCmd gSpriteAnim_8416DA4[] = +{ + ANIMCMD_FRAME(118, 8), + ANIMCMD_END, +}; +#endif static const union AnimCmd *const gSpriteAnimTable_840AF18[] = { gSpriteAnim_840AEA8, @@ -328,6 +335,9 @@ static const union AnimCmd *const gSpriteAnimTable_840AF34[] = gSpriteAnim_840AEF8, gSpriteAnim_840AF00, gSpriteAnim_840AF08, +#if GERMAN + gSpriteAnim_8416DA4, +#endif }; static const union AnimCmd *const gSpriteAnimTable_840AF4C[] = { diff --git a/src/link.c b/src/link.c index 783f6aecd..336616f1a 100644 --- a/src/link.c +++ b/src/link.c @@ -149,6 +149,11 @@ struct Link gLink; u8 gLastRecvQueueCount; u16 gLinkSavedIme; +#ifdef GERMAN +u8 deUnkValue1; +u8 deUnkValue2; +#endif + EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = {0}; EWRAM_DATA bool8 gLinkTestDummyBool = {0}; EWRAM_DATA u32 gFiller_20238B8 = {0}; @@ -479,6 +484,9 @@ static void ProcessRecvCmds(u8 unusedParam) memcpy(localLinkPlayerBlock.magic2, sMagic, sizeof(localLinkPlayerBlock.magic2) - 1); InitBlockSend(&localLinkPlayerBlock, sizeof(localLinkPlayerBlock)); break; + case 0x4444: + word_3002910[i] = gRecvCmds[1][i]; + break; case 0x5555: byte_3002A68 = 1; break; @@ -549,23 +557,28 @@ static void ProcessRecvCmds(u8 unusedParam) sub_80516C4(i, gRecvCmds[1][i]); break; case 0xCCCC: - { - const u32 *addresses; - const u32 *sizes; - void *data; - u16 size; - - addresses = sBlockRequestLookupTable; - data = (void *)addresses[gRecvCmds[1][i] * 2]; - - sizes = addresses + 1; - size = sizes[gRecvCmds[1][i] * 2]; +#if defined(ENGLISH) + SendBlock(0, (void *)(sBlockRequestLookupTable)[gRecvCmds[1][i] * 2], (sBlockRequestLookupTable + 1)[gRecvCmds[1][i] * 2]); +#elif defined(GERMAN) + if (deUnkValue2 == 1) + { + deUnkValue2 = 2; + deUnkValue1 = gRecvCmds[1][i]; + } + else if (deUnkValue2 == 2 || deUnkValue2 == 3) + { + SendBlock(0, (void *)(sBlockRequestLookupTable)[gRecvCmds[1][i] * 2], (sBlockRequestLookupTable + 1)[gRecvCmds[1][i] * 2]); - SendBlock(0, data, size); - break; - } - case 0x4444: - word_3002910[i] = gRecvCmds[1][i]; + if (deUnkValue2 == 2) + deUnkValue2 = 1; + else + deUnkValue2 = 0; + } + else + { + SendBlock(0, (void *)(sBlockRequestLookupTable)[gRecvCmds[1][i] * 2], (sBlockRequestLookupTable + 1)[gRecvCmds[1][i] * 2]); + } +#endif break; case 0xCAFE: word_3002910[i] = gRecvCmds[1][i]; @@ -676,6 +689,9 @@ void OpenLinkTimed(void) { sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED; gLinkTimeOutCounter = 0; +#if defined(GERMAN) + ResetBlockSend(); +#endif OpenLink(); } diff --git a/src/mail.c b/src/mail.c index a0a47e98f..1bd4e73dc 100644 --- a/src/mail.c +++ b/src/mail.c @@ -31,10 +31,10 @@ struct MailLayout struct Unk2000000 { /* 0x00*/ u8 words[8][27]; - /* 0xEC*/ u8 varD8[20]; + /* 0xD8*/ u8 varD8[20]; /* 0xEC*/ MainCallback varEC; /* 0xF0*/ MainCallback varF0; - /* 0xFF*/ struct MailStruct *varF4; + /* 0xF4*/ struct MailStruct *varF4; /* 0xF8*/ u8 varF8; /* 0xF9*/ u8 varF9; /* 0xFA*/ u8 varFA; @@ -61,7 +61,9 @@ struct MailGraphics u16 color12; }; -extern struct Unk2000000 unk_2000000; +extern u8 ewram[]; +#define ewram0 (*(struct Unk2000000 *)(ewram)) + extern struct MailGraphics gMailGraphicsTable[]; extern u16 gUnknown_083E562C[][2]; @@ -71,8 +73,7 @@ extern struct MailLayout gUnknown_083E57A4[]; extern u8 gOtherText_From[]; static u8 sub_80F8A28(void); -// static void sub_80F8D50(void); -// static u8 *sub_80F8D7C(u8 *dest, u8 *src); +static void sub_80F8D50(void); static void sub_80F8DA0(void); static void sub_80F8E80(void); static void sub_80F8F18(void); @@ -81,222 +82,69 @@ static void sub_80F8F58(void); static void sub_80F8F78(void); static void sub_80F8FB4(void); -#ifdef NONMATCHING void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) { u16 mailDesign; u8 buffer[4]; - u8 local1; - - unk_2000000.varFF = GAME_LANGUAGE; - // Compiler uses [sub 1], while asm uses [ptr + FE] - unk_2000000.varFE = 1; - unk_2000000.var104 = (MainCallback)sub_80EB3FC; - unk_2000000.var108 = (MainCallback)ConvertEasyChatWordsToString; + ewram0.varFF = GAME_LANGUAGE; + ewram0.var100 = 1; + ewram0.var104 = (MainCallback)sub_80EB3FC; + ewram0.var108 = (MainCallback)ConvertEasyChatWordsToString; mailDesign = arg0->itemId - ITEM_ORANGE_MAIL; if (mailDesign <= 11) { - unk_2000000.varFA = arg0->itemId - ITEM_ORANGE_MAIL; + ewram0.varFA = arg0->itemId - ITEM_ORANGE_MAIL; } else { - unk_2000000.varFA = 0; + ewram0.varFA = 0; arg2 = FALSE; } - switch (unk_2000000.var100) + switch (ewram0.var100) { case 0: default: - unk_2000000.var10C = &gUnknown_083E5730[unk_2000000.varFA]; + ewram0.var10C = &gUnknown_083E5730[ewram0.varFA]; break; case 1: - unk_2000000.var10C = &gUnknown_083E57A4[unk_2000000.varFA]; + ewram0.var10C = &gUnknown_083E57A4[ewram0.varFA]; break; } if (((sub_80A2D64(arg0->species, buffer) << 16) + 0xFFFF0000) <= (410 << 16)) { - switch (unk_2000000.varFA) + switch (ewram0.varFA) { case 6: - unk_2000000.varFB = 1; + ewram0.varFB = 1; break; case 9: - unk_2000000.varFB = 2; + ewram0.varFB = 2; break; default: - unk_2000000.varFB = 0; + ewram0.varFB = 0; break; } } else { - unk_2000000.varFB = 0; + ewram0.varFB = 0; } - unk_2000000.varF4 = arg0; - unk_2000000.varEC = arg1; - unk_2000000.varF8 = arg2; + ewram0.varF4 = arg0; + ewram0.varEC = arg1; + ewram0.varF8 = arg2; SetMainCallback2(sub_80F8D50); } -#else -__attribute__((naked)) -void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x4\n\ - adds r4, r0, 0\n\ - adds r6, r1, 0\n\ - lsls r2, 24\n\ - lsrs r5, r2, 24\n\ - ldr r2, _080F8958 @ =0x02000000\n\ - adds r1, r2, 0\n\ - adds r1, 0xFF\n\ - movs r0, 0x2\n\ - strb r0, [r1]\n\ - adds r0, 0xFE\n\ - adds r1, r2, r0\n\ - movs r0, 0x1\n\ - strb r0, [r1]\n\ - movs r0, 0x82\n\ - lsls r0, 1\n\ - adds r1, r2, r0\n\ - ldr r0, _080F895C @ =sub_80EB3FC\n\ - str r0, [r1]\n\ - movs r0, 0x84\n\ - lsls r0, 1\n\ - adds r1, r2, r0\n\ - ldr r0, _080F8960 @ =ConvertEasyChatWordsToString\n\ - str r0, [r1]\n\ - ldrh r1, [r4, 0x20]\n\ - adds r0, r1, 0\n\ - subs r0, 0x79\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xB\n\ - bhi _080F8964\n\ - subs r1, 0x79\n\ - adds r0, r2, 0\n\ - adds r0, 0xFA\n\ - strb r1, [r0]\n\ - b _080F896E\n\ - .align 2, 0\n\ -_080F8958: .4byte 0x02000000\n\ -_080F895C: .4byte sub_80EB3FC\n\ -_080F8960: .4byte ConvertEasyChatWordsToString\n\ -_080F8964:\n\ - adds r1, r2, 0\n\ - adds r1, 0xFA\n\ - movs r0, 0\n\ - strb r0, [r1]\n\ - movs r5, 0\n\ -_080F896E:\n\ - ldr r1, _080F8994 @ =0x02000000\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - adds r0, r1, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _080F8980\n\ - cmp r0, 0x1\n\ - beq _080F899C\n\ -_080F8980:\n\ - movs r0, 0x86\n\ - lsls r0, 1\n\ - adds r2, r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, 0xFA\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - ldr r1, _080F8998 @ =gUnknown_083E5730\n\ - b _080F89AC\n\ - .align 2, 0\n\ -_080F8994: .4byte 0x02000000\n\ -_080F8998: .4byte gUnknown_083E5730\n\ -_080F899C:\n\ - movs r0, 0x86\n\ - lsls r0, 1\n\ - adds r2, r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, 0xFA\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - ldr r1, _080F89DC @ =gUnknown_083E57A4\n\ -_080F89AC:\n\ - adds r0, r1\n\ - str r0, [r2]\n\ - ldrh r0, [r4, 0x1E]\n\ - mov r1, sp\n\ - bl sub_80A2D64\n\ - lsls r0, 16\n\ - ldr r1, _080F89E0 @ =0xffff0000\n\ - adds r0, r1\n\ - movs r1, 0xCD\n\ - lsls r1, 17\n\ - cmp r0, r1\n\ - bhi _080F89F8\n\ - ldr r0, _080F89E4 @ =0x02000000\n\ - adds r1, r0, 0\n\ - adds r1, 0xFA\n\ - ldrb r2, [r1]\n\ - adds r1, r0, 0\n\ - cmp r2, 0x6\n\ - beq _080F89E8\n\ - cmp r2, 0x9\n\ - beq _080F89F0\n\ - b _080F89FA\n\ - .align 2, 0\n\ -_080F89DC: .4byte gUnknown_083E57A4\n\ -_080F89E0: .4byte 0xffff0000\n\ -_080F89E4: .4byte 0x02000000\n\ -_080F89E8:\n\ - adds r2, r1, 0\n\ - adds r2, 0xFB\n\ - movs r0, 0x1\n\ - b _080F8A00\n\ -_080F89F0:\n\ - adds r2, r1, 0\n\ - adds r2, 0xFB\n\ - movs r0, 0x2\n\ - b _080F8A00\n\ -_080F89F8:\n\ - ldr r1, _080F8A20 @ =0x02000000\n\ -_080F89FA:\n\ - adds r2, r1, 0\n\ - adds r2, 0xFB\n\ - movs r0, 0\n\ -_080F8A00:\n\ - strb r0, [r2]\n\ - adds r0, r1, 0\n\ - adds r0, 0xF4\n\ - str r4, [r0]\n\ - subs r0, 0x8\n\ - str r6, [r0]\n\ - adds r0, 0xC\n\ - strb r5, [r0]\n\ - ldr r0, _080F8A24 @ =sub_80F8D50\n\ - bl SetMainCallback2\n\ - add sp, 0x4\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080F8A20: .4byte 0x02000000\n\ -_080F8A24: .4byte sub_80F8D50\n\ - .syntax divided\n"); -} - -#endif #define RETURN_UP_STATE break #define RETURN_SKIP_STATE return FALSE @@ -363,31 +211,31 @@ static u8 sub_80F8A28(void) RETURN_UP_STATE; case 11: - LoadPalette(gMailGraphicsTable[unk_2000000.varFA].palette, 0, 16 * 2); + LoadPalette(gMailGraphicsTable[ewram0.varFA].palette, 0, 16 * 2); RETURN_UP_STATE; case 12: - LZ77UnCompVram(gMailGraphicsTable[unk_2000000.varFA].tileMap, (void *)(VRAM + 0x4000)); + LZ77UnCompVram(gMailGraphicsTable[ewram0.varFA].tileMap, (void *)(VRAM + 0x4000)); RETURN_UP_STATE; case 13: - LZ77UnCompVram(gMailGraphicsTable[unk_2000000.varFA].tiles, (void *)(VRAM)); + LZ77UnCompVram(gMailGraphicsTable[ewram0.varFA].tiles, (void *)(VRAM)); - gPlttBufferUnfaded[241] = gMailGraphicsTable[unk_2000000.varFA].color10; - gPlttBufferUnfaded[248] = gMailGraphicsTable[unk_2000000.varFA].color12; + gPlttBufferUnfaded[241] = gMailGraphicsTable[ewram0.varFA].color10; + gPlttBufferUnfaded[248] = gMailGraphicsTable[ewram0.varFA].color12; gPlttBufferUnfaded[10] = gUnknown_083E562C[gSaveBlock2.playerGender][0]; gPlttBufferUnfaded[11] = gUnknown_083E562C[gSaveBlock2.playerGender][1]; RETURN_UP_STATE; case 14: - if (unk_2000000.varF8 != 0) + if (ewram0.varF8 != 0) { sub_80F8DA0(); } RETURN_UP_STATE; case 15: - if (unk_2000000.varF8 != 0) + if (ewram0.varF8 != 0) { sub_80F8E80(); } @@ -400,18 +248,18 @@ static u8 sub_80F8A28(void) { u16 local1; - local1 = sub_809D4A8(unk_2000000.varF4->species); + local1 = sub_809D4A8(ewram0.varF4->species); - switch (unk_2000000.varFB) + switch (ewram0.varFB) { case 1: sub_809D580(local1); - unk_2000000.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 96, 128, 0); + ewram0.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 96, 128, 0); break; case 2: sub_809D580(local1); - unk_2000000.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 40, 128, 0); + ewram0.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 40, 128, 0); break; } RETURN_UP_STATE; @@ -432,7 +280,7 @@ static u8 sub_80F8A28(void) REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; BeginNormalPaletteFade(-1, 0, 16, 0, 0); gPaletteFade.bufferTransferDisabled = 0; - unk_2000000.varF0 = sub_80F8F58; + ewram0.varF0 = sub_80F8F58; return TRUE; default: @@ -443,7 +291,7 @@ static u8 sub_80F8A28(void) return FALSE; } -void sub_80F8D50(void) +static void sub_80F8D50(void) { do { @@ -455,7 +303,7 @@ void sub_80F8D50(void) } while (sub_80F9344() != 1); } -u8 *sub_80F8D7C(u8 *dest, u8 *src) +static u8 *sub_80F8D7C(u8 *dest, u8 *src) { u16 length; @@ -467,163 +315,33 @@ u8 *sub_80F8D7C(u8 *dest, u8 *src) return dest + length; } -#ifdef NONMATCHING static void sub_80F8DA0(void) { - u8 local0; - - local0 = unk_2000000.var10C->var0; + u16 i; + u8 r6; + u8 *ptr; - // No idea what's happening in this loop. - if (local0 <= 0) + r6 = 0; + for (i = 0; i < ewram0.var10C->var0; i++) { - u8 i; - u8 i2 = 0; - - for (i = 0; i < unk_2000000.var10C->var0; i++) - { - ConvertEasyChatWordsToString(unk_2000000.words[i], &unk_2000000.varF4->words[i2], - ((*unk_2000000.var10C->var4)[i] << 28) >> 30, 1); - i2 += ((*unk_2000000.var10C->var4)[i] << 28) >> 30; - } + ConvertEasyChatWordsToString(ewram0.words[i], &ewram0.varF4->words[r6], ewram0.var10C->var4[i].unk_0_2, 1); + r6 += ewram0.var10C->var4[i].unk_0_2; } - - if (unk_2000000.var100 == 0) + ptr = ewram0.varD8; + if (ewram0.var100 == 0) { - u8 *ptr; - u16 length; - - ptr = sub_80F8D7C(unk_2000000.varD8, unk_2000000.varF4->playerName); + ptr = sub_80F8D7C(ptr, ewram0.varF4->playerName); StringCopy(ptr, gOtherText_From); + ewram0.varF9 = ewram0.var10C->var2 - StringLength(ewram0.varD8); - length = StringLength(unk_2000000.varD8); - - unk_2000000.varF9 = unk_2000000.var10C->var2 - length; } else { - u8 *ptr; - - ptr = StringCopy(unk_2000000.varD8, gOtherText_From); - sub_80F8D7C(ptr, unk_2000000.varF4->playerName); - - unk_2000000.varF9 = unk_2000000.var10C->var2; + ptr = StringCopy(ptr, gOtherText_From); + sub_80F8D7C(ptr, ewram0.varF4->playerName); + ewram0.varF9 = ewram0.var10C->var2; } } -#else -__attribute__((naked)) -static void sub_80F8DA0(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - movs r6, 0\n\ - movs r5, 0\n\ - ldr r2, _080F8E3C @ =0x02000000\n\ - movs r0, 0x86\n\ - lsls r0, 1\n\ - adds r1, r2, r0\n\ - ldr r0, [r1]\n\ - ldrb r0, [r0]\n\ - cmp r5, r0\n\ - bcs _080F8E04\n\ - mov r8, r2\n\ - adds r7, r1, 0\n\ -_080F8DBE:\n\ - lsls r0, r5, 3\n\ - subs r0, r5\n\ - lsls r0, 2\n\ - subs r0, r5\n\ - add r0, r8\n\ - mov r1, r8\n\ - adds r1, 0xF4\n\ - lsls r2, r6, 1\n\ - ldr r1, [r1]\n\ - adds r1, r2\n\ - ldr r2, [r7]\n\ - ldr r2, [r2, 0x4]\n\ - lsls r4, r5, 2\n\ - adds r2, r4, r2\n\ - ldr r2, [r2]\n\ - lsls r2, 28\n\ - lsrs r2, 30\n\ - movs r3, 0x1\n\ - bl ConvertEasyChatWordsToString\n\ - ldr r1, [r7]\n\ - ldr r0, [r1, 0x4]\n\ - adds r4, r0\n\ - ldr r0, [r4]\n\ - lsls r0, 28\n\ - lsrs r0, 30\n\ - adds r0, r6, r0\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - adds r0, r5, 0x1\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - ldrb r1, [r1]\n\ - cmp r5, r1\n\ - bcc _080F8DBE\n\ -_080F8E04:\n\ - ldr r2, _080F8E40 @ =0x020000d8\n\ - adds r4, r2, 0\n\ - subs r4, 0xD8\n\ - adds r0, r2, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _080F8E48\n\ - ldr r1, [r2, 0x1C]\n\ - adds r1, 0x12\n\ - adds r0, r2, 0\n\ - bl sub_80F8D7C\n\ - adds r2, r0, 0\n\ - ldr r1, _080F8E44 @ =gOtherText_From\n\ - bl StringCopy\n\ - ldr r0, _080F8E40 @ =0x020000d8\n\ - bl StringLength\n\ - movs r2, 0x86\n\ - lsls r2, 1\n\ - adds r1, r4, r2\n\ - ldr r1, [r1]\n\ - ldrb r1, [r1, 0x2]\n\ - subs r1, r0\n\ - b _080F8E6A\n\ - .align 2, 0\n\ -_080F8E3C: .4byte 0x02000000\n\ -_080F8E40: .4byte 0x020000d8\n\ -_080F8E44: .4byte gOtherText_From\n\ -_080F8E48:\n\ - ldr r1, _080F8E7C @ =gOtherText_From\n\ - adds r0, r2, 0\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - adds r0, r4, 0\n\ - adds r0, 0xF4\n\ - ldr r1, [r0]\n\ - adds r1, 0x12\n\ - adds r0, r2, 0\n\ - bl sub_80F8D7C\n\ - movs r1, 0x86\n\ - lsls r1, 1\n\ - adds r0, r4, r1\n\ - ldr r0, [r0]\n\ - ldrb r1, [r0, 0x2]\n\ -_080F8E6A:\n\ - adds r0, r4, 0\n\ - adds r0, 0xF9\n\ - strb r1, [r0]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080F8E7C: .4byte gOtherText_From\n\ - .syntax divided\n"); -} -#endif static void sub_80F8E80(void) { @@ -631,25 +349,25 @@ static void sub_80F8E80(void) u8 x; u8 y = 0; - for (pos = 0; pos < unk_2000000.var10C->var0; pos++) + for (pos = 0; pos < ewram0.var10C->var0; pos++) { - if (unk_2000000.words[pos][0] == 0xFF) + if (ewram0.words[pos][0] == 0xFF) { continue; } - if (unk_2000000.words[pos][0] == 0x00) + if (ewram0.words[pos][0] == 0x00) { continue; } - x = unk_2000000.var10C->var4[pos].unk_0_4; - y += unk_2000000.var10C->var4[pos].unk_0_0; - MenuPrint(unk_2000000.words[pos], unk_2000000.var10C->var3_4 + x, unk_2000000.var10C->var3_0 + y); + x = ewram0.var10C->var4[pos].unk_0_4; + y += ewram0.var10C->var4[pos].unk_0_0; + MenuPrint(ewram0.words[pos], ewram0.var10C->var3_4 + x, ewram0.var10C->var3_0 + y); y += 2; } - MenuPrint(unk_2000000.varD8, unk_2000000.varF9, unk_2000000.var10C->var1); + MenuPrint(ewram0.varD8, ewram0.varF9, ewram0.var10C->var1); } static void sub_80F8F18(void) @@ -661,13 +379,13 @@ static void sub_80F8F18(void) static void sub_80F8F2C(void) { - if (unk_2000000.varFB != 0) + if (ewram0.varFB != 0) { AnimateSprites(); BuildOamBuffer(); } - unk_2000000.varF0(); + ewram0.varF0(); } static void sub_80F8F58(void) @@ -677,7 +395,7 @@ static void sub_80F8F58(void) local0 = UpdatePaletteFade(); if (local0 == 0) { - unk_2000000.varF0 = sub_80F8F78; + ewram0.varF0 = sub_80F8F78; } } @@ -686,7 +404,7 @@ static void sub_80F8F78(void) if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { BeginNormalPaletteFade(-1, 0, 0, 16, 0); - unk_2000000.varF0 = sub_80F8FB4; + ewram0.varF0 = sub_80F8FB4; } } @@ -699,18 +417,18 @@ static void sub_80F8FB4(void) return; } - SetMainCallback2(unk_2000000.varEC); - switch (unk_2000000.varFB) + SetMainCallback2(ewram0.varEC); + switch (ewram0.varFB) { case 2: case 1: - local1 = sub_809D4A8(unk_2000000.varF4->species); + local1 = sub_809D4A8(ewram0.varF4->species); sub_809D608(local1); - sub_809D510(&gSprites[unk_2000000.varFC]); + sub_809D510(&gSprites[ewram0.varFC]); break; } - memset(&unk_2000000, 0, 0x110); + memset(&ewram0, 0, 0x110); ResetPaletteFade(); } diff --git a/src/mail_data.c b/src/mail_data.c new file mode 100644 index 000000000..f83484346 --- /dev/null +++ b/src/mail_data.c @@ -0,0 +1,207 @@ +#include "global.h" +#include "items.h" +#include "name_string_util.h" +#include "pokemon.h" +#include "species.h" +#include "text.h" + +void sub_80A2B40(struct MailStruct *); +u16 sub_80A2D44(u16, u32); +bool8 itemid_is_mail(u16); +u16 sub_809D474(u32); + +void sub_80A2B18(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + sub_80A2B40(&gSaveBlock1.mail[i]); +} + +void sub_80A2B40(struct MailStruct *mail) +{ + int i; + + for (i = 0; i < 9; i++) + mail->words[i] = -1; + + for (i = 0; i < 8; i++) + mail->playerName[i] = -1; + + for (i = 0; i < 4; i++) + mail->trainerId[i] = 0; + + mail->species = 1; + mail->itemId = 0; +} + +bool8 sub_80A2B94(struct Pokemon *mon) +{ + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); + if (itemid_is_mail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF) + return TRUE; + else + return FALSE; +} + +u8 sub_80A2BC4(struct Pokemon *mon, u16 itemId) +{ + u16 _itemId; + u8 heldItem[2]; + u8 id; + u8 i; + u16 species; + u32 personality; + + _itemId = itemId; + heldItem[0] = _itemId; + heldItem[1] = _itemId >> 8; + id = 0; + + while (id < 6) + { + if (gSaveBlock1.mail[id].itemId == 0) + { + for (i = 0; i < 9; i++) + gSaveBlock1.mail[id].words[i] = -1; + + for (i = 0; i < 7; i++) + gSaveBlock1.mail[id].playerName[i] = gSaveBlock2.playerName[i]; + gSaveBlock1.mail[id].playerName[i] = EOS; + PadNameString(gSaveBlock1.mail[id].playerName, 0); + + for (i = 0; i < 4; i++) + gSaveBlock1.mail[id].trainerId[i] = gSaveBlock2.playerTrainerId[i]; + + species = GetBoxMonData(&mon->box, MON_DATA_SPECIES); + personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY); + gSaveBlock1.mail[id].species = sub_80A2D44(species, personality); + gSaveBlock1.mail[id].itemId = _itemId; + SetMonData(mon, MON_DATA_MAIL, &id); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + return id; + } + id++; + } + + return -1; +} + +u16 sub_80A2D44(u16 species, u32 personality) +{ + if (species != SPECIES_UNOWN) + return species; + return ((sub_809D474(personality) << 16) + (30000 << 16)) >> 16; +} + +u16 sub_80A2D64(u16 a1, u16 *a2) +{ + u16 result; + + if (a1 >= 30000 && a1 < (30000 + UNOWN_FORM_COUNT)) + { + result = SPECIES_UNOWN; + *a2 = a1 - 30000; + } + else + { + result = a1; + } + + return result; +} + +u8 sub_80A2D88(struct Pokemon *mon, struct MailStruct *mail) +{ + u8 heldItem[2]; + u16 itemId = mail->itemId; + u8 mailId = sub_80A2BC4(mon, itemId); + + if (mailId == 0xFF) + return 0xFF; + + gSaveBlock1.mail[mailId] = *mail; + + SetMonData(mon, MON_DATA_MAIL, &mailId); + + heldItem[0] = itemId; + heldItem[1] = itemId >> 8; + + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + + return mailId; +} + +int unref_sub_80A2DF4(void) +{ + return 0; +} + +void sub_80A2DF8(struct Pokemon *mon) +{ + u8 heldItem[2]; + u8 mailId; + + if (sub_80A2B94(mon)) + { + mailId = GetMonData(mon, MON_DATA_MAIL); + gSaveBlock1.mail[mailId].itemId = 0; + mailId = 0xFF; + heldItem[0] = 0; + heldItem[1] = 0; + SetMonData(mon, MON_DATA_MAIL, &mailId); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + } +} + +void unref_sub_80A2E58(u8 mailId) +{ + gSaveBlock1.mail[mailId].itemId = 0; +} + +u8 sub_80A2E78(struct Pokemon *mon) +{ + u8 i; + u8 newHeldItem[2]; + u8 newMailId; + + newHeldItem[0] = 0; + newHeldItem[1] = 0; + newMailId = 0xFF; + + for (i = 6; i < 16; i++) + { + if (gSaveBlock1.mail[i].itemId == 0) + { + memcpy(&gSaveBlock1.mail[i], &gSaveBlock1.mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct)); + gSaveBlock1.mail[GetMonData(mon, MON_DATA_MAIL)].itemId = 0; + SetMonData(mon, MON_DATA_MAIL, &newMailId); + SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem); + return i; + } + } + + return 0xFF; +} + +bool8 itemid_is_mail(u16 itemId) +{ + switch (itemId) + { + case ITEM_ORANGE_MAIL: + case ITEM_HARBOR_MAIL: + case ITEM_GLITTER_MAIL: + case ITEM_MECH_MAIL: + case ITEM_WOOD_MAIL: + case ITEM_WAVE_MAIL: + case ITEM_BEAD_MAIL: + case ITEM_SHADOW_MAIL: + case ITEM_TROPIC_MAIL: + case ITEM_DREAM_MAIL: + case ITEM_FAB_MAIL: + case ITEM_RETRO_MAIL: + return TRUE; + default: + return FALSE; + } +} diff --git a/src/main.c b/src/main.c index 3275c817e..114fc171f 100644 --- a/src/main.c +++ b/src/main.c @@ -31,9 +31,13 @@ static void IntrDummy(void); const u8 gGameVersion = GAME_VERSION; -const u8 gGameLanguage = GAME_LANGUAGE; // English +const u8 gGameLanguage = GAME_LANGUAGE; +#if defined(ENGLISH) const char BuildDateTime[] = "2002 10 15 20:34"; +#elif defined(GERMAN) +const char BuildDateTime[] = "$Name: debug-Euro-2003-05-09-A $"; +#endif const IntrFunc gIntrTableTemplate[] = { diff --git a/src/main_menu.c b/src/main_menu.c index 284fbac52..294d33620 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -692,10 +692,17 @@ void PrintPlayTime(void) u8 playTime[16]; u8 alignedPlayTime[32]; +#if defined(ENGLISH) MenuPrint(gMainMenuString_Time, 16, 3); FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); sub_8072C74(alignedPlayTime, playTime, 48, 1); MenuPrint(alignedPlayTime, 22, 3); +#elif defined(GERMAN) + MenuPrint_PixelCoords(gMainMenuString_Time, 124, 24, TRUE); + FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); + sub_8072C74(alignedPlayTime, playTime, 40, 1); + MenuPrint(alignedPlayTime, 23, 3); +#endif } void PrintPokedexCount(void) @@ -711,7 +718,11 @@ void PrintBadgeCount(void) { u8 buffer[16]; +#if defined(ENGLISH) MenuPrint(gMainMenuString_Badges, 16, 5); +#elif defined(GERMAN) + MenuPrint_PixelCoords(gMainMenuString_Badges, 124, 40, TRUE); +#endif ConvertIntToDecimalString(buffer, GetBadgeCount()); MenuPrint_PixelCoords(buffer, 205, 40, 1); } diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c index 25651702d..11dadf380 100644 --- a/src/mauville_old_man.c +++ b/src/mauville_old_man.c @@ -121,109 +121,54 @@ void sub_80F7B40(void) oldMan->oldMan1.unk_2DBD = 1; } -// too mathy -__attribute__((naked)) void sub_80F7BA0(void) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - ldr r1, _080F7C48 @ =gSaveBlock1 + 0x2D94\n\ - ldr r0, _080F7C4C @ =gSpecialVar_0x8004\n\ - ldrh r0, [r0]\n\ - adds r5, r1, 0\n\ - adds r5, 0xE\n\ - cmp r0, 0\n\ - bne _080F7BB2\n\ - adds r5, r1, 0x2\n\ -_080F7BB2:\n\ - ldr r2, _080F7C50 @ =gStringVar4\n\ - adds r4, r2, 0\n\ - movs r6, 0\n\ -_080F7BB8:\n\ - ldrh r1, [r5]\n\ - adds r5, 0x2\n\ - adds r0, r2, 0\n\ - bl sub_80EB3FC\n\ - adds r2, r0, 0\n\ - adds r7, r6, 0x1\n\ - cmp r2, r4\n\ - beq _080F7BDA\n\ - movs r1, 0x37\n\ -_080F7BCC:\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - bne _080F7BD4\n\ - strb r1, [r4]\n\ -_080F7BD4:\n\ - adds r4, 0x1\n\ - cmp r2, r4\n\ - bne _080F7BCC\n\ -_080F7BDA:\n\ - adds r4, 0x1\n\ - movs r0, 0\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - ldrh r1, [r5]\n\ - adds r5, 0x2\n\ - adds r0, r2, 0\n\ - bl sub_80EB3FC\n\ - adds r2, r0, 0\n\ - cmp r2, r4\n\ - beq _080F7C02\n\ - movs r1, 0x37\n\ -_080F7BF4:\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - bne _080F7BFC\n\ - strb r1, [r4]\n\ -_080F7BFC:\n\ - adds r4, 0x1\n\ - cmp r2, r4\n\ - bne _080F7BF4\n\ -_080F7C02:\n\ - adds r4, 0x1\n\ - movs r0, 0xFE\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - ldrh r1, [r5]\n\ - adds r5, 0x2\n\ - adds r0, r2, 0\n\ - bl sub_80EB3FC\n\ - adds r2, r0, 0\n\ - cmp r2, r4\n\ - beq _080F7C2A\n\ - movs r1, 0x37\n\ -_080F7C1C:\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - bne _080F7C24\n\ - strb r1, [r4]\n\ -_080F7C24:\n\ - adds r4, 0x1\n\ - cmp r2, r4\n\ - bne _080F7C1C\n\ -_080F7C2A:\n\ - cmp r6, 0\n\ - bne _080F7C3A\n\ - movs r0, 0xFC\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0xF\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ -_080F7C3A:\n\ - lsls r0, r7, 16\n\ - lsrs r6, r0, 16\n\ - cmp r6, 0x1\n\ - bls _080F7BB8\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080F7C48: .4byte gSaveBlock1 + 0x2D94\n\ -_080F7C4C: .4byte gSpecialVar_0x8004\n\ -_080F7C50: .4byte gStringVar4\n\ - .syntax divided"); + struct UnkMauvilleOldManStruct *oldMan = &gSaveBlock1.oldMan.oldMan1; + u16 specialVar = gSpecialVar_0x8004; // It's a bit odd to use this temp variable, but it seems needed to match. + u16 *r5; + u16 i; + u8 *ptr; + u8 *r4; + + r5 = oldMan->mauvilleOldMan_ecArray2; + if (specialVar == 0) + r5 = oldMan->mauvilleOldMan_ecArray; + ptr = gStringVar4; + r4 = ptr; + for (i = 0; i < 2; i++) + { + ptr = sub_80EB3FC(ptr, *(r5++)); + while (ptr != r4) + { + if (*r4 == 0) + *r4 = 0x37; + r4++; + } + r4++; + *(ptr++) = 0; + ptr = sub_80EB3FC(ptr, *(r5++)); + while (ptr != r4) + { + if (*r4 == 0) + *r4 = 0x37; + r4++; + } + r4++; + *(ptr++) = 0xFE; + ptr = sub_80EB3FC(ptr, *(r5++)); + while (ptr != r4) + { + if (*r4 == 0) + *r4 = 0x37; + r4++; + } + //_080F7C2A + if (i == 0) + { + *(ptr++) = EXT_CTRL_CODE_BEGIN; + *(ptr++) = 0xF; + } + } } void sub_80F7C54(void) @@ -276,131 +221,32 @@ void sub_80F7CC8(void) gScriptResult = TRUE; } -// someone fix this -#ifdef NONMATCHING void sub_80F7CF4(void) { - u8 *stringPtr; - OldMan *oldMan = &gSaveBlock1.oldMan; + struct UnkMauvilleOldManStruct2 *oldMan = &gSaveBlock1.oldMan.oldMan2; - if(oldMan->oldMan2.unk1 == 0) + if(oldMan->unk1 == 0) sub_80F7DC0(); - if(oldMan->oldMan2.mauvilleOldMan_ecArray[oldMan->oldMan2.unk1] != 0xFFFF) // is not the last element of the array? + if(oldMan->mauvilleOldMan_ecArray[oldMan->unk1] != 0xFFFF) // is not the last element of the array? { - u16 random = 7 % Random(); // this is a little bit closer, but the compiler prefers an AND instead of division. i assume its because the compiler wants to avoid division by zero, however using an & causes this order to not be close anymore. - sub_80EB3FC(gStringVar4, oldMan->oldMan2.mauvilleOldMan_ecArray[oldMan->oldMan2.unk1]); - stringPtr = StringCopy(gStringVar4, gOtherText_Is); + u8 *stringPtr; + u32 random = Random(); + + random %= 8; + stringPtr = sub_80EB3FC(gStringVar4, oldMan->mauvilleOldMan_ecArray[oldMan->unk1]); + stringPtr = StringCopy(stringPtr, gOtherText_Is); stringPtr = StringCopy(stringPtr, (u8 *)gUnknown_083E5388[random]); StringCopy(stringPtr, gOtherText_DontYouAgree); } else { - StringCopy(gStringVar4, (u8 *)gUnknown_083E53A8[oldMan->oldMan2.mauvilleOldMan_ecArray2[oldMan->oldMan2.unk2++]]); + StringCopy(gStringVar4, (u8 *)gUnknown_083E53A8[oldMan->mauvilleOldMan_ecArray2[oldMan->unk2++]]); } if(!(Random() % 10)) - oldMan->oldMan2.unk1 = 10; + oldMan->unk1 = 10; else - oldMan->oldMan2.unk1++; + oldMan->unk1++; gScriptResult = TRUE; } -#else -__attribute__((naked)) -void sub_80F7CF4(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - ldr r5, _080F7D50 @ =gSaveBlock1 + 0x2D94\n\ - ldrb r0, [r5, 0x1]\n\ - cmp r0, 0\n\ - bne _080F7D02\n\ - bl sub_80F7DC0\n\ -_080F7D02:\n\ - ldrb r0, [r5, 0x1]\n\ - lsls r0, 1\n\ - adds r6, r5, 0x4\n\ - adds r0, r6\n\ - ldrh r1, [r0]\n\ - ldr r0, _080F7D54 @ =0x0000ffff\n\ - cmp r1, r0\n\ - beq _080F7D68\n\ - bl Random\n\ - adds r4, r0, 0\n\ - lsls r4, 16\n\ - lsrs r4, 16\n\ - movs r0, 0x7\n\ - ands r4, r0\n\ - ldr r0, _080F7D58 @ =gStringVar4\n\ - ldrb r1, [r5, 0x1]\n\ - lsls r1, 1\n\ - adds r1, r6\n\ - ldrh r1, [r1]\n\ - bl sub_80EB3FC\n\ - adds r2, r0, 0\n\ - ldr r1, _080F7D5C @ =gOtherText_Is\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - ldr r0, _080F7D60 @ =gUnknown_083E5388\n\ - lsls r4, 2\n\ - adds r4, r0\n\ - ldr r1, [r4]\n\ - adds r0, r2, 0\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - ldr r1, _080F7D64 @ =gOtherText_DontYouAgree\n\ - bl StringCopy\n\ - b _080F7D88\n\ - .align 2, 0\n\ -_080F7D50: .4byte gSaveBlock1 + 0x2D94\n\ -_080F7D54: .4byte 0x0000ffff\n\ -_080F7D58: .4byte gStringVar4\n\ -_080F7D5C: .4byte gOtherText_Is\n\ -_080F7D60: .4byte gUnknown_083E5388\n\ -_080F7D64: .4byte gOtherText_DontYouAgree\n\ -_080F7D68:\n\ - ldr r0, _080F7DA0 @ =gStringVar4\n\ - ldr r3, _080F7DA4 @ =gUnknown_083E53A8\n\ - ldrb r1, [r5, 0x2]\n\ - adds r2, r1, 0x1\n\ - strb r2, [r5, 0x2]\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r2, r5, 0\n\ - adds r2, 0x18\n\ - adds r1, r2\n\ - ldrb r1, [r1]\n\ - lsls r1, 2\n\ - adds r1, r3\n\ - ldr r1, [r1]\n\ - bl StringCopy\n\ -_080F7D88:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0xA\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bne _080F7DA8\n\ - movs r0, 0xA\n\ - b _080F7DAC\n\ - .align 2, 0\n\ -_080F7DA0: .4byte gStringVar4\n\ -_080F7DA4: .4byte gUnknown_083E53A8\n\ -_080F7DA8:\n\ - ldrb r0, [r5, 0x1]\n\ - adds r0, 0x1\n\ -_080F7DAC:\n\ - strb r0, [r5, 0x1]\n\ - ldr r1, _080F7DBC @ =gScriptResult\n\ - movs r0, 0x1\n\ - strh r0, [r1]\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080F7DBC: .4byte gScriptResult\n\ - .syntax divided"); -} -#endif diff --git a/src/money.c b/src/money.c index e73ee506a..de0730951 100644 --- a/src/money.c +++ b/src/money.c @@ -138,10 +138,12 @@ void sub_80B7AEC(u32 arg0, u8 left, u8 top) MenuPrint_RightAligned(buffer, left, top); +#ifdef ENGLISH ptr[0] = 0xFC; ptr[1] = 0x14; ptr[2] = 0x00; ptr[3] = 0xFF; +#endif } __attribute__((naked)) diff --git a/src/new_game.c b/src/new_game.c index e058280af..3b93d37cc 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -9,6 +9,7 @@ #include "pokedex.h" #include "pokemon_size_record.h" #include "rng.h" +#include "roamer.h" #include "rom4.h" #include "rtc.h" #include "script.h" @@ -135,8 +136,8 @@ void NewGameInitData(void) gPlayerPartyCount = 0; ZeroPlayerPartyMons(); sub_80961D8(); - sub_81341F8(); - sub_813420C(); + ClearRoamerData(); + ClearRoamerLocationData(); gSaveBlock1.registeredItem = 0; sub_80A3714(); NewGameInitPCItems(); diff --git a/src/pokedex.c b/src/pokedex.c index a5dcfe049..3ef1de51e 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -51,15 +51,6 @@ struct PokedexEntry /*0x20*/ u16 trainerOffset; }; /*size = 0x24*/ -struct CryRelatedStruct -{ - u16 unk0; - u8 unk2; - u8 unk3; - u8 unk4; - u8 unk5; -}; - extern struct MusicPlayerInfo gMPlay_BGM; extern u8 gReservedSpritePaletteCount; extern struct PokedexView *gPokedexView; @@ -124,13 +115,6 @@ u16 NationalPokedexNumToSpecies(u16); // asm/pokedex_area_screen void ShowPokedexAreaScreen(u16 species, u8 *string); -// asm/pokedex_cry_screen -u8 sub_8119E3C(struct CryRelatedStruct *, u8); -void sub_8119F88(u8 a); -void sub_811A050(u16 species); -u8 ShowPokedexCryScreen(struct CryRelatedStruct *, u8); -void DestroyCryMeterNeedleSprite(); - void sub_808C02C(void) { u16 i; @@ -2526,9 +2510,9 @@ void Task_InitCryScreenMultistep(u8 taskId) sp8.unk0 = 0x4020; sp8.unk2 = 0x1F; - sp8.unk3 = 8; - sp8.unk5 = 0x1E; - sp8.unk4 = 0xC; + sp8.paletteNo = 8; + sp8.yPos = 0x1E; + sp8.xPos = 0xC; if (sub_8119E3C(&sp8, 0) != 0) { gMain.state++; @@ -2542,9 +2526,9 @@ void Task_InitCryScreenMultistep(u8 taskId) sp10.unk0 = 0x3000; sp10.unk2 = 0xE; - sp10.unk3 = 9; - sp10.unk4 = 0x12; - sp10.unk5 = 3; + sp10.paletteNo = 9; + sp10.xPos = 0x12; + sp10.yPos = 3; if (ShowPokedexCryScreen(&sp10, 1) != 0) { gMain.state++; diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c new file mode 100644 index 000000000..53807befc --- /dev/null +++ b/src/pokedex_cry_screen.c @@ -0,0 +1,85 @@ +#include "global.h" +#include "asm.h" +#include "palette.h" +#include "sprite.h" + +struct Unk201C800 { + u8 unk_0; + u8 unk_1; + u8 unk_2; + u8 filler_3; + u16 unk_4; +}; + +#define EWRAM_1C800 (*(struct Unk201C800 *)(unk_201C000 + 0x800)) + +extern u8 unk_201C000[]; + +extern u8 gUnknown_03005E98; + +// data/pokedex_cry_screen.o +extern const u16 gUnknown_083FAE7C[]; +extern const u16 gUnknown_083FAF1C[]; +extern const u8 gUnknown_083FAF3C[]; +extern struct SpriteTemplate gSpriteTemplate_83FB774; +extern const struct SpriteSheet gCryMeterNeedleSpriteSheets[]; +extern const struct SpritePalette gCryMeterNeedleSpritePalettes[]; + +#if ENGLISH +#define CRY_METER_MAP_WIDTH 10 +#elif GERMAN +#define CRY_METER_MAP_WIDTH 32 +#endif + +u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { + int returnVal = FALSE; + + switch (gUnknown_03005E98) + { + case 0: + LZ77UnCompVram(gUnknown_083FAF3C, (void *) (VRAM + cry->unk0)); + LoadPalette(&gUnknown_083FAF1C, cry->paletteNo * 16, 0x20); + gUnknown_03005E98 += 1; + break; + + case 1: + { + void *vram; + u8 row, col; + u32 r12; + int x, y; + + vram = (void *) BG_SCREEN_ADDR(cry->unk2); + + r12 = (u32) (cry->unk0 << 18) >> 23; + + for (row = 0; row < 8; row++) + { + for (col = 0; col < 10; col++) + { + y = row + cry->yPos; + x = col + cry->xPos; + *(u16 *) (vram + (y * 64 + x * 2)) = (gUnknown_083FAE7C[row * CRY_METER_MAP_WIDTH + col] | (cry->paletteNo << 12)) + r12; + } + } + + gUnknown_03005E98 += 1; + break; + } + + case 2: + { + LoadSpriteSheets(gCryMeterNeedleSpriteSheets); + LoadSpritePalettes(gCryMeterNeedleSpritePalettes); + EWRAM_1C800.unk_4 = CreateSprite(&gSpriteTemplate_83FB774, 40 + cry->xPos * 8, 56 + cry->yPos * 8, 1); + EWRAM_1C800.unk_0 = 0x20; + EWRAM_1C800.unk_1 = 0x20; + EWRAM_1C800.unk_2 = 0; + + returnVal = TRUE; + break; + } + } + + return returnVal; +} diff --git a/src/pokemon_1.c b/src/pokemon_1.c index 1c11449c3..204fa7b9a 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -51,7 +51,7 @@ void ZeroMonData(struct Pokemon *mon) SetMonData(mon, MON_DATA_SPATK, (u8 *)&arg); SetMonData(mon, MON_DATA_SPDEF, (u8 *)&arg); arg = 255; - SetMonData(mon, MON_DATA_64, (u8 *)&arg); + SetMonData(mon, MON_DATA_MAIL, (u8 *)&arg); } void ZeroPlayerPartyMons(void) @@ -75,7 +75,7 @@ void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFix CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); SetMonData(mon, MON_DATA_LEVEL, &level); arg = 255; - SetMonData(mon, MON_DATA_64, (u8 *)&arg); + SetMonData(mon, MON_DATA_MAIL, (u8 *)&arg); CalculateMonStats(mon); } @@ -478,7 +478,7 @@ void sub_803B4B4(struct Pokemon *src, struct Pokemon *dest) SetMonData(dest, MON_DATA_HP, (u8 *)&value); SetMonData(dest, MON_DATA_MAX_HP, (u8 *)&value); value = 255; - SetMonData(dest, MON_DATA_64, (u8 *)&value); + SetMonData(dest, MON_DATA_MAIL, (u8 *)&value); CalculateMonStats(dest); } diff --git a/src/pokemon_2.c b/src/pokemon_2.c index 9030fe096..3be11f453 100644 --- a/src/pokemon_2.c +++ b/src/pokemon_2.c @@ -383,8 +383,8 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) return mon->spAttack; case MON_DATA_SPDEF: return mon->spDefense; - case MON_DATA_64: - return mon->pokerus; + case MON_DATA_MAIL: + return mon->mail; default: return GetBoxMonData(&mon->box, field, data); } @@ -761,8 +761,8 @@ void SetMonData(struct Pokemon *mon, s32 field, const u8 *data) case MON_DATA_SPDEF: SET16(mon->spDefense); break; - case MON_DATA_64: - SET8(mon->pokerus); + case MON_DATA_MAIL: + SET8(mon->mail); break; case MON_DATA_SPECIES2: break; @@ -1079,7 +1079,7 @@ u8 SendMonToPC(struct Pokemon *mon) { if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) { - sub_8040B1C(mon); + MonRestorePP(mon); CopyMon(&gPokemonStorage.boxes[i][j], &mon->box, sizeof(mon->box)); return 1; } diff --git a/src/pokemon_3.c b/src/pokemon_3.c index 5f186292f..270a52ad5 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -1,12 +1,19 @@ #include "global.h" #include "asm.h" +#include "battle.h" #include "event_data.h" +#include "hold_effects.h" #include "item.h" #include "items.h" +#include "link.h" #include "main.h" +#include "m4a.h" #include "pokemon.h" #include "rng.h" +#include "rom4.h" #include "rtc.h" +#include "songs.h" +#include "sound.h" #include "species.h" #include "sprite.h" #include "string_util.h" @@ -40,7 +47,11 @@ struct EvolutionData struct Evolution evolutions[5]; }; -extern void get_battle_strings_(u8 *); +struct SpindaSpot +{ + u8 x, y; + u16 image[16]; +}; extern u8 gPlayerPartyCount; extern struct Pokemon gPlayerParty[6]; @@ -62,6 +73,29 @@ extern u8 gPlayerMonIndex; extern u8 gEnemyMonIndex; extern u8 gUnknown_02024C0B; extern u8 gUnknown_02024E6C; +extern struct SpindaSpot gSpindaSpotGraphics[]; +extern void *gUnknown_081FAF4C[]; +extern u8 gSpeciesNames[][11]; +extern struct Trainer gTrainers[]; +extern s8 gNatureStatTable[][5]; +extern s8 gUnknown_082082FE[][3]; +extern u16 gTrainerBattleOpponent; +extern u16 gBattleTypeFlags; +extern struct BaseStats gBaseStats[]; +extern u32 gBitTable[]; +extern u32 gExperienceTables[8][101]; +extern u32 gTMHMLearnsets[][2]; +extern const u16 *gLevelUpLearnsets[]; +extern u8 gBattleMonForms[]; +extern const u8 BattleText_Wally[]; +extern const struct SpritePalette gMonPaletteTable[]; +extern const struct SpritePalette gMonShinyPaletteTable[]; +extern const u16 gHMMoves[]; +extern s8 gUnknown_083F7E28[]; +extern u8 byte_2024C06; +extern const u8 BattleText_PreventedSwitch[]; +extern u16 gUnknown_02024A6A[]; +extern u8 gJapaneseNidoranNames[][11]; extern u8 gUnknown_082082F8[]; extern u8 gUnknown_083FFDB3[]; @@ -70,6 +104,8 @@ extern u8 gUnknown_083FEE5D[]; extern u8 gUnknown_083FEE92[]; extern u8 *gUnknown_08400F58[]; +u8 CheckPartyHasHadPokerus(struct Pokemon *, u8); + bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) { u32 status = GetMonData(mon, MON_DATA_STATUS, 0); @@ -476,3 +512,920 @@ u32 SpeciesToCryId(u16 species) return gSpeciesIdToCryId[species - 276]; } + +void unref_sub_803F938(u16 species, u32 personality, u8 *dest) +{ + if (species == SPECIES_SPINDA && dest != gUnknown_081FAF4C[0] && dest != gUnknown_081FAF4C[2]) + { + int i; + for (i = 0; i < 4; i++) + { + int j; + u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); + u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); + + for (j = 0; j < 16; j++) + { + int k; + s32 row = gSpindaSpotGraphics[i].image[j]; + + for (k = x; k < x + 16; k++) + { + u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); + + if (row & 1) + { + if (k & 1) + { + if ((u8)((*val & 0xF0) - 0x10) <= 0x20) + *val += 0x40; + } + else + { + if ((u8)((*val & 0xF) - 0x01) <= 0x02) + *val += 0x04; + } + } + + row >>= 1; + } + + y++; + } + + personality >>= 8; + } + } +} + +void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4) +{ + if (species == SPECIES_SPINDA && a4) + { + int i; + for (i = 0; i < 4; i++) + { + int j; + u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); + u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); + + for (j = 0; j < 16; j++) + { + int k; + s32 row = gSpindaSpotGraphics[i].image[j]; + + for (k = x; k < x + 16; k++) + { + u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); + + if (row & 1) + { + if (k & 1) + { + if ((u8)((*val & 0xF0) - 0x10) <= 0x20) + *val += 0x40; + } + else + { + if ((u8)((*val & 0xF) - 0x01) <= 0x02) + *val += 0x04; + } + } + + row >>= 1; + } + + y++; + } + + personality >>= 8; + } + } +} + +void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies) +{ +#ifdef BUGFIX_EVO_NAME + u8 language; + GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); + language = GetMonData(mon, MON_DATA_LANGUAGE, &language); + if (language == GAME_LANGUAGE && !StringCompareWithoutExtCtrlCodes(gSpeciesNames[oldSpecies], gStringVar1)) + SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); +#else + GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); + if (!StringCompareWithoutExtCtrlCodes(gSpeciesNames[oldSpecies], gStringVar1)) + SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); +#endif +} + +bool8 sub_803FBBC(void) +{ + bool8 retVal = FALSE; + switch (gLinkPlayers[GetMultiplayerId()].lp_field_18) + { + case 0: + case 3: + retVal = FALSE; + break; + case 1: + case 2: + retVal = TRUE; + break; + } + return retVal; +} + +bool8 sub_803FBFC(u8 id) +{ + bool8 retVal = FALSE; + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + retVal = FALSE; + break; + case 1: + case 2: + retVal = TRUE; + break; + } + return retVal; +} + +s32 sub_803FC34(u16 a1) +{ + s32 id; + for (id = 0; id < MAX_LINK_PLAYERS; id++) + if (gLinkPlayers[id].lp_field_18 == a1) + break; + return id; +} + +u8 sub_803FC58(u16 trainer) +{ + return gTrainers[trainer].encounterMusic_gender & 0x7F; +} + +u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex) +{ + if (statIndex < 1 || statIndex > 5) + { + // should just be "return n", but it wouldn't match without this + u16 retVal = n; + retVal++; + retVal--; + return retVal; + } + + switch (gNatureStatTable[nature][statIndex - 1]) + { + case 1: + return (u16)(n * 110) / 100; + case -1: + return (u16)(n * 90) / 100; + } + + return n; +} + +void AdjustFriendship(struct Pokemon *mon, u8 event) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + u8 holdEffect; + + if (heldItem == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + { + holdEffect = gEnigmaBerries[0].holdEffect; + } + else + { + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + } + } + else + { + holdEffect = ItemId_GetHoldEffect(heldItem); + } + + if (species && species != SPECIES_EGG) + { + u8 friendshipLevel = 0; + s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + if (friendship > 99) + friendshipLevel++; + if (friendship > 199) + friendshipLevel++; + if ((event != 5 || !(Random() & 1)) + && (event != 3 + || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) + && (gTrainers[gTrainerBattleOpponent].trainerClass == 24 + || gTrainers[gTrainerBattleOpponent].trainerClass == 25 + || gTrainers[gTrainerBattleOpponent].trainerClass == 32)))) + { + s8 mod = gUnknown_082082FE[event][friendshipLevel]; + if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + mod = (150 * mod) / 100; + friendship += mod; + if (mod > 0) + { + if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL) + friendship++; + if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == sav1_map_get_name()) + friendship++; + } + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(mon, MON_DATA_FRIENDSHIP, (u8 *)&friendship); + } + } +} + +void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) +{ + u8 evs[NUM_STATS]; + u16 evIncrease = 0; + u16 totalEVs = 0; + u16 heldItem; + u8 holdEffect; + int i; + + for (i = 0; i < NUM_STATS; i++) + { + evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, 0); + totalEVs += evs[i]; + } + + for (i = 0; i < NUM_STATS; i++) + { + u8 hasHadPokerus; + int multiplier; + + if (totalEVs >= MAX_TOTAL_EVS) + break; + + hasHadPokerus = CheckPartyHasHadPokerus(mon, 0); + + if (hasHadPokerus) + multiplier = 2; + else + multiplier = 1; + + switch (i) + { + case 0: + evIncrease = gBaseStats[defeatedSpecies].evYield_HP * multiplier; + break; + case 1: + evIncrease = gBaseStats[defeatedSpecies].evYield_Attack * multiplier; + break; + case 2: + evIncrease = gBaseStats[defeatedSpecies].evYield_Defense * multiplier; + break; + case 3: + evIncrease = gBaseStats[defeatedSpecies].evYield_Speed * multiplier; + break; + case 4: + evIncrease = gBaseStats[defeatedSpecies].evYield_SpAttack * multiplier; + break; + case 5: + evIncrease = gBaseStats[defeatedSpecies].evYield_SpDefense * multiplier; + break; + } + + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + + if (heldItem == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + { + holdEffect = gEnigmaBerries[0].holdEffect; + } + else + { + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + } + } + else + { + holdEffect = ItemId_GetHoldEffect(heldItem); + } + + if (holdEffect == HOLD_EFFECT_MACHO_BRACE) + evIncrease *= 2; + + if (totalEVs + (s16)evIncrease > MAX_TOTAL_EVS) + evIncrease = ((s16)evIncrease + MAX_TOTAL_EVS) - (totalEVs + evIncrease); + + if (evs[i] + (s16)evIncrease > 255) + { + int val1 = (s16)evIncrease + 255; + int val2 = evs[i] + evIncrease; + evIncrease = val1 - val2; + } + + evs[i] += evIncrease; + totalEVs += evIncrease; + SetMonData(mon, MON_DATA_HP_EV + i, &evs[i]); + } +} + +u16 GetMonEVCount(struct Pokemon *mon) +{ + int i; + u16 count = 0; + + for (i = 0; i < NUM_STATS; i++) + count += GetMonData(mon, MON_DATA_HP_EV + i, 0); + + return count; +} + +void RandomlyGivePartyPokerus(struct Pokemon *party) +{ + u16 rnd = Random(); + if (rnd == 0x4000 || rnd == 0x8000 || rnd == 0xC000) + { + struct Pokemon *mon; + + do + { + do + { + rnd = Random() % PARTY_SIZE; + mon = &party[rnd]; + } + while (!GetMonData(mon, MON_DATA_SPECIES, 0)); + } + while (GetMonData(mon, MON_DATA_IS_EGG, 0)); + + if (!(CheckPartyHasHadPokerus(party, gBitTable[rnd]))) + { + u8 rnd2; + + do + { + rnd2 = Random(); + } + while (rnd2 == 0); + + if (rnd2 & 0xF0) + rnd2 &= 0x07; + + rnd2 |= (rnd2 << 4); + rnd2 &= 0xF3; + rnd2++; + + SetMonData(&party[rnd], MON_DATA_POKERUS, &rnd2); + } + } +} + +u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) +{ + u8 retVal; + + int partyIndex = 0; + unsigned curBit = 1; + retVal = 0; + + if (selection) + { + do + { + if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0) & 0xF)) + retVal |= curBit; + partyIndex++; + curBit <<= 1; + selection >>= 1; + } + while (selection); + } + else if (GetMonData(&party[0], MON_DATA_POKERUS, 0) & 0xF) + { + retVal = 1; + } + + return retVal; +} + +u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) +{ + u8 retVal; + + int partyIndex = 0; + unsigned curBit = 1; + retVal = 0; + + if (selection) + { + do + { + if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0)) + retVal |= curBit; + partyIndex++; + curBit <<= 1; + selection >>= 1; + } + while (selection); + } + else if (GetMonData(&party[0], MON_DATA_POKERUS, 0)) + { + retVal = 1; + } + + return retVal; +} + +void UpdatePartyPokerusTime(u16 days) +{ + int i; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, 0)) + { + u8 pokerus = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS, 0); + if (pokerus & 0xF) + { + if ((pokerus & 0xF) < days || days > 4) + pokerus &= 0xF0; + else + pokerus -= days; + + SetMonData(&gPlayerParty[i], MON_DATA_POKERUS, &pokerus); + } + } + } +} + +void PartySpreadPokerus(struct Pokemon *party) +{ + if ((Random() % 3) == 0) + { + int i; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_SPECIES, 0)) + { + u8 pokerus = GetMonData(&party[i], MON_DATA_POKERUS, 0); + u8 curPokerus = pokerus; + if (pokerus) + { + if (pokerus & 0xF) + { + // spread to adjacent party members + if (i != 0 && !(GetMonData(&party[i - 1], MON_DATA_POKERUS, 0) & 0xF0)) + SetMonData(&party[i - 1], MON_DATA_POKERUS, &curPokerus); + if (i != (PARTY_SIZE - 1) && !(GetMonData(&party[i + 1], MON_DATA_POKERUS, 0) & 0xF0)) + { + SetMonData(&party[i + 1], MON_DATA_POKERUS, &curPokerus); + i++; + } + } + } + } + } + } +} + +bool8 TryIncrementMonLevel(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u8 nextLevel = GetMonData(mon, MON_DATA_LEVEL, 0) + 1; + if (GetMonData(mon, MON_DATA_EXP, 0) > gExperienceTables[gBaseStats[species].growthRate][nextLevel]) + { + SetMonData(mon, MON_DATA_LEVEL, &nextLevel); + return TRUE; + } + else + { + return FALSE; + } +} + +u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + if (species == SPECIES_EGG) + { + return 0; + } + else if (tm < 32) + { + u32 mask = 1 << tm; + return gTMHMLearnsets[species][0] & mask; + } + else + { + u32 mask = 1 << (tm - 32); + return gTMHMLearnsets[species][1] & mask; + } +} + +u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) +{ + u16 learnedMoves[4]; + u8 numMoves = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + int i, j, k; + + for (i = 0; i < 4; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + for (i = 0; i < 20; i++) + { + u16 moveLevel; + + if (gLevelUpLearnsets[species][i] == 0xFFFF) + break; + + moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; + + if (moveLevel <= (level << 9)) + { + for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) + ; + + if (j == 4) + { + for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) + ; + + if (k == numMoves) + moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + } + } + } + + return numMoves; +} + +u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) +{ + u8 numMoves = 0; + int i; + + for (i = 0; i < 20 && gLevelUpLearnsets[species][i] != 0xFFFF; i++) + moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + + return numMoves; +} + +u8 sub_8040574(struct Pokemon *mon) +{ + u16 learnedMoves[4]; + u16 moves[20]; + u8 numMoves = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + int i, j, k; + + if (species == SPECIES_EGG) + return 0; + + for (i = 0; i < 4; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + for (i = 0; i < 20; i++) + { + u16 moveLevel; + + if (gLevelUpLearnsets[species][i] == 0xFFFF) + break; + + moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; + + if (moveLevel <= (level << 9)) + { + for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) + ; + + if (j == 4) + { + for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) + ; + + if (k == numMoves) + moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + } + } + } + + return numMoves; +} + +u16 SpeciesToPokedexNum(u16 species) +{ + if (IsNationalPokedexEnabled()) + { + return SpeciesToNationalPokedexNum(species); + } + else + { + species = SpeciesToHoennPokedexNum(species); + if (species <= 202) + return species; + return 0xFFFF; + } +} + +void ClearBattleMonForms(void) +{ + int i; + for (i = 0; i < 4; i++) + gBattleMonForms[i] = 0; +} + +u16 sub_8040728(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) + return BGM_BATTLE34; + if (gBattleTypeFlags & BATTLE_TYPE_REGI) + return BGM_BATTLE36; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + return BGM_BATTLE20; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + switch (gTrainers[gTrainerBattleOpponent].trainerClass) + { + case 2: + case 0x31: + return BGM_BATTLE30; + case 3: + case 4: + case 0x32: + case 0x33: + return BGM_BATTLE31; + case 0x19: + return BGM_BATTLE32; + case 0x20: + return BGM_BATTLE33; + case 0x2E: + if (!StringCompare(gTrainers[gTrainerBattleOpponent].trainerName, BattleText_Wally)) + return BGM_BATTLE20; + return BGM_BATTLE35; + case 0x18: + return BGM_BATTLE38; + default: + return BGM_BATTLE20; + } + } + return BGM_BATTLE27; +} + +void sub_80408BC(void) +{ + ResetMapMusic(); + m4aMPlayAllStop(); + PlayBGM(sub_8040728()); +} + +void current_map_music_set__default_for_battle(u16 song) +{ + ResetMapMusic(); + m4aMPlayAllStop(); + if (song) + PlayNewMapMusic(song); + else + PlayNewMapMusic(sub_8040728()); +} + +const u16 *species_and_otid_get_pal(u16, u32, u32); + +const u16 *pokemon_get_pal(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + return species_and_otid_get_pal(species, otId, personality); +} + +//Extracts the upper 16 bits of a 32-bit number +#define HIHALF(n) (((n) & 0xFFFF0000) >> 16) + +//Extracts the lower 16 bits of a 32-bit number +#define LOHALF(n) ((n) & 0xFFFF) + +const u16 *species_and_otid_get_pal(u16 species, u32 otId , u32 personality) +{ + u32 shinyValue; + + if (species > SPECIES_EGG) + return gMonPaletteTable[0].data; + + shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); + if (shinyValue < 8) + return gMonShinyPaletteTable[species].data; + else + return gMonPaletteTable[species].data; +} + +const struct SpritePalette *sub_80409C8(u16, u32, u32); + +const struct SpritePalette *sub_8040990(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + return sub_80409C8(species, otId, personality); +} + +const struct SpritePalette *sub_80409C8(u16 species, u32 otId , u32 personality) +{ + u32 shinyValue; + + shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); + if (shinyValue < 8) + return &gMonShinyPaletteTable[species]; + else + return &gMonPaletteTable[species]; +} + +bool8 IsHMMove2(u16 move) +{ + int i = 0; + while (gHMMoves[i] != 0xFFFF) + { + if (gHMMoves[i++] == move) + return TRUE; + } + return FALSE; +} + +bool8 sub_8040A3C(u16 species) +{ + return gBaseStats[species].bodyColor >> 7; // XXX: should this be a bitfield instead? +} + +s8 sub_8040A54(struct Pokemon *mon, u8 a2) +{ + u8 nature = GetNature(mon); + return gUnknown_083F7E28[nature * 5 + a2]; +} + +s8 sub_8040A7C(u32 personality, u8 a2) +{ + u8 nature = GetNatureFromPersonality(personality); + return gUnknown_083F7E28[nature * 5 + a2]; +} + +bool8 IsOtherTrainer(u32, u8 *); + +bool8 IsTradedMon(struct Pokemon *mon) +{ + u8 otName[8]; + u32 otId; + GetMonData(mon, MON_DATA_OT_NAME, otName); + otId = GetMonData(mon, MON_DATA_OT_ID, 0); + return IsOtherTrainer(otId, otName); +} + +bool8 IsOtherTrainer(u32 otId, u8 *otName) +{ + if (otId == (gSaveBlock2.playerTrainerId[0] | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[3] << 24))) + { + int i; + + for (i = 0; otName[i] != EOS; i++) + if (otName[i] != gSaveBlock2.playerName[i]) + return TRUE; + return FALSE; + } + + return TRUE; +} + +void BoxMonRestorePP(struct BoxPokemon *); + +void MonRestorePP(struct Pokemon *mon) +{ + BoxMonRestorePP(&mon->box); +} + +void BoxMonRestorePP(struct BoxPokemon *boxMon) +{ + int i; + + for (i = 0; i < 4; i++) + { + if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0)) + { + u16 move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0); + u16 bonus = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, 0); + u8 pp = CalculatePPWithBonus(move, bonus, i); + SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp); + } + } +} + +void sub_8040B8C(void) +{ + byte_2024C06 = BATTLE_STRUCT->filler1_2[0x37]; + gUnknown_030041C0[0] = 0xFD; + gUnknown_030041C0[1] = 4; + gUnknown_030041C0[2] = BATTLE_STRUCT->filler1[0x34]; + gUnknown_030041C0[4] = EOS; + if (!battle_side_get_owner(BATTLE_STRUCT->filler1[0x34])) + gUnknown_030041C0[3] = pokemon_order_func(gUnknown_02024A6A[BATTLE_STRUCT->filler1[0x34]]); + else + gUnknown_030041C0[3] = gUnknown_02024A6A[BATTLE_STRUCT->filler1[0x34]]; + gUnknown_03004290[0] = 0xFD; + gUnknown_03004290[1] = 4; + gUnknown_03004290[2] = gUnknown_02024E6C; + gUnknown_03004290[3] = pokemon_order_func(gUnknown_02024A6A[gUnknown_02024E6C]); + gUnknown_03004290[4] = EOS; + sub_8120FFC(BattleText_PreventedSwitch, gStringVar4); +} + +void SetWildMonHeldItem(void) +{ + if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER))) + { + u16 rnd = Random() % 100; + u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); + if (gBaseStats[species].item1 == gBaseStats[species].item2) + { + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item1); + return; + } + + if (rnd > 44) + { + if (rnd <= 94) + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item1); + else + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item2); + } + } +} + +bool8 IsShinyOtIdPersonality(u32, u32); + +bool8 IsShiny(struct Pokemon *mon) +{ + u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + return IsShinyOtIdPersonality(otId, personality); +} + +bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) +{ + bool8 retVal = FALSE; + u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); + if (shinyValue < 8) + retVal = TRUE; + return retVal; +} + +u8 *sub_8040D08(void) +{ + u8 id = GetMultiplayerId(); + return gLinkPlayers[sub_803FC34(gLinkPlayers[id].lp_field_18 ^ 2)].name; +} + +bool32 sub_8040D3C(u16 species, u8 *name, u8 language) +{ + bool32 retVal = FALSE; + if (species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) + { + u8 *speciesName; + if (language == GAME_LANGUAGE) + { + speciesName = gSpeciesNames[species]; + } + else + { + if (species == SPECIES_NIDORAN_M) + speciesName = gJapaneseNidoranNames[0]; + else + speciesName = gJapaneseNidoranNames[1]; + } + if (!StringCompareWithoutExtCtrlCodes(name, speciesName)) + retVal = TRUE; + else + retVal = FALSE; + } + return retVal; +} + +bool32 sub_8040D8C(u16 species, u8 *name) +{ + u8 language = GAME_LANGUAGE; + if (name[0] == 0xFC && name[1] == 21) + language = LANGUAGE_JAPANESE; + return sub_8040D3C(species, name, language); +} + +bool32 unref_sub_8040DAC(struct Pokemon *mon) +{ + u8 name[12]; + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u8 language = GetMonData(mon, MON_DATA_LANGUAGE, 0); + GetMonData(mon, MON_DATA_NICKNAME, name); + return sub_8040D3C(species, name, language); +} diff --git a/src/roamer.c b/src/roamer.c new file mode 100644 index 000000000..394f81c75 --- /dev/null +++ b/src/roamer.c @@ -0,0 +1,226 @@ +#include "global.h" +#include "pokemon.h" +#include "rng.h" +#include "roamer.h" +#include "species.h" + +#ifdef SAPPHIRE +#define ROAMER_SPECIES SPECIES_LATIAS +#else +#define ROAMER_SPECIES SPECIES_LATIOS +#endif + +enum +{ + MAP_GRP = 0, // map group + MAP_NUM = 1, // map number +}; + +EWRAM_DATA static u8 sLocationHistory[3][2] = {0}; +EWRAM_DATA static u8 sRoamerLocation[2] = {0}; + +static const u8 sRoamerLocations[][6] = +{ + { 0x19, 0x1A, 0x20, 0x21, 0x31, 0xFF }, + { 0x1A, 0x19, 0x20, 0x21, 0xFF, 0xFF }, + { 0x20, 0x1A, 0x19, 0x21, 0xFF, 0xFF }, + { 0x21, 0x20, 0x19, 0x1A, 0x22, 0x26 }, + { 0x22, 0x21, 0x23, 0xFF, 0xFF, 0xFF }, + { 0x23, 0x22, 0x24, 0xFF, 0xFF, 0xFF }, + { 0x24, 0x23, 0x25, 0x26, 0xFF, 0xFF }, + { 0x25, 0x24, 0x26, 0xFF, 0xFF, 0xFF }, + { 0x26, 0x25, 0x21, 0xFF, 0xFF, 0xFF }, + { 0x27, 0x24, 0x28, 0x29, 0xFF, 0xFF }, + { 0x28, 0x27, 0x2A, 0xFF, 0xFF, 0xFF }, + { 0x29, 0x27, 0x2A, 0xFF, 0xFF, 0xFF }, + { 0x2A, 0x28, 0x29, 0x2B, 0xFF, 0xFF }, + { 0x2B, 0x2A, 0x2C, 0xFF, 0xFF, 0xFF }, + { 0x2C, 0x2B, 0x2D, 0xFF, 0xFF, 0xFF }, + { 0x2D, 0x2C, 0x2E, 0xFF, 0xFF, 0xFF }, + { 0x2E, 0x2D, 0x2F, 0xFF, 0xFF, 0xFF }, + { 0x2F, 0x2E, 0x30, 0xFF, 0xFF, 0xFF }, + { 0x30, 0x2F, 0x31, 0xFF, 0xFF, 0xFF }, + { 0x31, 0x30, 0x19, 0xFF, 0xFF, 0xFF }, + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, +}; + +void ClearRoamerData(void) +{ + memset(&gSaveBlock1.roamer, 0, sizeof(gSaveBlock1.roamer)); +} + +void ClearRoamerLocationData(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + sLocationHistory[i][MAP_GRP] = 0; + sLocationHistory[i][MAP_NUM] = 0; + } + + sRoamerLocation[MAP_GRP] = 0; + sRoamerLocation[MAP_NUM] = 0; +} + +void CreateInitialRoamerMon(void) +{ + struct Roamer *roamer; + CreateMon(&gEnemyParty[0], ROAMER_SPECIES, 40, 0x20, 0, 0, 0, 0); + roamer = &gSaveBlock1.roamer; + roamer->species = ROAMER_SPECIES; + roamer->level = 40; + roamer->status = 0; + roamer->active = TRUE; + roamer->ivs = GetMonData(&gEnemyParty[0], MON_DATA_IVS); + roamer->personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY); + roamer->hp = GetMonData(&gEnemyParty[0], MON_DATA_MAX_HP); + roamer->cool = GetMonData(&gEnemyParty[0], MON_DATA_COOL); + roamer->beauty = GetMonData(&gEnemyParty[0], MON_DATA_BEAUTY); + roamer->cute = GetMonData(&gEnemyParty[0], MON_DATA_CUTE); + roamer->smart = GetMonData(&gEnemyParty[0], MON_DATA_SMART); + roamer->tough = GetMonData(&gEnemyParty[0], MON_DATA_TOUGH); + sRoamerLocation[MAP_GRP] = 0; + sRoamerLocation[MAP_NUM] = sRoamerLocations[Random() % 20][0]; +} + +void InitRoamer(void) +{ + ClearRoamerData(); + ClearRoamerLocationData(); + CreateInitialRoamerMon(); +} + +void UpdateLocationHistoryForRoamer(void) +{ + sLocationHistory[2][MAP_GRP] = sLocationHistory[1][MAP_GRP]; + sLocationHistory[2][MAP_NUM] = sLocationHistory[1][MAP_NUM]; + + sLocationHistory[1][MAP_GRP] = sLocationHistory[0][MAP_GRP]; + sLocationHistory[1][MAP_NUM] = sLocationHistory[0][MAP_NUM]; + + sLocationHistory[0][MAP_GRP] = gSaveBlock1.location.mapGroup; + sLocationHistory[0][MAP_NUM] = gSaveBlock1.location.mapNum; +} + +void RoamerMoveToOtherLocationSet(void) +{ + u8 val = 0; + struct Roamer *roamer = &gSaveBlock1.roamer; + + if (!roamer->active) + return; + + sRoamerLocation[MAP_GRP] = val; + + while (1) + { + val = sRoamerLocations[Random() % 20][0]; + if (sRoamerLocation[MAP_NUM] != val) + { + sRoamerLocation[MAP_NUM] = val; + return; + } + } +} + +void RoamerMove(void) +{ + u8 locSet = 0; + + if ((Random() % 16) == 0) + { + RoamerMoveToOtherLocationSet(); + } + else + { + struct Roamer *roamer = &gSaveBlock1.roamer; + + if (!roamer->active) + return; + + while (locSet < 20) + { + if (sRoamerLocation[MAP_NUM] == sRoamerLocations[locSet][0]) + { + u8 mapNum; + while (1) + { + mapNum = sRoamerLocations[locSet][(Random() % 5) + 1]; + if (!(sLocationHistory[2][MAP_GRP] == 0 && sLocationHistory[2][MAP_NUM] == mapNum) && mapNum != 0xFF) + break; + } + sRoamerLocation[MAP_NUM] = mapNum; + return; + } + locSet++; + } + } +} + +bool8 IsRoamerAt(u8 mapGroup, u8 mapNum) +{ + struct Roamer *roamer = &gSaveBlock1.roamer; + + if (roamer->active && mapGroup == sRoamerLocation[MAP_GRP] && mapNum == sRoamerLocation[MAP_NUM]) + return TRUE; + else + return FALSE; +} + +void CreateRoamerMonInstance(void) +{ + struct Pokemon *mon = &gEnemyParty[0]; + struct Roamer *roamer = &gSaveBlock1.roamer; + CreateMonWithIVsPersonality(mon, roamer->species, roamer->level, roamer->ivs, roamer->personality); + SetMonData(mon, MON_DATA_STATUS, (u8 *)&roamer->status); + SetMonData(mon, MON_DATA_HP, (u8 *)&roamer->hp); + SetMonData(mon, MON_DATA_COOL, (u8 *)&roamer->cool); + SetMonData(mon, MON_DATA_BEAUTY, (u8 *)&roamer->beauty); + SetMonData(mon, MON_DATA_CUTE, (u8 *)&roamer->cute); + SetMonData(mon, MON_DATA_SMART, (u8 *)&roamer->smart); + SetMonData(mon, MON_DATA_TOUGH, (u8 *)&roamer->tough); +} + +bool8 TryStartRoamerEncounter(void) +{ + if (IsRoamerAt(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) == TRUE && (Random() % 4) == 0) + { + CreateRoamerMonInstance(); + return TRUE; + } + else + { + return FALSE; + } +} + +void UpdateRoamerHPStatus(struct Pokemon *mon) +{ + struct Roamer *roamer; + u16 hp; + u8 status; + + hp = GetMonData(mon, MON_DATA_HP); + + roamer = &gSaveBlock1.roamer; + roamer->hp = hp; + + status = GetMonData(mon, MON_DATA_STATUS); + + roamer->status = status; + + RoamerMoveToOtherLocationSet(); +} + +void SetRoamerInactive(void) +{ + struct Roamer *roamer = &gSaveBlock1.roamer; + roamer->active = FALSE; +} + +void GetRoamerLocation(u8 *mapGroup, u8 *mapNum) +{ + *mapGroup = sRoamerLocation[MAP_GRP]; + *mapNum = sRoamerLocation[MAP_NUM]; +} diff --git a/src/rom3.c b/src/rom3.c index 351d5d44b..b0ef7f088 100644 --- a/src/rom3.c +++ b/src/rom3.c @@ -56,7 +56,7 @@ extern void sub_8083C50(u8); extern void nullsub_41(void); extern void nullsub_91(void); extern void battle_anim_clear_some_data(void); -extern void sub_8040710(void); +extern void ClearBattleMonForms(void); extern void BattleAI_HandleItemUseBeforeAISetup(void); extern void sub_8094978(u8, int); extern void sub_800BA78(void); @@ -102,7 +102,7 @@ void setup_poochyena_battle(void) sub_800B858(); gUnknown_02024A64 = 0; battle_anim_clear_some_data(); - sub_8040710(); + ClearBattleMonForms(); BattleAI_HandleItemUseBeforeAISetup(); if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { diff --git a/src/rom4.c b/src/rom4.c index 39c182731..5beb698ab 100644 --- a/src/rom4.c +++ b/src/rom4.c @@ -25,6 +25,7 @@ #include "palette.h" #include "play_time.h" #include "rng.h" +#include "roamer.h" #include "safari_zone.h" #include "script.h" #include "script_pokemon_80C4.h" @@ -164,8 +165,8 @@ void sub_805308C(void) FlagReset(SYS_SAFARI_MODE); sub_8054164(); ResetCyclingRoadChallengeData(); - mapnumbers_history_shift_sav1_0_2_4_out(); - sub_8134348(); + UpdateLocationHistoryForRoamer(); + RoamerMoveToOtherLocationSet(); } void ResetGameStats(void) @@ -531,8 +532,8 @@ void sub_80538F0(u8 mapGroup, u8 mapNum) sub_807D874(i); sub_8072ED0(); - mapnumbers_history_shift_sav1_0_2_4_out(); - sub_8134394(); + UpdateLocationHistoryForRoamer(); + RoamerMove(); DoCurrentWeather(); ResetFieldTasksArgs(); mapheader_run_script_with_tag_x5(); @@ -561,8 +562,8 @@ void sub_8053994(u32 a1) sub_8053C98(); sav1_reset_battle_music_maybe(); mapheader_run_script_with_tag_x3(); - mapnumbers_history_shift_sav1_0_2_4_out(); - sub_8134348(); + UpdateLocationHistoryForRoamer(); + RoamerMoveToOtherLocationSet(); not_trainer_hill_battle_pyramid(); if (a1 != 1 && v3) { diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c index 7b572ba73..93fbce556 100644 --- a/src/rom_800D42C.c +++ b/src/rom_800D42C.c @@ -12,8 +12,16 @@ extern u8 BattleText_Win[]; extern u8 BattleText_Loss[]; extern u8 BattleText_Tie[]; +#if ENGLISH #define LEFT_MESSAGE_X 6 #define RIGHT_MESSAGE_X 21 +#define TILE_OFFSET_LOSS 168 +#elif GERMAN +#define LEFT_MESSAGE_X 5 +#define RIGHT_MESSAGE_X 20 +#define TILE_OFFSET_LOSS 172 +#endif +#define TILE_OFFSET_WIN 160 #define CENTER_MESSAGE_X 13 #define MESSAGE_Y 2 @@ -31,7 +39,7 @@ void sub_800DC24(void) if (gUnknown_02024D26 == 3) { - PRINT_MESSAGE(BattleText_Tie, 160, CENTER_MESSAGE_X); + PRINT_MESSAGE(BattleText_Tie, TILE_OFFSET_WIN, CENTER_MESSAGE_X); return; } @@ -46,13 +54,15 @@ void sub_800DC24(void) switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) { case 0: - case 2: PRINT_MESSAGE_LEFT(BattleText_Win, 160); - PRINT_MESSAGE_RIGHT(BattleText_Loss, 168); + case 2: + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); return; case 1: - case 3: PRINT_MESSAGE_RIGHT(BattleText_Win, 160) - PRINT_MESSAGE_LEFT(BattleText_Loss, 168) + case 3: + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN) + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS) return; } } @@ -62,13 +72,15 @@ void sub_800DC24(void) switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18) { case 1: - case 3: PRINT_MESSAGE_LEFT(BattleText_Win, 160); - PRINT_MESSAGE_RIGHT(BattleText_Loss, 168); + case 3: + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); return; case 0: - case 2: PRINT_MESSAGE_RIGHT(BattleText_Win, 160); - PRINT_MESSAGE_LEFT(BattleText_Loss, 168); + case 2: + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); return; } } @@ -81,26 +93,26 @@ void sub_800DC24(void) { if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) { - PRINT_MESSAGE_RIGHT(BattleText_Win, 160); - PRINT_MESSAGE_LEFT(BattleText_Loss, 168); + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); } else { - PRINT_MESSAGE_LEFT(BattleText_Win, 160); - PRINT_MESSAGE_RIGHT(BattleText_Loss, 168); + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); } } else { if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0) { - PRINT_MESSAGE_LEFT(BattleText_Win, 160); - PRINT_MESSAGE_RIGHT(BattleText_Loss, 168); + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); } else { - PRINT_MESSAGE_RIGHT(BattleText_Win, 160); - PRINT_MESSAGE_LEFT(BattleText_Loss, 168); + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); } } } diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 2d7691033..b216bbe97 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -20,7 +20,6 @@ #define NUM_BATTLE_SLOTS 4 #define gBattleMonPartyPositions gUnknown_02024A6A -#define gBattleMonForms gUnknown_02024E84 #define gCastformFrontSpriteCoords gUnknownCastformCoords_0837F598 #define gCastformElevations gUnknownCastformData_0837F5A8 #define gCastformBackSpriteYCoords gUnknown_0837F5AC diff --git a/src/string_util.c b/src/string_util.c index e537cff3a..957d70153 100644 --- a/src/string_util.c +++ b/src/string_util.c @@ -137,6 +137,21 @@ u16 StringLength(const u8 *str) return length; } +#ifdef GERMAN +s32 StringLengthN(const u8 *str, s32 n) +{ + s32 i; + + for (i = 0; i < n && str[i] != EOS; i++) + ; + + if (i == n) + i = 0; + + return i; +} +#endif + s32 StringCompare(const u8 *str1, const u8 *str2) { while (*str1 == *str2) diff --git a/src/strings.c b/src/strings.c index 54c9bdc6a..f41af082c 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1,5 +1,6 @@ #include "global.h" +#if ENGLISH // placeholder strings const u8 gExpandedPlaceholder_Empty[] = _(""); const u8 gExpandedPlaceholder_Kun[] = _(""); @@ -921,3 +922,925 @@ const u8 gSystemText_SaveFailed[] = _("Save failed..."); const u8 gSystemText_NoSaveFileNoTime[] = _("There is no save file, so the time\ncan’t be set."); const u8 gSystemText_ClockAdjustmentUsable[] = _("The in-game clock adjustment system\nis now useable."); const u8 gSystemText_Saving[] = _("SAVING...\nDON’T TURN OFF THE POWER."); +#elif GERMAN +#include "global.h" + +// placeholder strings +const u8 gExpandedPlaceholder_Empty[] = _(""); +const u8 gExpandedPlaceholder_Kun[] = _(""); +const u8 gExpandedPlaceholder_Chan[] = _(""); +const u8 gExpandedPlaceholder_Sapphire[] = _("SAPHIR"); +const u8 gExpandedPlaceholder_Ruby[] = _("RUBIN"); +const u8 gExpandedPlaceholder_Aqua[] = _("AQUA"); +const u8 gExpandedPlaceholder_Magma[] = _("MAGMA"); +const u8 gExpandedPlaceholder_Archie[] = _("ADRIAN"); +const u8 gExpandedPlaceholder_Maxie[] = _("MARC"); +const u8 gExpandedPlaceholder_Kyogre[] = _("KYOGRE"); +const u8 gExpandedPlaceholder_Groudon[] = _("GROUDON"); +const u8 gExpandedPlaceholder_Brendan[] = _("BRIX"); +const u8 gExpandedPlaceholder_May[] = _("MAIKE"); + +// system text +const u8 gSystemText_Egg[] = _("EI"); +const u8 gSystemText_Pokemon2[] = _("POKéMON"); + +// main menu text +const u8 gMainMenuString_NewGame[] = _("NEUES SPIEL"); +const u8 gMainMenuString_Continue[] = _("WEITER"); +const u8 gMainMenuString_Option[] = _("OPTIONEN"); +const u8 gMainMenuString_MysteryEvents[] = _("GEHEIMGESCHEHEN"); + +// system text 2 +const u8 SystemText_UpdatingSaveExternal[] = _("Neuer Spielstand mittels Übertra-\ngung externer Daten. Bitte warten."); +const u8 SystemText_SaveUpdated[] = _("Der Spielstand wurde erneuert."); +const u8 SystemText_SaveUpdatedExchangeBackup[] = _("Der Spielstand wurde gespeichert.\pDas Backup Memory kann keine \nweiteren Spieldaten sichern.\pBitte Backup Memory austauschen.\pBei Fragen bitte an die Nintendo\nKonsumentenberatung wenden."); +const u8 SystemText_SaveNotUpdated[] = _("Spielstand wurde nicht gesichert.\pBitte Backup Memory \naustauschen.\pBei Fragen bitte an die Nintendo\nKonsumentenberatung wenden."); + +// save file text +const u8 gSaveFileCorruptMessage[] = _("Der Spielstand ist beschädigt. Der\nvorherige Spielstand wird geladen."); +const u8 gSaveFileDeletedMessage[] = _("Der Spielstand wurde gelöscht."); + +// system text 3 +const u8 gBoardNotInstalledMessage[] = _("Das ‘1M Sub-circuit Board’\nist nicht installiert."); +const u8 gBatteryDryMessage[] = _("Interne Batterie ist verbraucht.\nSpiel kann fortgesetzt werden.\pAber zeitbasierende Spiel-Events\nwerden nicht mehr initiiert."); + +// main menu text 2 +const u8 gMainMenuString_Player[] = _("SPIELER"); +const u8 gMainMenuString_Pokedex[] = _("POKéDEX"); +const u8 gMainMenuString_Time[] = _("SPIELZEIT"); +const u8 gMainMenuString_Badges[] = _("ORDEN"); + +// birch text +const u8 gBirchText_Boy[] = _("JUNGE"); +const u8 gBirchText_Girl[] = _("MÄDEL"); +const u8 gBirchText_NewName[] = _("NEUER NAME"); + +#ifdef SAPPHIRE +const u8 gDefaultBoyName1[] = _("SEAN"); +#else +const u8 gDefaultBoyName1[] = _("ROLAND"); +#endif +const u8 gDefaultBoyName2[] = _("DANIEL"); +const u8 gDefaultBoyName3[] = _("HELGE"); +const u8 gDefaultBoyName4[] = _("JAN"); + +#ifdef SAPPHIRE +const u8 gDefaultGirlName1[] = _("MARINA"); +#else +const u8 gDefaultGirlName1[] = _("PETRA"); +#endif +const u8 gDefaultGirlName2[] = _("TANJA"); +const u8 gDefaultGirlName3[] = _("ANDREA"); +const u8 gDefaultGirlName4[] = _("SARA"); + +const u8 gSystemText_IntroWeCall[] = _("Dies ist ein so genanntes\n“POKéMON”."); +const u8 gSystemText_NewPara[] = _("\p"); + +const u8 gDexText_UnknownPoke[] = _("?????"); +const u8 gDexText_UnknownHeight[] = _("???,? m"); +const u8 gDexText_UnknownWeight[] = _("???,? kg$"); +const u8 gDexText_CryOf[] = _("{CLEAR_TO 2}RUF VON$"); +const u8 gDexText_SizeComparedTo[] = _("GRÖSSE IM VERGLEICH ZU "); +const u8 gDexText_RegisterComplete[] = _("Neuer Eintrag aufgenommen."); +const u8 gDexText_Searching[] = _("Suche läuft.\nBitte warten..."); +const u8 gDexText_SearchComplete[] = _("Suche beendet."); +const u8 gDexText_NoMatching[] = _("Es wurde keine Übereinstimmung ermittelt."); + +const u8 DexText_SearchForPoke[] = _("Suche nach POKéMON anhand\nausgewählter Parameter."); +const u8 DexText_SwitchDex[] = _("Ordnungssystem des POKéDEX ändern."); +const u8 DexText_ReturnToDex[] = _("Kehre zurück zum POKéDEX."); +const u8 DexText_SelectDexMode[] = _("Wähle einen POKéDEX."); +const u8 DexText_SelectDexList[] = _("Wähle ein Ordnungssystem des POKéDEX."); +const u8 DexText_ListByABC[] = _("Nach Anfangsbuchstaben suchen.\n(Alle gesehenen POKéMON.)"); +const u8 DexText_ListByColor[] = _("Nach Körperfarbe suchen.\n(Alle gesehenen POKéMON.)"); +const u8 DexText_ListByType[] = _("Nach Elementklasse suchen.\n(Nur gefangene POKéMON.)"); +const u8 DexText_ExecuteSearchSwitch[] = _("Suche/Ändern ausführen."); +const u8 DexText_HoennDex[] = _("HOENN DEX"); +const u8 DexText_NationalDex[] = _("NATIONALER DEX"); +const u8 DexText_NumericalMode[] = _("NUMERISCH"); +const u8 DexText_ABCMode[] = _("VON A BIS Z"); +const u8 DexText_HeaviestMode[] = _("NACH GEWICHT {0x86}"); +const u8 DexText_LightestMode[] = _("NACH GEWICHT {0x85}"); +const u8 DexText_TallestMode[] = _("NACH GRÖSSE {0x86}"); +const u8 DexText_SmallestMode[] = _("NACH GRÖSSE {0x85}"); +const u8 DexText_ABC[] = _("ABC"); +const u8 DexText_DEF[] = _("DEF"); +const u8 DexText_GHI[] = _("GHI"); +const u8 DexText_JKL[] = _("JKL"); +const u8 DexText_MNO[] = _("MNO"); +const u8 DexText_PQR[] = _("PQR"); +const u8 DexText_STU[] = _("STU"); +const u8 DexText_VWX[] = _("VWX"); +const u8 DexText_YZ[] = _("YZ"); +const u8 DexText_Red[] = _("ROT"); +const u8 DexText_Blue[] = _("BLAU"); +const u8 DexText_Yellow[] = _("GELB"); +const u8 DexText_Green[] = _("GRÜN"); +const u8 DexText_Black[] = _("SCHWARZ"); +const u8 DexText_Brown[] = _("BRAUN"); +const u8 DexText_Purple[] = _("LILA"); +const u8 DexText_Gray[] = _("GRAU"); +const u8 DexText_White[] = _("WEISS"); +const u8 DexText_Pink[] = _("ROSA"); +const u8 DexText_HoennDex2[] = _("POKéDEX von HOENN"); +const u8 DexText_NationalDex2[] = _("POKéDEX, erweiterte Edition"); +const u8 DexText_ListByNumber[] = _("POKéMON werden anhand ihrer\nNummer sortiert."); +const u8 DexText_ListByABC2[] = _("Gesehene und gefangene POKéMON\nwerden alphabetisch geordnet."); +const u8 DexText_ListByHeavyToLightest[] = _("Gefangene POKéMON werden nach Gewicht\nsortiert, beginnend mit dem schwersten."); +const u8 DexText_ListByLightToHeaviest[] = _("Gefangene POKéMON werden nach Gewicht\nsortiert, beginnend mit dem leichtesten."); +const u8 DexText_ListByTallToSmallest[] = _("Gefangene POKéMON werden nach Größe\nsortiert, beginnend mit dem größten."); +const u8 DexText_ListBySmallToTallest[] = _("Gefangene POKéMON werden nach Größe\nsortiert, beginnend mit dem kleinsten."); +const u8 DexText_Terminator5[] = _(""); +const u8 DexText_DontSpecify[] = _("KEINE ANGABE"); +const u8 DexText_None[] = _("KEINER"); +const u8 DexText_RightPointingTriangle[] = _("▶"); +const u8 DexText_Terminator6[] = _(" "); + +const u8 gMenuText_WelcomeToHOFAndDexRating[] = _("Willkommen in der RUHMESHALLE!$Gesehene POKéMON: {STR_VAR_1}!\nGefangene POKéMON: {STR_VAR_2}!\pPROF. BIRKs POKéDEX-Bewertung!\pPROF. BIRK: Sehen wir mal...\p"); +const u8 gMenuText_HOFSaving[] = _("SPEICHERVORGANG...\nDAS GERÄT NICHT AUSSCHALTEN!"); +const u8 gMenuText_HOFCorrupt[] = _("Die RH-Daten sind beschädigt."); +const u8 gMenuText_HOFNumber[] = _("RUHMESHALLE, Nr. "); +const u8 gMenuText_HOFCongratulations[] = _("CHAMP der POKéMON LIGA!\nHerzlichen Glückwunsch!"); + +const u8 gOtherText_Number2[] = _("Nr."); +const u8 gOtherText_Level3[] = _("Lv."); +const u8 gOtherText_IDNumber[] = _("ID.Nr. /"); +const u8 gOtherText_Name[] = _("NAME /"); +const u8 gOtherText_IDNumber2[] = _("ID.Nr. /"); +const u8 gOtherText_BirchInTrouble[] = _("{HIGHLIGHT WHITE2}{COLOR DARK_GREY}PROF. BIRK ist in Schwierigkeiten!\nSchnapp’ dir ein POKéMON und hilf ihm!"); +const u8 gOtherText_DoYouChoosePoke[] = _("{HIGHLIGHT WHITE2}{COLOR DARK_GREY}Wählst du dieses POKéMON?"); +const u8 gOtherText_Poke[] = _("POKéMON"); + +const u8 gSystemText_SaveErrorExchangeBackup[] = _("Fehler beim Speichern!\pBitte Backup Memory\naustauschen."); +const u8 gOtherText_FlyToWhere[] = _("Wohin willst du FLIEGEN?"); + +const u8 OtherText_Use[] = _("O.K."); +const u8 OtherText_Toss[] = _("MÜLL"); +const u8 OtherText_Register[] = _("WÄHLEN"); +const u8 OtherText_Give2[] = _("GEBEN"); +const u8 OtherText_CheckTag[] = _("PRÜFEN"); +const u8 OtherText_Confirm[] = _("O.K."); +const u8 gOtherText_Walk[] = _("LAUFEN"); + +const u8 gUnknownText_Exit[] = _("BEENDEN"); +const u8 gOtherText_CancelNoTerminator[] = _("ZURÜCK"); +const u8 gOtherText_CancelWithTerminator[] = _("$ZURÜCK"); + +const u8 OtherText_Item[] = _("ITEM"); +const u8 OtherText_Mail[] = _("BRIEF"); +const u8 OtherText_Take2[] = _("NEHMEN"); +const u8 OtherText_Store[] = _("GEBEN"); + +const u8 gOtherText_Check[] = _("PRÜFEN"); +const u8 gOtherText_None[] = _("KEINES"); + +const u8 gOtherText_ThreeQuestions2[] = _("???"); + +const u8 gOtherText_FiveQuestionsAndSlash[] = _("?????$/"); + +const u8 gOtherText_OneDash[] = _("-"); +const u8 gOtherText_TwoDashes[] = _("--"); +const u8 gOtherText_ThreeDashes2[] = _("---"); +const u8 gOtherText_MaleSymbol2[] = _("♂"); +const u8 gOtherText_FemaleSymbolAndLv[] = _("♀$Lv."); +const u8 gOtherText_TallPlusAndRightArrow[] = _("{TALL_PLUS}${RIGHT_ARROW}"); +const u8 gMenuText_GoBackToPrev[] = _("Kehre zurück zum\nvorherigen Menü."); +const u8 gOtherText_WhatWillYouDo[] = _("Was möchtest du tun?"); + +const u8 gOtherText_xString1[] = _("×{STR_VAR_1}"); +const u8 gOtherText_Berry2[] = _("BEERE"); +const u8 gOtherText_Coins2[] = _("{STR_VAR_1} MÜNZ."); +const u8 gOtherText_CloseBag[] = _("BEUTEL SCHLIESSEN"); + +const u8 OtherText_TheField3[] = _("zum Hauptmenü."); +const u8 OtherText_TheBattle[] = _("zum Kampf."); +const u8 OtherText_ThePokeList[] = _("zur POKéMON-LISTE."); +const u8 OtherText_TheShop[] = _("zum Geschäft."); +const u8 OtherText_TheField[] = _("zum Hauptmenü."); +const u8 OtherText_TheField2[] = _("zum Hauptmenü."); +const u8 OtherText_ThePC[] = _("zum PC."); + +const struct TextStruct gUnknown_0840E740[7] = +{ + OtherText_TheField3, + OtherText_TheBattle, + OtherText_ThePokeList, + OtherText_TheShop, + OtherText_TheField, + OtherText_TheField2, + OtherText_ThePC, +}; + +const u8 gOtherText_ReturnTo[] = _("Zurück "); +const u8 gOtherText_WhatWillYouDo2[] = _("Was möchtest\ndu tun?"); +const u8 gOtherText_CantWriteMail[] = _("Du kannst keinen\nBRIEF schreiben."); +const u8 gOtherText_NoPokemon[] = _("Hier ist kein\nPOKéMON.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_SwitchWhichItem[] = _("Gegen welches Item\naustauschen?"); +const u8 gOtherText_CantBeHeld[] = _("{STR_VAR_1} ist nicht zu geben."); +const u8 gOtherText_CantBeHeldHere[] = _("{STR_VAR_1} ist hier nicht zu geben."); +const u8 gOtherText_HowManyToDeposit[] = _("Wie viele möchtest\ndu ablegen?"); +const u8 gOtherText_DepositedItems[] = _("{STR_VAR_2}× {STR_VAR_1}\nwurde abgelegt."); +const u8 gOtherText_NoRoomForItems[] = _("Kein Platz für\nweitere Items."); +const u8 gOtherText_CantStoreSomeoneItem[] = _("Du kannst kein\nItem eines anderen\nauf dem PC lagern."); +const u8 gOtherText_TooImportant[] = _("Das ist viel zu\nwichtig, um es\nwegzuwerfen!"); +const u8 gOtherText_HowManyToToss[] = _("Wie viel in den Müll?"); +const u8 gOtherText_ThrewAwayItem[] = _("{STR_VAR_2} × {STR_VAR_1}\nweggeworfen."); +const u8 gOtherText_OkayToThrowAwayPrompt[] = _("Willst du wirklich\n{STR_VAR_2} × {STR_VAR_1}\nwegwerfen?"); +const u8 gOtherText_DadsAdvice[] = _("VATI sagt immer...\n{PLAYER}, dies ist weder der rechte\lOrt noch der rechte Zeitpunkt dafür!{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_CantGetOffBike[] = _("Du kannst hier nicht vom RAD steigen.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_ItemfinderResponding[] = _("Oh!\nDas Gerät zeigt etwas an!\pHier muss ein Item vergraben sein!{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_ItemfinderItemUnderfoot[] = _("Das Gerät macht direkt unter\ndeinen Füßen etwas aus!{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_NoResponse[] = _("... ... ... ... Nichts!\nKeine Anzeige.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_Coins3[] = _("Deine MÜNZEN:\n{STR_VAR_1}{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_BootedTM[] = _("Eine TM wurde aktiviert."); +const u8 gOtherText_BootedHM[] = _("Eine VM wurde aktiviert."); +const u8 gOtherText_ContainsMove[] = _("Sie enthält\n{STR_VAR_1}.\p{STR_VAR_1} einem\nPOKéMON beibringen?"); +const u8 gOtherText_UsedItem[] = _("{PLAYER} setzt\n{STR_VAR_2} ein.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_RepelLingers[] = _("Aber SCHUTZ wirkt doch\nnoch!{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_UsedFlute[] = _("{PLAYER} setzt\n{STR_VAR_2} ein.\pWilde POKéMON werden angezogen.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_UsedRepel[] = _("{PLAYER} setzt\n{STR_VAR_2} ein.\pWilde POKéMON werden abgehalten.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_BoxIsFull[] = _("Die BOXEN sind voll.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_Size[] = _("MASS:"); +const u8 gOtherText_Firm[] = _("GÜTE:"); + +const u8 gContestStatsText_Unknown1[] = _("{STR_VAR_1},{STR_VAR_2} cm"); + +const u8 ContestStatsText_VerySoft[] = _("Sehr weich"); +const u8 ContestStatsText_Soft[] = _("Weich"); +const u8 ContestStatsText_Hard[] = _("Hart"); +const u8 ContestStatsText_VeryHard[] = _("Sehr hart"); +const u8 ContestStatsText_SuperHard[] = _("Steinhart"); + +const u8 ContestStatsText_RedPokeBlock[] = _("{POKEBLOCK} ROT"); +const u8 ContestStatsText_BluePokeBlock[] = _("{POKEBLOCK} BLAU"); +const u8 ContestStatsText_PinkPokeBlock[] = _("{POKEBLOCK} ROSA"); +const u8 ContestStatsText_GreenPokeBlock[] = _("{POKEBLOCK} GRÜN"); +const u8 ContestStatsText_YellowPokeBlock[] = _("{POKEBLOCK} GELB"); +const u8 ContestStatsText_PurplePokeBlock[] = _("{POKEBLOCK} LILA"); +const u8 ContestStatsText_IndigoPokeBlock[] = _("{POKEBLOCK} INDIGO"); +const u8 ContestStatsText_BrownPokeBlock[] = _("{POKEBLOCK} BRAUN"); +const u8 ContestStatsText_LiteBluePokeBlock[] = _("{POKEBLOCK} CYAN"); +const u8 ContestStatsText_OlivePokeBlock[] = _("{POKEBLOCK} OLIV"); +const u8 ContestStatsText_GrayPokeBlock[] = _("{POKEBLOCK} GRAU"); +const u8 ContestStatsText_BlackPokeBlock[] = _("{POKEBLOCK} SCHWARZ"); +const u8 ContestStatsText_WhitePokeBlock[] = _("{POKEBLOCK} WEISS"); +const u8 ContestStatsText_GoldPokeBlock[] = _("{POKEBLOCK} GOLD"); + +const u8 gContestStatsText_Spicy[] = _("SCHARF"); +const u8 gContestStatsText_Dry[] = _("TROCKEN"); +const u8 gContestStatsText_Sweet[] = _("SÜSS"); +const u8 gContestStatsText_Bitter[] = _("BITTER"); +const u8 gContestStatsText_Sour[] = _("SAUER$LECKER$WÜRZE"); + +const u8 gContestStatsText_StowCase[] = _("BOX verstauen."); +const u8 gContestStatsText_ThrowAwayPrompt[] = _("{STR_VAR_1}\nwegwerfen?"); +const u8 gContestStatsText_WasThrownAway[] = _("{STR_VAR_1}\nwurde weggeworfen."); +const u8 gContestStatsText_NormallyAte[] = _("{STR_VAR_1} aß den\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); +const u8 gContestStatsText_HappilyAte[] = _("{STR_VAR_1} aß gerne den\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); +const u8 gContestStatsText_DisdainfullyAte[] = _("{STR_VAR_1} aß ungern den\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); + +const u8 MartText_Buy[] = _("KAUFEN"); +const u8 MartText_Sell[] = _("VERKAUFEN"); +const u8 MartText_Quit2[] = _("TSCHÜSS!"); + +const u8 gOtherText_QuitShopping[] = _("Einkauf beenden."); + +const u8 gOtherText_HowManyYouWant[] = _("{STR_VAR_1}? Aber gerne.\nWie viele möchtest du?"); +const u8 gOtherText_ThatWillBe[] = _("{STR_VAR_1}? Und du möchtest {STR_VAR_2}?\nDas macht dann ¥{STR_VAR_3}."); +const u8 gOtherText_ThatWillBe2[] = _("{STR_VAR_1} soll es sein?\nDas kostet ¥{STR_VAR_2}. Einverstanden?"); +const u8 gOtherText_ThatWillBe3[] = _("Du wolltest {STR_VAR_1}?\nDas kostet ¥{STR_VAR_2}. Einverstanden?"); +const u8 gOtherText_HereYouGo[] = _("Bitte sehr!\nUnd vielen Dank."); +const u8 gOtherText_HereYouGo2[] = _("Vielen Dank!\nEs wird auf deinen PC übertragen."); +const u8 gOtherText_HereYouGo3[] = _("Danke!\nEs wird auf deinen PC übertragen."); +const u8 gOtherText_NotEnoughMoney[] = _("Du hast nicht genug Geld.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_NoRoomFor[] = _("Du hast keinen Platz für weitere Items.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_SpaceForIsFull[] = _("Es ist kein Platz für {STR_VAR_1}.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_AnythingElse[] = _("Gibt es noch etwas, womit\nich dienen kann?"); +const u8 gOtherText_CanIHelpYou[] = _("Kann ich dir sonst noch dienlich sein?"); +const u8 gOtherText_FreePremierBall[] = _("Ich gebe dir noch einen PREMIERBALL.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_CantBuyThat[] = _("{STR_VAR_2}? Es tut mir Leid, aber\ndas kann ich nicht kaufen.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_HowManyToSell[] = _("{STR_VAR_2}?\nWie viele möchtest du verkaufen?"); +const u8 gOtherText_CanPay[] = _("Ich gebe dir ¥{STR_VAR_1}.\nBist du damit einverstanden?"); +const u8 gOtherText_SoldItem[] = _("{STR_VAR_2} wurde übergeben\nim Tausch gegen ¥{STR_VAR_1}."); + +const u8 OtherText_Money[] = _("¥{STR_VAR_1}"); +const u8 OtherText_Shift[] = _("TAUSCH"); +const u8 OtherText_SendOut[] = _("AUSSENDEN"); +const u8 OtherText_Switch2[] = _("TAUSCH"); +const u8 OtherText_Summary[] = _("BERICHT"); +const u8 OtherText_Moves[] = _("ATTACKEN"); +const u8 OtherText_Enter2[] = _("EINTRAGEN"); +const u8 OtherText_NoEntry[] = _("AUSTRAGEN"); +const u8 OtherText_Take[] = _("NEHMEN"); +const u8 OtherText_Read2[] = _("LESEN"); + +const u8 gOtherText_Hp2[] = _("KP"); +const u8 gOtherText_SpAtk2[] = _("SP. ANG."); +const u8 gOtherText_SpDef2[] = _("SP. VER."); +const u8 gOtherText_WontHaveAnyEffect[] = _("Es wird keine Wirkung haben.{PAUSE_UNTIL_PRESS}"); + +const u8 gOtherText_CantUseOnPoke[] = _("Das kann nicht bei diesem\nPOKéMON eingesetzt werden.{PAUSE_UNTIL_PRESS}"); + +const u8 gOtherText_CantBeSwitched[] = _("{STR_VAR_1} kann nicht ausge-\ntauscht werden!{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_AlreadyBattle[] = _("{STR_VAR_1}\nkämpft bereits!{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_AlreadySelected[] = _("{STR_VAR_1} ist\nbereits ausgewählt.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_NoEnergyLeft[] = _("{STR_VAR_1} kann\nnicht kämpfen!{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_CantSwitchPokeWithYours[] = _("Ein POKéMON von {STR_VAR_1} ist\nnicht gegen deins eintauschbar!{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_EGGCantBattle[] = _("Ein EI kann nicht kämpfen!{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_CantBeUsedBadge[] = _("Das ist erst einsetzbar, wenn\nein neuer ORDEN errungen wurde."); +const u8 gOtherText_NoMoreThreePoke[] = _("Es können nicht mehr als\ndrei POKéMON teilnehmen."); +const u8 gOtherText_SendRemovedMailPrompt[] = _("Den abgenommenen BRIEF\nauf deinen PC übertragen?"); +const u8 gOtherText_MailWasSent[] = _("Der BRIEF wurde auf deinen\nPC übertragen.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_MailboxIsFull[] = _("Du kannst keine weiteren BRIEFE\nauf deinen PC übertragen.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_MailRemovedMessageLost[] = _("Wird der BRIEF entfernt, geht\nder Inhalt verloren, okay?"); +const u8 gOtherText_MailMustBeRemoved[] = _("Der BRIEF muss entfernt werden,\num ein Item tragen zu können.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_WasGivenToHold[] = _("{STR_VAR_1} erhält\n{STR_VAR_2} zum Tragen.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_AlreadyHolding[] = _("{STR_VAR_1} trägt bereits\n{STR_VAR_2}.\pSollen die Items ausge-\ntauscht werden?"); +const u8 gOtherText_NotHoldingAnything[] = _("{STR_VAR_1} trägt\nkein Item.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_ReceivedTheThingFrom[] = _("{STR_VAR_2} von\n{STR_VAR_1} erhalten.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_MailTaken[] = _("Der BRIEF wurde dem\nPOKéMON abgenommen.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_TakenAndReplaced[] = _("{STR_VAR_2} wurde gegen\n{STR_VAR_1} ausgetauscht.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_PokeHoldingItemCantMail[] = _("Dieses POKéMON trägt ein Item.\nEs kann keinen BRIEF tragen.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_MailTransferredMailbox[] = _("Der BRIEF wurde von deinem\nPC heruntergeladen.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_BagFullCannotRemoveItem[] = _("Der BEUTEL ist voll. Das Item des\nPOKéMON wurde nicht entfernt.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_LearnedMove[] = _("{STR_VAR_1} erlernt\n{STR_VAR_2}!"); +const u8 gOtherText_NotCompatible[] = _("{STR_VAR_1} und {STR_VAR_2}\nsind nicht kompatibel.\p{STR_VAR_2} kann nicht \nerlernt werden.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_WantsToLearn[] = _("{STR_VAR_1} versucht,\n{STR_VAR_2} zu erlernen.\pAber {STR_VAR_1} kann maximal\nvier Attacken erlernen.\pSoll eine andere Attacke durch\n{STR_VAR_2} ersetzt werden?"); +const u8 gOtherText_StopTryingTo[] = _("{STR_VAR_2} nicht\nerlernen?"); +const u8 gOtherText_DidNotLearnMove2[] = _("{STR_VAR_1} hat {STR_VAR_2}\nnicht erlernt.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_WhichMoveToForget2[] = _("Welche Attacke soll vergessen\nwerden?{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_ForgetMove123_2[] = _("{PAUSE 32}1, {PAUSE 15}2 und{PAUSE 15}... {PAUSE 15}... {PAUSE 15}... {PAUSE 15}{PLAY_SE 0x38 0x00} Schwupp!\p{STR_VAR_1} hat\n{STR_VAR_2} vergessen.\pUnd...{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_AlreadyKnows[] = _("{STR_VAR_1} kennt\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_HPRestoredBy[] = _("Die KP von {STR_VAR_1} wurden\num {STR_VAR_2} Punkte aufgefüllt.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_CuredPoisoning[] = _("Die Vergiftung von {STR_VAR_1}\nwurde geheilt.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_CuredParalysis[] = _("Die Paralyse von {STR_VAR_1}\nwurde aufgehoben.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_WokeUp[] = _("{STR_VAR_1} ist aufgewacht.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_BurnHealed[] = _("Verbrennung von {STR_VAR_1}\nwurde geheilt.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_ThawedOut[] = _("{STR_VAR_1} wurde aufgetaut.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_PPRestored[] = _("AP wurden aufgefüllt.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_RegainedHealth[] = _("{STR_VAR_1} erholte sich.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_BecameHealthy[] = _("{STR_VAR_1} erholte sich.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_PPIncreased[] = _("AP von {STR_VAR_1}\nwurden angehoben.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_ElevatedTo[] = _("{STR_VAR_1} erreicht\nLv. {STR_VAR_2}."); +const u8 gOtherText_WasRaised[] = _("{STR_VAR_2} von\n{STR_VAR_1} wurde angehoben.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_SnapConfusion[] = _("{STR_VAR_1} ist nicht\nmehr verwirrt.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_GotOverLove[] = _("{STR_VAR_1} fühlt sich nicht\nmehr angezogen.{PAUSE_UNTIL_PRESS}"); +const u8 OtherText_ChoosePoke[] = _("Wähle ein POKéMON."); +const u8 OtherText_MovePokeTo[] = _("An wessen Stelle setzen?"); +const u8 OtherText_TeachWhat[] = _("Welches POKéMON lehren?"); +const u8 OtherText_UseWhat[] = _("Welches POKéMON?"); +const u8 OtherText_GiveWhat[] = _("Welchem POKéMON geben?"); +const u8 OtherText_DoWhat[] = _("Was tun mit {STR_VAR_1}?"); +const u8 OtherText_NothingToCut[] = _("Hier nicht einsetzbar."); +const u8 OtherText_CantSurf[] = _("SURFER nicht einsetzbar."); +const u8 OtherText_AlreadySurfing[] = _("SURFER ist eingesetzt."); +const u8 OtherText_CantUseThatHere[] = _("Hier nicht einsetzbar."); +const u8 OtherText_RestoreWhatMove[] = _("Welche Attacke auffüllen?"); +const u8 OtherText_BoostPP[] = _("AP welcher Attacke heben?"); +const u8 OtherText_DoWhatWithItem[] = _("Was willst du mit dem Item?"); +const u8 OtherText_NoPokeForBattle[] = _("Kein POKéMON kampfbereit!"); +const u8 OtherText_ChoosePoke2[] = _("Wähle ein POKéMON."); +const u8 OtherText_NotEnoughHP[] = _("Nicht genügend KP..."); +const u8 OtherText_ThreePokeNeeded[] = _("Drei POKéMON sind nötig."); +const u8 OtherText_PokeCantBeSame[] = _("Nicht dieselben POKéMON!"); +const u8 OtherText_NoIdenticalHoldItems[] = _("Nicht dieselben Items!"); +const u8 OtherText_TeachWhichPoke[] = _("Welches POKéMON lehren?"); +const u8 gOtherText_Attack[] = _("ANGRIFF"); +const u8 gOtherText_Defense[] = _("VERT."); +const u8 gOtherText_SpAtk[] = _("SP.ANG."); +const u8 gOtherText_SpDef[] = _("SP.VER."); +const u8 gOtherText_Speed[] = _("INIT."); +const u8 gOtherText_HP[] = _("KP"); +const u8 gOtherText_Terminator18[] = _(""); +const u8 gOtherText_OriginalTrainer[] = _("OT:"); +const u8 gOtherText_Type2[] = _("TYP:"); +const u8 gOtherText_Power2[] = _("STÄRKE"); +const u8 gOtherText_Accuracy2[] = _("GENAU."); +const u8 gOtherText_Appeal2[] = _("AUSDR."); +const u8 gOtherText_Jam2[] = _("EINDR."); +const u8 gOtherText_Status[] = _("STATUS"); +const u8 gOtherText_ExpPoints[] = _("E.-PUNKTE"); +const u8 gOtherText_NextLv[] = _("NÄCHST. Lv."); +const u8 gOtherText_Ribbons00[] = _("BÄNDER: 00"); + +const u8 OtherText_Event[] = _("GESCHEHEN"); +const u8 OtherText_Switch[] = _("TAUSCH"); +const u8 OtherText_PokeInfo[] = _("POKéMON-INFO"); +const u8 OtherText_PokeSkills[] = _("POKéMON-FÄHIG."); +const u8 OtherText_BattleMoves[] = _("ATTACKEN"); +const u8 OtherText_ContestMoves[] = _("WETT.-ATTACKEN"); +const u8 OtherText_Info[] = _("INFO"); + +const u8 gOtherText_EggLongTime[] = _("Dieses EI braucht sicher\nnoch lange, bis es schlüpft."); +const u8 gOtherText_EggSomeTime[] = _("Was da wohl schlüpfen wird?\nEs wird sicher lange dauern."); +const u8 gOtherText_EggSoon[] = _("Es bewegt sich manchmal.\nVielleicht schlüpft es bald?"); +const u8 gOtherText_EggAbout[] = _("Es macht Geräusche.\nSicher schlüpft es bald!"); +const u8 gOtherText_CantForgetHMs[] = _("VM-Attacken können jetzt\nnicht vergessen werden."); +const u8 gOtherText_PlayersBase[] = _("BASIS v. {PLAYER}"); +const u8 gOtherText_OkayToDeleteFromRegistry[] = _("Soll {STR_VAR_1} aus dem GRUNDBUCH\ngelöscht werden?"); +const u8 gOtherText_RegisteredDataDeleted[] = _("Eingetragene Daten wurden gelöscht.{PAUSE_UNTIL_PRESS}"); + +const u8 gSecretBaseText_NoRegistry[] = _("Es gibt kein GRUNDBUCH.{PAUSE_UNTIL_PRESS}"); +const u8 SecretBaseText_DelRegist[] = _("EINTR. LÖSCHEN"); +const u8 SecretBaseText_Decorate[] = _("DEKORIEREN"); +const u8 SecretBaseText_PutAway[] = _("WEGNEHMEN"); +const u8 SecretBaseText_Toss[] = _("WEGWERFEN"); +const u8 SecretBaseText_PutOutDecor[] = _("Wähle eine Dekoration \nund stelle sie auf."); +const u8 SecretBaseText_StoreChosenDecor[] = _("Wähle eine Dekoration und \nübertrage sie auf deinen PC."); +const u8 SecretBaseText_ThrowAwayDecor[] = _("Wähle eine Dekoration\nund wirf sie weg."); +const u8 gSecretBaseText_NoDecors[] = _("Es gibt keine Dekoration.{PAUSE_UNTIL_PRESS}"); +const u8 SecretBaseText_Desk[] = _("TISCH"); +const u8 SecretBaseText_Chair[] = _("STUHL"); +const u8 SecretBaseText_Plant[] = _("PFLANZE"); +const u8 SecretBaseText_Ornament[] = _("ORNAMENT"); +const u8 SecretBaseText_Mat[] = _("MATTE"); +const u8 SecretBaseText_Poster[] = _("POSTER"); +const u8 SecretBaseText_Doll[] = _("PUPPE"); +const u8 SecretBaseText_Cushion[] = _("KISSEN"); +const u8 gSecretBaseText_GoldRank[] = _("GOLD"); +const u8 gSecretBaseText_SilverRank[] = _("SILBER"); +const u8 gSecretBaseText_PlaceItHere[] = _("Hierhin platzieren?"); +const u8 gSecretBaseText_CantBePlacedHere[] = _("Kann hier nicht platziert werden."); +const u8 gSecretBaseText_CancelDecorating[] = _("Dekorieren beenden?"); +const u8 gSecretBaseText_InUseAlready[] = _("Das wurde bereits platziert."); +const u8 gSecretBaseText_NoMoreDecor[] = _("Mehr kann nicht dekoriert werden. Es\nist nur Platz für {STR_VAR_1} Dekorationen."); +const u8 gSecretBaseText_NoMoreDecor2[] = _("Mehr kann nicht dekoriert werden. Es\nist nur Platz für {STR_VAR_1} Dekorationen."); +const u8 gSecretBaseText_DecorMustPlaceOnTable[] = _("Das geht nicht. Es muss auf einem\nTISCH oder Ähnlichem stehen."); +const u8 gSecretBaseText_DecorCantPlace[] = _("Die Dekoration kann nicht in deinem\neigenen Zimmer aufgestellt werden."); +const u8 gSecretBaseText_DecorInUse[] = _("Diese Dekoration wurde platziert.\nDu kannst sie nicht wegwerfen."); +const u8 gSecretBaseText_WillBeDiscarded[] = _("{STR_VAR_1} wird weggeworfen.\nEinverstanden?"); +const u8 gSecretBaseText_DecorThrownAway[] = _("Die Dekoration wurde weggeworfen."); +const u8 gSecretBaseText_StopPuttingAwayDecor[] = _("Wegnehmen von Dekoration beenden?"); +const u8 gSecretBaseText_NoDecor[] = _("Hier ist keine Dekoration."); +const u8 gSecretBaseText_ReturnDecor[] = _("Diese Dekoration auf \nden PC übertragen?"); +const u8 gSecretBaseText_DecorReturned[] = _("Die Dekoration wurde auf\nden PC übertragen."); +const u8 gSecretBaseText_NoDecorInUse[] = _("Es sind keine Dekorationen platziert.{PAUSE_UNTIL_PRESS}"); +const u8 SecretBaseText_Tristan[] = _("TATIAN"); +const u8 SecretBaseText_Philip[] = _("LARS"); +const u8 SecretBaseText_Dennis[] = _("KLAAS"); +const u8 SecretBaseText_Roberto[] = _("HAINER"); +const u8 SecretBaseText_TurnOff[] = _("AUSSCHALTEN"); +const u8 SecretBaseText_Decoration[] = _("DEKORATION"); +const u8 SecretBaseText_ItemStorage[] = _("ITEM-LAGER"); + +const u8 gPCText_Mailbox[] = _("BRIEFBOX"); +const u8 PCText_DepositItem[] = _("ITEM ABLEGEN"); +const u8 PCText_WithdrawItem[] = _("ITEM NEHMEN"); +const u8 PCText_TossItem[] = _("ITEM IN MÜLL"); +const u8 PCText_StoreItems[] = _("Lagere Items auf deinem PC."); +const u8 PCText_TakeOutItems[] = _("Nimm Items von deinem PC."); +const u8 PCText_ThrowAwayItems[] = _("Wirf gelagerte Items weg."); + +const u8 gOtherText_NoItems[] = _("Es gibt keine Items.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_NoMoreRoom[] = _("In deinem BEUTEL\nist kein Platz mehr."); +const u8 gOtherText_HowManyToWithdraw[] = _("Wie viele möchtest\ndu aufnehmen?"); +const u8 gOtherText_WithdrewThing[] = _("{STR_VAR_2} × {STR_VAR_1}\naufgenommen."); +const u8 OtherText_Read[] = _("LESEN"); +const u8 gOtherText_MoveToBag[] = _("IN BEUTEL GEBEN"); +const u8 OtherText_Give[] = _("GEBEN"); +const u8 gOtherText_NoMailHere[] = _("Hier ist kein BRIEF.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_WhatWillYouDoMail[] = _("Was soll mit dem BRIEF von\n{STR_VAR_1} geschehen?"); +const u8 gOtherText_MessageWillBeLost[] = _("Der Inhalt geht verloren.\nIst das in Ordnung für dich?"); +const u8 gOtherText_BagIsFull[] = _("Der BEUTEL ist voll.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_MailWasReturned[] = _("Der BRIEF, dessen Inhalt gelöscht\nist, wurde im BEUTEL gelagert.{PAUSE_UNTIL_PRESS}"); +const u8 gOtherText_Dad[] = _("VATI"); +const u8 gOtherText_Mom[] = _("MUTTI"); +const u8 gOtherText_Wallace[] = _("WASSILI"); +const u8 gOtherText_Steven[] = _("TROY"); +const u8 gOtherText_Brawly[] = _("KAMILLO"); +const u8 gOtherText_Winona[] = _("WIBKE"); +const u8 gOtherText_Phoebe[] = _("ANTONIA"); +const u8 gOtherText_Glacia[] = _("FROSINA"); +const u8 gContestText_ContestWinner[] = _("-WETTBEWERBSSIEGER\n"); +const u8 gOtherText_Unknown1[] = _(" von "); +const u8 OtherText_Cool[] = _("COOL."); +const u8 OtherText_Beauty2[] = _("SCHÖN."); +const u8 OtherText_Cute[] = _("ANMUT"); +const u8 OtherText_Smart[] = _("KLUG."); +const u8 OtherText_Tough[] = _("STÄRKE"); +const u8 OtherText_NonstopSuperCool[] = _("Super-mega-cool ist\ndieses umwerfende "); +const u8 OtherText_Terminator6[] = _(""); +const u8 OtherText_GoodLookingPoke[] = _("Das anbetungswürdige\nPOKéMON: "); +const u8 OtherText_Terminator7[] = _(""); +const u8 OtherText_MarvelousGreat[] = _("Phantastisch, großartig -\nschlicht brillant: "); +const u8 OtherText_Terminator8[] = _(""); +const u8 OtherText_CenturyLastVenus[] = _("Ein Bild von einem POKéMON!\nDas wunderschöne "); +const u8 OtherText_Terminator9[] = _(""); +const u8 OtherText_Terminator10[] = _("Einfach umwerfend, das strahlende\nLächeln von "); +const u8 OtherText_DazzlingSmile[] = _(""); +const u8 OtherText_PokeCenterIdol[] = _("Superstar des POKéMON-CENTERs -\ndas unvergleichliche "); +const u8 OtherText_Terminator11[] = _(""); +const u8 OtherText_LovelyAndSweet[] = _("Das liebliche, zuckersüße "); +const u8 OtherText_Terminator12[] = _(""); +const u8 OtherText_ThePretty[] = _("Das Gewinner-Portrait\nvon dem hübschen "); +const u8 OtherText_WinningPortrait[] = _(""); +const u8 OtherText_GiveUsWink[] = _("Winke uns zu, du\ngoldiges "); +const u8 OtherText_Terminator13[] = _(""); +const u8 OtherText_SmartnessMaestro[] = _("Der Gelehrte unter den\nPOKéMON! Das weise "); +const u8 OtherText_Terminator14[] = _(""); +const u8 OtherText_ChosenPokeAmong[] = _("Das auserwählte und\neinzigartige POKéMON: "); +const u8 OtherText_Terminator15[] = _(""); +const u8 OtherText_TheExcellent[] = _("Das grandiose "); +const u8 OtherText_ItsMomentOfElegance[] = _(" -\nder Inbegriff von Eleganz und Stil"); +const u8 OtherText_PowerfullyMuscular[] = _("Der energische, kraftstrotzende\nÜberflieger: "); +const u8 OtherText_Terminator16[] = _(""); +const u8 OtherText_StrongErEst[] = _("Stark, stärker, am stärksten -\ndas allerstärkste "); +const u8 OtherText_Terminator17[] = _(""); +const u8 OtherText_MightyTough[] = _("Das mächtige, prächtige - das\nstärkste POKéMON: "); +const u8 OtherText_Exclamation[] = _(""); +const u8 OtherText_Petalburg[] = _("BLÜTENBURG CITY"); +const u8 OtherText_Slateport[] = _("GRAPHITPORT CITY"); +const u8 OtherText_Littleroot[] = _("WURZELHEIM"); +const u8 OtherText_Lilycove[] = _("SEEGRASULB CITY"); +const u8 OtherText_Dewford[] = _("FAUSTAUHAVEN"); +const u8 OtherText_Enter[] = _("JA"); +const u8 OtherText_Info3[] = _("INFO"); +const u8 OtherText_WhatsAContest[] = _("Der WETTBEWERB"); +const u8 OtherText_TypesOfContest[] = _("WETTBEWERB-Arten"); +const u8 OtherText_Ranks[] = _("Klassen"); +const u8 OtherText_Judging[] = _("Bewertung"); +const u8 OtherText_CoolContest[] = _("COOL.-WETTB."); +const u8 OtherText_BeautyContest[] = _("SCHÖN.-WETTB."); +const u8 OtherText_CuteContest[] = _("ANMUT-WETTB."); +const u8 OtherText_SmartContest[] = _("KLUG.-WETTB."); +const u8 OtherText_ToughContest[] = _("STÄRKE-WETTB."); +const u8 OtherText_Decoration[] = _("DEKORATION"); +const u8 OtherText_PackUp[] = _("EINPACKEN"); +const u8 OtherText_Count[] = _("ZÄHLEN"); +const u8 OtherText_Registry[] = _("GRUNDBUCH"); +const u8 OtherText_Information[] = _("INFORMATION"); +const u8 OtherText_Mach[] = _("EIL"); +const u8 OtherText_Acro[] = _("KUNST"); +const u8 OtherText_Poison[] = _("GIF"); +const u8 OtherText_Paralysis[] = _("PAR"); +const u8 OtherText_Sleep[] = _("SLF"); +const u8 OtherText_Burn[] = _("BRT"); +const u8 OtherText_Frozen[] = _("GFR"); +const u8 OtherText_Quit[] = _("ZURÜCK"); +const u8 OtherText_SawIt[] = _("Gesehen"); +const u8 OtherText_NotYet[] = _("Noch nicht"); +const u8 OtherText_Yes[] = _("JA"); +const u8 OtherText_No[] = _("NEIN"); +const u8 OtherText_Info2[] = _("INFO"); +const u8 OtherText_SingleBattle[] = _("EINZELKAMPF"); +const u8 OtherText_DoubleBattle[] = _("DOPPELKAMPF"); +const u8 OtherText_MultiBattle[] = _("MULTIKAMPF"); +const u8 OtherText_MrBriney[] = _("MR. BRACK"); +const u8 OtherText_MakeAChallenge[] = _("Zum Kampf fordern"); +const u8 OtherText_ObtainInformation[] = _("Information dazu"); +const u8 OtherText_Lv50_2[] = _("Lv. 50"); +const u8 OtherText_Lv100_2[] = _("Lv. 100"); +const u8 OtherText_Zigzagoon[] = _("ZIGZACHS"); +const u8 OtherText_Nincada[] = _("NINCADA"); +const u8 OtherText_Poochyena[] = _("FIFFYEN"); +const u8 OtherText_Nincada2[] = _("NINCADA"); +const u8 OtherText_Lotad[] = _("LOTURZEL"); +const u8 OtherText_Roselia[] = _("ROSELIA"); +const u8 OtherText_Shroomish[] = _("KNILZ"); +const u8 OtherText_Nincada3[] = _("NINCADA"); +const u8 OtherText_Surskit[] = _("GEHWEIHER"); +const u8 OtherText_Treecko[] = _("GECKARBOR"); +const u8 OtherText_Torchic[] = _("FLEMMLI"); +const u8 OtherText_Mudkip[] = _("HYDROPI"); +const u8 OtherText_Seedot[] = _("SAMURZEL"); +const u8 OtherText_Shroomish2[] = _("KNILZ"); +const u8 OtherText_Spinda[] = _("PANDIR"); +const u8 OtherText_Shroomish3[] = _("KNILZ"); +const u8 OtherText_Zigzagoon2[] = _("ZIGZACHS"); +const u8 OtherText_Wurmple[] = _("WAUMPEL"); +const u8 OtherText_PokeBall[] = _("POKéBALL"); +const u8 OtherText_SuperPotion[] = _("SUPERTRANK"); +const u8 OtherText_SamePrice[] = _("Zum selben Preis"); +const u8 OtherText_Yen135[] = _("¥135"); +const u8 OtherText_Yen155[] = _("¥155"); +const u8 OtherText_Yen175[] = _("¥175"); +const u8 OtherText_CostMore[] = _("Sie kosten mehr."); +const u8 OtherText_CostLess[] = _("Sie kosten weniger."); +const u8 OtherText_SamePrice2[] = _("Gleicher Preis"); +const u8 OtherText_MaleSymbol[] = _("♂"); +const u8 OtherText_FemaleSymbol[] = _("♀"); +const u8 OtherText_Neither[] = _("Weder noch"); +const u8 OtherText_Males[] = _("Männer"); +const u8 OtherText_Females[] = _("Frauen"); +const u8 OtherText_SameNumber[] = _("Gleich viele"); +const u8 OtherText_Male[] = _("Männlich"); +const u8 OtherText_Female[] = _("Weiblich"); +const u8 OtherText_ItDepends[] = _("Ansichtssache"); +const u8 OtherText_Six2[] = _("6"); +const u8 OtherText_Eight2[] = _("8"); +const u8 OtherText_Ten[] = _("10"); +const u8 OtherText_One[] = _("1"); +const u8 OtherText_Two[] = _("2"); +const u8 OtherText_Three[] = _("3"); +const u8 OtherText_Six[] = _("6"); +const u8 OtherText_Seven[] = _("7"); +const u8 OtherText_Eight[] = _("8"); +const u8 OtherText_FreshWater[] = _("TAFELWASSER{CLEAR_TO 72}¥200"); +const u8 OtherText_SodaPop[] = _("SPRUDEL{CLEAR_TO 72}¥300"); +const u8 OtherText_Lemonade[] = _("LIMONADE{CLEAR_TO 72}¥350"); +const u8 OtherText_HowToRide[] = _("RAD FAHREN"); +const u8 OtherText_HowToTurn[] = _("KURVEN FAHREN"); +const u8 OtherText_SandySlopes[] = _("SANDHÜGEL"); +const u8 OtherText_Wheelies[] = _("WHEELIES"); +const u8 OtherText_BunnyHops[] = _("HOPPELN"); +const u8 OtherText_Jumping[] = _("SPRINGEN"); +const u8 OtherText_Satisfied[] = _("Zufrieden"); +const u8 OtherText_Dissatisfied[] = _("Unzufrieden"); +const u8 OtherText_Deepseatooth[] = _("ABYSSZAHN"); +const u8 OtherText_Deepseascale[] = _("ABYSSPLATTE"); +const u8 OtherText_BlueFlute2[] = _("BLAUE FLÖTE"); +const u8 OtherText_YellowFlute2[] = _("GELBE FLÖTE"); +const u8 OtherText_RedFlute2[] = _("ROTE FLÖTE"); +const u8 OtherText_WhiteFlute2[] = _("WEISSE FLÖTE"); +const u8 OtherText_BlackFlute2[] = _("SCHWRZ. FLÖTE"); +const u8 OtherText_GlassChair[] = _("GLASSTUHL"); +const u8 OtherText_GlassDesk[] = _("GLASTISCH"); +const u8 OtherText_TreeckoDoll[] = _("GECKARBOR-PUPPE 1.000 M."); +const u8 OtherText_TorchicDoll[] = _("FLEMMLI-PUPPE 1.000 M."); +const u8 OtherText_MudkipDoll[] = _("HYDROPI-PUPPE 1.000 M."); +const u8 OtherText_50Coins[] = _(" 50 MÜNZEN ¥1.000"); +const u8 OtherText_500Coins[] = _("500 MÜNZEN ¥10.000"); +const u8 OtherText_Excellent[] = _("Klasse!"); +const u8 OtherText_NotSoHot[] = _("Naja..."); +const u8 OtherText_RedShard[] = _("PURPURSTÜCK"); +const u8 OtherText_YellowShard[] = _("GELBSTÜCK"); +const u8 OtherText_BlueShard[] = _("INDIGOSTÜCK"); +const u8 OtherText_GreenShard[] = _("GRÜNSTÜCK"); +const u8 OtherText_BattleTower[] = _("DUELLTURM"); +const u8 OtherText_Right[] = _("Rechts"); +const u8 OtherText_Left[] = _("Links"); +const u8 OtherText_TM32[] = _("TM32 1.500 MÜNZEN"); +const u8 OtherText_TM29[] = _("TM29 3.500 MÜNZEN"); +const u8 OtherText_TM35[] = _("TM35 4.000 MÜNZEN"); +const u8 OtherText_TM24[] = _("TM24 4.000 MÜNZEN"); +const u8 OtherText_TM13[] = _("TM13 4.000 MÜNZEN"); +const u8 OtherText_1F_2[] = _("EG"); +const u8 OtherText_2F_2[] = _("1S"); +const u8 OtherText_3F_2[] = _("2S"); +const u8 OtherText_4F_2[] = _("3S"); +const u8 OtherText_5F_2[] = _("4S"); +const u8 OtherText_Cool2[] = _("COOL."); +const u8 OtherText_Beauty3[] = _("SCHÖN."); +const u8 OtherText_Cute2[] = _("ANMUT"); +const u8 OtherText_Smart2[] = _("KLUG."); +const u8 OtherText_Tough2[] = _("STÄRKE"); +const u8 OtherText_Normal[] = _("NORMAL"); +const u8 OtherText_Super[] = _("SUPER"); +const u8 OtherText_Hyper[] = _("HYPER"); +const u8 OtherText_Master[] = _("MASTER"); +const u8 OtherText_Cool3[] = _("COOL."); +const u8 OtherText_Beauty4[] = _("SCHÖN."); +const u8 OtherText_Cute3[] = _("ANMUT"); +const u8 OtherText_Smart3[] = _("KLUG."); +const u8 OtherText_Tough3[] = _("STÄRKE"); +const u8 OtherText_Items[] = _("ITEM"); +const u8 OtherText_KeyItems[] = _("BASIS-ITEM"); +const u8 OtherText_Balls[] = _("BALL"); +const u8 OtherText_TMsHMs[] = _("TM/VM"); +const u8 OtherText_Berries[] = _("BEEREN"); + +const u8 gPCText_SomeonesPC[] = _("JEMANDES PC"); +const u8 gPCText_LanettesPC[] = _("LANETTES PC"); +const u8 gPCText_PlayersPC[] = _("PC von {PLAYER}"); +const u8 gPCText_HallOfFame[] = _("RUHMESHALLE"); +const u8 gPCText_LogOff[] = _("AUSLOGGEN"); + +const u8 gOtherText_99Times[] = _("99-mal +"); +const u8 gOtherText_1Minute[] = _("1 Minute +"); +const u8 gOtherText_Seconds[] = _(" Sekunden"); +const u8 gOtherText_Times[] = _("-mal$."); +const u8 gOtherText_BigGuy[] = _(""); +const u8 gOtherText_BigGirl[] = _(""); +const u8 gOtherText_Son[] = _("Sohn"); +const u8 gOtherText_Daughter[] = _("Tochter"); +const u8 OtherText_BlueFlute[] = _("BLAUE FLÖTE"); +const u8 OtherText_YellowFlute[] = _("GELBE FLÖTE"); +const u8 OtherText_RedFlute[] = _("ROTE FLÖTE"); +const u8 OtherText_WhiteFlute[] = _("WEISSE FLÖTE"); +const u8 OtherText_BlackFlute[] = _("SCHWRZ. FLÖTE"); +const u8 OtherText_PrettyChair[] = _("EDLER STUHL"); +const u8 OtherText_PrettyDesk[] = _("EDLER TISCH"); +const u8 OtherText_1F[] = _("EG"); +const u8 OtherText_2F[] = _("1S"); +const u8 OtherText_3F[] = _("2S"); +const u8 OtherText_4F[] = _("3S"); +const u8 OtherText_5F[] = _("4S"); +const u8 OtherText_6F[] = _("5S"); +const u8 OtherText_7F[] = _("6S"); +const u8 OtherText_8F[] = _("7S"); +const u8 OtherText_9F[] = _("8S"); +const u8 OtherText_10F[] = _("9S"); +const u8 OtherText_11F[] = _("10S"); +const u8 OtherText_B1F[] = _("U1S"); +const u8 OtherText_B2F[] = _("U2S"); +const u8 OtherText_B3F[] = _("U3S"); +const u8 OtherText_B4F[] = _("U4S"); +const u8 OtherText_Rooftop[] = _("DACH"); + +const u8 gOtherText_NowOn[] = _("Momentan im"); + +const u8 gPCText_Cancel[] = _("ZURÜCK"); + +const u8 PCText_ExitBox[] = _("Die BOX verlassen?"); +const u8 PCText_WhatYouDo[] = _("Was möchtest du tun?"); +const u8 PCText_PickATheme[] = _("Wähle eine Motivsammlung."); +const u8 PCText_PickAWallpaper[] = _("Wähle ein Hintergrundmotiv."); +const u8 PCText_IsSelected[] = _(" ist ausgewählt."); +const u8 PCText_JumpToWhichBox[] = _("Zu welcher BOX wechseln?"); +const u8 PCText_DepositInWhichBox[] = _("In welche BOX ablegen?"); +const u8 PCText_WasDeposited[] = _(" wurde abgelegt."); +const u8 PCText_BoxIsFull[] = _("Die BOX ist voll."); +const u8 PCText_ReleasePoke[] = _("Dieses POKéMON freilassen?"); +const u8 PCText_WasReleased[] = _("{STR_VAR_1} ist wieder frei."); +const u8 PCText_ByeBye[] = _("Tschüss, !"); +const u8 PCText_MarkPoke[] = _("Markiere dein POKéMON."); +const u8 PCText_LastPoke[] = _("Dein letztes POKéMON!"); +const u8 PCText_PartyFull[] = _("Dein Team ist voll!"); +const u8 PCText_HoldingPoke[] = _("Du hältst ein POKéMON!"); +const u8 PCText_WhichOneWillTake[] = _("Welches wählst du aus?"); +const u8 PCText_CantReleaseEgg[] = _("Du kannst kein EI freilass.!"); +const u8 PCText_ContinueBox[] = _("Die BOX weiter bearbeiten?"); +const u8 PCText_CameBack[] = _(" kam zurück!"); +const u8 PCText_Worried[] = _("War es in Sorge um dich?"); +const u8 PCText_Surprise[] = _("... ... ... ... ...!"); +const u8 PCText_PleaseRemoveMail[] = _("BRIEF bitte entfernen."); +const u8 PCText_Cancel2[] = _("ZURÜCK"); +const u8 PCText_Deposit[] = _("ABLEGEN"); +const u8 PCText_Withdraw[] = _("NEHMEN"); +const u8 PCText_Switch[] = _("TAUSCHEN"); +const u8 PCText_Move[] = _("BEWEGEN"); +const u8 PCText_Place[] = _("ABSETZEN"); +const u8 PCText_Summary[] = _("BERICHT"); +const u8 PCText_Release[] = _("ENTLASS."); +const u8 PCText_Mark[] = _("MARKIER."); +const u8 PCText_Name[] = _("BENENNEN"); +const u8 PCText_Jump[] = _("WECHSELN"); +const u8 PCText_Wallpaper[] = _("MOTIV"); +const u8 PCText_Scenery1[] = _("LISTE 1"); +const u8 PCText_Scenery2[] = _("LISTE 2"); +const u8 PCText_Scenery3[] = _("LISTE 3"); +const u8 PCText_Etc[] = _("SONSTIGES"); +const u8 PCText_Forest[] = _("WALD"); +const u8 PCText_City[] = _("MAUER"); +const u8 PCText_Desert[] = _("WÜSTE"); +const u8 PCText_Savanna[] = _("STEPPE"); +const u8 PCText_Crag[] = _("GERÖLL"); +const u8 PCText_Volcano[] = _("VULKAN"); +const u8 PCText_Snow[] = _("SCHNEE"); +const u8 PCText_Cave[] = _("HÖHLE"); +const u8 PCText_Beach[] = _("STRAND"); +const u8 PCText_Seafloor[] = _("TIEFSEE"); +const u8 PCText_River[] = _("FLUSS"); +const u8 PCText_Sky[] = _("HIMMEL"); +const u8 PCText_Polka[] = _("PUNKTE"); +const u8 PCText_PokeCenter[] = _("POKéCENTER"); +const u8 PCText_Machine[] = _("MASCHINE"); +const u8 PCText_Plain[] = _("WEISS"); +const u8 PCText_WhatDoYouWant[] = _("Was willst du tun?"); +const u8 PCText_WithdrawPoke[] = _("POKéMON NEHMEN"); +const u8 PCText_DepositPoke[] = _("POKéMON ABLEGEN"); +const u8 PCText_MovePoke[] = _("POKéMON BEWEGEN"); +const u8 PCText_SeeYa[] = _("TSCHÜSSI!"); +const u8 PCText_MovePokeToParty[] = _("Nimm POKéMON aus einer\nBOX in dein Team auf."); +const u8 PCText_StorePokeInBox[] = _("Lagere POKéMON aus deinem\nTeam in einer BOX."); +const u8 PCText_OrganizeBoxesParty[] = _("Ordne POKéMON in den BOXEN\nund/oder in deinem Team."); +const u8 PCText_ReturnToPrevMenu[] = _("Zurück zum vorherigen Menü."); + +const u8 gPCText_OnlyOne[] = _("Du führst nur ein POKéMON mit dir."); +const u8 gPCText_PartyFull2[] = _("Dein Team ist voll!"); +const u8 gPCText_BOX[] = _("BOX "); + +// pokenav +const u8 PCText_CheckMap[] = _("{CLEAR 0}Karte der HOENN-Region"); +const u8 PCText_CheckPoke[] = _("{CLEAR 0}POKéMON-Daten im Detail"); +const u8 PCText_CheckTrainer[] = _("{CLEAR 0}TRAINER-Daten im Detail"); +const u8 PCText_CheckRibbons[] = _("{CLEAR 0}Einsicht über BÄNDER"); +const u8 PCText_PutAwayNav[] = _("{CLEAR 0}POKéNAV schließen"); +const u8 PCText_NoRibbonWin[] = _("{CLEAR 0}Es gibt keine BÄNDER."); +const u8 PCText_NoTrainers[] = _("{CLEAR 0}Keine TRAINER-Daten aufgenommen"); +const u8 PCText_CheckParty[] = _("{CLEAR 0}Daten über POKéMON des Teams"); +const u8 PCText_CheckPokeAll[] = _("{CLEAR 0}Daten über alle POKéMON"); +const u8 PCText_ReturnToNav[] = _("{CLEAR 0}Zurück zum POKéNAV-Menü"); +const u8 PCText_FindCool[] = _("{CLEAR 0}Nach coolen POKéMON suchen."); +const u8 PCText_FindBeauty[] = _("{CLEAR 0}Nach schönen POKéMON suchen."); +const u8 PCText_FindCute[] = _("{CLEAR 0}Nach anmutigen POKéMON suchen."); +const u8 PCText_FindSmart[] = _("{CLEAR 0}Nach klugen POKéMON suchen."); +const u8 PCText_FindTough[] = _("{CLEAR 0}Nach starken POKéMON suchen."); +const u8 PCText_ReturnToCondition[] = _("{CLEAR 0}Zurück zum Menüpunkt ZUSTAND"); + +const u8 gOtherText_NumberRegistered[] = _("Registrierte:"); +const u8 gOtherText_NumberBattles[] = _("Kämpfe:"); +const u8 gOtherText_Strategy[] = _("{PALETTE 5}TAKTIK:"); +const u8 gOtherText_TrainersPokemon[] = _("{PALETTE 5}POKéMON:"); +const u8 gOtherText_SelfIntroduction[] = _("{PALETTE 5}MOTTO:"); +const u8 gOtherText_Nature2[] = _("NATUR/"); +const u8 gOtherText_InParty[] = _("IM TEAM"); +const u8 gOtherText_Number[] = _("Nr. "); +const u8 gOtherText_Ribbons[] = _("BÄNDER"); +const u8 OtherText_MakeProfilePage1[] = _("Erstelle dein eigenes Profil:"); +const u8 OtherText_MakeProfilePage2[] = _("Kombiniere 4 Wörter/Ausdrücke."); +const u8 OtherText_MakeMessagePage1[] = _("Verwende 6 Ausdrücke."); +const u8 OtherText_MakeMessagePage2[] = _("Max. pro Zeile 2-mal 12 Buchstaben"); +const u8 OtherText_DescribeFeelingsPage1[] = _("Finde Worte, die deine momentanen"); +const u8 OtherText_DescribeFeelingsPage2[] = _("Empfindungen beschreiben."); +const u8 OtherText_WithFourPhrases[] = _("Verwende 4 Ausdrücke und"); +const u8 OtherText_CombineNinePhrasesPage1[] = _("Kombiniere 9 Ausdrücke und"); +const u8 OtherText_CombineNinePhrasesPage2[] = _("erstelle eine Nachricht."); +const u8 OtherText_ImproveBardSongPage1[] = _("Ändere nur 1 Wort/Ausdruck"); +const u8 OtherText_ImproveBardSongPage2[] = _("und verbessere das BARDEN-Lied."); +const u8 OtherText_YourProfile[] = _("Dein Profil"); +const u8 OtherText_YourFeelingBattle[] = _("Deine Gefühle zum Kampfbeginn"); +const u8 OtherText_SetWinMessage[] = _("Deine Worte im Fall des Sieges"); +const u8 OtherText_SetLossMessage[] = _("Deine Worte im Fall der Niederlage"); +const u8 OtherText_TheAnswer[] = _("Die Antwort"); +const u8 OtherText_MailMessage[] = _("Der Inhalt des BRIEFES"); +const u8 OtherText_MailSalutation[] = _("Der Gruß des BRIEFES"); +const u8 OtherText_NewSong[] = _("Das neue Lied"); +const u8 OtherText_CombineTwoPhrasesPage1[] = _("Kombiniere 2 Ausdrücke und"); +const u8 OtherText_CombineTwoPhrasesPage2[] = _("schaffe einen hippen Spruch."); +const u8 OtherText_ConfirmTrendyPage1[] = _("Der hippe Spruch"); +const u8 OtherText_ConfirmTrendyPage2[] = _("lautet also so. O.K.?"); +const u8 OtherText_HipsterPage1[] = _("Kombiniere 2 Ausdrücke und"); +const u8 OtherText_HipsterPage2[] = _("bringe ihr einen guten Spruch bei."); + +const u8 gOtherText_TextDeletedConfirmPage1[] = _("Der gesamte verfasste Text wird"); +const u8 gOtherText_TextDeletedConfirmPage2[] = _("gelöscht. Einverstanden?"); +const u8 gOtherText_QuitEditing[] = _("Das Textverfassen beenden?"); +const u8 gOtherText_EditedTextNoSavePage1[] = _("Der Text wird nicht gespeichert."); +const u8 gOtherText_EditedTextNoSavePage2[] = _("Ist das in Ordnung?"); +const u8 gOtherText_EnterAPhraseOrWord[] = _("Bitte Wort/Ausdruck eingeben."); +const u8 gOtherText_TextNoDelete[] = _("Gesamter Text ist nicht löschbar."); +const u8 gOtherText_OnlyOnePhrase[] = _("Nur ein Ausdruck ist änderbar."); +const u8 gOtherText_OriginalSongRestored[] = _("Das Lied wird wiederhergestellt."); +const u8 gOtherText_TrendyAlready[] = _("Das ist bereits hip."); +const u8 gOtherText_CombineTwoPhrases[] = _("Kombiniere 2 Wörter/Ausdrücke."); +const u8 gOtherText_QuitGivingInfo[] = _("Keine weiteren Infos liefern?"); +const u8 gOtherText_StopGivingMail[] = _("POKéMON keinen BRIEF geben?"); +const u8 gOtherText_Profile[] = _("PROFIL"); +const u8 gOtherText_AtBattleStart[] = _("Zum Kampfbeginn"); +const u8 gOtherText_UponWinningBattle[] = _("Über den Sieg"); +const u8 gOtherText_UponLosingBattle[] = _("Über die Niederlage"); + +// mauville_old_man? +const u8 gOtherText_TheBardsSong[] = _("Das BARDEN-Lied"); +const u8 gOtherText_WhatsHipHappening[] = _("Was ist hip? Was ist top?"); +const u8 gOtherText_Interview[] = _("Interview"); +const u8 gOtherText_GoodSaying[] = _("Guter Spruch"); +const u8 OtherText_SoPretty[] = _(" so hübsch!"); +const u8 OtherText_SoDarling[] = _(" so reizend!"); +const u8 OtherText_SoRelaxed[] = _(" so lässig!"); +const u8 OtherText_SoSunny[] = _(" so überwältigend!"); +const u8 OtherText_SoDesirable[] = _(" so erstrebenswert!"); +const u8 OtherText_SoExciting[] = _(" so aufregend!"); +const u8 OtherText_SoAmusing[] = _(" so amüsant!"); +const u8 OtherText_SoMagical[] = _(" so zauberhaft!"); + +const u8 gOtherText_Is[] = _(" klingt"); +const u8 gOtherText_DontYouAgree[] = _("\nFindest du nicht auch?"); + +const u8 OtherText_WantVacationNicePlace[] = _("Ich will unbedingt verreisen!\nKennst du ein hübsches Reiseziel?"); +const u8 OtherText_BoughtCrayonsIsNice[] = _("Ich habe 120 verschiedene Farbstifte\ngekauft! Das ist doch toll, oder?"); +const u8 OtherText_IfWeCouldFloat[] = _("Wäre es nicht herrlich, wir könnten auf\neiner Luftblasenwolke davonschweben?"); +const u8 OtherText_SandWashesAwayMakeSad[] = _("Eine Botschaft in Sand geschrieben\nwird weggespült. Das ist traurig."); +const u8 OtherText_WhatsBottomSeaLike[] = _("Wie der Meeresgrund wohl ist? Ich\nwürde ihn so gerne einmal erleben!"); +const u8 OtherText_SeeSettingSun[] = _("Sehnst du dich beim Anblick der unter-\ngehenden Sonne nach deinem Zuhause?"); +const u8 OtherText_LyingInGreenGrass[] = _("Einfach so im grünen Gras liegen...\nOh, das ist so was von angenehm!"); +const u8 OtherText_SecretBasesWonderful[] = _("GEHEIMBASEN sind superklasse!\nFindest du das nicht auch aufregend?"); + +const u8 OtherText_PokeLeague[] = _("POKéMON LIGA"); +const u8 OtherText_PokeCenter[] = _("POKéMON-CENTER"); + +const u8 gOtherText_GetsAPokeBlock[] = _(" erhält einen {POKEBLOCK}?"); + +const u8 OtherText_Coolness[] = _("Coolness "); +const u8 OtherText_Beauty[] = _("Schönheit "); +const u8 OtherText_Cuteness[] = _("Anmut "); +const u8 OtherText_Smartness[] = _("Klugheit "); +const u8 OtherText_Toughness[] = _("Stärke "); + +const u8 gOtherText_WasEnhanced[] = _("wurde erhöht!"); +const u8 gOtherText_NothingChanged[] = _("Keine Veränderung eingetreten!"); +const u8 gOtherText_WontEat[] = _("Es will nicht mehr essen."); + +const u8 gSystemText_SaveFailedBackupCheck[] = _("Speicherfehler\nBackup Memory wird geprüft.\nBitte warten...\n{COLOR RED}“Benötigte Zeit: 1 Minute”"); +const u8 gSystemText_BackupDamagedGameContinue[] = _("Backup Memory defekt oder\ninterne Batterie verbraucht!\nSpiel kann fortgesetzt werden.\nWeiteres Speichern nicht möglich."); +const u8 gSystemText_GameplayEnded[] = _("{COLOR RED}“Spiel fortsetzen nicht möglich.\nZurück zum Titelbildschirm...”"); +const u8 gSystemText_CheckCompleteSaveAttempt[] = _("Überprüfung beendet.\nNeuer Speicherversuch erfolgt.\nBitte warten..."); +const u8 gSystemText_SaveCompletedGameEnd[] = _("Speichern beendet.\n{COLOR RED}“Spiel fortsetzen nicht möglich.\nZurück zum Titelbildschirm.”"); +const u8 gSystemText_SaveCompletedPressA[] = _("Speichern beendet.\n{COLOR RED}“Bitte A-Knopf drücken.”"); + +const u8 gOtherText_Ferry[] = _("FÄHRE"); +const u8 gOtherText_SecretBase[] = _("GEHEIMBASIS"); +const u8 gOtherText_Hideout[] = _("VERSTECK"); + +const u8 gSystemText_ResetRTCPrompt[] = _("Echtzeituhr zurücksetzen?\nA: Bestätigen, B: Zurück"); +const u8 gSystemText_PresentTime[] = _("Aktuelle Uhrzeit im Spiel"); +const u8 gSystemText_PreviousTime[] = _("Vorherige Uhrzeit im Spiel"); +const u8 gSystemText_PleaseResetTime[] = _("Bitte die Zeit zurückstellen."); +const u8 gSystemText_ClockResetDataSave[] = _("Die Uhr wurde zurückgestellt. Daten\nwerden gesichert. Bitte warten..."); +const u8 gSystemText_SaveCompleted[] = _("Speichern beendet."); +const u8 gSystemText_SaveFailed[] = _("Speichern fehlgeschlagen."); +const u8 gSystemText_NoSaveFileNoTime[] = _("Es existiert kein Speicherstand. Uhr-\nzeit kann nicht eingestellt werden."); +const u8 gSystemText_ClockAdjustmentUsable[] = _("Das spielinterne Zeiteingabe-\nSystem ist jetzt verfügbar."); +const u8 gSystemText_Saving[] = _("SPEICHERVORGANG...\nGERÄT NICHT AUSSCHALTEN!"); +#endif diff --git a/src/text.c b/src/text.c index cc3dab547..7be72833a 100644 --- a/src/text.c +++ b/src/text.c @@ -2338,7 +2338,7 @@ u8 sub_8003490(struct Window *win, u8 c, u16 tileDataStartOffset, u8 left, u8 to return retVal; } -void sub_80034D4(u8 *tileData, u8 *text) +void sub_80034D4(u8 *tileData, const u8 *text) { sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6C74, tileData, text); } @@ -2474,12 +2474,18 @@ static u8 UpdateWindowText(struct Window *win) return 0; } +#if defined(ENGLISH) +#define SUB_800374C_LINE_LENGTH 26 +#elif defined(GERMAN) +#define SUB_800374C_LINE_LENGTH 27 +#endif + u8 sub_800374C(struct Window *win) { u8 retVal; sWaitType = 1; - sLineLength = 26; + sLineLength = SUB_800374C_LINE_LENGTH; retVal = UpdateWindowText(win); sLineLength = 26; sWaitType = 0; diff --git a/src/trainer_card.c b/src/trainer_card.c index a0b1cf6d1..e6ed79c15 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -42,11 +42,18 @@ struct Struct2000000 /*0x9C*/ u8 language; // 0x9C }; -extern struct Struct2000000 unk_2000000; +extern u8 ewram[]; +#define ewram0 (*(struct Struct2000000 *)(ewram)) + extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; extern struct TrainerCard gTrainerCards[4]; -extern u8 gUnknown_03004DE0[]; // TODO: find out correct type +struct UnknownStruct1 +{ + u8 filler0[0x780]; + u16 unk780[160]; +}; +extern struct UnknownStruct1 gUnknown_03004DE0; extern u8 gUnknown_083B5EF4[]; extern u16 *gUnknown_083B5EF8[5]; @@ -67,6 +74,9 @@ extern u8 gOtherText_TradeRecord[]; extern u8 gOtherText_Boy[]; extern u8 gOtherText_Girl[]; +extern bool8 (*const gUnknown_083B5EBC[])(struct Task *); +extern bool8 (*const gUnknown_083B5ED8[])(struct Task *); + // Other signature than on save_menu_util.h void FormatPlayTime(u8 *playtime, u16 hours, u16 minutes, s16 colon); @@ -151,29 +161,16 @@ void sub_8093110(Callback arg1) { sub_80932AC(arg1); SetMainCallback2(sub_8093174); - unk_2000000.language = GAME_LANGUAGE; + ewram0.language = GAME_LANGUAGE; } void sub_8093130(u8 playerIndex, Callback arg2) { - struct Struct2000000* r2; - struct LinkPlayer* r3; - struct LinkPlayerMapObject* r4; - u8 linkPlayerId; - sub_80932E4(playerIndex, arg2); SetMainCallback2(sub_8093174); - - r2 = &unk_2000000; - r3 = gLinkPlayers; - r4 = gLinkPlayerMapObjects; - - linkPlayerId = r4[playerIndex].linkPlayerId; - - r2->language = r3[linkPlayerId].language; + ewram0.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language; } - static void sub_8093174(void) { switch (gMain.state) @@ -236,14 +233,14 @@ static void sub_8093254(void) LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - unk_2000000.var_6++; - if (unk_2000000.var_6 >= 60) + ewram0.var_6++; + if (ewram0.var_6 >= 60) { - unk_2000000.var_6 = 0; - unk_2000000.var_5 ^= 1; + ewram0.var_6 = 0; + ewram0.var_5 ^= 1; } - if (unk_2000000.var_4) - DmaCopy16(3, gUnknown_03004DE0, gUnknown_03004DE0 + 0x780, 320); + if (ewram0.var_4) + DmaCopy16(3, gUnknown_03004DE0.filler0, gUnknown_03004DE0.unk780, sizeof(gUnknown_03004DE0.unk780)); } static void sub_80932AC(Callback callBack) @@ -268,20 +265,20 @@ void sub_8093324(void) { u8 taskId = FindTaskIdByFunc(nullsub_60); struct Task *task = &gTasks[taskId]; - unk_2000000.var_1 = task->data[TD_0]; + ewram0.var_1 = task->data[TD_0]; - LoadWordFromTwoHalfwords((u16 *)&task->data[TD_CALLBACK], (u32 *)&unk_2000000.var_60); + LoadWordFromTwoHalfwords((u16 *)&task->data[TD_CALLBACK], (u32 *)&ewram0.var_60); - if (unk_2000000.var_1) + if (ewram0.var_1) { struct TrainerCard(*trainerCards)[4] = &gTrainerCards; s16 var = task->data[TD_1]; struct TrainerCard *dest = &(*trainerCards)[var]; - memcpy(&unk_2000000.var_64, dest, sizeof(struct TrainerCard)); + memcpy(&ewram0.var_64, dest, sizeof(struct TrainerCard)); } else { - sub_8093390(&unk_2000000.var_64); + sub_8093390(&ewram0.var_64); } } @@ -426,271 +423,138 @@ static void sub_8093550(void) REG_IME = backup; REG_DISPSTAT |= DISPSTAT_VBLANK_INTR | DISPSTAT_HBLANK_INTR; - REG_DISPCNT = 0x1f40; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; } -__attribute__((naked)) -void sub_8093598() +void sub_8093598(void) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - sub sp, 0x4\n\ - movs r2, 0xC0\n\ - lsls r2, 19\n\ - movs r3, 0x80\n\ - lsls r3, 9\n\ - mov r4, sp\n\ - movs r6, 0\n\ - ldr r1, _080935E4 @ =0x040000d4\n\ - movs r5, 0x80\n\ - lsls r5, 5\n\ - ldr r7, _080935E8 @ =0x81000800\n\ - movs r0, 0x81\n\ - lsls r0, 24\n\ - mov r12, r0\n\ -_080935B6:\n\ - strh r6, [r4]\n\ - mov r0, sp\n\ - str r0, [r1]\n\ - str r2, [r1, 0x4]\n\ - str r7, [r1, 0x8]\n\ - ldr r0, [r1, 0x8]\n\ - adds r2, r5\n\ - subs r3, r5\n\ - cmp r3, r5\n\ - bhi _080935B6\n\ - strh r6, [r4]\n\ - mov r0, sp\n\ - str r0, [r1]\n\ - str r2, [r1, 0x4]\n\ - lsrs r0, r3, 1\n\ - mov r2, r12\n\ - orrs r0, r2\n\ - str r0, [r1, 0x8]\n\ - ldr r0, [r1, 0x8]\n\ - add sp, 0x4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080935E4: .4byte 0x040000d4\n\ -_080935E8: .4byte 0x81000800\n\ - .syntax divided\n"); + u8 *addr = (void *)VRAM; + u32 size = 0x10000; + + while (1) + { + DmaFill16(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill16(3, 0, addr, size); + break; + } + } } -__attribute__((naked)) -void sub_80935EC() +void sub_80935EC(void) { - asm(".syntax unified\n\ - sub sp, 0x4\n\ - movs r2, 0xE0\n\ - lsls r2, 19\n\ - mov r1, sp\n\ - movs r0, 0\n\ - strh r0, [r1]\n\ - ldr r0, _08093608 @ =0x040000d4\n\ - str r1, [r0]\n\ - str r2, [r0, 0x4]\n\ - ldr r1, _0809360C @ =0x81000200\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - add sp, 0x4\n\ - bx lr\n\ - .align 2, 0\n\ -_08093608: .4byte 0x040000d4\n\ -_0809360C: .4byte 0x81000200\n\ - .syntax divided\n"); + void *addr = (void *)OAM; + + DmaFill16(3, 0, addr, 0x400); } -__attribute__((naked)) -void sub_8093610() +void sub_8093610(void) { - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - ldr r5, _08093664 @ =REG_BG0CNT\n\ - movs r1, 0\n\ - strh r1, [r5]\n\ - ldr r2, _08093668 @ =REG_BG1CNT\n\ - strh r1, [r2]\n\ - ldr r3, _0809366C @ =REG_BG2CNT\n\ - strh r1, [r3]\n\ - ldr r4, _08093670 @ =REG_BG3CNT\n\ - strh r1, [r4]\n\ - ldr r0, _08093674 @ =REG_BG0HOFS\n\ - strh r1, [r0]\n\ - adds r0, 0x2\n\ - strh r1, [r0]\n\ - adds r0, 0x2\n\ - strh r1, [r0]\n\ - adds r0, 0x2\n\ - strh r1, [r0]\n\ - adds r0, 0x2\n\ - strh r1, [r0]\n\ - adds r0, 0x2\n\ - strh r1, [r0]\n\ - adds r0, 0x2\n\ - strh r1, [r0]\n\ - adds r0, 0x2\n\ - strh r1, [r0]\n\ - ldr r1, _08093678 @ =0x00001e08\n\ - adds r0, r1, 0\n\ - strh r0, [r5]\n\ - ldr r1, _0809367C @ =0x00000801\n\ - adds r0, r1, 0\n\ - strh r0, [r2]\n\ - ldr r1, _08093680 @ =0x00000902\n\ - adds r0, r1, 0\n\ - strh r0, [r3]\n\ - ldr r1, _08093684 @ =0x00000a03\n\ - adds r0, r1, 0\n\ - strh r0, [r4]\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08093664: .4byte 0x4000008 @ REG_BG0CNT\n\ -_08093668: .4byte 0x400000A @ REG_BG1CNT\n\ -_0809366C: .4byte 0x400000C @ REG_BG2CNT\n\ -_08093670: .4byte 0x400000E @ REG_BG3CNT\n\ -_08093674: .4byte 0x4000010 @ REG_BG0HOFS\n\ -_08093678: .4byte 0x00001e08\n\ -_0809367C: .4byte 0x00000801\n\ -_08093680: .4byte 0x00000902\n\ -_08093684: .4byte 0x00000a03\n\ - .syntax divided\n"); + REG_BG0CNT = 0; + REG_BG1CNT = 0; + REG_BG2CNT = 0; + REG_BG3CNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(30) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(10) | BGCNT_16COLOR | BGCNT_TXT256x256; } -#ifdef NONMATCHING static void sub_8093688(void) { - int i; + u8 i; - asm_comment("WIP"); sub_8093324(); - unk_2000000.var_0 = FALSE; - unk_2000000.var_3 = FALSE; - unk_2000000.var_4 = FALSE; + ewram0.var_0 = FALSE; + ewram0.var_3 = FALSE; + ewram0.var_4 = FALSE; - unk_2000000.var_2 = unk_2000000.var_64.stars; + ewram0.var_2 = ewram0.var_64.stars; - unk_2000000.var_5 = FALSE; - unk_2000000.var_6 = FALSE; + ewram0.var_5 = FALSE; + ewram0.var_6 = FALSE; for (i = 0; i < 4; i++) { - sub_80EB3FC(unk_2000000.var_20[i], unk_2000000.var_64.var_28[i]); + sub_80EB3FC(ewram0.var_20[i], ewram0.var_64.var_28[i]); } sub_80936D4(); } -#else - -__attribute__((naked)) -static void sub_8093688(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - bl sub_8093324\n\ - ldr r2, _080936D0 @ =0x02000000\n\ - movs r1, 0\n\ - strb r1, [r2]\n\ - strb r1, [r2, 0x3]\n\ - strb r1, [r2, 0x4]\n\ - adds r0, r2, 0\n\ - adds r0, 0x65\n\ - ldrb r0, [r0]\n\ - strb r0, [r2, 0x2]\n\ - strb r1, [r2, 0x5]\n\ - strb r1, [r2, 0x6]\n\ - movs r4, 0\n\ - adds r6, r2, 0\n\ - adds r6, 0x20\n\ - adds r5, r2, 0\n\ - adds r5, 0x8C\n\ -_080936AE:\n\ - lsls r0, r4, 4\n\ - adds r0, r6\n\ - lsls r1, r4, 1\n\ - adds r1, r5, r1\n\ - ldrh r1, [r1]\n\ - bl sub_80EB3FC\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0x3\n\ - bls _080936AE\n\ - bl sub_80936D4\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080936D0: .4byte 0x02000000\n\ - .syntax divided\n"); -} - -#endif void sub_80936D4(void) { - unk_2000000.var_7 = FALSE; - unk_2000000.var_8 = FALSE; - unk_2000000.var_9 = FALSE; - unk_2000000.var_a = FALSE; - unk_2000000.var_b = FALSE; - unk_2000000.var_c = FALSE; - unk_2000000.var_d = FALSE; + ewram0.var_7 = 0; + ewram0.var_8 = 0; + ewram0.var_9 = 0; + ewram0.var_a = 0; + ewram0.var_b = 0; + ewram0.var_c = 0; + ewram0.var_d = 0; - memset(unk_2000000.var_e, 0, sizeof(unk_2000000.var_e)); + memset(ewram0.var_e, 0, sizeof(ewram0.var_e)); - if (unk_2000000.var_64.hasPokedex) + if (ewram0.var_64.hasPokedex) { - unk_2000000.var_7 += TRUE; + ewram0.var_7 += 1; } - if (unk_2000000.var_64.firstHallOfFameA != 0 || unk_2000000.var_64.firstHallOfFameB != 0 || - unk_2000000.var_64.firstHallOfFameC != 0) + if (ewram0.var_64.firstHallOfFameA != 0 || ewram0.var_64.firstHallOfFameB != 0 || + ewram0.var_64.firstHallOfFameC != 0) { - unk_2000000.var_8 += TRUE; + ewram0.var_8 += 1; } - if (unk_2000000.var_64.linkBattleWins != 0 || unk_2000000.var_64.linkBattleLosses != 0) + if (ewram0.var_64.linkBattleWins != 0 || ewram0.var_64.linkBattleLosses != 0) { - unk_2000000.var_9 += TRUE; + ewram0.var_9 += 1; } - if (unk_2000000.var_64.battleTowerWins != 0 || unk_2000000.var_64.battleTowerLosses != 0) + if (ewram0.var_64.battleTowerWins != 0 || ewram0.var_64.battleTowerLosses != 0) { - unk_2000000.var_a += TRUE; + ewram0.var_a += 1; } - if (unk_2000000.var_64.contestsWithFriends != 0) + if (ewram0.var_64.contestsWithFriends != 0) { - unk_2000000.var_b += TRUE; + ewram0.var_b += 1; } - if (unk_2000000.var_64.pokeblocksWithFriends != 0) + if (ewram0.var_64.pokeblocksWithFriends != 0) { - unk_2000000.var_c += TRUE; + ewram0.var_c += 1; } - if (unk_2000000.var_64.pokemonTrades != 0) + if (ewram0.var_64.pokemonTrades != 0) { - unk_2000000.var_d += TRUE; + ewram0.var_d += 1; } - if (!unk_2000000.var_1) + if (!ewram0.var_1) { u32 badgeFlag; int i; i = 0; badgeFlag = BADGE01_GET; - while (TRUE) + while (1) { if (FlagGet(badgeFlag)) { - unk_2000000.var_e[i] += TRUE; + ewram0.var_e[i] += 1; } badgeFlag += 1; @@ -747,202 +611,87 @@ static void sub_809380C() sub_809382C(taskId); } -__attribute__((naked)) static void sub_809382C(u8 taskId) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldr r7, _08093858 @ =gUnknown_083B5EBC\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r4, r1, 3\n\ - ldr r6, _0809385C @ =0x02000000\n\ - ldr r5, _08093860 @ =gTasks\n\ -_0809383E:\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r7\n\ - ldr r1, [r0]\n\ - adds r0, r4, r5\n\ - bl _call_via_r1\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0809383E\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08093858: .4byte gUnknown_083B5EBC\n\ -_0809385C: .4byte 0x02000000\n\ -_08093860: .4byte gTasks\n\ - .syntax divided\n"); + while (gUnknown_083B5EBC[ewram0.var_0](&gTasks[taskId]) != 0) + ; } -__attribute__((naked)) -bool8 sub_8093864() +bool8 sub_8093864(struct Task *task) { - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - sub sp, 0x4\n\ - ldr r4, _080938A0 @ =0x02000000\n\ - ldr r2, _080938A4 @ =gSaveBlock2\n\ - ldrb r1, [r2, 0x11]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - movs r5, 0\n\ - strb r0, [r4, 0x5]\n\ - ldrb r0, [r2, 0x12]\n\ - strb r0, [r4, 0x6]\n\ - bl sub_80939A4\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - str r5, [sp]\n\ - movs r1, 0\n\ - movs r2, 0x10\n\ - movs r3, 0\n\ - bl BeginNormalPaletteFade\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - movs r0, 0\n\ - add sp, 0x4\n\ - pop {r4,r5}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080938A0: .4byte 0x02000000\n\ -_080938A4: .4byte gSaveBlock2\n\ - .syntax divided\n"); + ewram0.var_5 = gSaveBlock2.playTimeSeconds & 1; + ewram0.var_6 = gSaveBlock2.playTimeVBlanks; + sub_80939A4(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + ewram0.var_0 += 1; + return FALSE; } -__attribute__((naked)) -bool8 sub_80938A8() +bool8 sub_80938A8(struct Task *task) { - asm(".syntax unified\n\ - push {lr}\n\ - ldr r0, _080938C4 @ =gPaletteFade\n\ - ldrb r1, [r0, 0x7]\n\ - movs r0, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080938BE\n\ - ldr r1, _080938C8 @ =0x02000000\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ -_080938BE:\n\ - movs r0, 0\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080938C4: .4byte gPaletteFade\n\ -_080938C8: .4byte 0x02000000\n\ - .syntax divided\n"); + if (!gPaletteFade.active) + ewram0.var_0 += 1; + return FALSE; } -__attribute__((naked)) -bool8 sub_80938CC() +bool8 sub_80938CC(struct Task *task) { - asm(".syntax unified\n\ - push {lr}\n\ - ldr r0, _080938E4 @ =gMain\n\ - ldrh r1, [r0, 0x2E]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080938EC\n\ - ldr r1, _080938E8 @ =0x02000000\n\ - movs r0, 0x5\n\ - strb r0, [r1]\n\ - movs r0, 0x1\n\ - b _08093914\n\ - .align 2, 0\n\ -_080938E4: .4byte gMain\n\ -_080938E8: .4byte 0x02000000\n\ -_080938EC:\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08093912\n\ - ldr r2, _08093900 @ =0x02000000\n\ - ldrb r1, [r2, 0x3]\n\ - cmp r1, 0\n\ - beq _08093904\n\ - movs r0, 0x5\n\ - b _0809390C\n\ - .align 2, 0\n\ -_08093900: .4byte 0x02000000\n\ -_08093904:\n\ - movs r0, 0x1\n\ - eors r0, r1\n\ - strb r0, [r2, 0x3]\n\ - movs r0, 0x3\n\ -_0809390C:\n\ - strb r0, [r2]\n\ - movs r0, 0x1\n\ - b _08093914\n\ -_08093912:\n\ - movs r0, 0\n\ -_08093914:\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); + if (gMain.newKeys & B_BUTTON) + { + ewram0.var_0 = 5; + return TRUE; + } + else if (gMain.newKeys & A_BUTTON) + { + if (ewram0.var_3 != 0) + { + ewram0.var_0 = 5; + return TRUE; + } + else + { + ewram0.var_3 ^= 1; + ewram0.var_0 = 3; + return TRUE; + } + } + + return FALSE; } -bool8 sub_8093918() +bool8 sub_8093918(struct Task *task) { sub_8093A28(); PlaySE(SE_CARD); - unk_2000000.var_0 += TRUE; + ewram0.var_0 += 1; return FALSE; } -bool8 sub_8093938() +bool8 sub_8093938(struct Task *task) { if (sub_8093A48()) { - unk_2000000.var_0 = 2; + ewram0.var_0 = 2; } return FALSE; } -__attribute__((naked)) -bool8 sub_8093954() +bool8 sub_8093954(struct Task *task) { - asm(".syntax unified\n\ - push {lr}\n\ - sub sp, 0x4\n\ - bl sub_80939C0\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - movs r1, 0\n\ - str r1, [sp]\n\ - movs r2, 0\n\ - movs r3, 0x10\n\ - bl BeginNormalPaletteFade\n\ - ldr r1, _0809397C @ =0x02000000\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - movs r0, 0\n\ - add sp, 0x4\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_0809397C: .4byte 0x02000000\n\ - .syntax divided\n"); + sub_80939C0(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + ewram0.var_0 += 1; + return FALSE; } -bool8 sub_8093980() +bool8 sub_8093980(struct Task *task) { if (!gPaletteFade.active) { - SetMainCallback2((MainCallback)unk_2000000.var_60); + SetMainCallback2((MainCallback)ewram0.var_60); } return FALSE; @@ -972,9 +721,9 @@ static void sub_80939DC(u8 taskId) struct Task *task; task = &gTasks[taskId]; - if (unk_2000000.var_5 != task->data[TD_1]) + if (ewram0.var_5 != task->data[TD_1]) { - task->data[TD_1] = unk_2000000.var_5; + task->data[TD_1] = ewram0.var_5; task->data[TD_0] ^= TRUE; } @@ -990,102 +739,32 @@ static void sub_8093A28(void) sub_8093A68(taskId); } -__attribute__((naked)) -static u8 sub_8093A48() +static u8 sub_8093A48(void) { - asm(".syntax unified\n\ - push {lr}\n\ - ldr r0, _08093A5C @ =sub_8093A68\n\ - bl FindTaskIdByFunc\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0xFF\n\ - beq _08093A60\n\ - movs r0, 0\n\ - b _08093A62\n\ - .align 2, 0\n\ -_08093A5C: .4byte sub_8093A68\n\ -_08093A60:\n\ - movs r0, 0x1\n\ -_08093A62:\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); + if (FindTaskIdByFunc(sub_8093A68) == 0xFF) + return TRUE; + else + return FALSE; } -__attribute__((naked)) static void sub_8093A68(u8 taskId) { - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldr r5, _08093A98 @ =gUnknown_083B5ED8\n\ - ldr r2, _08093A9C @ =gTasks\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 3\n\ - adds r4, r1, r2\n\ -_08093A7A:\n\ - movs r1, 0x8\n\ - ldrsh r0, [r4, r1]\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - ldr r1, [r0]\n\ - adds r0, r4, 0\n\ - bl _call_via_r1\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08093A7A\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08093A98: .4byte gUnknown_083B5ED8\n\ -_08093A9C: .4byte gTasks\n\ - .syntax divided\n"); + while (gUnknown_083B5ED8[gTasks[taskId].data[0]](&gTasks[taskId]) != 0) + ; } -__attribute__((naked)) -bool8 sub_8093AA0() +bool8 sub_8093AA0(struct Task *task) { - asm(".syntax unified\n\ - push {r4,lr}\n\ - adds r4, r0, 0\n\ - ldr r0, _08093AE0 @ =0x02000000\n\ - movs r1, 0\n\ - strb r1, [r0, 0x4]\n\ - bl dp12_8087EA4\n\ - movs r1, 0\n\ - ldr r0, _08093AE4 @ =gUnknown_03004DE0\n\ - ldr r2, _08093AE8 @ =0x0000fffc\n\ - movs r3, 0xF0\n\ - lsls r3, 3\n\ - adds r0, r3\n\ -_08093ABA:\n\ - strh r2, [r0]\n\ - adds r0, 0x2\n\ - adds r1, 0x1\n\ - cmp r1, 0x9F\n\ - bls _08093ABA\n\ - ldr r0, _08093AEC @ =sub_8093D7C\n\ - bl SetHBlankCallback\n\ - ldr r1, _08093AE0 @ =0x02000000\n\ - movs r0, 0x1\n\ - strb r0, [r1, 0x4]\n\ - ldrh r0, [r4, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x8]\n\ - movs r0, 0\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08093AE0: .4byte 0x02000000\n\ -_08093AE4: .4byte gUnknown_03004DE0\n\ -_08093AE8: .4byte 0x0000fffc\n\ -_08093AEC: .4byte sub_8093D7C\n\ - .syntax divided\n"); + s32 i; + + ewram0.var_4 = 0; + dp12_8087EA4(); + for (i = 0; i < ARRAY_COUNT(gUnknown_03004DE0.unk780); i++) + gUnknown_03004DE0.unk780[i] = -4; + SetHBlankCallback(sub_8093D7C); + ewram0.var_4 = 1; + task->data[0]++; + return FALSE; } __attribute__((naked)) @@ -1245,7 +924,7 @@ bool8 sub_8093C0C(struct TrainerCard *trainerCard) sub_80939C0(); sub_8093DAC(); - if (!unk_2000000.var_3) + if (!ewram0.var_3) { sub_80939A4(); } @@ -1409,7 +1088,7 @@ bool8 sub_8093D50(void) { u8 taskId; - unk_2000000.var_4 = FALSE; + ewram0.var_4 = FALSE; SetHBlankCallback(NULL); sub_8093E04(); @@ -1450,7 +1129,7 @@ _08093DA8: .4byte 0x4000012 @ REG_BG0VOFS\n\ static void sub_8093DAC(void) { - if (unk_2000000.var_3) + if (ewram0.var_3) { sub_8093DEC(); } @@ -1564,11 +1243,11 @@ _08093E9C: .4byte 0x80000200\n\ void sub_8093EA0(void) { - LoadPalette(gUnknown_083B5EF8[unk_2000000.var_2], 0, 48 * 2); + LoadPalette(gUnknown_083B5EF8[ewram0.var_2], 0, 48 * 2); LoadPalette(gBadgesPalette, 48, 16 * 2); LoadPalette(gUnknown_083B5F4C, 64, 16 * 2); - if (unk_2000000.var_64.gender != MALE) + if (ewram0.var_64.gender != MALE) { LoadPalette(gUnknown_083B5F0C, 16, 16 * 2); } @@ -1576,7 +1255,7 @@ void sub_8093EA0(void) static void sub_8093EF8(void) { - LoadTrainerGfx_TrainerCard(unk_2000000.var_64.gender, 80, (void *)(VRAM + 0x1880)); + LoadTrainerGfx_TrainerCard(ewram0.var_64.gender, 80, (void *)(VRAM + 0x1880)); } __attribute__((naked)) @@ -1887,8 +1566,8 @@ static void sub_8094140(void) BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values); buffer = gStringVar1; - StringCopy(buffer, unk_2000000.var_64.playerName); - ConvertInternationalString(buffer, unk_2000000.language); + StringCopy(buffer, ewram0.var_64.playerName); + ConvertInternationalString(buffer, ewram0.language); MenuPrint(buffer, 7, 5); TrainerCard_Front_PrintTrainerID(); @@ -1921,26 +1600,26 @@ static void TrainerCard_Front_PrintTrainerID(void) { u8 buffer[8]; - ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); + ConvertIntToDecimalStringN(buffer, ewram0.var_64.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); MenuPrint(buffer, 20, 2); } static void TrainerCard_Front_PrintMoney(void) { - sub_80B7AEC(unk_2000000.var_64.money, 16, 8); + sub_80B7AEC(ewram0.var_64.money, 16, 8); } static void TrainerCard_Front_PrintPokedexCount(void) { u8 buffer[16]; - if (unk_2000000.var_7 == FALSE) + if (ewram0.var_7 == FALSE) { sub_8094110(); return; } - ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3); + ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3); MenuPrint_RightAligned(buffer, 16, 10); } @@ -1953,10 +1632,10 @@ static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon) playTimeHours = gSaveBlock2.playTimeHours; playTimeMinutes = gSaveBlock2.playTimeMinutes; - if (unk_2000000.var_1 != 0) + if (ewram0.var_1 != 0) { - playTimeHours = unk_2000000.var_64.playTimeHours; - playTimeMinutes = unk_2000000.var_64.playTimeMinutes; + playTimeHours = ewram0.var_64.playTimeHours; + playTimeMinutes = ewram0.var_64.playTimeMinutes; } FormatPlayTime(buffer, playTimeHours, playTimeMinutes, colon); @@ -1967,23 +1646,23 @@ static void sub_809429C(void) { u8 *str; - if (unk_2000000.var_1 == FALSE) + if (ewram0.var_1 == FALSE) { return; } str = gStringVar1; - str = StringCopy(str, unk_2000000.var_20[0]); + str = StringCopy(str, ewram0.var_20[0]); str[0] = 00; str++; - str = StringCopy(str, unk_2000000.var_20[1]); + str = StringCopy(str, ewram0.var_20[1]); MenuPrint(gStringVar1, 2, 14); str = gStringVar1; - str = StringCopy(str, unk_2000000.var_20[2]); + str = StringCopy(str, ewram0.var_20[2]); str[0] = 00; str++; - str = StringCopy(str, unk_2000000.var_20[3]); + str = StringCopy(str, ewram0.var_20[3]); MenuPrint(gStringVar1, 2, 16); } @@ -1992,8 +1671,8 @@ static void TrainerCard_Back_PrintName(void) u8 *str; str = gStringVar1; - StringCopy(str, unk_2000000.var_64.playerName); - ConvertInternationalString(str, unk_2000000.language); + StringCopy(str, ewram0.var_64.playerName); + ConvertInternationalString(str, ewram0.language); StringAppend(str, gOtherText_TrainersTrainerCard); @@ -2002,7 +1681,7 @@ static void TrainerCard_Back_PrintName(void) static void TrainerCard_Back_PrintHallOfFameTime_Label(void) { - if (unk_2000000.var_8 == FALSE) + if (ewram0.var_8 == FALSE) { return; } @@ -2014,24 +1693,24 @@ static void TrainerCard_Back_PrintHallOfFameTime(void) { u8 *str; - if (unk_2000000.var_8 == FALSE) + if (ewram0.var_8 == FALSE) { return; } str = gStringVar1; - str = ConvertIntToDecimalStringN(str, unk_2000000.var_64.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3); + str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3); str = StringCopy(str, gUnknown_083B5EF4); - str = ConvertIntToDecimalStringN(str, unk_2000000.var_64.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2); + str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2); str = StringCopy(str, gUnknown_083B5EF4); - str = ConvertIntToDecimalStringN(str, unk_2000000.var_64.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2); + str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2); MenuPrint_RightAligned(gStringVar1, 28, 5); } static void TrainerCard_Back_PrintLinkBattlesLabel(void) { - if (unk_2000000.var_9 == FALSE) + if (ewram0.var_9 == FALSE) { return; } @@ -2043,21 +1722,21 @@ static void TrainerCard_Back_PrintLinkBattles(void) { u8 buffer[16]; - if (unk_2000000.var_9 == FALSE) + if (ewram0.var_9 == FALSE) { return; } - ConvertIntToDecimalString(buffer, unk_2000000.var_64.linkBattleWins); + ConvertIntToDecimalString(buffer, ewram0.var_64.linkBattleWins); MenuPrint_RightAligned(buffer, 22, 7); - ConvertIntToDecimalString(buffer, unk_2000000.var_64.linkBattleLosses); + ConvertIntToDecimalString(buffer, ewram0.var_64.linkBattleLosses); MenuPrint_RightAligned(buffer, 28, 7); } static void TrainerCard_Back_PrintBattleTower_Label(void) { - if (unk_2000000.var_a == FALSE) + if (ewram0.var_a == FALSE) { return; } @@ -2069,21 +1748,21 @@ static void TrainerCard_Back_PrintBattleTower(void) { u8 buffer[16]; - if (unk_2000000.var_a == FALSE) + if (ewram0.var_a == FALSE) { return; } - sub_8072C44(buffer, unk_2000000.var_64.battleTowerWins, 24, 1); + sub_8072C44(buffer, ewram0.var_64.battleTowerWins, 24, 1); MenuPrint_PixelCoords(buffer, 112, 120, 0); - sub_8072C44(buffer, unk_2000000.var_64.battleTowerLosses, 24, 1); + sub_8072C44(buffer, ewram0.var_64.battleTowerLosses, 24, 1); MenuPrint_PixelCoords(buffer, 149, 120, 0); } static void TrainerCard_Back_PrintLinkContests_Label(void) { - if (unk_2000000.var_b == FALSE) + if (ewram0.var_b == FALSE) { return; } @@ -2095,18 +1774,18 @@ static void TrainerCard_Back_PrintLinkContests(void) { u8 buffer[8]; - if (unk_2000000.var_b == FALSE) + if (ewram0.var_b == FALSE) { return; } - ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(buffer, ewram0.var_64.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3); MenuPrint_RightAligned(buffer, 28, 13); } static void TrainerCard_Back_PrintLinkPokeblocks_Label(void) { - if (unk_2000000.var_c == FALSE) + if (ewram0.var_c == FALSE) { return; } @@ -2118,18 +1797,18 @@ static void TrainerCard_Back_PrintLinkPokeblocks(void) { u8 buffer[8]; - if (unk_2000000.var_c == FALSE) + if (ewram0.var_c == FALSE) { return; } - ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); + ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); MenuPrint_RightAligned(buffer, 28, 11); } static void TrainerCard_Back_PrintPokemonTrades_Label(void) { - if (unk_2000000.var_d == FALSE) + if (ewram0.var_d == FALSE) { return; } @@ -2141,12 +1820,12 @@ static void TrainerCard_Back_PrintPokemonTrades(void) { u8 buffer[8]; - if (unk_2000000.var_d == FALSE) + if (ewram0.var_d == FALSE) { return; } - ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); + ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); MenuPrint_RightAligned(buffer, 28, 9); } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 408dc69ce..9dfcf0e5c 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -7,6 +7,7 @@ #include "field_player_avatar.h" #include "metatile_behavior.h" #include "rng.h" +#include "roamer.h" #include "rom4.h" #include "safari_zone.h" #include "script.h" @@ -3323,7 +3324,7 @@ bool8 StandardWildEncounter(u16 a, u16 b) if (DoWildEncounterTest(gWildMonHeaders[headerNum].landMonsInfo->encounterRate, 0) == TRUE) { - if (sub_81344CC() == TRUE) + if (TryStartRoamerEncounter() == TRUE) { roamer = &gSaveBlock1.roamer; if (RepelCheck(roamer->level)) @@ -3357,7 +3358,7 @@ bool8 StandardWildEncounter(u16 a, u16 b) if (DoWildEncounterTest(gWildMonHeaders[headerNum].waterMonsInfo->encounterRate, 0) == TRUE) { - if (sub_81344CC() == TRUE) + if (TryStartRoamerEncounter() == TRUE) { roamer = &gSaveBlock1.roamer; if (RepelCheck(roamer->level)) @@ -3425,7 +3426,7 @@ bool8 SweetScentWildEncounter(void) wildPokemonInfo = gWildMonHeaders[headerNum].landMonsInfo; if (wildPokemonInfo == NULL) return FALSE; - if (sub_81344CC() == TRUE) + if (TryStartRoamerEncounter() == TRUE) { StartBattle_Roamer(); return TRUE; @@ -3442,7 +3443,7 @@ bool8 SweetScentWildEncounter(void) wildPokemonInfo = gWildMonHeaders[headerNum].waterMonsInfo; if (wildPokemonInfo == NULL) return FALSE; - if (sub_81344CC() == TRUE) + if (TryStartRoamerEncounter() == TRUE) { StartBattle_Roamer(); return TRUE; |