diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_dome_cards.c | 430 | ||||
-rw-r--r-- | src/berry_fix_program.c | 531 | ||||
-rw-r--r-- | src/egg_hatch.c | 8 | ||||
-rw-r--r-- | src/item.c | 12 | ||||
-rw-r--r-- | src/lilycove_lady.c | 1101 | ||||
-rw-r--r-- | src/load_save.c | 4 | ||||
-rw-r--r-- | src/multiboot.c | 2 | ||||
-rw-r--r-- | src/pokemon_2.c | 6 | ||||
-rw-r--r-- | src/pokemon_3.c | 24 | ||||
-rw-r--r-- | src/pokemon_size_record.c | 8 | ||||
-rw-r--r-- | src/reset_save_heap.c | 32 | ||||
-rw-r--r-- | src/start_menu.c | 8 | ||||
-rw-r--r-- | src/text.c | 6 | ||||
-rw-r--r-- | src/trig.c | 3 |
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[] = { |