diff options
-rw-r--r-- | asm/hall_of_fame.s | 207 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/hall_of_fame.c | 106 |
3 files changed, 80 insertions, 234 deletions
diff --git a/asm/hall_of_fame.s b/asm/hall_of_fame.s index a713b5ad0..f617997a6 100644 --- a/asm/hall_of_fame.s +++ b/asm/hall_of_fame.s @@ -9,211 +9,4 @@ - thumb_func_start sub_81437A4 -sub_81437A4: @ 81437A4 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - mov r9, r1 - mov r10, r2 - adds r6, r3, 0 - lsls r0, 16 - lsrs r0, 16 - lsls r1, 16 - lsrs r1, 16 - mov r9, r1 - lsls r2, 16 - lsrs r2, 16 - mov r10, r2 - lsls r6, 16 - lsrs r6, 16 - lsls r7, r0, 3 - ldr r1, _08143854 @ =gTrainerFrontPicTable - mov r8, r1 - add r8, r7 - ldr r1, _08143858 @ =gTrainerFrontPicCoords - lsls r2, r0, 2 - adds r2, r1 - ldrb r1, [r2] - ldrb r2, [r2, 0x1] - movs r3, 0x80 - lsls r3, 18 - ldr r5, _0814385C @ =gUnknown_0840B5A0 - lsls r4, r6, 2 - adds r4, r5 - ldr r4, [r4] - str r4, [sp] - str r0, [sp, 0x4] - mov r0, r8 - bl DecompressPicFromTable_2 - ldr r0, _08143860 @ =gTrainerFrontPicPaletteTable - adds r0, r7, r0 - ldr r0, [r0] - lsls r4, r6, 4 - movs r2, 0x80 - lsls r2, 1 - adds r1, r4, r2 - lsls r1, 16 - lsrs r1, 16 - movs r2, 0x20 - bl LoadCompressedPalette - lsls r1, r6, 24 - lsrs r1, 24 - adds r0, r6, 0 - bl sub_8143680 - ldr r0, _08143864 @ =gUnknown_02024E8C - mov r1, r9 - lsls r1, 16 - asrs r1, 16 - mov r9, r1 - mov r2, r10 - lsls r2, 16 - asrs r2, 16 - mov r10, r2 - movs r3, 0x1 - bl CreateSprite - lsls r0, 24 - lsrs r0, 24 - ldr r1, _08143868 @ =gSprites - lsls r2, r0, 4 - adds r2, r0 - lsls r2, 2 - adds r2, r1 - ldrb r3, [r2, 0x5] - movs r1, 0xF - ands r1, r3 - orrs r1, r4 - strb r1, [r2, 0x5] - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08143854: .4byte gTrainerFrontPicTable -_08143858: .4byte gTrainerFrontPicCoords -_0814385C: .4byte gUnknown_0840B5A0 -_08143860: .4byte gTrainerFrontPicPaletteTable -_08143864: .4byte gUnknown_02024E8C -_08143868: .4byte gSprites - thumb_func_end sub_81437A4 - - thumb_func_start sub_814386C -sub_814386C: @ 814386C - push {r4,r5,lr} - adds r5, r0, 0 - ldrh r1, [r5, 0x26] - movs r2, 0x26 - ldrsh r0, [r5, r2] - cmp r0, 0x78 - ble _08143882 - adds r0, r5, 0 - bl DestroySprite - b _081438BA -_08143882: - adds r0, r1, 0x1 - ldrh r1, [r5, 0x30] - adds r0, r1 - strh r0, [r5, 0x26] - ldrh r4, [r5, 0x2E] - lsls r4, 24 - lsrs r4, 24 - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x3 - ands r0, r1 - adds r0, 0x8 - ldr r1, _081438C0 @ =gSineTable - lsls r4, 1 - adds r4, r1 - movs r2, 0 - ldrsh r1, [r4, r2] - muls r0, r1 - cmp r0, 0 - bge _081438B0 - adds r0, 0xFF -_081438B0: - asrs r0, 8 - strh r0, [r5, 0x24] - ldrh r0, [r5, 0x2E] - adds r0, 0x4 - strh r0, [r5, 0x2E] -_081438BA: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081438C0: .4byte gSineTable - thumb_func_end sub_814386C - - thumb_func_start sub_81438C4 -sub_81438C4: @ 81438C4 - push {r4,lr} - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0xF0 - bl __umodsi3 - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - bl Random - adds r2, r0, 0 - lsls r2, 16 - lsrs r2, 16 - movs r0, 0x7 - ands r2, r0 - negs r2, r2 - ldr r0, _08143934 @ =gSpriteTemplate_840B7A4 - lsls r4, 16 - asrs r4, 16 - lsls r2, 16 - asrs r2, 16 - adds r1, r4, 0 - movs r3, 0 - bl CreateSprite - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 4 - adds r1, r0 - lsls r1, 2 - ldr r0, _08143938 @ =gSprites - adds r4, r1, r0 - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x11 - bl __umodsi3 - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - bl StartSpriteAnim - bl Random - movs r1, 0x3 - ands r1, r0 - cmp r1, 0 - beq _0814393C - movs r0, 0 - b _0814393E - .align 2, 0 -_08143934: .4byte gSpriteTemplate_840B7A4 -_08143938: .4byte gSprites -_0814393C: - movs r0, 0x1 -_0814393E: - strh r0, [r4, 0x30] - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_81438C4 - .align 2, 0 @ Don't pad with nop. diff --git a/ld_script.txt b/ld_script.txt index b5732033e..ccfd768c2 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -256,7 +256,6 @@ SECTIONS { src/field_region_map.o(.text); asm/battle_anim_813F0F4.o(.text); src/hall_of_fame.o(.text); - asm/hall_of_fame.o(.text); src/credits.o(.text); src/lottery_corner.o(.text); src/diploma.o(.text); diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 93f32ec88..550cb0ebe 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -14,6 +14,8 @@ #include "m4a.h" #include "data2.h" #include "decompress.h" +#include "rng.h" +#include "trig.h" extern u32 gUnknown_0203931C; extern bool8 gUnknown_02039324; // has hall of fame records @@ -24,6 +26,15 @@ extern struct SpriteTemplate gUnknown_02024E8C; extern const s16 gUnknown_0840B534[][4]; extern const s16 gUnknown_0840B564[][4]; +extern const struct SpriteTemplate gSpriteTemplate_840B7A4; +extern const struct HallofFameMon sDummyFameMon; +extern const u8 gHallOfFame_Gfx[]; +extern const u16 gHallOfFame_Pal[]; +extern const struct CompressedSpriteSheet gUnknown_0840B514; +extern const struct CompressedSpritePalette gUnknown_0840B524; +extern const struct SpriteTemplate gUnknown_0840B6B8; +extern const struct SpriteFrameImage* gUnknown_0840B69C[]; +extern void* gUnknown_0840B5A0[]; struct HallofFameMon { @@ -77,11 +88,11 @@ static void HallOfFame_PrintPlayerInfo(u8 a0, u8 a1); static void sub_81433E0(void); static void sub_8143570(void); static void sub_81435B8(void); -static u32 sub_81436BC(u16 species, s16 posX, s16 posY, u16 pokeID, u32 tid, u32 pid); +static u32 HallOfFame_LoadPokemonPic(u16 species, s16 posX, s16 posY, u16 pokeID, u32 tid, u32 pid); +static u32 HallOfFame_LoadTrainerPic(u16 trainerPicID, s16 posX, s16 posY, u16 a3); +static bool8 sub_81438C4(void); // functions from different files -void sub_81438C4(void); -u32 sub_81437A4(u16 gender, u16 a1, u16 a2, u16 a3); void sub_81439D0(void); void sub_80C5CD4(void*); // ? void sub_80C5E38(void*); // ? @@ -236,17 +247,17 @@ static void sub_814217C(u8 taskID) else sub_8125EC8(3); - for (i = 0; i < 50; i++, lastSavedTeam++) + for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, lastSavedTeam++) { if (lastSavedTeam->mons[0].species == 0) break; } - if (i >= 50) + if (i >= HALL_OF_FAME_MAX_TEAMS) { struct HallofFameMons* r5 = (struct HallofFameMons*)(&ewram[0x1E000]); struct HallofFameMons* r6 = (struct HallofFameMons*)(&ewram[0x1E000]); r5++; - for (i = 0; i < 49; i++, r6++, r5++) + for (i = 0; i < HALL_OF_FAME_MAX_TEAMS - 1; i++, r6++, r5++) { *r6 = *r5; } @@ -306,7 +317,7 @@ static void sub_8142320(u8 taskID) field6 = gUnknown_0840B564[currPokeID][3]; } - spriteID = sub_81436BC(currMon->species, xPos, yPos, currPokeID, currMon->tid, currMon->personality); + spriteID = HallOfFame_LoadPokemonPic(currMon->species, xPos, yPos, currPokeID, currMon->tid, currMon->personality); gSprites[spriteID].data1 = field4; gSprites[spriteID].data2 = field6; gSprites[spriteID].data0 = 0; @@ -412,7 +423,7 @@ static void sub_8142738(u8 taskID) SetUpWindowConfig(&gWindowConfig_81E71B4); InitMenuWindow(&gWindowConfig_81E71B4); - gTasks[taskID].tPlayerSpriteID = sub_81437A4(gSaveBlock2.playerGender, 120, 72, 6); + gTasks[taskID].tPlayerSpriteID = HallOfFame_LoadTrainerPic(gSaveBlock2.playerGender, 120, 72, 6); gTasks[taskID].tFrameCount = 120; gTasks[taskID].func = sub_8142794; } @@ -467,8 +478,6 @@ static void sub_81428A0(u8 taskID) #undef tPlayerSpriteID #undef tMonSpriteID -extern const struct HallofFameMon sDummyFameMon; - void sub_81428CC(void) { switch (gMain.state) @@ -545,15 +554,15 @@ static void sub_8142A28(u8 taskID) u16 i; struct HallofFameMons* savedTeams = (struct HallofFameMons*)(&ewram[0x1E000]); - for (i = 0; i < 50; i++, savedTeams++) + for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, savedTeams++) { if (savedTeams->mons[0].species == 0) break; } - if (i < 50) + if (i < HALL_OF_FAME_MAX_TEAMS) gTasks[taskID].tCurrTeamNo = i - 1; else - gTasks[taskID].tCurrTeamNo = 49; + gTasks[taskID].tCurrTeamNo = HALL_OF_FAME_MAX_TEAMS - 1; gTasks[taskID].tCurrPageNo = GetGameStat(10); for (i = 0, vram1 = (u16*)(VRAM + 0x381A), vram2 = (u16*)(VRAM + 0x385A); i <= 16; i++) @@ -606,7 +615,7 @@ static void sub_8142B04(u8 taskID) posX = gUnknown_0840B564[i][2]; posY = gUnknown_0840B564[i][3]; } - spriteID = sub_81436BC(currMon->species, posX, posY, i, currMon->tid, currMon->personality); + spriteID = HallOfFame_LoadPokemonPic(currMon->species, posX, posY, i, currMon->tid, currMon->personality); gSprites[spriteID].oam.priority = 1; gTasks[taskID].tMonSpriteID(i) = spriteID; } @@ -894,9 +903,6 @@ static void HallOfFame_PrintPlayerInfo(u8 a0, u8 a1) MenuPrint_RightAligned(gStringVar1, a0 + 14, a1 + 5); } -extern const u8 gHallOfFame_Gfx[]; -extern const u16 gHallOfFame_Pal[]; - static void sub_81433E0(void) { u32 offsetWrite, offsetWrite2, offsetWrite3, offsetWrite4; @@ -976,9 +982,6 @@ static void sub_81433E0(void) LoadPalette(gHallOfFame_Pal, 0, 0x20); } -extern const struct CompressedSpriteSheet gUnknown_0840B514; -extern const struct CompressedSpritePalette gUnknown_0840B524; - static void sub_8143570(void) { remove_some_task(); @@ -1027,9 +1030,6 @@ void SpriteCB_HallOfFame_Dummy(struct Sprite* sprite) } -extern const struct SpriteTemplate gUnknown_0840B6B8; -extern const struct SpriteFrameImage* gUnknown_0840B69C[]; - void sub_8143648(u16 paletteTag, u8 animID) { gUnknown_02024E8C = gUnknown_0840B6B8; @@ -1046,9 +1046,7 @@ void sub_8143680(u16 paletteTag, u8 animID) gUnknown_02024E8C.anims = gUnknown_081EC2A4[0]; } -extern void* gUnknown_0840B5A0[]; - -static u32 sub_81436BC(u16 species, s16 posX, s16 posY, u16 pokeID, u32 tid, u32 pid) +static u32 HallOfFame_LoadPokemonPic(u16 species, s16 posX, s16 posY, u16 pokeID, u32 tid, u32 pid) { u8 spriteID; const u8* pokePal; @@ -1063,3 +1061,59 @@ static u32 sub_81436BC(u16 species, s16 posX, s16 posY, u16 pokeID, u32 tid, u32 gSprites[spriteID].oam.paletteNum = pokeID; return spriteID; } + +static u32 HallOfFame_LoadTrainerPic(u16 trainerPicID, s16 posX, s16 posY, u16 a3) +{ + u8 spriteID; + + DecompressPicFromTable_2(&gTrainerFrontPicTable[trainerPicID], gTrainerFrontPicCoords[trainerPicID].coords, gTrainerFrontPicCoords[trainerPicID].y_offset, (void*) 0x2000000, gUnknown_0840B5A0[a3], trainerPicID); + + LoadCompressedPalette(gTrainerFrontPicPaletteTable[trainerPicID].data, 16 * a3 + 256, 0x20); + sub_8143680(a3, a3); + + spriteID = CreateSprite(&gUnknown_02024E8C, posX, posY, 1); + gSprites[spriteID].oam.paletteNum = a3; + + return spriteID; +} + +void sub_814386C(struct Sprite* sprite) +{ + if (sprite->pos2.y > 120) + DestroySprite(sprite); + else + { + u16 rand; + u8 tableID; + + sprite->pos2.y++; + sprite->pos2.y += sprite->data1; + + tableID = sprite->data0; + rand = (Random() % 4) + 8; + sprite->pos2.x = rand * gSineTable[tableID] / 256; + + sprite->data0 += 4; + } +} + +bool8 sub_81438C4(void) +{ + u8 spriteID; + struct Sprite* sprite; + + s16 posX = Random() % 240; + s16 posY = -(Random() % 8); + + spriteID = CreateSprite(&gSpriteTemplate_840B7A4, posX, posY, 0); + sprite = &gSprites[spriteID]; + + StartSpriteAnim(sprite, Random() % 17); + + if (Random() & 3) + sprite->data1 = 0; + else + sprite->data1 = 1; + + return 0; +} |