summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_dome_cards.c430
-rw-r--r--src/berry_fix_program.c531
-rw-r--r--src/egg_hatch.c8
-rw-r--r--src/item.c12
-rw-r--r--src/lilycove_lady.c1101
-rw-r--r--src/load_save.c4
-rw-r--r--src/multiboot.c2
-rw-r--r--src/pokemon_2.c6
-rw-r--r--src/pokemon_3.c24
-rw-r--r--src/pokemon_size_record.c8
-rw-r--r--src/reset_save_heap.c32
-rw-r--r--src/start_menu.c8
-rw-r--r--src/text.c6
-rw-r--r--src/trig.c3
14 files changed, 2131 insertions, 44 deletions
diff --git a/src/battle_dome_cards.c b/src/battle_dome_cards.c
new file mode 100644
index 000000000..c0557ac70
--- /dev/null
+++ b/src/battle_dome_cards.c
@@ -0,0 +1,430 @@
+
+// Includes
+#include "global.h"
+#include "sprite.h"
+#include "window.h"
+#include "malloc.h"
+#include "species.h"
+#include "palette.h"
+#include "decompress.h"
+#include "battle_dome_cards.h"
+
+extern const struct CompressedSpriteSheet gMonFrontPicTable[NUM_SPECIES];
+extern const struct CompressedSpriteSheet gMonBackPicTable[NUM_SPECIES];
+extern const struct CompressedSpriteSheet gTrainerFrontPicTable[];
+extern const struct CompressedSpriteSheet gTrainerBackPicTable[];
+extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
+extern const union AffineAnimCmd *const gUnknown_082FF618[];
+extern const union AffineAnimCmd *const gUnknown_082FF694[];
+extern const union AnimCmd *const gUnknown_082FF70C[];
+extern const union AnimCmd *const *const gUnknown_08309AAC[NUM_SPECIES];
+extern const union AnimCmd *const *const gUnknown_0830536C[];
+extern const u8 gUnknown_0831F578[];
+
+// Static type declarations
+
+struct BattleDomeCard {
+ u8 *frames;
+ struct SpriteFrameImage *images;
+ u16 paletteTag;
+ u8 spriteId;
+ u8 active;
+};
+
+// Static RAM declarations
+
+static EWRAM_DATA struct SpriteTemplate gUnknown_0203CCEC = {};
+static EWRAM_DATA struct BattleDomeCard gUnknown_0203CD04[8] = {};
+
+// Static ROM declarations
+
+// .rodata
+
+static const struct BattleDomeCard gUnknown_0860B058 = {};
+static const struct OamData gUnknown_0860B064 = {
+ .size = 3
+};
+static const struct OamData gUnknown_0860B06C = {
+ .affineMode = 1, .size = 3
+};
+
+// .text
+
+static void nullsub_122(struct Sprite *sprite)
+{
+
+}
+
+bool16 dp13_810BB8C(void)
+{
+ int i;
+
+ for (i = 0; i < 8; i ++)
+ {
+ gUnknown_0203CD04[i] = gUnknown_0860B058;
+ }
+ return FALSE;
+}
+
+static bool16 load_pokemon_image_TODO(u16 species, u32 personality, bool8 isFrontPic, u8 *dest, bool8 isTrainer, bool8 ignoreDeoxys)
+{
+ if (!isTrainer)
+ {
+ if (isFrontPic)
+ {
+ if (!ignoreDeoxys)
+ {
+ LoadSpecialPokePic(&gMonFrontPicTable[species], dest, species, personality, isFrontPic);
+ }
+ else
+ {
+ LoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], dest, species, personality, isFrontPic);
+ }
+ }
+ else
+ {
+ if (!ignoreDeoxys)
+ {
+ LoadSpecialPokePic(&gMonBackPicTable[species], dest, species, personality, isFrontPic);
+ }
+ else
+ {
+ LoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], dest, species, personality, isFrontPic);
+ }
+ }
+ }
+ else
+ {
+ if (isFrontPic)
+ {
+ DecompressPicFromTable(&gTrainerFrontPicTable[species], dest, species);
+ }
+ else
+ {
+ DecompressPicFromTable(&gTrainerBackPicTable[species], dest, species);
+ }
+ }
+ return FALSE;
+}
+
+static bool16 sub_818D09C(u16 species, u32 personality, bool8 isFrontPic, u8 *dest, bool8 isTrainer)
+{
+ return load_pokemon_image_TODO(species, personality, isFrontPic, dest, isTrainer, FALSE);
+}
+
+static void sub_818D0C4(u16 species, u32 otId, u32 personality, u8 paletteSlot, u16 paletteTag, bool8 isTrainer)
+{
+ if (!isTrainer)
+ {
+ if (paletteTag == 0xFFFF)
+ {
+ gUnknown_0203CCEC.paletteTag |= 0xFFFF;
+ LoadCompressedPalette(species_and_otid_get_pal(species, otId, personality), 0x100 + paletteSlot * 0x10, 0x20);
+ }
+ else
+ {
+ gUnknown_0203CCEC.paletteTag = paletteTag;
+ LoadCompressedObjectPalette(sub_806E7CC(species, otId, personality));
+ }
+ }
+ else
+ {
+ if (paletteTag == 0xFFFF)
+ {
+ gUnknown_0203CCEC.paletteTag |= 0xFFFF;
+ LoadCompressedPalette(gTrainerFrontPicPaletteTable[species].data, 0x100 + paletteSlot * 0x10, 0x20);
+ }
+ else
+ {
+ gUnknown_0203CCEC.paletteTag = paletteTag;
+ LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[species]);
+ }
+ }
+}
+
+static void sub_818D180(u16 species, u32 otId, u32 personality, u8 paletteSlot, bool8 isTrainer)
+{
+ if (!isTrainer)
+ {
+ LoadCompressedPalette(species_and_otid_get_pal(species, otId, personality), paletteSlot * 0x10, 0x20);
+ }
+ else
+ {
+ LoadCompressedPalette(gTrainerFrontPicPaletteTable[species].data, paletteSlot * 0x10, 0x20);
+ }
+}
+
+static void uns_builder_assign_animtable1(bool8 isTrainer)
+{
+ if (!isTrainer)
+ {
+ gUnknown_0203CCEC.anims = gUnknown_082FF70C;
+ }
+ else
+ {
+ gUnknown_0203CCEC.anims = gUnknown_0830536C[0];
+ }
+}
+
+static u16 oamt_spawn_poke_or_trainer_picture(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 isTrainer, bool8 ignoreDeoxys)
+{
+ u8 i;
+ u8 *framePics;
+ struct SpriteFrameImage *images;
+ int j;
+ u8 spriteId;
+
+ for (i = 0; i < 8; i ++)
+ {
+ if (!gUnknown_0203CD04[i].active)
+ {
+ break;
+ }
+ }
+ if (i == 8)
+ {
+ return 0xFFFF;
+ }
+ framePics = Alloc(4 * 0x800);
+ if (!framePics)
+ {
+ return 0xFFFF;
+ }
+ images = Alloc(4 * sizeof(struct SpriteFrameImage));
+ if (!images)
+ {
+ Free(framePics);
+ return 0xFFFF;
+ }
+ if (load_pokemon_image_TODO(species, personality, isFrontPic, framePics, isTrainer, ignoreDeoxys))
+ {
+ // debug trap?
+ return 0xFFFF;
+ }
+ for (j = 0; j < 4; j ++)
+ {
+ images[j].data = framePics + 0x800 * j;
+ images[j].size = 0x800;
+ }
+ gUnknown_0203CCEC.tileTag = 0xFFFF;
+ gUnknown_0203CCEC.oam = &gUnknown_0860B064;
+ uns_builder_assign_animtable1(isTrainer);
+ gUnknown_0203CCEC.images = images;
+ gUnknown_0203CCEC.affineAnims = gDummySpriteAffineAnimTable;
+ gUnknown_0203CCEC.callback = nullsub_122;
+ sub_818D0C4(species, otId, personality, paletteSlot, paletteTag, isTrainer);
+ spriteId = CreateSprite(&gUnknown_0203CCEC, x, y, 0);
+ if (paletteTag == 0xFFFF)
+ {
+ gSprites[spriteId].oam.paletteNum = paletteSlot;
+ }
+ gUnknown_0203CD04[i].frames = framePics;
+ gUnknown_0203CD04[i].images = images;
+ gUnknown_0203CD04[i].paletteTag = paletteTag;
+ gUnknown_0203CD04[i].spriteId = spriteId;
+ gUnknown_0203CD04[i].active = TRUE;
+ return spriteId;
+}
+
+static u16 sub_818D384(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 isTrainer)
+{
+ return oamt_spawn_poke_or_trainer_picture(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, isTrainer, FALSE);
+}
+
+u16 sub_818D3E4(u16 species, u32 otId, u32 personality, u8 flags, s16 x, s16 y, u8 paletteSlot, u16 paletteTag)
+{
+ u8 *framePics;
+ struct SpriteFrameImage *images;
+ int j;
+ u8 i;
+ u8 spriteId;
+ u8 flags2;
+
+ for (i = 0; i < 8; i ++)
+ {
+ if (!gUnknown_0203CD04[i].active)
+ {
+ break;
+ }
+ }
+ if (i == 8)
+ {
+ return 0xFFFF;
+ }
+ framePics = Alloc(4 * 0x800);
+ if (!framePics)
+ {
+ return 0xFFFF;
+ }
+ if (flags & 0x80)
+ {
+ flags &= 0x7F;
+ flags2 = 3;
+ }
+ else
+ {
+ flags2 = flags;
+ }
+ images = Alloc(4 * sizeof(struct SpriteFrameImage));
+ if (!images)
+ {
+ Free(framePics);
+ return 0xFFFF;
+ }
+ if (load_pokemon_image_TODO(species, personality, flags, framePics, FALSE, FALSE))
+ {
+ // debug trap?
+ return 0xFFFF;
+ }
+ for (j = 0; j < 4; j ++)
+ {
+ images[j].data = framePics + 0x800 * j;
+ images[j].size = 0x800;
+ }
+ gUnknown_0203CCEC.tileTag = 0xFFFF;
+ gUnknown_0203CCEC.anims = gUnknown_08309AAC[species];
+ gUnknown_0203CCEC.images = images;
+ if (flags2 == 0x01)
+ {
+ gUnknown_0203CCEC.affineAnims = gUnknown_082FF694;
+ gUnknown_0203CCEC.oam = &gUnknown_0860B06C;
+ }
+ else if (flags2 == 0x00)
+ {
+ gUnknown_0203CCEC.affineAnims = gUnknown_082FF618;
+ gUnknown_0203CCEC.oam = &gUnknown_0860B06C;
+ }
+ else
+ {
+ gUnknown_0203CCEC.oam = &gUnknown_0860B064;
+ gUnknown_0203CCEC.affineAnims = gDummySpriteAffineAnimTable;
+ }
+ gUnknown_0203CCEC.callback = nullsub_122;
+ sub_818D0C4(species, otId, personality, paletteSlot, paletteTag, FALSE);
+ spriteId = CreateSprite(&gUnknown_0203CCEC, x, y, 0);
+ if (paletteTag == 0xFFFF)
+ {
+ gSprites[spriteId].oam.paletteNum = paletteSlot;
+ }
+ gUnknown_0203CD04[i].frames = framePics;
+ gUnknown_0203CD04[i].images = images;
+ gUnknown_0203CD04[i].paletteTag = paletteTag;
+ gUnknown_0203CD04[i].spriteId = spriteId;
+ gUnknown_0203CD04[i].active = TRUE;
+ return spriteId;
+}
+
+static u16 sub_818D5B0(u16 spriteId)
+{
+ u8 i;
+ u8 *framePics;
+ struct SpriteFrameImage *images;
+
+ for (i = 0; i < 8; i ++)
+ {
+ if (gUnknown_0203CD04[i].spriteId == spriteId)
+ {
+ break;
+ }
+ }
+ if (i == 8)
+ {
+ return 0xFFFF;
+ }
+ framePics = gUnknown_0203CD04[i].frames;
+ images = gUnknown_0203CD04[i].images;
+ if (gUnknown_0203CD04[i].paletteTag != 0xFFFF)
+ {
+ FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum));
+ }
+ DestroySprite(&gSprites[spriteId]);
+ Free(framePics);
+ Free(images);
+ gUnknown_0203CD04[i] = gUnknown_0860B058;
+ return 0;
+}
+
+static u16 sub_818D65C(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId, bool8 isTrainer)
+{
+ if (sub_818D09C(species, personality, isFrontPic, (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA), FALSE))
+ {
+ return 0xFFFF;
+ }
+ sub_818D180(species, otId, personality, paletteSlot, isTrainer);
+ return 0;
+}
+
+static u16 sub_818D6CC(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId, bool8 isTrainer)
+{
+ u8 *framePics;
+
+ framePics = Alloc(4 * 0x800);
+ if (framePics && !sub_818D09C(species, personality, isFrontPic, framePics, isTrainer))
+ {
+ BlitBitmapRectToWindow(windowId, framePics, 0, 0, 0x40, 0x40, destX, destY, 0x40, 0x40);
+ sub_818D180(species, otId, personality, paletteSlot, isTrainer);
+ Free(framePics);
+ return 0;
+ }
+ return 0xFFFF;
+}
+
+static u16 sub_818D778(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 ignoreDeoxys)
+{
+ return oamt_spawn_poke_or_trainer_picture(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, FALSE, ignoreDeoxys);
+}
+
+u16 sub_818D7D8(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag)
+{
+ return sub_818D778(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, FALSE);
+}
+
+u16 sub_818D820(u16 spriteId)
+{
+ return sub_818D5B0(spriteId);
+}
+
+u16 sub_818D834(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId)
+{
+ return sub_818D65C(species, otId, personality, isFrontPic, paletteSlot, windowId, FALSE);
+}
+
+u16 sub_818D864(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)
+{
+ return sub_818D6CC(species, otId, personality, isFrontPic, destX, destY, paletteSlot, windowId, FALSE);
+}
+
+u16 sub_818D8AC(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag)
+{
+ return sub_818D384(species, 0, 0, isFrontPic, x, y, paletteSlot, paletteTag, TRUE);
+}
+
+u16 sub_818D8F0(u16 spriteId)
+{
+ return sub_818D5B0(spriteId);
+}
+
+u16 sub_818D904(u16 species, bool8 isFrontPic, u8 paletteSlot, u8 windowId)
+{
+ return sub_818D65C(species, 0, 0, isFrontPic, paletteSlot, windowId, TRUE);
+}
+
+u16 sub_818D938(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)
+{
+ return sub_818D6CC(species, 0, 0, isFrontPic, destX, destY, paletteSlot, windowId, TRUE);
+}
+
+u8 sub_818D97C(u8 a0, u8 a1)
+{
+ if (a1 == 1)
+ {
+ switch (a0)
+ {
+ default:
+ return gUnknown_0831F578[0x3F];
+ case 0:
+ return gUnknown_0831F578[0x3C];
+ }
+ }
+ return a0;
+}
diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c
new file mode 100644
index 000000000..f04308ae8
--- /dev/null
+++ b/src/berry_fix_program.c
@@ -0,0 +1,531 @@
+
+// Includes
+#include "global.h"
+#include "gpu_regs.h"
+#include "multiboot.h"
+#include "malloc.h"
+#include "bg.h"
+#include "main.h"
+#include "sprite.h"
+#include "task.h"
+#include "unknown_task.h"
+#include "window.h"
+#include "menu.h"
+#include "m4a.h"
+
+// Static type declarations
+
+typedef struct {
+ u8 state;
+ u8 unk1;
+ u16 unk2;
+ struct MultiBootParam mb;
+} berryfix_t;
+
+// Static RAM declarations
+
+static berryfix_t *berry_fix_mb_manager;
+
+// Static ROM declarations
+
+static void berry_fix_main(void);
+static void berry_fix_gpu_set(void);
+static int berry_fix_text_update(int);
+static void berry_fix_text_print(int);
+static void berry_fix_bg_hide(void);
+
+// .rodata
+
+static const u8 gUnknown_08617E78[] = _("Berry Program Update");
+static const u8 gUnknown_08617E8D[] = _("Ruby/Sapphire");
+static const u8 gUnknown_08617E9B[] = _("Emerald");
+
+static const u8 Unknown_08617EA3[] = _("The Berry Program on your POKéMON\nRuby/Sapphire Game Pak will be updated.\n{COLOR RED}{SHADOW LIGHT_RED}Press the A Button.");
+static const u8 Unknown_08617F07[] = _("Please ensure the connection of your\nGame Boy Advance system matches this.\n{COLOR RED}{SHADOW LIGHT_RED}YES: Press the A Button.\nNO: Turn off the power and try again.");
+static const u8 Unknown_08617F97[] = _("Please turn on the power of POKéMON\nRuby/Sapphire while holding START and\nSELECT simultaneously. Then, ensure\nthe picture above appears.");
+static const u8 Unknown_08618020[] = _("Transmitting. Please wait.\n{COLOR RED}{SHADOW LIGHT_RED}Please do not turn off the power or\nunplug the Game Boy Advance Game\nLink Cable.");
+static const u8 Unknown_08618092[] = _("Please follow the instructions on your\nPOKéMON Ruby/Sapphire screen.");
+static const u8 Unknown_086180D7[] = _("Transmission failure.\n{COLOR RED}{SHADOW LIGHT_RED}Please try again.");
+
+static const struct BgTemplate gUnknown_08618108[] = {
+ {
+ 0, 0, 30, 0, 0, 0
+ }, {
+ 1, 1, 31, 0, 0, 1
+ }
+};
+
+static const struct WindowTemplate gUnknown_08618110[] = {
+ {0, 2, 4, 26, 2, 15, 0x001},
+ {0, 1, 11, 28, 8, 15, 0x035},
+ {0, 0, 8, 30, 2, 15, 0x115},
+ {0, 8, 0, 14, 2, 15, 0x151},
+ {-1}
+};
+
+static const u16 gUnknown_08618138[] = {
+ 0x7fff, 0x7fff, 0x318c, 0x675a,
+ 0x043c, 0x3aff, 0x0664, 0x4bd2,
+ 0x6546, 0x7b14, 0x7fff, 0x318c,
+ 0x675a, 0x0000, 0x0000, 0x0000
+};
+
+static const u8 gUnknown_08618158[] = {10, 11, 12};
+static const u8 gUnknown_0861815B[] = { 0, 10, 13};
+
+static const u8 *const gUnknown_08618160[] = {
+ Unknown_08617F07,
+ Unknown_08617F97,
+ Unknown_08618020,
+ Unknown_08618092,
+ Unknown_086180D7,
+ Unknown_08617EA3
+};
+
+extern const u8 gUnknown_08DD87C0[];
+extern const u8 gUnknown_08DD8EE0[];
+extern const u8 gUnknown_08DD8780[];
+extern const u8 gUnknown_08DD90E0[];
+extern const u8 gUnknown_08DD9718[];
+extern const u8 gUnknown_08DD9080[];
+extern const u8 gUnknown_08DD98B4[];
+extern const u8 gUnknown_08DD9E58[];
+extern const u8 gUnknown_08DD9874[];
+extern const u8 gUnknown_08DDA02C[];
+extern const u8 gUnknown_08DDA63C[];
+extern const u8 gUnknown_08DD9FEC[];
+extern const u8 gUnknown_08DDA840[];
+extern const u8 gUnknown_08DDAE40[];
+extern const u8 gUnknown_08DDA800[];
+extern const u8 gUnknown_08DDB020[];
+extern const u8 gUnknown_08DDB2C4[];
+extern const u8 gUnknown_08DDAFE0[];
+
+static const u8 *const gUnknown_08618178[][3] = {
+ {
+ gUnknown_08DD87C0,
+ gUnknown_08DD8EE0,
+ gUnknown_08DD8780
+ }, {
+ gUnknown_08DD90E0,
+ gUnknown_08DD9718,
+ gUnknown_08DD9080
+ }, {
+ gUnknown_08DD98B4,
+ gUnknown_08DD9E58,
+ gUnknown_08DD9874
+ }, {
+ gUnknown_08DDA02C,
+ gUnknown_08DDA63C,
+ gUnknown_08DD9FEC
+ }, {
+ gUnknown_08DDA840,
+ gUnknown_08DDAE40,
+ gUnknown_08DDA800
+ }, {
+ gUnknown_08DDB020,
+ gUnknown_08DDB2C4,
+ gUnknown_08DDAFE0
+ },
+};
+
+extern const u8 gUnknown_089A6550[0xC0];
+extern const u8 gMultiBootProgram_BerryGlitchFix_Start[0x3b34];
+extern const u8 gMultiBootProgram_BerryGlitchFix_End[];
+
+// .text
+
+void InitBerryFixProgram(void)
+{
+ DisableInterrupts(0xFFFF);
+ EnableInterrupts(0x0001);
+ m4aSoundVSyncOff();
+ SetVBlankCallback(NULL);
+ ResetSpriteData();
+ ResetTasks();
+ remove_some_task();
+ SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
+ berry_fix_mb_manager = AllocZeroed(0x50);
+ berry_fix_mb_manager->state = 0;
+ berry_fix_mb_manager->unk1 = 6;
+ SetMainCallback2(berry_fix_main);
+}
+
+static void berry_fix_main(void)
+{
+ switch (berry_fix_mb_manager->state)
+ {
+ case 0:
+ berry_fix_gpu_set();
+ berry_fix_mb_manager->state = 1;
+ break;
+ case 1:
+ if (berry_fix_text_update(5) == 5 && (gMain.newKeys & A_BUTTON))
+ {
+ berry_fix_mb_manager->state = 2;
+ }
+ break;
+ case 2:
+ if (berry_fix_text_update(0) == 0 && (gMain.newKeys & A_BUTTON))
+ {
+ berry_fix_mb_manager->state = 3;
+ }
+ break;
+ case 3:
+ if (berry_fix_text_update(1) == 1)
+ {
+ berry_fix_mb_manager->mb.masterp = gUnknown_089A6550;
+ berry_fix_mb_manager->mb.server_type = 0;
+ MultiBootInit(&berry_fix_mb_manager->mb);
+ berry_fix_mb_manager->unk2 = 0;
+ berry_fix_mb_manager->state = 4;
+ }
+ break;
+ case 4:
+ MultiBootMain(&berry_fix_mb_manager->mb);
+ if (berry_fix_mb_manager->mb.probe_count != 0 || (!(berry_fix_mb_manager->mb.response_bit & 2) || !(berry_fix_mb_manager->mb.client_bit & 2)))
+ {
+ berry_fix_mb_manager->unk2 = 0;
+ }
+ else if (++ berry_fix_mb_manager->unk2 > 180)
+ {
+ MultiBootStartMaster(&berry_fix_mb_manager->mb, gMultiBootProgram_BerryGlitchFix_Start, (u32)(gMultiBootProgram_BerryGlitchFix_End - gMultiBootProgram_BerryGlitchFix_Start), 4, 1);
+ berry_fix_mb_manager->state = 5;
+ }
+ break;
+ case 5:
+ if (berry_fix_text_update(2) == 2) {
+ MultiBootMain(&berry_fix_mb_manager->mb);
+ if (MultiBootCheckComplete(&berry_fix_mb_manager->mb)) {
+ berry_fix_mb_manager->state = 6;
+ }
+ else if (!(berry_fix_mb_manager->mb.client_bit & 2)) {
+ berry_fix_mb_manager->state = 7;
+ }
+ }
+ break;
+ case 6:
+ if (berry_fix_text_update(3) == 3 && gMain.newKeys & A_BUTTON)
+ {
+ DoSoftReset();
+ }
+ break;
+ case 7:
+ if (berry_fix_text_update(4) == 4 && gMain.newKeys & A_BUTTON)
+ {
+ berry_fix_mb_manager->state = 1;
+ }
+ break;
+ }
+}
+
+#ifdef NONMATCHING
+static void berry_fix_gpu_set(void)
+{
+ s32 width;
+
+ SetGpuReg(REG_OFFSET_BG0CNT, 0x0000);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0x0000);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0x0000);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0x0000);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0x0000);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0x0000);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
+
+ DmaFill32(3, 0, VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, OAM, OAM_SIZE);
+ DmaFill32(3, 0, PLTT, PLTT_SIZE);
+ ResetBgsAndClearDma3BusyFlags(0);
+
+ InitBgsFromTemplates(0, gUnknown_08618108, ARRAY_COUNT(gUnknown_08618108));
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ InitWindows(gUnknown_08618110);
+ DeactivateAllTextPrinters();
+
+ DmaCopy32(3, gUnknown_08618138, BG_PLTT + 0x1E0, 0x20);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP);
+ FillWindowPixelBuffer(2, 0);
+ FillWindowPixelBuffer(3, 0);
+ FillWindowPixelBuffer(0, 0xAA);
+
+// This block is a meme among memes
+ width = (0x78 - GetStringWidth(0, gUnknown_08617E9B, 0)) / 2;
+ box_print(2, 0, width, 3, gUnknown_0861815B, -1, gUnknown_08617E9B);
+ width = (s32)(0x78 - GetStringWidth(0, gUnknown_08617E9B, 0)) / 2 + 0x78;
+ box_print(2, 0, width, 3, gUnknown_0861815B, -1, gUnknown_08617E8D);
+ width = (0x70 - GetStringWidth(0, gUnknown_08617E8D, 0)) / 2;
+ box_print(3, 0, width, 0, gUnknown_0861815B, -1, gUnknown_08617E8D);
+ width = (0xd0 - GetStringWidth(1, gUnknown_08617E78, 0)) / 2;
+ box_print(0, 1, width, 2, gUnknown_08618158, -1, gUnknown_08617E78);
+
+ CopyWindowToVram(2, 2);
+ CopyWindowToVram(3, 2);
+ CopyWindowToVram(0, 2);
+}
+
+#else
+__attribute__((naked)) static void berry_fix_gpu_set(void)
+{
+ asm(".syntax unified\n"
+ "\tpush {r4-r6,lr}\n"
+ "\tmov r6, r8\n"
+ "\tpush {r6}\n"
+ "\tsub sp, 0x10\n"
+ "\tmovs r0, 0x8\n"
+ "\tmovs r1, 0\n"
+ "\tbl SetGpuReg\n"
+ "\tmovs r0, 0xA\n"
+ "\tmovs r1, 0\n"
+ "\tbl SetGpuReg\n"
+ "\tmovs r0, 0x10\n"
+ "\tmovs r1, 0\n"
+ "\tbl SetGpuReg\n"
+ "\tmovs r0, 0x12\n"
+ "\tmovs r1, 0\n"
+ "\tbl SetGpuReg\n"
+ "\tmovs r0, 0x14\n"
+ "\tmovs r1, 0\n"
+ "\tbl SetGpuReg\n"
+ "\tmovs r0, 0x16\n"
+ "\tmovs r1, 0\n"
+ "\tbl SetGpuReg\n"
+ "\tmovs r0, 0x50\n"
+ "\tmovs r1, 0\n"
+ "\tbl SetGpuReg\n"
+ "\tmovs r1, 0\n"
+ "\tstr r1, [sp, 0xC]\n"
+ "\tldr r4, =0x040000d4\n"
+ "\tadd r0, sp, 0xC\n"
+ "\tstr r0, [r4]\n"
+ "\tmovs r0, 0xC0\n"
+ "\tlsls r0, 19\n"
+ "\tstr r0, [r4, 0x4]\n"
+ "\tldr r0, =0x85006000\n"
+ "\tstr r0, [r4, 0x8]\n"
+ "\tldr r0, [r4, 0x8]\n"
+ "\tstr r1, [sp, 0xC]\n"
+ "\tadd r0, sp, 0xC\n"
+ "\tstr r0, [r4]\n"
+ "\tmovs r0, 0xE0\n"
+ "\tlsls r0, 19\n"
+ "\tstr r0, [r4, 0x4]\n"
+ "\tldr r2, =0x85000100\n"
+ "\tstr r2, [r4, 0x8]\n"
+ "\tldr r0, [r4, 0x8]\n"
+ "\tstr r1, [sp, 0xC]\n"
+ "\tadd r0, sp, 0xC\n"
+ "\tstr r0, [r4]\n"
+ "\tmovs r0, 0xA0\n"
+ "\tlsls r0, 19\n"
+ "\tstr r0, [r4, 0x4]\n"
+ "\tstr r2, [r4, 0x8]\n"
+ "\tldr r0, [r4, 0x8]\n"
+ "\tmovs r0, 0\n"
+ "\tbl ResetBgsAndClearDma3BusyFlags\n"
+ "\tldr r1, =gUnknown_08618108\n"
+ "\tmovs r0, 0\n"
+ "\tmovs r2, 0x2\n"
+ "\tbl InitBgsFromTemplates\n"
+ "\tmovs r0, 0\n"
+ "\tmovs r1, 0\n"
+ "\tmovs r2, 0\n"
+ "\tbl ChangeBgX\n"
+ "\tmovs r0, 0\n"
+ "\tmovs r1, 0\n"
+ "\tmovs r2, 0\n"
+ "\tbl ChangeBgY\n"
+ "\tmovs r0, 0x1\n"
+ "\tmovs r1, 0\n"
+ "\tmovs r2, 0\n"
+ "\tbl ChangeBgX\n"
+ "\tmovs r0, 0x1\n"
+ "\tmovs r1, 0\n"
+ "\tmovs r2, 0\n"
+ "\tbl ChangeBgY\n"
+ "\tldr r0, =gUnknown_08618110\n"
+ "\tbl InitWindows\n"
+ "\tbl DeactivateAllTextPrinters\n"
+ "\tldr r0, =gUnknown_08618138\n"
+ "\tstr r0, [r4]\n"
+ "\tldr r0, =0x050001e0\n"
+ "\tstr r0, [r4, 0x4]\n"
+ "\tldr r0, =0x84000008\n"
+ "\tstr r0, [r4, 0x8]\n"
+ "\tldr r0, [r4, 0x8]\n"
+ "\tmovs r0, 0\n"
+ "\tmovs r1, 0x40\n"
+ "\tbl SetGpuReg\n"
+ "\tmovs r0, 0x2\n"
+ "\tmovs r1, 0\n"
+ "\tbl FillWindowPixelBuffer\n"
+ "\tmovs r0, 0x3\n"
+ "\tmovs r1, 0\n"
+ "\tbl FillWindowPixelBuffer\n"
+ "\tmovs r0, 0\n"
+ "\tmovs r1, 0xAA\n"
+ "\tbl FillWindowPixelBuffer\n"
+ "\tldr r5, =gUnknown_08617E9B\n"
+ "\tmovs r0, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tmovs r2, 0\n"
+ "\tbl GetStringWidth\n"
+ "\tadds r1, r0, 0\n"
+ "\tmovs r4, 0x78\n"
+ "\tsubs r0, r4, r1\n"
+ "\tlsrs r1, r0, 31\n"
+ "\tadds r0, r1\n"
+ "\tasrs r0, 1\n"
+ "\tlsls r2, r0, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tldr r6, =gUnknown_0861815B\n"
+ "\tstr r6, [sp]\n"
+ "\tmovs r0, 0x1\n"
+ "\tnegs r0, r0\n"
+ "\tmov r8, r0\n"
+ "\tstr r0, [sp, 0x4]\n"
+ "\tstr r5, [sp, 0x8]\n"
+ "\tmovs r0, 0x2\n"
+ "\tmovs r1, 0\n"
+ "\tmovs r3, 0x3\n"
+ "\tbl box_print\n"
+ "\tldr r5, =gUnknown_08617E8D\n"
+ "\tmovs r0, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tmovs r2, 0\n"
+ "\tbl GetStringWidth\n"
+ "\tadds r1, r0, 0\n"
+ "\tsubs r4, r1\n"
+ "\tlsrs r0, r4, 31\n"
+ "\tadds r4, r0\n"
+ "\tasrs r4, 1\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r0, 0x78\n"
+ "\tlsls r2, r0, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tstr r6, [sp]\n"
+ "\tmov r0, r8\n"
+ "\tstr r0, [sp, 0x4]\n"
+ "\tstr r5, [sp, 0x8]\n"
+ "\tmovs r0, 0x2\n"
+ "\tmovs r1, 0\n"
+ "\tmovs r3, 0x3\n"
+ "\tbl box_print\n"
+ "\tmovs r0, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\tmovs r2, 0\n"
+ "\tbl GetStringWidth\n"
+ "\tadds r1, r0, 0\n"
+ "\tmovs r0, 0x70\n"
+ "\tsubs r0, r1\n"
+ "\tlsrs r1, r0, 31\n"
+ "\tadds r0, r1\n"
+ "\tasrs r0, 1\n"
+ "\tlsls r2, r0, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tstr r6, [sp]\n"
+ "\tmov r0, r8\n"
+ "\tstr r0, [sp, 0x4]\n"
+ "\tstr r5, [sp, 0x8]\n"
+ "\tmovs r0, 0x3\n"
+ "\tmovs r1, 0\n"
+ "\tmovs r3, 0\n"
+ "\tbl box_print\n"
+ "\tldr r4, =gUnknown_08617E78\n"
+ "\tmovs r0, 0x1\n"
+ "\tadds r1, r4, 0\n"
+ "\tmovs r2, 0\n"
+ "\tbl GetStringWidth\n"
+ "\tadds r1, r0, 0\n"
+ "\tmovs r0, 0xD0\n"
+ "\tsubs r0, r1\n"
+ "\tlsrs r1, r0, 31\n"
+ "\tadds r0, r1\n"
+ "\tasrs r0, 1\n"
+ "\tlsls r2, r0, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tldr r0, =gUnknown_08618158\n"
+ "\tstr r0, [sp]\n"
+ "\tmov r0, r8\n"
+ "\tstr r0, [sp, 0x4]\n"
+ "\tstr r4, [sp, 0x8]\n"
+ "\tmovs r0, 0\n"
+ "\tmovs r1, 0x1\n"
+ "\tmovs r3, 0x2\n"
+ "\tbl box_print\n"
+ "\tmovs r0, 0x2\n"
+ "\tmovs r1, 0x2\n"
+ "\tbl CopyWindowToVram\n"
+ "\tmovs r0, 0x3\n"
+ "\tmovs r1, 0x2\n"
+ "\tbl CopyWindowToVram\n"
+ "\tmovs r0, 0\n"
+ "\tmovs r1, 0x2\n"
+ "\tbl CopyWindowToVram\n"
+ "\tadd sp, 0x10\n"
+ "\tpop {r3}\n"
+ "\tmov r8, r3\n"
+ "\tpop {r4-r6}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.pool\n"
+ ".syntax divided");
+}
+#endif
+
+static int berry_fix_text_update(int checkval)
+{
+ if (berry_fix_mb_manager->unk1 == checkval)
+ {
+ return checkval;
+ }
+ if (berry_fix_mb_manager->unk1 == 6)
+ {
+ berry_fix_text_print(checkval);
+ berry_fix_mb_manager->unk1 = checkval;
+ }
+ else
+ {
+ berry_fix_bg_hide();
+ berry_fix_mb_manager->unk1 = 6;
+ }
+ return berry_fix_mb_manager->unk1;
+}
+
+static void berry_fix_text_print(int scene)
+{
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
+ FillWindowPixelBuffer(1, 0xAA);
+ box_print(1, 1, 0, 0, gUnknown_08618158, -1, gUnknown_08618160[scene]);
+ PutWindowTilemap(1);
+ CopyWindowToVram(1, 2);
+ switch (scene)
+ {
+ case 0:
+ case 2:
+ case 3:
+ case 4:
+ PutWindowTilemap(2);
+ break;
+ case 1:
+ PutWindowTilemap(3);
+ break;
+ case 5:
+ PutWindowTilemap(0);
+ break;
+ }
+ CopyBgTilemapBufferToVram(0);
+ LZ77UnCompVram(gUnknown_08618178[scene][0], (void *)BG_CHAR_ADDR(1));
+ LZ77UnCompVram(gUnknown_08618178[scene][1], (void *)BG_SCREEN_ADDR(31));
+ CpuCopy32(gUnknown_08618178[scene][2], (void *)BG_PLTT, 0x100);
+ ShowBg(0);
+ ShowBg(1);
+}
+
+static void berry_fix_bg_hide()
+{
+ HideBg(0);
+ HideBg(1);
+}
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
index a84e71856..6d14e92f0 100644
--- a/src/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -52,8 +52,8 @@ extern const u8 gUnknown_08C004E0[];
extern const u16 gUnknown_08DD7300[]; // palette, gameboy advance
extern const u32 gUnknown_08DD7360[]; // tileset gameboy advance
extern const u32 gUnknown_08331F60[]; // tilemap gameboy circle
-extern const u8 gOtherText_HatchedFromEgg[];
-extern const u8 gOtherText_NickHatchPrompt[];
+extern const u8 gText_HatchedFromEgg[];
+extern const u8 gText_NickHatchPrompt[];
extern u8* GetMonNick(struct Pokemon* mon, u8* dst);
extern u8* GetBoxMonNick(struct BoxPokemon* boxMon, u8* dst);
@@ -640,7 +640,7 @@ static void CB2_EggHatch_1(void)
break;
case 5:
GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
- StringExpandPlaceholders(gStringVar4, gOtherText_HatchedFromEgg);
+ StringExpandPlaceholders(gStringVar4, gText_HatchedFromEgg);
EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 3, 0xFF);
PlayFanfare(371);
sEggHatchData->CB2_state++;
@@ -657,7 +657,7 @@ static void CB2_EggHatch_1(void)
break;
case 8:
GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
- StringExpandPlaceholders(gStringVar4, gOtherText_NickHatchPrompt);
+ StringExpandPlaceholders(gStringVar4, gText_NickHatchPrompt);
EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 2, 1);
sEggHatchData->CB2_state++;
break;
diff --git a/src/item.c b/src/item.c
index c85e2fe1f..0114676b6 100644
--- a/src/item.c
+++ b/src/item.c
@@ -8,9 +8,9 @@
extern void ApplyNewEncyprtionKeyToHword(u16* hword, u32 newKey);
extern bool8 InBattlePyramid(void);
-extern const u8 gOtherText_PokeBalls[];
-extern const u8 gOtherText_Berries[];
-extern const u8 gOtherText_Berry[];
+extern const u8 gText_PokeBalls[];
+extern const u8 gText_Berries[];
+extern const u8 gText_Berry[];
extern const u8 gUnknown_085897E4[][28]; // not sure what this one is
bool8 CheckPyramidBagHasItem(u16 itemId, u16 count);
@@ -92,7 +92,7 @@ void CopyItemNameHandlePlural(u16 itemId, u8 *string, u32 quantity)
if (quantity < 2)
StringCopy(string, ItemId_GetItem(ITEM_POKE_BALL)->name);
else
- StringCopy(string, gOtherText_PokeBalls);
+ StringCopy(string, gText_PokeBalls);
}
else
{
@@ -109,9 +109,9 @@ void GetBerryCountString(u8* dst, const u8* berryName, u32 quantity)
u8* txtPtr;
if (quantity < 2)
- berryString = gOtherText_Berry;
+ berryString = gText_Berry;
else
- berryString = gOtherText_Berries;
+ berryString = gText_Berries;
txtPtr = StringCopy(dst, berryName);
*txtPtr = CHAR_SPACE;
StringCopy(txtPtr + 1, berryString);
diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c
new file mode 100644
index 000000000..9f38824f9
--- /dev/null
+++ b/src/lilycove_lady.c
@@ -0,0 +1,1101 @@
+//
+// Created by Scott Norton on 9/19/17.
+//
+
+#include "global.h"
+#include "main.h"
+#include "rom4.h"
+#include "rom6.h"
+#include "event_data.h"
+#include "script.h"
+#include "rng.h"
+#include "string_util.h"
+#include "item.h"
+#include "items.h"
+#include "item_menu.h"
+#include "text.h"
+#include "easy_chat.h"
+#include "lilycove_lady.h"
+
+static void SetLilycoveQuizLady(void);
+static void SetLilycoveFavourLady(void);
+static void SetLilycoveContestLady(void);
+static void sub_818E004(void);
+static void sub_818DBC4(void);
+static void sub_818E674(void);
+static u8 sub_818E13C(void);
+static bool8 sub_818E1F4(void);
+static u8 sub_818E258(const u8 *);
+
+extern const u8 gText_Lady2[];
+
+static const u16 gUnknown_0860B074[] = {
+ 0x62, 0xcb, 0xdc, 0xcc, 0xd1
+};
+static const u16 gUnknown_0860B07E[] = {
+ 0x1a, 0x14, 0x0a
+};
+
+static const u16 Unknown_0860B084[] = {
+ 0x101b, 0x1623, 0x1812, 0x102c, 0x020e, 0x0c03, 0x1a0b, 0x0210, 0x020d
+};
+
+static const u16 Unknown_0860B096[] = {
+ 0x101b, 0x1013, 0x1020, 0x1a0f, 0x020c, 0x0c03, 0x0211, 0x0203, 0x0400
+};
+
+static const u16 Unknown_0860B0A8[] = {
+ 0x0e0f, 0x1018, 0x020e, 0x0204, 0x0c03, 0xffff, 0x0212, 0x0451, 0x0463
+};
+
+static const u16 Unknown_0860B0BA[] = {
+ 0x101b, 0x100b, 0x0e0d, 0x141a, 0x181d, 0x0c03, 0x141e, 0x1a26, 0x1823
+};
+
+static const u16 Unknown_0860B0CC[] = {
+ 0x101b, 0x181d, 0x1018, 0x0a02, 0x2014, 0x0c03, 0x0208, 0x1824, 0x181c
+};
+
+static const u16 Unknown_0860B0DE[] = {
+ 0x101b, 0x1000, 0x1c19, 0x265d, 0x0c03, 0xffff, 0x0447, 0x045d, 0x042c
+};
+
+static const u16 Unknown_0860B0F0[] = {
+ 0x101b, 0x1034, 0x1e11, 0x100b, 0x1a08, 0x0c03, 0x044b, 0x0446, 0x040a
+};
+
+static const u16 Unknown_0860B102[] = {
+ 0x101b, 0x1000, 0x274f, 0x0626, 0x0c03, 0xffff, 0x0442, 0x0411, 0x0450
+};
+
+static const u16 Unknown_0860B114[] = {
+ 0x101b, 0x1000, 0x1c19, 0x043c, 0x0c03, 0xffff, 0x0421, 0x0464, 0x0435
+};
+
+static const u16 Unknown_0860B126[] = {
+ 0x101b, 0x1203, 0x1030, 0x0207, 0x0c03, 0xffff, 0x0210, 0x020e, 0x020d
+};
+
+static const u16 Unknown_0860B138[] = {
+ 0x101b, 0x1623, 0x0a05, 0x020e, 0x0c03, 0xffff, 0x1a25, 0x181a, 0x181b
+};
+
+static const u16 Unknown_0860B14A[] = {
+ 0x101b, 0x1823, 0x1603, 0x0a02, 0x1812, 0x0c03, 0x1a15, 0x1a23, 0x181b
+};
+
+static const u16 Unknown_0860B15C[] = {
+ 0x1020, 0x020e, 0x1010, 0x1043, 0x1e0f, 0x0c03, 0x181c, 0x1a24, 0x1816
+};
+
+static const u16 Unknown_0860B16E[] = {
+ 0x0446, 0x100b, 0x0620, 0x061c, 0x101b, 0x0c03, 0x0420, 0x0426, 0xffff
+};
+
+static const u16 Unknown_0860B180[] = {
+ 0x0400, 0x100b, 0x0639, 0x061c, 0x101b, 0x0c03, 0x040e, 0x0410, 0xffff
+};
+
+static const u16 Unknown_0860B192[] = {
+ 0x041f, 0x100b, 0x0639, 0x061c, 0x101b, 0x0c03, 0x0445, 0x0400, 0xffff
+};
+
+static const u16 *const gUnknown_0860B1A4[] = {
+ Unknown_0860B084,
+ Unknown_0860B096,
+ Unknown_0860B0A8,
+ Unknown_0860B0BA,
+ Unknown_0860B0CC,
+ Unknown_0860B0DE,
+ Unknown_0860B0F0,
+ Unknown_0860B102,
+ Unknown_0860B114,
+ Unknown_0860B126,
+ Unknown_0860B138,
+ Unknown_0860B14A,
+ Unknown_0860B15C,
+ Unknown_0860B16E,
+ Unknown_0860B180,
+ Unknown_0860B192
+};
+
+static const u16 gUnknown_0860B1E4[] = {
+ 0x0210, 0x0400, 0x0212, 0x1a26, 0x0208, 0x045d, 0x040a, 0x0411, 0x0464, 0x020e, 0x1a25, 0x181b, 0x1a24, 0x0420, 0x0410, 0x0400
+};
+
+static const u16 gUnknown_0860B204[] = {
+ 0x007b, 0x007f, 0x0081, 0x0023, 0x0023, 0x0023, 0x00a5, 0x00a7, 0x00a6, 0x000b, 0x012f, 0x006b, 0x006d, 0x0044, 0x0044, 0x000c
+};
+
+extern const u8 gUnknown_085EEB83[];
+extern const u8 gUnknown_085EEB8C[];
+extern const u8 gUnknown_085EEB95[];
+extern const u8 gUnknown_085EEB9E[];
+extern const u8 gUnknown_085EEBA4[];
+extern const u8 gUnknown_085EEBAB[];
+
+static const u8 *const gUnknown_0860B224[] = {
+ gUnknown_085EEB83,
+ gUnknown_085EEB8C,
+ gUnknown_085EEB95,
+ gUnknown_085EEB9E,
+ gUnknown_085EEBA4,
+ gUnknown_085EEBAB
+};
+
+static const u16 Unknown_0860B23C[] = {
+ 0x0056, 0x0053, 0x0054, 0x000e, 0x0012, 0x000f, 0x00a7, 0x0011, 0x0010, 0x0018, 0x0019, 0x001e, 0x0000
+};
+
+static const u16 Unknown_0860B256[] = {
+ 0x0051, 0x006a, 0x006b, 0x00cc, 0x00c2, 0x002f, 0x0067, 0x0068, 0x0087, 0x0089, 0x008b, 0x009d, 0x00a0, 0x00a5, 0x0004, 0x0002, 0x0000
+};
+
+static const u16 Unknown_0860B278[] = {
+ 0x0021, 0x000d, 0x001a, 0x001b, 0x001c, 0x00cc, 0x00ca, 0x0026, 0x0086, 0x0096, 0x0097, 0x009a, 0x00a2, 0x00a6, 0x0000
+};
+
+static const u16 Unknown_0860B296[] = {
+ 0x0020, 0x004d, 0x004b, 0x004c, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x006e, 0x005d, 0x006c, 0x006d, 0x006a, 0x006b, 0x00d6, 0x00bc, 0x00b3, 0x000b, 0x000c, 0x0000
+};
+
+static const u16 Unknown_0860B2C0[] = {
+ 0x001f, 0x0013, 0x0014, 0x004a, 0x004e, 0x0049, 0x00a5, 0x00c8, 0x0067, 0x006f, 0x0000
+};
+
+static const u16 Unknown_0860B2D6[] = {
+ 0x00b7, 0x00d3, 0x00d2, 0x00d8, 0x009e, 0x00a6, 0x00ab, 0x00aa, 0x006c, 0x006d, 0x0000
+};
+
+static const u16 *const gUnknown_0860B2EC[] = {
+ Unknown_0860B23C,
+ Unknown_0860B256,
+ Unknown_0860B278,
+ Unknown_0860B296,
+ Unknown_0860B2C0,
+ Unknown_0860B2D6
+};
+
+static const u16 gUnknown_0860B304[] = {
+ 0x0b, 0x6e, 0x40, 0x6f, 0x44, 0x47
+};
+
+extern const u8 gUnknown_085EEB2B[];
+extern const u8 gUnknown_085EEB34[];
+extern const u8 gUnknown_085EEB3A[];
+extern const u8 gUnknown_085EEB41[];
+extern const u8 gUnknown_085EEB4A[];
+extern const u8 gUnknown_085EEB51[];
+extern const u8 gUnknown_085EEB5A[];
+extern const u8 gUnknown_085EEB61[];
+extern const u8 gUnknown_085EEB6A[];
+extern const u8 gUnknown_085EEB74[];
+extern const u8 gUnknown_085EADA4[];
+extern const u8 gUnknown_085EADB5[];
+extern const u8 gUnknown_085EADC4[];
+extern const u8 gUnknown_085EADD5[];
+extern const u8 gUnknown_085EADE7[];
+
+static const u8 *const gUnknown_0860B310[] = {
+ gUnknown_085EEB2B,
+ gUnknown_085EEB34,
+ gUnknown_085EEB3A,
+ gUnknown_085EEB41,
+ gUnknown_085EEB4A
+};
+static const u8 *const gUnknown_0860B324[] = {
+ gUnknown_085EEB51,
+ gUnknown_085EEB5A,
+ gUnknown_085EEB61,
+ gUnknown_085EEB6A,
+ gUnknown_085EEB74
+};
+static const u8 *const gUnknown_0860B338[] = {
+ gUnknown_085EADA4,
+ gUnknown_085EADB5,
+ gUnknown_085EADC4,
+ gUnknown_085EADD5,
+ gUnknown_085EADE7
+};
+
+static const u16 gUnknown_0860B34C[] = {
+ 0x0120, 0x013b, 0x011e, 0x013d, 0x0019
+};
+
+static EWRAM_DATA struct LilycoveLadyFavour *gUnknown_0203CD64 = NULL;
+static EWRAM_DATA struct LilycoveLadyQuiz *gUnknown_0203CD68 = NULL;
+static EWRAM_DATA struct LilycoveLadyContest *gUnknown_0203CD6C = NULL;
+
+extern EWRAM_DATA u16 gScriptItemId;
+
+u8 GetLilycoveLadyId(void)
+{
+ return gSaveBlock1Ptr->lilycoveLady.id;
+}
+
+void sub_818D9C0(void)
+{
+ LilycoveLady *lilycoveLady;
+
+ VarSet(VAR_0x4010, gUnknown_0860B07E[GetLilycoveLadyId()]);
+ if (GetLilycoveLadyId() == LILYCOVE_LADY_CONTEST)
+ {
+ lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
+ VarSet(VAR_0x4011, gUnknown_0860B074[lilycoveLady->contest.category]);
+ gScriptResult = TRUE;
+ }
+ else
+ {
+ gScriptResult = FALSE;
+ }
+}
+
+void SetLilycoveLady(void)
+{
+ u16 id;
+
+ id = ((gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]);
+ id %= 6;
+ id >>= 1;
+ switch (id)
+ {
+ case LILYCOVE_LADY_QUIZ:
+ SetLilycoveQuizLady();
+ break;
+ case LILYCOVE_LADY_FAVOUR:
+ SetLilycoveFavourLady();
+ break;
+ case LILYCOVE_LADY_CONTEST:
+ SetLilycoveContestLady();
+ break;
+ }
+}
+
+void sub_818DA78(void)
+{
+ switch (GetLilycoveLadyId())
+ {
+ case LILYCOVE_LADY_QUIZ:
+ sub_818E004();
+ break;
+ case LILYCOVE_LADY_FAVOUR:
+ sub_818DBC4();
+ break;
+ case LILYCOVE_LADY_CONTEST:
+ sub_818E674();
+ break;
+ }
+}
+
+void SetLilycoveLadyRandomly(void)
+{
+ u8 id;
+
+ id = Random() % 3;
+ switch (id)
+ {
+ case LILYCOVE_LADY_QUIZ:
+ SetLilycoveQuizLady();
+ break;
+ case LILYCOVE_LADY_FAVOUR:
+ SetLilycoveFavourLady();
+ break;
+ case LILYCOVE_LADY_CONTEST:
+ SetLilycoveContestLady();
+ break;
+ }
+}
+
+void sub_818DAEC(void)
+{
+ gScriptResult = GetLilycoveLadyId();
+}
+
+static u8 sub_818DB04(const u16 *data)
+{
+ u8 len;
+
+ for (len = 0; *data != 0; len ++, data ++);
+ return len;
+}
+
+static void sub_818DB20(void)
+{
+ u8 size;
+ u8 idx;
+
+ gUnknown_0203CD64->unk_00c = Random() % 6;
+ size = sub_818DB04(gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c]);
+ idx = Random() % size;
+ gUnknown_0203CD64->unk_010 = gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c][idx];
+}
+
+static void SetLilycoveFavourLady(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ gUnknown_0203CD64->id = LILYCOVE_LADY_FAVOUR;
+ gUnknown_0203CD64->phase = 0;
+ gUnknown_0203CD64->playerName[0] = EOS;
+ gUnknown_0203CD64->unk_002 = 0;
+ gUnknown_0203CD64->unk_003= 0;
+ gUnknown_0203CD64->itemId = ITEM_NONE;
+ gUnknown_0203CD64->language = gGameLanguage;
+ sub_818DB20();
+}
+
+static void sub_818DBC4(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ gUnknown_0203CD64->id = LILYCOVE_LADY_FAVOUR;
+ gUnknown_0203CD64->phase = 0;
+}
+
+u8 sub_818DBE8(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ if (gUnknown_0203CD64->phase == 2)
+ {
+ return 2;
+ }
+ else if (gUnknown_0203CD64->phase == 1)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+static const u8 *sub_818DC1C(u8 idx)
+{
+ return gUnknown_0860B224[idx];
+}
+
+void sub_818DC2C(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ StringCopy(gStringVar1, sub_818DC1C(gUnknown_0203CD64->unk_00c));
+}
+
+bool8 sub_818DC60(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ if (gUnknown_0203CD64->playerName[0] != EOS)
+ {
+ StringCopy7(gStringVar3, gUnknown_0203CD64->playerName);
+ ConvertInternationalString(gStringVar3, gUnknown_0203CD64->language);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_818DCAC(u8 *dest, u16 itemId)
+{
+ StringCopy(dest, ItemId_GetItem(itemId)->name);
+}
+
+void sub_818DCC8(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ sub_818DCAC(gStringVar2, gUnknown_0203CD64->itemId);
+}
+
+static void sub_818DCF4(const u8 *src, u8 *dest)
+{
+ memset(dest, 0xFF, 8);
+ StringCopy7(dest, src);
+}
+
+void sub_818DD14(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ sub_818DCF4(gUnknown_0203CD64->playerName, gStringVar3);
+ ConvertInternationalString(gStringVar3, gUnknown_0203CD64->language);
+}
+
+bool8 sub_818DD54(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ return gUnknown_0203CD64->unk_002 ? TRUE : FALSE;
+}
+
+void sub_818DD78(void)
+{
+ sub_81AAC50();
+}
+
+static bool8 sub_818DD84(u16 itemId)
+{
+ u8 len;
+ u8 i;
+ bool8 response;
+
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ len = sub_818DB04(gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c]);
+ gUnknown_0203CD64->phase = 1;
+ sub_818DCAC(gStringVar2, itemId);
+ gUnknown_0203CD64->itemId = itemId;
+ sub_818DCF4(gSaveBlock2Ptr->playerName, gUnknown_0203CD64->playerName);
+ gUnknown_0203CD64->language = gGameLanguage;
+ response = FALSE;
+ for (i = 0; i < len; i ++)
+ {
+ if (gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c][i] == itemId)
+ {
+ response = TRUE;
+ gUnknown_0203CD64->unk_003 ++;
+ gUnknown_0203CD64->unk_002 = 1;
+ if (gUnknown_0203CD64->unk_010 == itemId)
+ {
+ gUnknown_0203CD64->unk_003 = 5;
+ }
+ break;
+ }
+ gUnknown_0203CD64->unk_002 = 0;
+ }
+ return response;
+}
+
+bool8 sub_818DE44(void)
+{
+ return sub_818DD84(gScriptItemId);
+}
+
+bool8 sub_818DE5C(void)
+{
+ u8 checkval;
+
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ checkval = gUnknown_0203CD64->unk_003;
+ return checkval < 5 ? FALSE : TRUE;
+}
+
+static void sub_818DE88(u16 itemId)
+{
+ sub_818DCAC(gStringVar2, itemId);
+}
+
+u16 sub_818DEA0(void)
+{
+ u16 itemId;
+
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
+ itemId = gUnknown_0860B304[gUnknown_0203CD64->unk_00c];
+ sub_818DE88(itemId);
+ gUnknown_0203CD64->phase = 2;
+ return itemId;
+}
+
+void sub_818DEDC(void)
+{
+ SetLilycoveFavourLady();
+ gUnknown_0203CD64->phase = 1;
+}
+
+void sub_818DEF4(void)
+{
+ EnableBothScriptContexts();
+}
+
+static void sub_818DF00(void)
+{
+ u8 v0;
+ u8 i;
+
+ v0 = Random() % 16;
+ for (i = 0; i < 9; i ++)
+ {
+ gUnknown_0203CD68->unk_002[i] = gUnknown_0860B1A4[v0][i];
+ }
+ gUnknown_0203CD68->unk_014 = gUnknown_0860B1E4[v0];
+ gUnknown_0203CD68->itemId = gUnknown_0860B204[v0];
+ gUnknown_0203CD68->unk_02b = v0;
+ gUnknown_0203CD68->playerName[0] = EOS;
+}
+
+static void SetLilycoveQuizLady(void)
+{
+ u8 i;
+
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ gUnknown_0203CD68->id = LILYCOVE_LADY_QUIZ;
+ gUnknown_0203CD68->phase = 0;
+ for (i = 0; i < 9; i ++)
+ {
+ gUnknown_0203CD68->unk_002[i] = -1;
+ }
+ gUnknown_0203CD68->unk_014 = -1;
+ gUnknown_0203CD68->unk_016 = -1;
+ for (i = 0; i < 4; i ++)
+ {
+ gUnknown_0203CD68->playerTrainerId[i] = 0;
+ }
+ gUnknown_0203CD68->itemId = ITEM_NONE;
+ gUnknown_0203CD68->unk_02a = 0;
+ gUnknown_0203CD68->unk_02c = 0x10;
+ gUnknown_0203CD68->language = gGameLanguage;
+ sub_818DF00();
+}
+
+static void sub_818E004(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ gUnknown_0203CD68->id = LILYCOVE_LADY_QUIZ;
+ gUnknown_0203CD68->phase = 0;
+ gUnknown_0203CD68->unk_02a = 0;
+ gUnknown_0203CD68->unk_016 = -1;
+}
+
+u8 sub_818E038(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (gUnknown_0203CD68->phase == 2)
+ {
+ return 2;
+ }
+ else if (gUnknown_0203CD68->phase == 1)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+u8 sub_818E06C(void)
+{
+ int i;
+ int j;
+ u8 rv;
+ struct LilycoveLadyQuiz *quiz;
+
+ quiz = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (sub_811F8D8(quiz->unk_014) == 0)
+ {
+ i = quiz->unk_02b;
+ do
+ {
+ if (++ i >= 16)
+ {
+ i = 0;
+ }
+ } while (sub_811F8D8(gUnknown_0860B1E4[i]) == 0);
+ for (j = 0; j < 9; j ++)
+ {
+ quiz->unk_002[j] = gUnknown_0860B1A4[i][j];
+ }
+ quiz->unk_014 = gUnknown_0860B1E4[i];
+ quiz->itemId = gUnknown_0860B204[i];
+ quiz->unk_02b = i;
+ quiz->playerName[0] = EOS;
+ }
+ rv = sub_818E13C();
+ if (rv == 0)
+ {
+ return 2;
+ }
+ else if (rv == 2 || sub_818E1F4())
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+#ifdef NONMATCHING
+static u8 sub_818E13C(void)
+{
+ u8 retval;
+ u8 len;
+ u8 i;
+
+ retval = 1;
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (gUnknown_0203CD68->playerName[0] == EOS)
+ {
+ StringCopy7(gStringVar1, gText_Lady2);
+ retval = 0;
+ }
+ else
+ {
+ StringCopy7(gStringVar1, gUnknown_0203CD68->playerName);
+ ConvertInternationalString(gStringVar1, gUnknown_0203CD68->language);
+ len = sub_818E258(gUnknown_0203CD68->playerName);
+ if (len == sub_818E258(gSaveBlock2Ptr->playerName))
+ {
+ for (i = 0; i < len; i ++)
+ {
+ if (gUnknown_0203CD68->playerName[i] != gSaveBlock2Ptr->playerName[i])
+ {
+ retval = 2;
+ break;
+ }
+ }
+ }
+
+ }
+ return retval;
+}
+#else
+__attribute__((naked)) static u8 sub_818E13C(void)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmovs r7, 0x1\n"
+ "\tldr r5, =gUnknown_0203CD68\n"
+ "\tldr r0, =gSaveBlock1Ptr\n"
+ "\tldr r1, [r0]\n"
+ "\tldr r2, =0x00003b58\n"
+ "\tadds r0, r1, r2\n"
+ "\tstr r0, [r5]\n"
+ "\tldrb r0, [r0, 0x18]\n"
+ "\tcmp r0, 0xFF\n"
+ "\tbne _0818E174\n"
+ "\tldr r0, =gStringVar1\n"
+ "\tldr r1, =gText_Lady2\n"
+ "\tbl StringCopy7\n"
+ "\tmovs r7, 0\n"
+ "\tb _0818E1DC\n"
+ "\t.pool\n"
+ "_0818E174:\n"
+ "\tldr r4, =gStringVar1\n"
+ "\tldr r0, =0x00003b70\n"
+ "\tadds r1, r0\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl StringCopy7\n"
+ "\tldr r0, [r5]\n"
+ "\tadds r0, 0x2D\n"
+ "\tldrb r1, [r0]\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl ConvertInternationalString\n"
+ "\tldr r0, [r5]\n"
+ "\tadds r0, 0x18\n"
+ "\tbl sub_818E258\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tldr r6, =gSaveBlock2Ptr\n"
+ "\tldr r0, [r6]\n"
+ "\tbl sub_818E258\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r4, r0\n"
+ "\tbne _0818E1DC\n"
+ "\tldr r0, [r5]\n"
+ "\tmovs r2, 0\n"
+ "\tcmp r2, r4\n"
+ "\tbcs _0818E1DC\n"
+ "\tldr r1, [r6]\n"
+ "\tldrb r0, [r0, 0x18]\n"
+ "\tldrb r1, [r1]\n"
+ "\tcmp r0, r1\n"
+ "\tbne _0818E1DA\n"
+ "_0818E1BA:\n"
+ "\tadds r0, r2, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r2, r0, 24\n"
+ "\tcmp r2, r4\n"
+ "\tbcs _0818E1DC\n"
+ "\tldr r0, =gUnknown_0203CD68\n"
+ "\tldr r1, [r0]\n"
+ "\tadds r1, 0x18\n"
+ "\tadds r1, r2\n"
+ "\tldr r0, =gSaveBlock2Ptr\n"
+ "\tldr r0, [r0]\n"
+ "\tadds r0, r2\n"
+ "\tldrb r1, [r1]\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0818E1BA\n"
+ "_0818E1DA:\n"
+ "\tmovs r7, 0x2\n"
+ "_0818E1DC:\n"
+ "\tadds r0, r7, 0\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r1}\n"
+ "\tbx r1\n"
+ "\t.pool");
+}
+#endif
+
+static u8 sub_818E1F4(void)
+{
+ bool8 response;
+ u8 i;
+
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ response = FALSE;
+ for (i = 0; i < 4; i ++)
+ {
+ if (gUnknown_0203CD68->playerTrainerId[i] != gSaveBlock2Ptr->playerTrainerId[i])
+ {
+ response = TRUE;
+ break;
+ }
+ }
+ return response;
+}
+
+static u8 sub_818E258(const u8 *str)
+{
+ u8 len;
+ const u8 *ptr;
+
+ for (len = 0, ptr = str; *ptr != EOS; len ++, ptr ++);
+ return len;
+}
+
+void sub_818E274(void)
+{
+ StringCopy(gStringVar1, ItemId_GetItem(gUnknown_0203CD68->itemId)->name);
+}
+
+bool8 sub_818E298(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (!sub_818E13C())
+ {
+ gUnknown_0203CD68->language = gGameLanguage;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u8 sub_818E2D8(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ return gUnknown_0203CD68->unk_02a;
+}
+
+void sub_818E2FC(void)
+{
+ easy_chat_input_maybe();
+}
+
+bool8 sub_818E308(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ CopyEasyChatWord(gStringVar1, gUnknown_0203CD68->unk_014);
+ CopyEasyChatWord(gStringVar2, gUnknown_0203CD68->unk_016);
+ return StringCompare(gStringVar1, gStringVar2) ? FALSE : TRUE;
+}
+
+void sub_818E358(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ gSpecialVar_0x8005 = gUnknown_0203CD68->itemId;
+}
+
+void sub_818E37C(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ gUnknown_0203CD68->phase = 1;
+}
+
+void sub_818E39C(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ gUnknown_0203CD68->phase = 2;
+}
+
+void sub_818E3BC(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ gUnknown_0203CD68->unk_016 = -1;
+}
+
+void sub_818E3E0(void)
+{
+ sub_81AAC70();
+}
+
+void sub_818E3EC(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (sub_818E298())
+ {
+ gUnknown_0203CD68->unk_02c = gUnknown_0203CD68->unk_02b;
+ }
+ else
+ {
+ gUnknown_0203CD68->unk_02c = 0x10;
+ }
+ sub_818DF00();
+}
+
+void sub_818E430(void)
+{
+ u8 i;
+
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ for (i = 0; i < 9; i ++)
+ {
+ gUnknown_0203CD68->unk_002[i] = -1;
+ }
+ gUnknown_0203CD68->unk_014 = -1;
+}
+
+void sub_818E47C(void)
+{
+ gSpecialVar_0x8004 = 0x11;
+ easy_chat_input_maybe();
+}
+
+void sub_818E490(void)
+{
+ RemoveBagItem(gScriptItemId, 1);
+}
+
+void sub_818E4A4(void)
+{
+ u8 i;
+
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ gUnknown_0203CD68->itemId = gScriptItemId;
+ for (i = 0; i < 4; i ++)
+ {
+ gUnknown_0203CD68->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
+ }
+ StringCopy7(gUnknown_0203CD68->playerName, gSaveBlock2Ptr->playerName);
+ gUnknown_0203CD68->language = gGameLanguage;
+}
+
+void sub_818E510(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ gUnknown_0203CD68->unk_02a = 1;
+}
+
+void sub_818E538(void)
+{
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ CopyEasyChatWord(gStringVar3, gUnknown_0203CD68->unk_014);
+}
+
+void sub_818E564(void)
+{
+ EnableBothScriptContexts();
+}
+
+void sub_818E570(const struct LilycoveLadyQuiz *quiz)
+{
+ u8 i;
+
+ gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (quiz->unk_02c < 16 && gUnknown_0203CD68->id == LILYCOVE_LADY_QUIZ)
+ {
+ for (i = 0; i < 4; i ++)
+ {
+ if (quiz->unk_02c != gUnknown_0203CD68->unk_02b)
+ {
+ break;
+ }
+ gUnknown_0203CD68->unk_02b = Random() % 16;
+ }
+ if (quiz->unk_02c == gUnknown_0203CD68->unk_02b)
+ {
+ gUnknown_0203CD68->unk_02b = (gUnknown_0203CD68->unk_02b + 1) % 16;
+ }
+ gUnknown_0203CD68->unk_02c = quiz->unk_02c;
+ }
+}
+
+static void sub_818E604(void)
+{
+ gUnknown_0203CD6C->playerName[0] = EOS;
+ gUnknown_0203CD6C->fave_pkblk = 0;
+ gUnknown_0203CD6C->other_pkblk = 0;
+ gUnknown_0203CD6C->max_sheen = 0;
+ gUnknown_0203CD6C->category = Random() % 5;
+}
+
+static void SetLilycoveContestLady(void)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ gUnknown_0203CD6C->id = LILYCOVE_LADY_CONTEST;
+ gUnknown_0203CD6C->phase = 0;
+ sub_818E604();
+ gUnknown_0203CD6C->language = gGameLanguage;
+}
+
+static void sub_818E674(void)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ gUnknown_0203CD6C->id = LILYCOVE_LADY_CONTEST;
+ gUnknown_0203CD6C->phase = 0;
+ if (gUnknown_0203CD6C->fave_pkblk == 5 || gUnknown_0203CD6C->other_pkblk == 5)
+ {
+ sub_818E604();
+ }
+}
+
+static void sub_818E6B0(u8 sheen)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (gUnknown_0203CD6C->max_sheen <= sheen)
+ {
+ gUnknown_0203CD6C->max_sheen = sheen;
+ memset(gUnknown_0203CD6C->playerName, EOS, sizeof(gUnknown_0203CD6C->playerName));
+ memcpy(gUnknown_0203CD6C->playerName, gSaveBlock2Ptr->playerName, sizeof(gUnknown_0203CD6C->playerName));
+ gUnknown_0203CD6C->language = gGameLanguage;
+ }
+}
+
+bool8 sub_818E704(struct Pokeblock *pokeblock)
+{
+ u8 sheen;
+ bool8 response;
+
+ sheen = 0;
+ response = FALSE;
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ switch (gUnknown_0203CD6C->category)
+ {
+ case 0:
+ if (pokeblock->spicy != 0)
+ {
+ sheen = pokeblock->spicy;
+ response = TRUE;
+ }
+ break;
+ case 1:
+ if (pokeblock->dry != 0)
+ {
+ sheen = pokeblock->dry;
+ response = TRUE;
+ }
+ break;
+ case 2:
+ if (pokeblock->sweet != 0)
+ {
+ sheen = pokeblock->sweet;
+ response = TRUE;
+ }
+ break;
+ case 3:
+ if (pokeblock->bitter != 0)
+ {
+ sheen = pokeblock->bitter;
+ response = TRUE;
+ }
+ break;
+ case 4:
+ if (pokeblock->sour != 0)
+ {
+ sheen = pokeblock->sour;
+ response = TRUE;
+ }
+ break;
+ }
+ if (response == TRUE)
+ {
+ sub_818E6B0(sheen);
+ gUnknown_0203CD6C->fave_pkblk ++;
+ }
+ else
+ {
+ gUnknown_0203CD6C->other_pkblk ++;
+ }
+ return response;
+}
+
+static void sub_818E794(u8 *dest1, u8 *dest2)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ StringCopy(dest1, gUnknown_0860B324[gUnknown_0203CD6C->category]);
+ StringCopy10(dest2, gUnknown_0860B310[gUnknown_0203CD6C->category]);
+}
+
+void sub_818E7E0(u8 *dest1, u8 *dest2)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ *dest1 = gUnknown_0203CD6C->category;
+ StringCopy(dest2, gUnknown_0860B310[gUnknown_0203CD6C->category]);
+}
+
+void sub_818E81C(u8 *dest)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ StringCopy(dest, gUnknown_0203CD6C->playerName);
+}
+
+void sub_818E848(u8 *dest)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ *dest = gUnknown_0203CD6C->language;
+}
+
+void sub_818E868(u8 *dest, u8 category)
+{
+ StringCopy(dest, gUnknown_0860B338[category]);
+}
+
+u8 sub_818E880(void)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (gUnknown_0203CD6C->fave_pkblk >= 5)
+ {
+ return 1;
+ }
+ else if (gUnknown_0203CD6C->fave_pkblk == 0)
+ {
+ return 2;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+bool8 sub_818E8B4(void)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (gUnknown_0203CD6C->phase == 1)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_818E8E0(void)
+{
+ bool8 response;
+
+ response = FALSE;
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (gUnknown_0203CD6C->fave_pkblk >= 5 || gUnknown_0203CD6C->other_pkblk >= 5)
+ {
+ response = TRUE;
+ }
+ return response;
+}
+
+void sub_818E914(void)
+{
+ sub_818E794(gStringVar2, gStringVar1);
+}
+
+void sub_818E92C(void)
+{
+ sub_81357FC(3, c2_exit_to_overworld_2_switch);
+}
+
+void sub_818E940(void)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ gUnknown_0203CD6C->phase = 1;
+}
+
+void sub_818E960(void)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ gSpecialVar_0x8005 = gUnknown_0860B34C[gUnknown_0203CD6C->category];
+}
+
+u8 sub_818E990(void)
+{
+ gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
+ return gUnknown_0203CD6C->category;
+}
diff --git a/src/load_save.c b/src/load_save.c
index 588387186..68d978e3d 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -6,15 +6,11 @@
#include "rng.h"
#include "malloc.h"
-extern u8 gPlayerPartyCount;
-extern struct PokemonStorage* gPokemonStoragePtr;
extern void* gUnknown_0203CF5C;
-extern u8 gHeap[0x1C000];
extern bool16 IdentifyFlash(void);
extern void SetBagItemsPointers(void);
extern void SetDecorationInventoriesPointers(void);
-extern void InitHeap(void *heapStart, u32 heapSize);
void ApplyNewEncyprtionKeyToAllEncryptedData(u32 encryptionKey);
diff --git a/src/multiboot.c b/src/multiboot.c
index 80291ff46..7fd6df2d0 100644
--- a/src/multiboot.c
+++ b/src/multiboot.c
@@ -316,7 +316,7 @@ void MultiBootStartProbe(struct MultiBootParam *mp)
mp->probe_count = 1;
}
-void MultiBootStartMaster(struct MultiBootParam *mp, u8 *srcp, int length, u8 palette_color, s8 palette_speed)
+void MultiBootStartMaster(struct MultiBootParam *mp, const u8 *srcp, int length, u8 palette_color, s8 palette_speed)
{
int i = 0;
diff --git a/src/pokemon_2.c b/src/pokemon_2.c
index 30e788874..cf073570d 100644
--- a/src/pokemon_2.c
+++ b/src/pokemon_2.c
@@ -31,7 +31,7 @@ extern const union AnimCmd* gUnknown_082FF70C[];
extern const union AnimCmd* const * const gUnknown_08309AAC[];
extern const union AnimCmd* const * const gUnknown_08305D0C[];
extern const union AnimCmd* const * const gUnknown_0830536C[];
-extern const u8 gBadEggNickname[];
+extern const u8 gText_BadEgg[];
extern const u8 gText_EggNickname[];
extern u8 GetBankSide(u8 bank);
@@ -409,8 +409,8 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
if (boxMon->isBadEgg)
{
for (retVal = 0;
- retVal < POKEMON_NAME_LENGTH && gBadEggNickname[retVal] != EOS;
- data[retVal] = gBadEggNickname[retVal], retVal++) {}
+ retVal < POKEMON_NAME_LENGTH && gText_BadEgg[retVal] != EOS;
+ data[retVal] = gText_BadEgg[retVal], retVal++) {}
data[retVal] = EOS;
}
diff --git a/src/pokemon_3.c b/src/pokemon_3.c
index a2282539e..603732a34 100644
--- a/src/pokemon_3.c
+++ b/src/pokemon_3.c
@@ -46,16 +46,16 @@ extern const struct SpindaSpot gSpindaSpotGraphics[];
extern const u8* const gStatNamesTable[];
extern const u8 gSpeciesNames[][11];
extern const u8 gUnknown_08329EC8[];
-extern const u8 gUnknown_085CB38A[];
-extern const u8 gUnknown_085CB3AA[];
-extern const u8 gUnknown_085CA459[];
-extern const u8 gUnknown_085CA424[];
+extern const u8 gText_StatRose[];
+extern const u8 gText_PkmnsStatChanged2[];
+extern const u8 gText_PkmnGettingPumped[];
+extern const u8 gText_PkmnShroudedInMist[];
extern const s8 gNatureStatTable[][5];
extern const s8 gUnknown_08329ECE[][3];
extern const u32 gBitTable[];
extern const u32 gTMHMLearnsets[][2];
-extern const u8 BattleText_Wally[];
-extern const u8 BattleText_PreventedSwitch[];
+extern const u8 gText_BattleWallyName[];
+extern const u8 gText_PkmnsXPreventsSwitching[];
extern const struct CompressedSpritePalette gMonPaletteTable[];
extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
extern const u16 gHMMoves[];
@@ -215,8 +215,8 @@ void sub_806CF24(s32 stat)
{
gBankTarget = gBankInMenu;
StringCopy(gBattleTextBuff1, gStatNamesTable[gUnknown_08329EC8[stat]]);
- StringCopy(gBattleTextBuff2, gUnknown_085CB38A);
- StrCpyDecodeToDisplayedStringBattle(gUnknown_085CB3AA);
+ StringCopy(gBattleTextBuff2, gText_StatRose);
+ StrCpyDecodeToDisplayedStringBattle(gText_PkmnsStatChanged2);
}
u8 *sub_806CF78(u16 itemId)
@@ -251,7 +251,7 @@ u8 *sub_806CF78(u16 itemId)
else
{
gBankAttacker = gBankInMenu;
- StrCpyDecodeToDisplayedStringBattle(gUnknown_085CA459);
+ StrCpyDecodeToDisplayedStringBattle(gText_PkmnGettingPumped);
}
}
}
@@ -259,7 +259,7 @@ u8 *sub_806CF78(u16 itemId)
if (itemEffect[3] & 0x80)
{
gBankAttacker = gBankInMenu;
- StrCpyDecodeToDisplayedStringBattle(gUnknown_085CA424);
+ StrCpyDecodeToDisplayedStringBattle(gText_PkmnShroudedInMist);
}
return gDisplayedStringBattle;
@@ -1177,7 +1177,7 @@ u16 GetBattleBGM(void)
case CLASS_PKMN_TRAINER_RIVAL:
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
return 0x1E1;
- if (!StringCompare(gTrainers[gTrainerBattleOpponent_A].trainerName, BattleText_Wally))
+ if (!StringCompare(gTrainers[gTrainerBattleOpponent_A].trainerName, gText_BattleWallyName))
return 0x1DC;
return 0x1E1;
case CLASS_ELITE_FOUR:
@@ -1374,7 +1374,7 @@ void sub_806E994(void)
gBattleTextBuff2[2] = gBankInMenu;
gBattleTextBuff2[3] = pokemon_order_func(gBattlePartyID[gBankInMenu]);
gBattleTextBuff2[4] = EOS;
- StrCpyDecodeBattle(BattleText_PreventedSwitch, gStringVar4);
+ StrCpyDecodeBattle(gText_PkmnsXPreventsSwitching, gStringVar4);
}
struct PokeItem
diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c
index 804dbda74..12d98bfd8 100644
--- a/src/pokemon_size_record.c
+++ b/src/pokemon_size_record.c
@@ -45,8 +45,8 @@ static const u8 sGiftRibbonsMonDataIds[] =
MON_DATA_GIFT_RIBBON_7
};
-extern const u8 gOtherText_DecimalPoint[];
-extern const u8 gOtherText_Marco[];
+extern const u8 gText_DecimalPoint[];
+extern const u8 gText_Marco[];
extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
#define CM_PER_INCH 2.54
@@ -103,7 +103,7 @@ static void FormatMonSizeRecord(u8 *string, u32 size)
#endif
string = ConvertIntToDecimalStringN(string, size / 10, 0, 8);
- string = StringAppend(string, gOtherText_DecimalPoint);
+ string = StringAppend(string, gText_DecimalPoint);
ConvertIntToDecimalStringN(string, size % 10, 0, 1);
}
@@ -152,7 +152,7 @@ static void GetMonSizeRecordInfo(u16 species, u16 *sizeRecord)
FormatMonSizeRecord(gStringVar3, size);
StringCopy(gStringVar1, gSpeciesNames[species]);
if (*sizeRecord == DEFAULT_MAX_SIZE)
- StringCopy(gStringVar2, gOtherText_Marco);
+ StringCopy(gStringVar2, gText_Marco);
else
StringCopy(gStringVar2, gSaveBlock2Ptr->playerName);
}
diff --git a/src/reset_save_heap.c b/src/reset_save_heap.c
new file mode 100644
index 000000000..b786ff9f8
--- /dev/null
+++ b/src/reset_save_heap.c
@@ -0,0 +1,32 @@
+#include "global.h"
+#include "main.h"
+#include "gpu_regs.h"
+#include "m4a.h"
+#include "load_save.h"
+#include "save.h"
+#include "new_game.h"
+#include "rom4.h"
+#include "malloc.h"
+
+void sub_81700F8(void)
+{
+ u16 imeBackup;
+
+ imeBackup = REG_IME;
+ REG_IME = 0;
+ RegisterRamReset(0x00000001);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, 0x80);
+ REG_IME = imeBackup;
+ gMain.inBattle = FALSE;
+ SetSaveBlocksPointers(sub_815355C());
+ sub_808447C();
+ ResetSaveCounters();
+ sub_81534D0(0);
+ if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
+ {
+ Sav2_ClearSetDefault();
+ }
+ SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
+ InitHeap(gHeap, 0x1c000);
+ SetMainCallback2(sub_8086230);
+}
diff --git a/src/start_menu.c b/src/start_menu.c
index ffcab5220..ac393ce2e 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -151,7 +151,7 @@ static void BuildStartMenuActions_MultiBattleRoom(void)
extern const struct WindowTemplate gSafariBallsWindowTemplate;
extern const struct WindowTemplate gPyramidFloorWindowTemplate_1;
extern const struct WindowTemplate gPyramidFloorWindowTemplate_2;
-extern const u8 gOtherText_SafariStock[];
+extern const u8 gText_SafariBallStock[];
void DisplaySafariBallsWindow(void)
{
@@ -159,13 +159,13 @@ void DisplaySafariBallsWindow(void)
PutWindowTilemap(sSafariBallsWindowId);
sub_81973FC(sSafariBallsWindowId, 0);
ConvertIntToDecimalStringN(gStringVar1, gNumSafariBalls, STR_CONV_MODE_RIGHT_ALIGN, 2);
- StringExpandPlaceholders(gStringVar4, gOtherText_SafariStock);
+ StringExpandPlaceholders(gStringVar4, gText_SafariBallStock);
PrintTextOnWindow(sSafariBallsWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL);
CopyWindowToVram(sSafariBallsWindowId, 2);
}
extern const u8* const gUnknown_08510510[];
-extern const u8 gOtherText_BattlePyramid_X[];
+extern const u8 gText_BattlePyramidFloor[];
void DisplayPyramidFloorWindow(void)
{
@@ -177,7 +177,7 @@ void DisplayPyramidFloorWindow(void)
PutWindowTilemap(sBattlePyramidFloorWindowId);
sub_81973FC(sBattlePyramidFloorWindowId, 0);
StringCopy(gStringVar1, gUnknown_08510510[*(u16*)(&gSaveBlock2Ptr->field_CAA[8])]);
- StringExpandPlaceholders(gStringVar4, gOtherText_BattlePyramid_X);
+ StringExpandPlaceholders(gStringVar4, gText_BattlePyramidFloor);
PrintTextOnWindow(sBattlePyramidFloorWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL);
CopyWindowToVram(sBattlePyramidFloorWindowId, 2);
}
diff --git a/src/text.c b/src/text.c
index 4b963d1a6..0081a8244 100644
--- a/src/text.c
+++ b/src/text.c
@@ -2778,7 +2778,7 @@ _08005D6E:\n\
bx r1");
}
-u32 GetStringWidthFixedWidthFont(u8 *str, u8 fontId, u8 letterSpacing)
+u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
{
int i;
u8 width;
@@ -2787,7 +2787,7 @@ u32 GetStringWidthFixedWidthFont(u8 *str, u8 fontId, u8 letterSpacing)
u8 line;
int strPos;
u8 lineWidths[8];
- u8 *strLocal;
+ const u8 *strLocal;
for (i = 0; i < 8; i++)
{
@@ -2882,7 +2882,7 @@ u32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32)
return 0;
}
-s32 GetStringWidth(u8 fontId, u8 *str, s16 letterSpacing)
+u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
{
bool8 isJapanese;
int minGlyphWidth;
diff --git a/src/trig.c b/src/trig.c
index 93cf06893..c2bca3059 100644
--- a/src/trig.c
+++ b/src/trig.c
@@ -1,9 +1,6 @@
#include "global.h"
#include "trig.h"
-// Converts a number to Q4.12 fixed-point format
-#define Q_4_12(n) ((s16)((n) * 4096))
-
// Values of sin(x*(π/128)) as Q8.8 fixed-point numbers from x = 0 to x = 319
const s16 gSineTable[] =
{