summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2017-05-09 02:36:30 -0400
committerProjectRevoTPP <projectrevotpp@hotmail.com>2017-05-09 02:36:30 -0400
commitfc761599b412206f80d961a6052dce49b9998689 (patch)
tree1f3eb8f01ae005b8b509d1f120ce5d7bce230992 /src
parentd343d1f19a74657489d987dbd97b84e7389ae295 (diff)
parent4b4f716ae0c582068928a4ae7b31d9d10ac89eb5 (diff)
Merge branch 'master' of https://github.com/pret/pokeruby
Diffstat (limited to 'src')
-rw-r--r--src/battle_6.c57
-rw-r--r--src/battle_ai.c4
-rw-r--r--src/battle_anim_81258BC.c50
-rw-r--r--src/battle_interface.c3082
-rw-r--r--src/battle_records.c27
-rw-r--r--src/berry.c263
-rw-r--r--src/birch_pc.c114
-rw-r--r--src/credits.c424
-rw-r--r--src/dewford_trend.c7
-rw-r--r--src/easy_chat.c262
-rw-r--r--src/egg_hatch.c52
-rw-r--r--src/field_message_box.c12
-rw-r--r--src/field_specials.c189
-rw-r--r--src/fldeff_softboiled.c12
-rw-r--r--src/intro.c10
-rw-r--r--src/link.c48
-rw-r--r--src/mail.c416
-rw-r--r--src/mail_data.c207
-rw-r--r--src/main.c6
-rw-r--r--src/main_menu.c11
-rw-r--r--src/mauville_old_man.c270
-rw-r--r--src/money.c2
-rw-r--r--src/new_game.c5
-rw-r--r--src/pokedex.c28
-rw-r--r--src/pokedex_cry_screen.c85
-rw-r--r--src/pokemon_1.c6
-rw-r--r--src/pokemon_2.c10
-rw-r--r--src/pokemon_3.c955
-rw-r--r--src/roamer.c226
-rw-r--r--src/rom3.c4
-rw-r--r--src/rom4.c13
-rw-r--r--src/rom_800D42C.c46
-rw-r--r--src/rom_8077ABC.c1
-rw-r--r--src/string_util.c15
-rw-r--r--src/strings.c923
-rw-r--r--src/text.c10
-rw-r--r--src/trainer_card.c735
-rw-r--r--src/wild_encounter.c9
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;