diff options
-rw-r--r-- | include/de_rom_8040FE0.h | 6 | ||||
-rwxr-xr-x | ld_script.txt | 1 | ||||
-rw-r--r-- | src/de_rom_8040FE0.c | 272 | ||||
-rw-r--r-- | src/menu_cursor.c | 191 | ||||
-rw-r--r-- | src/pokenav.c | 10 |
5 files changed, 478 insertions, 2 deletions
diff --git a/include/de_rom_8040FE0.h b/include/de_rom_8040FE0.h new file mode 100644 index 000000000..1ec4ba28c --- /dev/null +++ b/include/de_rom_8040FE0.h @@ -0,0 +1,6 @@ +#ifndef GUARD_DE_ROM_8040FE0 +#define GUARD_DE_ROM_8040FE0 + +u8 *de_sub_8041024(s32 arg0, u32 arg1); + +#endif // GUARD_DE_ROM_8040FE0 diff --git a/ld_script.txt b/ld_script.txt index 281f1781d..0eb8f5971 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -68,6 +68,7 @@ SECTIONS { src/pokemon_2.o(.text); asm/pokemon_item_effect.o(.text); src/pokemon_3.o(.text); + src/de_rom_8040FE0.o(.text); src/trig.o(.text); src/rng.o(.text); src/util.o(.text); diff --git a/src/de_rom_8040FE0.c b/src/de_rom_8040FE0.c new file mode 100644 index 000000000..c618ebdb2 --- /dev/null +++ b/src/de_rom_8040FE0.c @@ -0,0 +1,272 @@ +#include "global.h" +#include "battle.h" + +#if GERMAN + +enum { + TRAINER_CLASS_NAME_LEADER = 25, + TRAINER_CLASS_NAME_SCHOOL_KID = 26, + TRAINER_CLASS_NAME_EXPERT = 30, + TRAINER_CLASS_NAME_POKEMON_TRAINER_3 = 46, +}; + +enum { + TRAINER_CLASS_LEADER_F = 26, + TRAINER_CLASS_ELITE_FOUR_F = 25, + TRAINER_CLASS_SCHOOL_KID_F = 30, + TRAINER_CLASS_BIRD_KEEPER = 46, + TRAINER_CLASS_MAY_1 = 61, + TRAINER_CLASS_MAY_2 = 62, + TRAINER_CLASS_MAY_3 = 63, +}; + +extern struct SecretBaseRecord gSecretBaseRecord; + +extern u8 gTrainerClassNames[][13]; +extern struct Trainer gTrainers[]; + +u8 *de_sub_8040FE0(u8 gender) { + if (gender) + { + gender++; + + } + + gender = TRAINER_CLASS_NAME_SCHOOL_KID; + return gTrainerClassNames[gender]; +} + +u8 *de_sub_8040FF4(u8 gender) { + if (gender) { + gender++; + } + + gender = TRAINER_CLASS_NAME_POKEMON_TRAINER_3; + return gTrainerClassNames[gender]; +} + +u8 *de_sub_804100C(u8 gender) { + if (gender) { + gender++; + } + + gender = TRAINER_CLASS_NAME_LEADER; + return gTrainerClassNames[gender]; +} + +#ifdef NONMATCHING + +u8 de_sub_81364AC(void); +u8 get_trainer_class_name_index(void); +u8 de_sub_81364F8(void); +u8 sub_8135FD8(void); + +u8 *de_sub_8041024(s32 arg0, u32 arg1) { + u8 nameIndex, trainerClass, gender; + struct Trainer *trainer; + u8 local2; + + switch (arg0) + { + case 0x400: + nameIndex = GetSecretBaseTrainerNameIndex(); + gender = gSecretBaseRecord.gender; + if (nameIndex == TRAINER_CLASS_NAME_SCHOOL_KID) + { + return de_sub_8040FE0(gender); + } + + return gTrainerClassNames[nameIndex]; + + case 0x100: + trainerClass = de_sub_81364AC(); + nameIndex = get_trainer_class_name_index(); + if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) + { + return de_sub_8040FE0(FEMALE); + } + if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) + { + return de_sub_8040FF4(FEMALE); + } + + return gTrainerClassNames[nameIndex]; + + case 0x800: + trainerClass = de_sub_81364F8(); + nameIndex = sub_8135FD8(); + if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) + { + return de_sub_8040FE0(FEMALE); + } + if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) + { + return de_sub_8040FF4(FEMALE); + } + + return gTrainerClassNames[nameIndex]; + + default: + trainer = &gTrainers[arg1]; + trainerClass = trainer->trainerClass; + local2 = sub_803FC58(arg1); + + if (trainerClass == TRAINER_CLASS_LEADER_F) + { + return de_sub_8040FE0(local2); + } + + if (trainerClass == TRAINER_CLASS_BIRD_KEEPER && local2 == FEMALE) + { + return de_sub_8040FF4(FEMALE); + } + + if (trainerClass == TRAINER_CLASS_ELITE_FOUR_F) + { + if (gTrainers[arg1].doubleBattle == TRUE) + { + return de_sub_804100C(FEMALE); + } + else + { + return de_sub_804100C(MALE); + } + } + + + return gTrainerClassNames[trainerClass]; + } +} +#else + +__attribute__((naked)) +void de_sub_8041024(void) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r2, r0, 0\n\ + adds r6, r1, 0\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r2, r0\n\ + beq _0804104A\n\ + cmp r2, r0\n\ + bgt _08041040\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + cmp r2, r0\n\ + beq _08041064\n\ + b _0804109C\n\ +_08041040:\n\ + movs r0, 0x80\n\ + lsls r0, 4\n\ + cmp r2, r0\n\ + beq _08041086\n\ + b _0804109C\n\ +_0804104A:\n\ + bl GetSecretBaseTrainerNameIndex\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + ldr r0, _08041060 @ =0x02017000\n\ + ldrb r0, [r0, 0x1]\n\ + lsls r0, 27\n\ + lsrs r2, r0, 31\n\ + cmp r5, 0x1A\n\ + beq _080410B8\n\ + b _080410F8\n\ + .align 2, 0\n\ +_08041060: .4byte 0x02017000\n\ +_08041064:\n\ + bl de_sub_81364AC\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + bl get_trainer_class_name_index\n\ +_08041070:\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r4, 0x1E\n\ + beq _08041094\n\ + adds r0, r4, 0\n\ + subs r0, 0x3D\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x2\n\ + bls _080410CC\n\ + b _080410F8\n\ +_08041086:\n\ + bl de_sub_81364F8\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + bl sub_8135FD8\n\ + b _08041070\n\ +_08041094:\n\ + movs r0, 0x1\n\ + bl de_sub_8040FE0\n\ + b _08041102\n\ +_0804109C:\n\ + ldr r1, _080410C0 @ =gTrainers\n\ + lsls r4, r6, 2\n\ + adds r0, r4, r6\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrb r5, [r0, 0x1]\n\ + lsls r0, r6, 16\n\ + lsrs r0, 16\n\ + bl sub_803FC58\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r5, 0x1A\n\ + bne _080410C4\n\ +_080410B8:\n\ + adds r0, r2, 0\n\ + bl de_sub_8040FE0\n\ + b _08041102\n\ + .align 2, 0\n\ +_080410C0: .4byte gTrainers\n\ +_080410C4:\n\ + cmp r5, 0x2E\n\ + bne _080410D4\n\ + cmp r2, 0x1\n\ + bne _080410D4\n\ +_080410CC:\n\ + movs r0, 0x1\n\ + bl de_sub_8040FF4\n\ + b _08041102\n\ +_080410D4:\n\ + cmp r5, 0x19\n\ + bne _080410F8\n\ + ldr r0, _080410F4 @ =gTrainers\n\ + adds r1, r4, r6\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x18]\n\ + movs r2, 0\n\ + cmp r0, 0x1\n\ + bne _080410EA\n\ + movs r2, 0x1\n\ +_080410EA:\n\ + adds r0, r2, 0\n\ + bl de_sub_804100C\n\ + b _08041102\n\ + .align 2, 0\n\ +_080410F4: .4byte gTrainers\n\ +_080410F8:\n\ + movs r0, 0xD\n\ + adds r1, r5, 0\n\ + muls r1, r0\n\ + ldr r0, _08041108 @ =gTrainerClassNames\n\ + adds r0, r1, r0\n\ +_08041102:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08041108: .4byte gTrainerClassNames\n\ + .syntax divided\n"); +} +#endif + +u32 de_sub_804110C(u32 arg0, u32 arg1) { + return arg1; +} + +#endif diff --git a/src/menu_cursor.c b/src/menu_cursor.c index 3aee0b96b..2dc36cf32 100644 --- a/src/menu_cursor.c +++ b/src/menu_cursor.c @@ -253,7 +253,7 @@ void sub_814A958(u8 a1) SetSubspriteTables(&gSprites[gUnknown_0203A3D1], &gSubspriteTables_842F5C0[v8]); return; } -#else +#elif ENGLISH __attribute__((naked)) void sub_814A958(u8 a1) { @@ -435,6 +435,189 @@ _0814AAB4: .4byte gSubspriteTables_842F5C0\n\ _0814AAB8: .4byte gUnknown_0203A3D1\n\ .syntax divided\n"); } +#elif GERMAN +__attribute__((naked)) +void sub_814A958(u8 a1) +{ + 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\ + lsls r0, 24\n\ + ldr r4, _0814A9C4 @ =gMenuCursorSubsprites\n\ + ldr r2, _0814A9C8 @ =0x0000ffff\n\ + lsrs r0, 24\n\ + str r0, [sp]\n\ + ldr r0, _0814A9CC @ =gUnknown_0842F780\n\ + ldr r1, [r0, 0x4]\n\ + ldr r0, [r0]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + adds r4, 0x8\n\ + movs r7, 0x1\n\ + movs r2, 0x1\n\ + ldr r1, [sp]\n\ + subs r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x7\n\ + ble _0814AA3E\n\ + ldr r0, _0814A9D0 @ =gUnknown_0842F788\n\ + mov r12, r0\n\ + mov r8, r1\n\ + movs r1, 0x8\n\ + negs r1, r1\n\ + mov r10, r1\n\ + ldr r5, _0814A9D4 @ =gUnknown_0842F790\n\ + mov r9, r5\n\ +_0814A99E:\n\ + lsls r0, r3, 16\n\ + asrs r3, r0, 16\n\ + cmp r3, 0x1F\n\ + ble _0814A9D8\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r1, 0x80\n\ + lsls r1, 14\n\ + adds r0, r1\n\ + lsrs r2, r0, 16\n\ + ldr r3, [sp]\n\ + lsls r5, r3, 16\n\ + b _0814AA24\n\ + .align 2, 0\n\ +_0814A9C4: .4byte gMenuCursorSubsprites\n\ +_0814A9C8: .4byte 0x0000ffff\n\ +_0814A9CC: .4byte gUnknown_0842F780\n\ +_0814A9D0: .4byte gUnknown_0842F788\n\ +_0814A9D4: .4byte gUnknown_0842F790\n\ +_0814A9D8:\n\ + ldr r6, [sp]\n\ + lsls r5, r6, 16\n\ + mov r0, r8\n\ + cmp r0, 0x27\n\ + ble _0814AA0E\n\ + cmp r3, 0x8\n\ + ble _0814AA0E\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + adds r2, r1, 0\n\ + subs r2, 0x20\n\ + adds r0, r3, 0\n\ + mov r6, r10\n\ + ands r0, r6\n\ + adds r2, r0\n\ + strh r2, [r4]\n\ + movs r0, 0x18\n\ + ands r0, r3\n\ + adds r1, r0\n\ + lsls r1, 16\n\ + lsrs r2, r1, 16\n\ + b _0814AA24\n\ +_0814AA0E:\n\ + mov r3, r9\n\ + ldr r0, [r3]\n\ + ldr r1, [r3, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r6, 0x80\n\ + lsls r6, 12\n\ + adds r0, r6\n\ + lsrs r2, r0, 16\n\ +_0814AA24:\n\ + adds r4, 0x8\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + asrs r1, r5, 16\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + subs r1, r0\n\ + lsls r1, 16\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + cmp r1, 0x7\n\ + bgt _0814A99E\n\ +_0814AA3E:\n\ + ldr r5, _0814AAAC @ =0x0843d6d8\n\ + ldr r0, [r5]\n\ + ldr r1, [r5, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + subs r1, 0x7\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + adds r0, r1\n\ + strh r0, [r4]\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r6, _0814AAB0 @ =gUnknown_0203A3D0\n\ + ldrb r0, [r6]\n\ + cmp r0, 0x40\n\ + beq _0814AA7C\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB4 @ =gSprites\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA7C:\n\ + ldr r1, _0814AABC @ =gUnknown_0203A3D1\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x40\n\ + beq _0814AA9C\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB4 @ =gSprites\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA9C:\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\ + .align 2, 0\n\ +_0814AAAC: .4byte 0x0843d6d8\n\ +_0814AAB0: .4byte gUnknown_0203A3D0\n\ +_0814AAB4: .4byte gSprites\n\ +_0814AAB8: .4byte gSubspriteTables_842F5C0\n\ +_0814AABC: .4byte gUnknown_0203A3D1\n\ + .syntax divided\n"); +} #endif void sub_814AABC(void (*callback)(struct Sprite *)) @@ -542,7 +725,11 @@ u8 CreateBlendedOutlineCursor(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5) } LoadSpriteSheetDeferred(&gUnknown_0842F1C0[a3 & 0xF]); - gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 0xA0, a1); +#if ENGLISH + gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 160, a1); +#elif GERMAN + gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 161, a1); +#endif if (gUnknown_0203A3D2 != 0x40) { diff --git a/src/pokenav.c b/src/pokenav.c index 24253e878..3a386d865 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -2,18 +2,28 @@ #include "pokenav.h" #include "battle.h" #include "data2.h" +#include "de_rom_8040FE0.h" #include "string_util.h" void sub_80F700C(u8 *arg0, u16 arg1) { struct Trainer *trainer; u8 *ptr; +#if ENGLISH trainer = (struct Trainer *) &gTrainers[gUnknown_083DFEC4->unkCEE8[arg1].unk0]; +#elif GERMAN + const u16 trainerIndex = gUnknown_083DFEC4->unkCEE8[arg1].unk0; + trainer = (struct Trainer *) &gTrainers[trainerIndex]; +#endif ptr = arg0; if (arg1 < gUnknown_083DFEC4->unkD158) { +#if ENGLISH ptr = StringCopy(ptr, gTrainerClassNames[trainer->trainerClass]); +#elif GERMAN + ptr = StringCopy(ptr, de_sub_8041024(0, trainerIndex)); +#endif ptr[0] = 0xFC; ptr[1] = 0x13; |