diff options
author | Diegoisawesome <Diegoisawesome@users.noreply.github.com> | 2018-11-19 13:29:07 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-19 13:29:07 -0600 |
commit | 6acf6aed0486d090bf4f8e731189b9d4ad07dadb (patch) | |
tree | 14944f58ff26ce5d59ed1383e9550a6215cbc83e /src | |
parent | 8f2ddf2997041bc813a32ac604002fcbb987e3a0 (diff) | |
parent | 58a1bba059a74203edb5d8819bf7af7e1171877a (diff) |
Merge pull request #391 from DizzyEggg/frontier
Clean up bss/common/ewram symbols and decompile mossdeep
Diffstat (limited to 'src')
-rw-r--r-- | src/apprentice.c | 7 | ||||
-rw-r--r-- | src/battle_factory.c | 2 | ||||
-rw-r--r-- | src/battle_factory_screen.c | 4 | ||||
-rw-r--r-- | src/battle_main.c | 12 | ||||
-rw-r--r-- | src/battle_palace.c | 1 | ||||
-rw-r--r-- | src/battle_pyramid.c | 1 | ||||
-rw-r--r-- | src/battle_tent.c | 5 | ||||
-rw-r--r-- | src/battle_tower.c | 5 | ||||
-rw-r--r-- | src/berry_blender.c | 10 | ||||
-rw-r--r-- | src/contest_painting.c | 8 | ||||
-rw-r--r-- | src/easy_chat.c | 1 | ||||
-rw-r--r-- | src/fldeff_strength.c | 1 | ||||
-rw-r--r-- | src/fossil_specials.c | 803 | ||||
-rw-r--r-- | src/mossdeep_gym.c | 313 | ||||
-rw-r--r-- | src/multiboot.c | 2 | ||||
-rw-r--r-- | src/mystery_event_script.c | 1 | ||||
-rw-r--r-- | src/new_game.c | 5 | ||||
-rw-r--r-- | src/overworld.c | 16 | ||||
-rw-r--r-- | src/pokedex.c | 7 | ||||
-rw-r--r-- | src/save.c | 1 | ||||
-rw-r--r-- | src/scrcmd.c | 19 | ||||
-rw-r--r-- | src/start_menu.c | 6 | ||||
-rw-r--r-- | src/string_util.c | 8 |
23 files changed, 690 insertions, 548 deletions
diff --git a/src/apprentice.c b/src/apprentice.c index fa4e08385..499f85094 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -340,9 +340,10 @@ extern const u8 gText_082B7185[]; extern const u8 gText_082B71C1[]; extern const u8 gText_082B71F9[]; -extern struct Unk030062ECStruct *gUnknown_030062EC; -extern struct Unk030062F0Struct *gUnknown_030062F0; -extern void (*gUnknown_030062F4)(void); +// IWRAM common +struct Unk030062ECStruct *gUnknown_030062EC; +struct Unk030062F0Struct *gUnknown_030062F0; +void (*gUnknown_030062F4)(void); // This file's functions. static u16 sub_819FF98(u8 arg0); diff --git a/src/battle_factory.c b/src/battle_factory.c index 37abf6add..1d7fbafc9 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -13,8 +13,6 @@ #include "constants/trainers.h" #include "constants/moves.h" -extern u16 gUnknown_03006298[]; - extern const struct FacilityMon gBattleFrontierMons[]; extern const struct FacilityMon gSlateportBattleTentMons[]; extern const struct BattleFrontierTrainer gBattleFrontierTrainers[]; diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c index 255cf5aa1..42a9b579c 100644 --- a/src/battle_factory_screen.c +++ b/src/battle_factory_screen.c @@ -131,7 +131,6 @@ struct FactorySwapMonsStruct bool8 unk30; }; -extern u8 (*gUnknown_030062E8)(void); extern u8 gUnknown_0203CF20; extern const u16 gBattleFrontierHeldItems[]; @@ -237,6 +236,9 @@ static IWRAM_DATA struct FactorySelectMonsStruct *sFactorySelectScreen; static IWRAM_DATA void (*sSwap_CurrentTableFunc)(u8 taskId); static IWRAM_DATA struct FactorySwapMonsStruct *sFactorySwapScreen; +// IWRAM common +u8 (*gUnknown_030062E8)(void); + // Const rom data. static const u16 gUnknown_0860F13C[] = INCBIN_U16("graphics/unknown/unknown_60F13C.gbapal"); static const u16 gUnknown_0860F15C[] = INCBIN_U16("graphics/unknown/unknown_60F15C.gbapal"); diff --git a/src/battle_main.c b/src/battle_main.c index 4669e9123..116f5963a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -173,6 +173,18 @@ static void HandleAction_NothingIsFainted(void); static void HandleAction_ActionFinished(void); // EWRAM vars +EWRAM_DATA u16 gBattle_BG0_X = 0; +EWRAM_DATA u16 gBattle_BG0_Y = 0; +EWRAM_DATA u16 gBattle_BG1_X = 0; +EWRAM_DATA u16 gBattle_BG1_Y = 0; +EWRAM_DATA u16 gBattle_BG2_X = 0; +EWRAM_DATA u16 gBattle_BG2_Y = 0; +EWRAM_DATA u16 gBattle_BG3_X = 0; +EWRAM_DATA u16 gBattle_BG3_Y = 0; +EWRAM_DATA u16 gBattle_WIN0H = 0; +EWRAM_DATA u16 gBattle_WIN0V = 0; +EWRAM_DATA u16 gBattle_WIN1H = 0; +EWRAM_DATA u16 gBattle_WIN1V = 0; EWRAM_DATA u8 gDisplayedStringBattle[300] = {0}; EWRAM_DATA u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT] = {0}; EWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0}; diff --git a/src/battle_palace.c b/src/battle_palace.c index d435f7e15..4033712b6 100644 --- a/src/battle_palace.c +++ b/src/battle_palace.c @@ -6,6 +6,7 @@ #include "battle_tower.h" #include "frontier_util.h" #include "item.h" +#include "string_util.h" #include "constants/items.h" // This file's functions. diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 878ea4e70..01f138925 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -15,6 +15,7 @@ #include "sound.h" #include "task.h" #include "start_menu.h" +#include "string_util.h" #include "trainer_see.h" #include "main.h" #include "load_save.h" diff --git a/src/battle_tent.c b/src/battle_tent.c index 678222ff5..c7e70912c 100644 --- a/src/battle_tent.c +++ b/src/battle_tent.c @@ -10,6 +10,7 @@ #include "item.h" #include "battle_factory_screen.h" #include "frontier_util.h" +#include "string_util.h" #include "constants/items.h" #include "constants/region_map_sections.h" @@ -17,10 +18,6 @@ extern const struct BattleFrontierTrainer gSlateportBattleTentTrainers[]; extern const struct FacilityMon gSlateportBattleTentMons[]; extern const u16 gBattleFrontierHeldItems[]; -extern u16 gUnknown_03006298[]; - -extern void sub_81A4C30(void); - // This file's functions. static void sub_81B99D4(void); static void sub_81B9A28(void); diff --git a/src/battle_tower.c b/src/battle_tower.c index 000a03a5b..165b6bf64 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -28,8 +28,6 @@ #include "constants/moves.h" #include "constants/species.h" -extern u16 gUnknown_03006298[]; - extern void sub_81A4C30(void); extern const u8 *const *const gUnknown_085DD690[]; @@ -68,6 +66,9 @@ extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_224166[]; EWRAM_DATA const struct BattleFrontierTrainer *gFacilityTrainers = NULL; EWRAM_DATA const struct FacilityMon *gFacilityTrainerMons = NULL; +// IWRAM common +u16 gUnknown_03006298[4]; + // This file's functions. static void sub_8161F94(void); static void sub_8162054(void); diff --git a/src/berry_blender.c b/src/berry_blender.c index fca544e03..7320e905f 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -33,6 +33,7 @@ #include "item_menu.h" #include "battle_records.h" #include "graphics.h" +#include "new_game.h" #define BLENDER_SCORE_BEST 0 #define BLENDER_SCORE_GOOD 1 @@ -132,8 +133,6 @@ struct BerryBlenderData extern struct MusicPlayerInfo gMPlayInfo_SE2; extern struct MusicPlayerInfo gMPlayInfo_BGM; -extern u8 gInGameOpponentsNo; -extern u8 gUnknown_020322D5; // text extern const u8 gText_SavingDontTurnOff2[]; @@ -195,18 +194,21 @@ static void sub_8083170(u16 a0, u16 a1); static void Blender_PrintMadePokeblockString(struct Pokeblock *pokeblock, u8 *dst); static bool32 TryAddContestLinkTvShow(struct Pokeblock *pokeblock, struct TvBlenderStruct *a1); -// ewram +// EWRAM EWRAM_DATA static struct BerryBlenderData *sBerryBlenderData = NULL; EWRAM_DATA static s32 sUnknown_020322A8[5] = {0}; EWRAM_DATA static s32 sUnknown_020322BC[5] = {0}; EWRAM_DATA static u32 sUnknown_020322D0 = 0; -// iwram +// IWRAM bss IWRAM_DATA static s16 sUnknown_03000DE8[8]; IWRAM_DATA static s16 sUnknown_03000DF8[6]; IWRAM_DATA static s16 sUnknown_03000E04; IWRAM_DATA static s16 sUnknown_03000E06; +// IWRAM common +u8 gInGameOpponentsNo; + // rom static const u16 sBlenderCenterPal[] = INCBIN_U16("graphics/berry_blender/center.gbapal"); diff --git a/src/contest_painting.c b/src/contest_painting.c new file mode 100644 index 000000000..7950b7cac --- /dev/null +++ b/src/contest_painting.c @@ -0,0 +1,8 @@ +#include "global.h" + +// IWRAM bss +IWRAM_DATA u8 gUnknown_030011F0; +IWRAM_DATA u16 gUnknown_030011F2; +IWRAM_DATA u16 gUnknown_030011F4; +IWRAM_DATA u8 gUnknown_030011F6; +IWRAM_DATA u8 gUnknown_030011F7; diff --git a/src/easy_chat.c b/src/easy_chat.c index 7d25d1430..e4233fb7f 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -13,6 +13,7 @@ #include "palette.h" #include "event_data.h" #include "easy_chat.h" +#include "string_util.h" // Static type declarations diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c index c9b91f97f..f796ecea6 100644 --- a/src/fldeff_strength.c +++ b/src/fldeff_strength.c @@ -5,6 +5,7 @@ #include "party_menu.h" #include "rom6.h" #include "script.h" +#include "string_util.h" #include "task.h" #include "constants/event_objects.h" #include "constants/field_effects.h" diff --git a/src/fossil_specials.c b/src/fossil_specials.c index 49db0f5b6..8164a3a78 100644 --- a/src/fossil_specials.c +++ b/src/fossil_specials.c @@ -17,29 +17,32 @@ #include "task.h" #include "window.h" -#define MIRAGE_TOWER_GFX_LENGTH (sizeof(gUnknown_08617274) + sizeof(gMirageTower_Gfx)) +#define MIRAGE_TOWER_GFX_LENGTH (32 + sizeof(gMirageTower_Gfx)) #define MIRAGE_TOWER_PALETTE_LENGTH 0x800 #define ROOT_FOSSIL_GFX_LENGTH sizeof(gRootFossil_Gfx) #define ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH 0x100 -//struct -struct Struct8617DA4 { +struct Struct8617DA4 +{ u8 x; u8 y; u16 tileId; }; -struct Struct203CF10 { +struct Struct203CF10 +{ u8 *buffer; - u8 curr_buffer_index; + u8 currIndex; }; -struct DynamicSpriteFrameImage{ +struct DynamicSpriteFrameImage +{ u8 *data; u16 size; }; -struct Struct203CF0C { +struct Struct203CF0C +{ u8 *frameImageTiles; struct DynamicSpriteFrameImage *frameImage; u8 spriteId; @@ -52,10 +55,10 @@ static void sub_81BED50(u8 taskId); static void sub_81BEBF4(u8 taskId); static void sub_81BF028(u8 taskId); static void sub_81BF248(struct Sprite *); -/*static*/ void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e); +static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e); // .rodata -static const u8 gUnknown_08617274[] = {00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}; +static const u8 gUnknown_08617274[32] = {0}; static const u8 gMirageTower_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower.4bpp"); static const u16 gUnknown_08617B94[] = INCBIN_U16("graphics/misc/mirage_tower.bin"); static const u16 gRootFossil_Pal[] = INCBIN_U16("graphics/misc/fossil.gbapal"); @@ -64,16 +67,16 @@ static const u8 gMirageTowerCrumbles_Gfx[] = INCBIN_U8("graphics/misc/mirage_tow static const u16 gMirageTowerCrumbles_Palette[] = INCBIN_U16("graphics/misc/mirage_tower_crumbles.gbapal"); const s16 gUnknown_08617D64[][3] = - { - { 0, 10, 65}, - { 17, 3, 50}, - {-12, 0, 75}, - { 10, 15, 90}, - { 7, 8, 65}, - {-18, 5, 75}, - { 22, -10, 55}, - {-24, -4, 65}, - }; +{ + { 0, 10, 65}, + { 17, 3, 50}, + {-12, 0, 75}, + { 10, 15, 90}, + { 7, 8, 65}, + {-18, 5, 75}, + { 22, -10, 55}, + {-24, -4, 65}, +}; const struct SpriteSheet gUnknown_08617D94[] = { @@ -82,26 +85,26 @@ const struct SpriteSheet gUnknown_08617D94[] = }; static const struct Struct8617DA4 gUnknown_08617DA4[] = - { - {0x12, 0x35, 0x251}, - {0x13, 0x35, 0x251}, - {0x14, 0x35, 0x251}, - {0x12, 0x36, 0x251}, - {0x13, 0x36, 0x251}, - {0x14, 0x36, 0x251}, - {0x12, 0x37, 0x251}, - {0x13, 0x37, 0x251}, - {0x14, 0x37, 0x251}, - {0x12, 0x38, 0x251}, - {0x13, 0x38, 0x251}, - {0x14, 0x38, 0x251}, - {0x12, 0x39, 0x259}, - {0x13, 0x39, 0x259}, - {0x14, 0x39, 0x259}, - {0x12, 0x3A, 0x121}, - {0x13, 0x3A, 0x121}, - {0x14, 0x3A, 0x121}, - }; +{ + {0x12, 0x35, 0x251}, + {0x13, 0x35, 0x251}, + {0x14, 0x35, 0x251}, + {0x12, 0x36, 0x251}, + {0x13, 0x36, 0x251}, + {0x14, 0x36, 0x251}, + {0x12, 0x37, 0x251}, + {0x13, 0x37, 0x251}, + {0x14, 0x37, 0x251}, + {0x12, 0x38, 0x251}, + {0x13, 0x38, 0x251}, + {0x14, 0x38, 0x251}, + {0x12, 0x39, 0x259}, + {0x13, 0x39, 0x259}, + {0x14, 0x39, 0x259}, + {0x12, 0x3A, 0x121}, + {0x13, 0x3A, 0x121}, + {0x14, 0x3A, 0x121}, +}; static const union AnimCmd gSpriteAnim_8617DEC[] = { @@ -131,67 +134,70 @@ static const union AnimCmd *const gSpriteAnimTable_8617DFC[] = gSpriteAnim_8617DEC, }; -static const struct SpriteTemplate gUnknown_08617E00 = { +static const struct SpriteTemplate gUnknown_08617E00 = +{ 0xFFFF, 0xFFFF, &gOamData_8617DF4, gSpriteAnimTable_8617DFC, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; -// ewram -EWRAM_DATA u8* gUnknown_0203CF04 = NULL; -EWRAM_DATA u8* gUnknown_0203CF08 = NULL; -EWRAM_DATA struct Struct203CF0C *gUnknown_0203CF0C = NULL; -EWRAM_DATA struct Struct203CF10 *gUnknown_0203CF10 = NULL; -EWRAM_DATA u16 *gUnknown_0203CF14 = NULL; +// EWRAM +EWRAM_DATA static u8* sUnknown_0203CF04 = NULL; +EWRAM_DATA static u8* sUnknown_0203CF08 = NULL; +EWRAM_DATA static struct Struct203CF0C *sUnknown_0203CF0C = NULL; +EWRAM_DATA static struct Struct203CF10 *sUnknown_0203CF10 = NULL; +EWRAM_DATA static u16 *sUnknown_0203CF14 = NULL; -// iwram -IWRAM_DATA u16 gUnknown_030012A8[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +// IWRAM bss +IWRAM_DATA static u16 gUnknown_030012A8[8]; // text void sub_81BEB24(void) { u8 i; - for(i = 0; i < (sizeof(gUnknown_08617DA4)/sizeof(gUnknown_08617DA4[0])); i++) + for (i = 0; i < (sizeof(gUnknown_08617DA4)/sizeof(gUnknown_08617DA4[0])); i++) MapGridSetMetatileIdAt(gUnknown_08617DA4[i].x + 7, gUnknown_08617DA4[i].y + 7, gUnknown_08617DA4[i].tileId); DrawWholeMapView(); } void sub_81BEB54(void) { - CreateTask(sub_81BED50, 0x9); + CreateTask(sub_81BED50, 9); } void sub_81BEB68(void) { - CreateTask(sub_81BEBF4, 0x9); + CreateTask(sub_81BEBF4, 9); } void sub_81BEB7C(void) { - CreateTask(sub_81BF028, 0x9); + CreateTask(sub_81BF028, 9); } void sub_81BEB90(void) { - SetGpuReg(REG_OFFSET_BG0HOFS, gUnknown_0203CF14[0]); - SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_0203CF14[1]); + SetGpuReg(REG_OFFSET_BG0HOFS, sUnknown_0203CF14[0]); + SetGpuReg(REG_OFFSET_BG0VOFS, sUnknown_0203CF14[1]); } void sub_81BEBB4(u8 taskId) { - if(!(gTasks[taskId].data[0])) + if (!(gTasks[taskId].data[0])) { - gUnknown_0203CF14[0] = -gUnknown_0203CF14[0]; + sUnknown_0203CF14[0] = -sUnknown_0203CF14[0]; gTasks[taskId].data[0] = 2; sub_81BEB90(); } else + { gTasks[taskId].data[0]--; + } } static void sub_81BEBF4(u8 taskId) { u8 zero; - switch(gTasks[taskId].data[0]) + switch (gTasks[taskId].data[0]) { case 0: FreeAllWindowBuffers(); @@ -199,19 +205,19 @@ static void sub_81BEBF4(u8 taskId) gTasks[taskId].data[0]++; break; case 1: - gUnknown_0203CF04 = (u8 *)AllocZeroed(MIRAGE_TOWER_GFX_LENGTH); - gUnknown_0203CF08 = (u8 *)AllocZeroed(MIRAGE_TOWER_PALETTE_LENGTH); + sUnknown_0203CF04 = (u8 *)AllocZeroed(MIRAGE_TOWER_GFX_LENGTH); + sUnknown_0203CF08 = (u8 *)AllocZeroed(MIRAGE_TOWER_PALETTE_LENGTH); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); gTasks[taskId].data[0]++; break; case 2: - CpuSet(gUnknown_08617274, gUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH / 2); - LoadBgTiles(0, gUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0); + CpuSet(gUnknown_08617274, sUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH / 2); + LoadBgTiles(0, sUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0); gTasks[taskId].data[0]++; break; case 3: - SetBgTilemapBuffer(0, gUnknown_0203CF08); + SetBgTilemapBuffer(0, sUnknown_0203CF08); CopyToBgTilemapBufferRect_ChangePalette(0, &gUnknown_08617B94, 12, 29, 6, 12, 17); CopyBgTilemapBufferToVram(0); gTasks[taskId].data[0]++; @@ -225,10 +231,10 @@ static void sub_81BEBF4(u8 taskId) gTasks[taskId].data[0]++; break; case 6: - gUnknown_0203CF14 = (u16 *)Alloc(4); + sUnknown_0203CF14 = Alloc(4); zero = 0; - gUnknown_0203CF14[0] = 2; - gUnknown_0203CF14[1] = zero; + sUnknown_0203CF14[0] = 2; + sUnknown_0203CF14[1] = zero; CreateTask(sub_81BEBB4, 0xA); DestroyTask(taskId); EnableBothScriptContexts(); @@ -236,86 +242,76 @@ static void sub_81BEBF4(u8 taskId) } } -#ifdef NONMATCHING #define OUTER_BUFFER_LENGTH 0x60 #define INNER_BUFFER_LENGTH 0x30 static void sub_81BED50(u8 taskId) { u8 anotherTaskId, j; + u16 i; + u8 index; - - switch(gTasks[taskId].data[0]) + switch (gTasks[taskId].data[0]) { case 1: - gUnknown_0203CF10 = (struct Struct203CF10 *)AllocZeroed(OUTER_BUFFER_LENGTH * sizeof(struct Struct203CF10)); + sUnknown_0203CF10 = AllocZeroed(OUTER_BUFFER_LENGTH * sizeof(struct Struct203CF10)); break; case 3: + if (gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1)) { - u16 i; - u16 left; - u32 index, next; - - index = (u16)gTasks[taskId].data[3]; - if(gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1)) + if (gTasks[taskId].data[1] > 1) { - if(gTasks[taskId].data[1] > 1) + index = gTasks[taskId].data[3]; + sUnknown_0203CF10[index].buffer = Alloc(INNER_BUFFER_LENGTH); + for (i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++) + sUnknown_0203CF10[index].buffer[i] = i; + for (i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++) { - index = (u8)index; - gUnknown_0203CF10[index].buffer = (u8 *)Alloc(INNER_BUFFER_LENGTH); - for(i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++) - gUnknown_0203CF10[index].buffer[i] = i; - for(i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++) - { - u16 rand1, rand2, temp; - - rand1 = Random() % 0x30; - rand2 = Random() % 0x30; - temp = gUnknown_0203CF10[index].buffer[rand2]; - gUnknown_0203CF10[index].buffer[rand2] = gUnknown_0203CF10[index].buffer[rand1]; - gUnknown_0203CF10[index].buffer[rand1] = temp; - } - if(gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1)) - gTasks[taskId].data[3]++; - gTasks[taskId].data[1] = 0; + u16 rand1, rand2, temp; + + rand1 = Random() % 0x30; + rand2 = Random() % 0x30; + SWAP(sUnknown_0203CF10[index].buffer[rand2], sUnknown_0203CF10[index].buffer[rand1], temp); } - gTasks[taskId].data[1]++; + if (gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1)) + gTasks[taskId].data[3]++; + gTasks[taskId].data[1] = 0; } - index = (u8)gTasks[taskId].data[3]; - for(left = (u8)gTasks[taskId].data[2]; left < (u16)index; left = next) + gTasks[taskId].data[1]++; + } + index = gTasks[taskId].data[3]; + for (i = (u8)(gTasks[taskId].data[2]); i < index; i++) + { + for (j = 0; j < 1; j++) { - j = 0; - next = left + 1; - while(!j) - { - sub_81BF2B8(gUnknown_0203CF04, ((((OUTER_BUFFER_LENGTH - 1) - left) * INNER_BUFFER_LENGTH) + gUnknown_0203CF10[left].buffer[(gUnknown_0203CF10[left].curr_buffer_index)++]), 0, INNER_BUFFER_LENGTH, 1); - j++; - } - if(gUnknown_0203CF10[left].curr_buffer_index > (INNER_BUFFER_LENGTH - 1)) - { - FREE_AND_SET_NULL(gUnknown_0203CF10[left].buffer); - gTasks[taskId].data[2]++; - if((left % 2) == 1) - gUnknown_0203CF14[1]--; - } + sub_81BF2B8(sUnknown_0203CF04, + ((((OUTER_BUFFER_LENGTH - 1) - i) * INNER_BUFFER_LENGTH) + sUnknown_0203CF10[i].buffer[(sUnknown_0203CF10[i].currIndex)++]), + 0, INNER_BUFFER_LENGTH, 1); + } + if (sUnknown_0203CF10[i].currIndex > (INNER_BUFFER_LENGTH - 1)) + { + FREE_AND_SET_NULL(sUnknown_0203CF10[i].buffer); + gTasks[taskId].data[2]++; + if ((i % 2) == 1) + sUnknown_0203CF14[1]--; } - LoadBgTiles(0, gUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0); - if(gUnknown_0203CF10[OUTER_BUFFER_LENGTH - 1].curr_buffer_index > (INNER_BUFFER_LENGTH - 1)) - break; - return; } + LoadBgTiles(0, sUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0); + if (sUnknown_0203CF10[OUTER_BUFFER_LENGTH - 1].currIndex > (INNER_BUFFER_LENGTH - 1)) + break; + return; case 4: UnsetBgTilemapBuffer(0); anotherTaskId = FindTaskIdByFunc(sub_81BEBB4); - if(anotherTaskId != 0xFF) + if (anotherTaskId != 0xFF) DestroyTask(anotherTaskId); - gUnknown_0203CF14[1] = gUnknown_0203CF14[0] = 0; + sUnknown_0203CF14[1] = sUnknown_0203CF14[0] = 0; sub_81BEB90(); break; case 5: - FREE_AND_SET_NULL(gUnknown_0203CF14); - FREE_AND_SET_NULL(gUnknown_0203CF10); - FREE_AND_SET_NULL(gUnknown_0203CF04); - FREE_AND_SET_NULL(gUnknown_0203CF08); + FREE_AND_SET_NULL(sUnknown_0203CF14); + FREE_AND_SET_NULL(sUnknown_0203CF10); + FREE_AND_SET_NULL(sUnknown_0203CF04); + FREE_AND_SET_NULL(sUnknown_0203CF08); break; case 6: SetGpuRegBits(REG_OFFSET_BG2CNT, 0x2); @@ -334,423 +330,75 @@ static void sub_81BED50(u8 taskId) gTasks[taskId].data[0]++; } -#else -NAKED -static void sub_81BED50(u8 taskId) -{ - asm("\n\ - .syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x10\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - ldr r1, =gTasks\n\ - lsls r0, 2\n\ - add r0, r10\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x8]\n\ - subs r0, 0x1\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - adds r6, r1, 0\n\ - cmp r0, 0x7\n\ - bls _081BED7C\n\ - b _081BF002\n\ - _081BED7C:\n\ - lsls r0, 2\n\ - ldr r1, =_081BED90\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .pool\n\ - .align 2, 0\n\ - _081BED90:\n\ - .4byte _081BEDB0\n\ - .4byte _081BF002\n\ - .4byte _081BEDC4\n\ - .4byte _081BEF64\n\ - .4byte _081BEF94\n\ - .4byte _081BEFD0\n\ - .4byte _081BEFF0\n\ - .4byte _081BEFF8\n\ - _081BEDB0:\n\ - ldr r4, =gUnknown_0203CF10\n\ - movs r0, 0xC0\n\ - lsls r0, 2\n\ - bl AllocZeroed\n\ - str r0, [r4]\n\ - b _081BF002\n\ - .pool\n\ - _081BEDC4:\n\ - mov r1, r10\n\ - lsls r0, r1, 2\n\ - adds r1, r0, r1\n\ - lsls r1, 3\n\ - adds r2, r1, r6\n\ - ldrh r3, [r2, 0xE]\n\ - movs r4, 0xE\n\ - ldrsh r1, [r2, r4]\n\ - str r0, [sp, 0x8]\n\ - cmp r1, 0x5F\n\ - bgt _081BEE8A\n\ - movs r1, 0xA\n\ - ldrsh r0, [r2, r1]\n\ - cmp r0, 0x1\n\ - ble _081BEE7C\n\ - lsls r0, r3, 24\n\ - lsrs r4, r0, 24\n\ - movs r0, 0x30\n\ - bl Alloc\n\ - ldr r3, =gUnknown_0203CF10\n\ - ldr r1, [r3]\n\ - lsls r2, r4, 3\n\ - adds r1, r2, r1\n\ - str r0, [r1]\n\ - movs r5, 0\n\ - adds r4, r2, 0\n\ - _081BEDFA:\n\ - ldr r0, [r3]\n\ - adds r0, r4, r0\n\ - ldr r0, [r0]\n\ - adds r0, r5\n\ - strb r5, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - cmp r5, 0x2F\n\ - bls _081BEDFA\n\ - movs r5, 0\n\ - ldr r7, =gUnknown_0203CF10\n\ - adds r6, r2, 0\n\ - _081BEE14:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x30\n\ - bl __umodsi3\n\ - adds r4, r0, 0\n\ - lsls r4, 16\n\ - lsrs r4, 16\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x30\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - ldr r1, [r7]\n\ - adds r1, r6, r1\n\ - ldr r1, [r1]\n\ - adds r0, r1, r0\n\ - ldrb r2, [r0]\n\ - adds r1, r4 \n\ - ldrb r1, [r1]\n\ - strb r1, [r0]\n\ - ldr r0, [r7]\n\ - adds r0, r6, r0\n\ - ldr r0, [r0]\n\ - adds r0, r4\n\ - strb r2, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - cmp r5, 0x2F\n\ - bls _081BEE14\n\ - ldr r0, =gTasks\n\ - ldr r1, [sp, 0x8]\n\ - add r1, r10\n\ - lsls r1, 3\n\ - adds r2, r1, r0\n\ - ldrh r3, [r2, 0xE]\n\ - movs r4, 0xE\n\ - ldrsh r1, [r2, r4]\n\ - adds r6, r0, 0\n\ - cmp r1, 0x5F\n\ - bgt _081BEE78\n\ - adds r0, r3, 0x1\n\ - strh r0, [r2, 0xE]\n\ - _081BEE78:\n\ - movs r0, 0\n\ - strh r0, [r2, 0xA]\n\ - _081BEE7C:\n\ - ldr r1, [sp, 0x8]\n\ - add r1, r10\n\ - lsls r1, 3\n\ - adds r1, r6\n\ - ldrh r0, [r1, 0xA]\n\ - adds r0, 0x1\n\ - strh r0, [r1, 0xA]\n\ - _081BEE8A:\n\ - ldr r0, [sp, 0x8]\n\ - add r0, r10\n\ - lsls r0, 3\n\ - adds r0, r6\n\ - ldrb r4, [r0, 0xE]\n\ - ldrb r5, [r0, 0xC]\n\ - lsls r0, r4, 16\n\ - cmp r5, r4\n\ - bcs _081BEF32\n\ - str r0, [sp, 0xC]\n\ - _081BEE9E:\n\ - movs r6, 0\n\ - adds r0, r5, 0x1\n\ - str r0, [sp, 0x4]\n\ - lsls r4, r5, 3\n\ - movs r2, 0x5F\n\ - subs r1, r2, r5\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 4\n\ - mov r9, r0\n\ - _081BEEB2:\n\ - ldr r0, =gUnknown_0203CF04\n\ - ldr r0, [r0]\n\ - ldr r7, =gUnknown_0203CF10\n\ - ldr r3, [r7]\n\ - adds r3, r4, r3\n\ - ldrb r2, [r3, 0x4]\n\ - adds r1, r2, 0x1\n\ - strb r1, [r3, 0x4]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - ldr r1, [r3]\n\ - adds r1, r2\n\ - ldrb r1, [r1]\n\ - add r1, r9\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - movs r2, 0x1\n\ - mov r8, r2\n\ - str r2, [sp]\n\ - movs r2, 0\n\ - movs r3, 0x30\n\ - bl sub_81BF2B8\n\ - adds r0, r6, 0x1\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - cmp r6, 0\n\ - beq _081BEEB2\n\ - ldr r0, [r7]\n\ - adds r1, r4, r0\n\ - ldrb r0, [r1, 0x4]\n\ - cmp r0, 0x2F\n\ - bls _081BEF24\n\ - ldr r0, [r1]\n\ - bl Free\n\ - ldr r0, [r7]\n\ - adds r0, r4, r0\n\ - movs r1, 0\n\ - str r1, [r0]\n\ - ldr r1, [sp, 0x8]\n\ - add r1, r10\n\ - lsls r1, 3\n\ - ldr r4, =gTasks\n\ - adds r1, r4\n\ - ldrh r0, [r1, 0xC]\n\ - adds r0, 0x1\n\ - strh r0, [r1, 0xC]\n\ - mov r0, r8\n\ - ands r5, r0\n\ - cmp r5, 0x1\n\ - bne _081BEF24\n\ - ldr r0, =gUnknown_0203CF14\n\ - ldr r1, [r0]\n\ - ldrh r0, [r1, 0x2]\n\ - subs r0, 0x1\n\ - strh r0, [r1, 0x2]\n\ - _081BEF24:\n\ - ldr r1, [sp, 0x4]\n\ - lsls r0, r1, 16\n\ - lsrs r5, r0, 16\n\ - ldr r2, [sp, 0xC]\n\ - lsrs r0, r2, 16\n\ - cmp r5, r0\n\ - bcc _081BEE9E\n\ - _081BEF32:\n\ - ldr r0, =gUnknown_0203CF04\n\ - ldr r1, [r0]\n\ - movs r2, 0x92\n\ - lsls r2, 4\n\ - movs r0, 0\n\ - movs r3, 0\n\ - bl LoadBgTiles\n\ - ldr r0, =gUnknown_0203CF10\n\ - ldr r0, [r0]\n\ - movs r4, 0xBE\n\ - lsls r4, 2\n\ - adds r0, r4\n\ - ldrb r0, [r0, 0x4]\n\ - cmp r0, 0x2F\n\ - bhi _081BF002\n\ - b _081BF014\n\ - .pool\n\ - _081BEF64:\n\ - movs r0, 0\n\ - bl UnsetBgTilemapBuffer\n\ - ldr r0, =sub_81BEBB4\n\ - bl FindTaskIdByFunc\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0xFF\n\ - beq _081BEF7C\n\ - bl DestroyTask\n\ - _081BEF7C:\n\ - ldr r0, =gUnknown_0203CF14\n\ - ldr r1, [r0]\n\ - movs r0, 0\n\ - strh r0, [r1]\n\ - strh r0, [r1, 0x2]\n\ - bl sub_81BEB90\n\ - b _081BF002\n\ - .pool\n\ - _081BEF94:\n\ - ldr r4, =gUnknown_0203CF14\n\ - ldr r0, [r4]\n\ - bl Free\n\ - movs r5, 0\n\ - str r5, [r4]\n\ - ldr r4, =gUnknown_0203CF10\n\ - ldr r0, [r4]\n\ - bl Free\n\ - str r5, [r4]\n\ - ldr r4, =gUnknown_0203CF04\n\ - ldr r0, [r4]\n\ - bl Free\n\ - str r5, [r4]\n\ - ldr r4, =gUnknown_0203CF08\n\ - ldr r0, [r4]\n\ - bl Free\n\ - str r5, [r4]\n\ - b _081BF002\n\ - .pool\n\ - _081BEFD0:\n\ - movs r0, 0xC\n\ - movs r1, 0x2\n\ - bl SetGpuRegBits\n\ - movs r0, 0x8\n\ - movs r1, 0\n\ - bl SetGpuRegBits\n\ - movs r0, 0\n\ - movs r1, 0x7\n\ - movs r2, 0\n\ - bl SetBgAttribute\n\ - bl sub_81971D0\n\ - b _081BF002\n\ - _081BEFF0:\n\ - movs r0, 0\n\ - bl ShowBg\n\ - b _081BF002\n\ - _081BEFF8:\n\ - mov r0, r10\n\ - bl DestroyTask\n\ - bl EnableBothScriptContexts\n\ - _081BF002:\n\ - ldr r0, =gTasks\n\ - mov r2, r10\n\ - lsls r1, r2, 2\n\ - add r1, r10\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldrh r0, [r1, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r1, 0x8]\n\ - _081BF014:\n\ - add sp, 0x10\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - .syntax divided"); -} -#endif // NONMATCHING - static void sub_81BF028(u8 taskId) { u16 i; + u8 *buffer; - switch(gTasks[taskId].data[0]) + switch (gTasks[taskId].data[0]) { case 1: - gUnknown_0203CF0C = (struct Struct203CF0C *)AllocZeroed(sizeof(struct Struct203CF0C)); - gUnknown_0203CF0C->frameImageTiles = (u8 *)AllocZeroed(ROOT_FOSSIL_GFX_LENGTH); - gUnknown_0203CF0C->frameImage = (struct DynamicSpriteFrameImage *) AllocZeroed(sizeof(struct DynamicSpriteFrameImage)); - gUnknown_0203CF0C->unkC = (u16 *)AllocZeroed(ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)); - gUnknown_0203CF0C->unk10 = 0; + sUnknown_0203CF0C = AllocZeroed(sizeof(*sUnknown_0203CF0C)); + sUnknown_0203CF0C->frameImageTiles = AllocZeroed(ROOT_FOSSIL_GFX_LENGTH); + sUnknown_0203CF0C->frameImage = AllocZeroed(sizeof(*sUnknown_0203CF0C->frameImage)); + sUnknown_0203CF0C->unkC = AllocZeroed(ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)); + sUnknown_0203CF0C->unk10 = 0; break; case 2: - { - u8 *buffer; - buffer = gUnknown_0203CF0C->frameImageTiles; - for(i = 0; i < ROOT_FOSSIL_GFX_LENGTH; i++, buffer++) - *buffer = gRootFossil_Gfx[i]; - } + buffer = sUnknown_0203CF0C->frameImageTiles; + for (i = 0; i < ROOT_FOSSIL_GFX_LENGTH; i++, buffer++) + *buffer = gRootFossil_Gfx[i]; break; case 3: - gUnknown_0203CF0C->frameImage->data = gUnknown_0203CF0C->frameImageTiles; - gUnknown_0203CF0C->frameImage->size = ROOT_FOSSIL_GFX_LENGTH; + sUnknown_0203CF0C->frameImage->data = sUnknown_0203CF0C->frameImageTiles; + sUnknown_0203CF0C->frameImage->size = ROOT_FOSSIL_GFX_LENGTH; break; case 4: { - u8 spriteId, zero; struct SpriteTemplate fossilTemplate; fossilTemplate = gUnknown_08617E00; - fossilTemplate.images = (struct SpriteFrameImage *)(gUnknown_0203CF0C->frameImage); - spriteId = CreateSprite(&fossilTemplate, 128, -16, 1); - gUnknown_0203CF0C->spriteId = spriteId; - zero = 0; - gSprites[gUnknown_0203CF0C->spriteId].centerToCornerVecX = zero; - gSprites[gUnknown_0203CF0C->spriteId].data[0] = gSprites[gUnknown_0203CF0C->spriteId].pos1.x; - gSprites[gUnknown_0203CF0C->spriteId].data[1] = 1; + fossilTemplate.images = (struct SpriteFrameImage *)(sUnknown_0203CF0C->frameImage); + sUnknown_0203CF0C->spriteId = CreateSprite(&fossilTemplate, 128, -16, 1); + gSprites[sUnknown_0203CF0C->spriteId].centerToCornerVecX = 0; + gSprites[sUnknown_0203CF0C->spriteId].data[0] = gSprites[sUnknown_0203CF0C->spriteId].pos1.x; + gSprites[sUnknown_0203CF0C->spriteId].data[1] = 1; } case 5: - for(i = 0; i < ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH; i++) - gUnknown_0203CF0C->unkC[i] = i; + for (i = 0; i < ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH; i++) + sUnknown_0203CF0C->unkC[i] = i; break; case 6: + for (i = 0; i < (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)); i++) { - u16 rand1, rand2, temp, j; - j = (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)) - 1; - for(i = 0; i <= j; i++) - { - rand1 = Random() % 0x100; - rand2 = Random() % 0x100; - j = (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)) - 1; - temp = gUnknown_0203CF0C->unkC[rand2]; - gUnknown_0203CF0C->unkC[rand2] = gUnknown_0203CF0C->unkC[rand1]; - gUnknown_0203CF0C->unkC[rand1] = temp; - } - gSprites[gUnknown_0203CF0C->spriteId].callback = sub_81BF248; - break; + u16 rand1, rand2, temp; + + rand1 = Random() % 0x100; + rand2 = Random() % 0x100; + SWAP(sUnknown_0203CF0C->unkC[rand2], sUnknown_0203CF0C->unkC[rand1], temp); } + gSprites[sUnknown_0203CF0C->spriteId].callback = sub_81BF248; + break; case 7: - if(gSprites[gUnknown_0203CF0C->spriteId].callback != SpriteCallbackDummy) + if (gSprites[sUnknown_0203CF0C->spriteId].callback != SpriteCallbackDummy) return; - DestroySprite(&gSprites[gUnknown_0203CF0C->spriteId]); - FREE_AND_SET_NULL(gUnknown_0203CF0C->unkC);; - FREE_AND_SET_NULL(gUnknown_0203CF0C->frameImage); - FREE_AND_SET_NULL(gUnknown_0203CF0C->frameImageTiles); - FREE_AND_SET_NULL(gUnknown_0203CF0C); + DestroySprite(&gSprites[sUnknown_0203CF0C->spriteId]); + FREE_AND_SET_NULL(sUnknown_0203CF0C->unkC);; + FREE_AND_SET_NULL(sUnknown_0203CF0C->frameImage); + FREE_AND_SET_NULL(sUnknown_0203CF0C->frameImageTiles); + FREE_AND_SET_NULL(sUnknown_0203CF0C); break; case 8: EnableBothScriptContexts(); + break; } - ++gTasks[taskId].data[0]; + + gTasks[taskId].data[0]++; } static void sub_81BF248(struct Sprite *sprite) { - if (gUnknown_0203CF0C->unk10 >= (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH)) + if (sUnknown_0203CF0C->unk10 >= (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH)) { sprite->callback = SpriteCallbackDummy; } @@ -759,7 +407,7 @@ static void sub_81BF248(struct Sprite *sprite) u8 i; for (i = 0; i < 2; i++) { - sub_81BF2B8(gUnknown_0203CF0C->frameImageTiles, gUnknown_0203CF0C->unkC[gUnknown_0203CF0C->unk10++], 0, 16, 0); + sub_81BF2B8(sUnknown_0203CF0C->frameImageTiles, sUnknown_0203CF0C->unkC[sUnknown_0203CF0C->unk10++], 0, 16, 0); } StartSpriteAnim(sprite, 0); } @@ -768,3 +416,146 @@ static void sub_81BF248(struct Sprite *sprite) sprite->pos1.y++; } } + +#ifdef NONMATCHING +static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e) +{ + u8 r5, r4, r0, r2; + u16 var; + + r4 = r5 = b / d; + gUnknown_030012A8[0] = r4; + + r0 = r2 = b % d; + gUnknown_030012A8[1] = r2; + + r4 &= 7; + r2 &= 7; + gUnknown_030012A8[2] = r4; + gUnknown_030012A8[3] = r2; + + r0 /= 8; + r5 /= 8; + gUnknown_030012A8[4] = r0; + gUnknown_030012A8[5] = r5; + + var = ((d / 8) * (r5 * 64)) + (r0 * 64); + gUnknown_030012A8[6] = var; + + var += (r4 * 8) + r2; + gUnknown_030012A8[7] = var; + + // This part is non-matching. 99% sure it IS functionally equivalent, though. + b = (b & 1) ^ 1; + c = (c << ((b) << 2)) | (15 << ((b ^ 1) << 2)); + + a[(var / 2) + (e * 32)] &= c; +} + +#else +NAKED +static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + str r0, [sp]\n\ + mov r10, r1\n\ + adds r6, r2, 0\n\ + mov r8, r3\n\ + ldr r0, [sp, 0x28]\n\ + mov r9, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + mov r10, r1\n\ + lsls r6, 24\n\ + lsrs r6, 24\n\ + mov r0, r8\n\ + lsls r0, 24\n\ + mov r8, r0\n\ + lsrs r7, r0, 24\n\ + mov r1, r9\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r9, r1\n\ + mov r0, r10\n\ + adds r1, r7, 0\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ + lsls r5, 24\n\ + lsrs r4, r5, 24\n\ + ldr r3, =gUnknown_030012A8\n\ + strh r4, [r3]\n\ + mov r0, r10\n\ + adds r1, r7, 0\n\ + str r3, [sp, 0x4]\n\ + bl __modsi3\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + ldr r3, [sp, 0x4]\n\ + strh r2, [r3, 0x2]\n\ + movs r1, 0x7\n\ + ands r4, r1\n\ + ands r2, r1\n\ + strh r4, [r3, 0x4]\n\ + strh r2, [r3, 0x6]\n\ + lsrs r0, 27\n\ + lsrs r5, 27\n\ + strh r0, [r3, 0x8]\n\ + strh r5, [r3, 0xA]\n\ + mov r1, r8\n\ + lsrs r1, 27\n\ + lsls r1, 6\n\ + mov r8, r1\n\ + mov r1, r8\n\ + muls r1, r5\n\ + lsls r0, 6\n\ + adds r1, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + strh r1, [r3, 0xC]\n\ + lsls r4, 3\n\ + adds r4, r2\n\ + adds r1, r4\n\ + lsls r4, r1, 16\n\ + lsrs r4, 17\n\ + strh r1, [r3, 0xE]\n\ + movs r1, 0x1\n\ + mov r0, r10\n\ + ands r1, r0\n\ + movs r2, 0x1\n\ + eors r1, r2\n\ + lsls r0, r1, 2\n\ + lsls r6, r0\n\ + eors r1, r2\n\ + lsls r1, 2\n\ + movs r0, 0xF\n\ + lsls r0, r1\n\ + orrs r6, r0\n\ + lsls r6, 24\n\ + lsrs r6, 24\n\ + mov r1, r9\n\ + lsls r1, 5\n\ + mov r9, r1\n\ + add r9, r4\n\ + ldr r1, [sp]\n\ + add r1, r9\n\ + ldrb r0, [r1]\n\ + ands r6, r0\n\ + strb r6, [r1]\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + "); +} +#endif // NONMATCHING diff --git a/src/mossdeep_gym.c b/src/mossdeep_gym.c new file mode 100644 index 000000000..cd377ad83 --- /dev/null +++ b/src/mossdeep_gym.c @@ -0,0 +1,313 @@ +#include "global.h" +#include "event_object_movement.h" +#include "fieldmap.h" +#include "malloc.h" +#include "mossdeep_gym.h" +#include "script_movement.h" +#include "constants/event_object_movement_constants.h" + +// Movement scripts. +extern const u8 gUnknown_08612698[]; +extern const u8 gUnknown_0861269C[]; +extern const u8 gUnknown_086126A0[]; +extern const u8 gUnknown_086126A4[]; +extern const u8 gUnknown_086126A8[]; +extern const u8 gUnknown_086126AA[]; +extern const u8 gUnknown_086126AC[]; +extern const u8 gUnknown_086126AE[]; + +struct MossdeepSubStruct +{ + u8 unk0; + u8 eventTemplateId; +}; + +struct MossdeepStruct +{ + struct MossdeepSubStruct objects[EVENT_OBJECTS_COUNT]; + u8 count; + bool8 unk41; +}; + +// This file's functions. +static void AddEventObject(u8 eventTemplateId, u8 arg1); +static void sub_81A8D94(u8 eventTemplateId, u8 arg1); + +// EWRAM vars +EWRAM_DATA static struct MossdeepStruct *gUnknown_0203CE50 = NULL; + +// code +void InitMossdeepGymTiles(bool8 arg0) +{ + if (gUnknown_0203CE50 == NULL) + gUnknown_0203CE50 = AllocZeroed(sizeof(*gUnknown_0203CE50)); + + gUnknown_0203CE50->unk41 = arg0; +} + +void FinishMossdeepGymTiles(void) +{ + u8 id; + + if (gUnknown_0203CE50 != NULL) + FREE_AND_SET_NULL(gUnknown_0203CE50); + + id = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[id]); + sub_80D338C(); +} + +u16 MossdeepGym_MoveEvents(u8 arg0) +{ + u8 i; + struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates; + u16 localId = 0; + + for (i = 0; i < EVENT_OBJECT_TEMPLATES_COUNT; i++) + { + s32 var; + u8 r5; + s16 x = events[i].x + 7; + s16 y = events[i].y + 7; + u16 metatile = MapGridGetMetatileIdAt(x, y); + + if (!gUnknown_0203CE50->unk41) + var = 0x250; + else + var = 0x298; + + if (metatile < 0x250) + continue; + + if ((u8)((metatile - var) / 8) >= 5) + continue; + if ((u8)((metatile - var) / 8) != arg0) + continue; + + r5 = (u8)((metatile - var) % 8); + if (r5 < 4) + { + s8 x = 0; + s8 y = 0; + const u8 *movementScript; + + switch (r5) + { + case 0: + movementScript = gUnknown_08612698; + x = 1; + break; + case 1: + movementScript = gUnknown_0861269C; + y = 1; + break; + case 2: + movementScript = gUnknown_086126A0; + x = -1; + break; + case 3: + movementScript = gUnknown_086126A4; + y = -1; + break; + default: + continue; + } + + events[i].x += x; + events[i].y += y; + if (GetEventObjectIdByLocalIdAndMap(events[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup) != EVENT_OBJECTS_COUNT) + { + AddEventObject(i, r5); + localId = events[i].localId; + ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); + } + else + { + sub_81A8D94(i, r5); + } + } + } + + return localId; +} + +void MossdeepGym_TurnEvents(void) +{ + u8 i; + s32 var; + struct EventObjectTemplate *events; + + if (gUnknown_0203CE50 == NULL) + return; + + if (!gUnknown_0203CE50->unk41) + var = 0x250; + else + var = 0x298; + + events = gSaveBlock1Ptr->eventObjectTemplates; + for (i = 0; i < gUnknown_0203CE50->count; i++) + { + s32 r6; + s8 r0; + u8 eventObjectId; + s16 x = events[gUnknown_0203CE50->objects[i].eventTemplateId].x + 7; + s16 y = events[gUnknown_0203CE50->objects[i].eventTemplateId].y + 7; + u16 metatile = MapGridGetMetatileIdAt(x, y); + + r0 = (u8)((metatile - var) % 8); + r0 -= (gUnknown_0203CE50->objects[i].unk0); + if (r0 < 0 || r0 == 3) + { + if (r0 == -3) + r6 = 1; + else + r6 = 0; + } + else + { + if (r0 > 0) + r6 = 1; + else + r6 = 2; + } + + eventObjectId = GetEventObjectIdByLocalIdAndMap(events[gUnknown_0203CE50->objects[i].eventTemplateId].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + if (eventObjectId != EVENT_OBJECTS_COUNT) + { + const u8 *movementScript; + u8 direction = gEventObjects[eventObjectId].facingDirection; + if (r6 == 0) + { + switch (direction) + { + case DIR_EAST: + movementScript = gUnknown_086126AE; + events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case DIR_SOUTH: + movementScript = gUnknown_086126A8; + events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + case DIR_WEST: + movementScript = gUnknown_086126AA; + events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case DIR_NORTH: + movementScript = gUnknown_086126AC; + events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + default: + continue; + } + ScriptMovement_StartObjectMovementScript(events[gUnknown_0203CE50->objects[i].eventTemplateId].localId, + gSaveBlock1Ptr->location.mapNum, + gSaveBlock1Ptr->location.mapGroup, + movementScript); + } + else if (r6 == 1) + { + switch (direction) + { + case DIR_EAST: + movementScript = gUnknown_086126AA; + events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case DIR_SOUTH: + movementScript = gUnknown_086126AC; + events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + case DIR_WEST: + movementScript = gUnknown_086126AE; + events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case DIR_NORTH: + movementScript = gUnknown_086126A8; + events[gUnknown_0203CE50->objects[i].eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + default: + continue; + } + ScriptMovement_StartObjectMovementScript(events[gUnknown_0203CE50->objects[i].eventTemplateId].localId, + gSaveBlock1Ptr->location.mapNum, + gSaveBlock1Ptr->location.mapGroup, + movementScript); + } + } + } +} + +static void AddEventObject(u8 eventTemplateId, u8 arg1) +{ + gUnknown_0203CE50->objects[gUnknown_0203CE50->count].eventTemplateId = eventTemplateId; + gUnknown_0203CE50->objects[gUnknown_0203CE50->count].unk0 = arg1; + gUnknown_0203CE50->count++; +} + +static void sub_81A8D94(u8 eventTemplateId, u8 arg1) +{ + s8 r0; + s32 r6; + s32 var; + u16 movementType; + struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates; + s16 x = events[eventTemplateId].x + 7; + s16 y = events[eventTemplateId].y + 7; + u16 metatile = MapGridGetMetatileIdAt(x, y); + + if (!gUnknown_0203CE50->unk41) + var = 0x250; + else + var = 0x298; + + r0 = (u8)((metatile - var) % 8); + r0 -= arg1; + if (r0 < 0 || r0 == 3) + r6 = 0; + else if (r0 > 0 || r0 == -3) + r6 = 1; + else + r6 = 2; + + movementType = events[eventTemplateId].movementType; + if (r6 == 0) + { + switch (movementType) + { + case MOVEMENT_TYPE_FACE_RIGHT: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case MOVEMENT_TYPE_FACE_DOWN: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + case MOVEMENT_TYPE_FACE_LEFT: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case MOVEMENT_TYPE_FACE_UP: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + default: + break; + } + } + else if (r6 == 1) + { + switch (movementType) + { + case MOVEMENT_TYPE_FACE_RIGHT: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_DOWN; + break; + case MOVEMENT_TYPE_FACE_DOWN: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_LEFT; + break; + case MOVEMENT_TYPE_FACE_LEFT: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_UP; + break; + case MOVEMENT_TYPE_FACE_UP: + events[eventTemplateId].movementType = MOVEMENT_TYPE_FACE_RIGHT; + break; + default: + break; + } + } +} diff --git a/src/multiboot.c b/src/multiboot.c index 7fd6df2d0..da90a55c0 100644 --- a/src/multiboot.c +++ b/src/multiboot.c @@ -1,7 +1,7 @@ #include "gba/gba.h" #include "multiboot.h" -static u16 MultiBoot_required_data[MULTIBOOT_NCHILD]; +IWRAM_DATA static u16 MultiBoot_required_data[MULTIBOOT_NCHILD]; static int MultiBootSend(struct MultiBootParam *mp, u16 data); static int MultiBootHandShake(struct MultiBootParam *mp); diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c index 921c8e97c..4196bb34c 100644 --- a/src/mystery_event_script.c +++ b/src/mystery_event_script.c @@ -18,7 +18,6 @@ #include "pokemon_storage_system.h" extern void sub_811EFC0(u8); -extern void ValidateEReaderTrainer(void); extern ScrCmdFunc gMysteryEventScriptCmdTable[]; extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[]; diff --git a/src/new_game.c b/src/new_game.c index cdabd5ccc..18b128624 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -28,7 +28,6 @@ #include "apprentice.h" #include "frontier_util.h" -extern u8 gDifferentSaveFile; extern u16 gSaveFileStatus; extern u8 gUnknown_030060B0; @@ -61,6 +60,10 @@ static void ClearFrontierRecord(void); static void WarpToTruck(void); static void ResetMiniGamesResults(void); +// EWRAM vars +EWRAM_DATA bool8 gDifferentSaveFile = FALSE; +EWRAM_DATA bool8 gUnknown_020322D5 = FALSE; + // const rom data static const struct ContestWinner sContestWinnerPicDummy = { diff --git a/src/overworld.c b/src/overworld.c index 28d2d02ca..10f2ebd26 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -88,12 +88,6 @@ extern const struct MapHeader *const *const gMapGroups[]; extern const s32 gMaxFlashLevel; extern const u16 gUnknown_82EC7C4[]; -u16 gUnknown_03005DA8; -MainCallback gFieldCallback; -bool8 (*gFieldCallback2)(void); -u8 gUnknown_03005DB4; -u8 gFieldLinkPlayerCount; - // functions extern void HealPlayerParty(void); extern void move_tilemap_camera_to_upper_left_corner(void); @@ -256,6 +250,16 @@ IWRAM_DATA static u8 sUnknown_03000E18; IWRAM_DATA static u8 sUnknown_03000E19; IWRAM_DATA static u32 sUnusedVar; +// IWRAM common +u16 *gBGTilemapBuffers1; +u16 *gBGTilemapBuffers2; +u16 *gBGTilemapBuffers3; +u16 gUnknown_03005DA8; +void (*gFieldCallback)(void); +bool8 (*gFieldCallback2)(void); +u8 gUnknown_03005DB4; +u8 gFieldLinkPlayerCount; + // EWRAM vars EWRAM_DATA static u8 sUnknown_020322D8 = 0; EWRAM_DATA struct WarpData gLastUsedWarp = {0}; diff --git a/src/pokedex.c b/src/pokedex.c index 93ff06876..1405393c1 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -29,14 +29,17 @@ #include "constants/songs.h" #include "constants/species.h" +extern u8 gUnknown_030061EC; + +// EWRAM static EWRAM_DATA struct PokedexView *gUnknown_02039B4C = NULL; static EWRAM_DATA u16 gUnknown_02039B50 = 0; static EWRAM_DATA u8 gUnknown_02039B52 = 0; static EWRAM_DATA struct PokedexListItem *gUnknown_02039B54 = NULL; +// IWRAM common u8 gUnknown_030060B0; -MainCallback gUnknown_030060B4; -u8 gUnknown_030061EC; +void (*gUnknown_030060B4)(void); struct PokedexEntry { diff --git a/src/save.c b/src/save.c index 3ee98f4f7..4ae516fc9 100644 --- a/src/save.c +++ b/src/save.c @@ -94,6 +94,7 @@ u16 gSaveUnusedVar2; u16 gUnknown_03006294; EWRAM_DATA struct SaveSection gSaveDataBuffer = {0}; +EWRAM_DATA static u8 sUnusedVar = 0; void ClearSaveData(void) { diff --git a/src/scrcmd.c b/src/scrcmd.c index d2a6c2a17..310387337 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -4,6 +4,7 @@ #include "berry.h" #include "clock.h" #include "coins.h" +#include "contest.h" #include "contest_link_80F57C4.h" #include "contest_painting.h" #include "data2.h" @@ -27,6 +28,7 @@ #include "event_obj_lock.h" #include "menu.h" #include "money.h" +#include "mossdeep_gym.h" #include "mystery_event_script.h" #include "palette.h" #include "party_menu.h" @@ -49,11 +51,6 @@ #include "tv.h" #include "window.h" -extern u16 sub_81A89A0(u8); -extern void sub_81A8AF8(void); -extern void sub_81A895C(void); -extern void sub_81A8934(u8); - typedef u16 (*SpecialFunc)(void); typedef void (*NativeFunc)(void); @@ -66,8 +63,6 @@ static EWRAM_DATA u16 sMovingNpcMapBank = 0; static EWRAM_DATA u16 sMovingNpcMapId = 0; static EWRAM_DATA u16 sFieldEffectScriptId = 0; -extern u16 gSpecialVar_ContestCategory; - IWRAM_DATA u8 gUnknown_03000F30; extern const SpecialFunc gSpecials[]; @@ -2157,13 +2152,13 @@ bool8 ScrCmd_mossdeepgym1(struct ScriptContext *ctx) { u16 v1 = VarGet(ScriptReadHalfword(ctx)); - sMovingNpcId = sub_81A89A0(v1); + sMovingNpcId = MossdeepGym_MoveEvents(v1); return FALSE; } bool8 ScrCmd_mossdeepgym2(struct ScriptContext *ctx) { - sub_81A8AF8(); + MossdeepGym_TurnEvents(); return FALSE; } @@ -2171,13 +2166,13 @@ bool8 ScrCmd_mossdeepgym3(struct ScriptContext *ctx) { u16 v1 = VarGet(ScriptReadHalfword(ctx)); - sub_81A8934(v1); + InitMossdeepGymTiles(v1); return FALSE; } bool8 ScrCmd_mossdeepgym4(struct ScriptContext *ctx) { - sub_81A895C(); + FinishMossdeepGymTiles(); return FALSE; } @@ -2204,7 +2199,7 @@ bool8 ScrCmd_cmdD9(struct ScriptContext *ctx) } } -// This command will force the Pokémon to be obedient, you don't get to make it disobedient +// This command will force the Pokémon to be obedient, you don't get to make it disobedient. bool8 ScrCmd_setmonobedient(struct ScriptContext *ctx) { bool8 obedient = TRUE; diff --git a/src/start_menu.c b/src/start_menu.c index 976cbe2a6..455d26509 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -35,6 +35,7 @@ #include "field_player_avatar.h" #include "battle_pyramid_bag.h" #include "battle_pike.h" +#include "new_game.h" // Menu actions enum @@ -63,6 +64,10 @@ enum SAVE_ERROR }; +// IWRAM common +bool8 (*gMenuCallback)(void); + +// EWRAM EWRAM_DATA static u8 sSafariBallsWindowId = 0; EWRAM_DATA static u8 sBattlePyramidFloorWindowId = 0; EWRAM_DATA static u8 sStartMenuCursorPos = 0; @@ -76,7 +81,6 @@ EWRAM_DATA static bool8 sSavingComplete = FALSE; EWRAM_DATA static u8 sSaveInfoWindowId = 0; // Extern variables. -extern u8 gDifferentSaveFile; extern u8 gUnknown_03005DB4; // Extern functions in not decompiled files. diff --git a/src/string_util.c b/src/string_util.c index 3fbf79d87..8ce9a97ed 100644 --- a/src/string_util.c +++ b/src/string_util.c @@ -2,7 +2,11 @@ #include "string_util.h" #include "text.h" -EWRAM_DATA u8 gUnknownStringVar[16] = {0}; +EWRAM_DATA u8 gStringVar1[0x100] = {0}; +EWRAM_DATA u8 gStringVar2[0x100] = {0}; +EWRAM_DATA u8 gStringVar3[0x100] = {0}; +EWRAM_DATA u8 gStringVar4[0x3E8] = {0}; +EWRAM_DATA static u8 sUnknownStringVar[16] = {0}; static const u8 sDigits[] = __("0123456789ABCDEF"); @@ -421,7 +425,7 @@ u8 *StringBraille(u8 *dest, const u8 *src) static const u8 *ExpandPlaceholder_UnknownStringVar(void) { - return gUnknownStringVar; + return sUnknownStringVar; } static const u8 *ExpandPlaceholder_PlayerName(void) |