Split fusion gallery, more ending code

This commit is contained in:
y.demaisonregne 2023-03-11 17:09:07 +01:00
parent 44e5f349d6
commit fd8a05f4c4
12 changed files with 758 additions and 72 deletions

View File

@ -3,3 +3,7 @@
#define ENDING_FLAG_FIRST_TIME_ATTACK_CLEAR 0x20
#define ENDING_FLAG_FIRST_HARD_MODE_CLEAR 0x40
#define ENDING_FLAG_FIRST_CLEAR 0x80
#define ENDING_IMAGE_OAM_SET_CLEAR_TIME 0
#define ENDING_IMAGE_OAM_SET_YOUR_RATE 1
#define ENDING_IMAGE_OAM_SET_COLLECTING 2

View File

@ -2,32 +2,18 @@
#define ENDING_AND_GALLERY_DATA_H
#include "types.h"
#include "structs/ending_and_gallery.h"
#define NUMBER_OF_ENDING_IMAGES 8
// ...
extern const u16 sEndingImageTextPAL[14 * 16];
// ...
extern const u32* const sEndingImagesTopHalfGfxPointers[NUMBER_OF_ENDING_IMAGES];
extern const u32* const sEndingImagesLowerHalfGfxPointers[NUMBER_OF_ENDING_IMAGES];
extern const u32* const sEndingImagesTopHalfTileTablePointers[NUMBER_OF_ENDING_IMAGES];
extern const u32* const sEndingImagesLowerHalfTileTablePointers[NUMBER_OF_ENDING_IMAGES];
extern const u16* const sEndingImagesPalPointers[NUMBER_OF_ENDING_IMAGES];
// ...
extern const u16* const sEndingWhitePalPointers[4];
// ...
extern const u32 sEndingImageTextGFX[803];
extern const u32 sEndingImageTextJapGFX[511];
// ...
extern const u32 sEndingImageNumbersMiscGFX[218];
// ...
@ -45,12 +31,33 @@ extern const u16 sEndingPosingPAL_White4[5 * 16];
extern const u16 sUnlockedOptionsPAL[1 * 16];
extern const struct EndingImageOam sEndingImageOam_54bd54[6];
extern const struct EndingImageOam sEndingImageOam_ClearTime_English[9];
extern const struct EndingImageOam sEndingImageOam_YourRate_English[11];
extern const struct EndingImageOam sEndingImageOam_Collecting_English[17];
extern const struct EndingImageOam sEndingImageOam_54bf58[6];
extern const struct EndingImageOam sEndingImageOam_ClearTime_Hiragana[6];
extern const struct EndingImageOam sEndingImageOam_YourRate_Hiragana[11];
extern const struct EndingImageOam sEndingImageOam_Collecting_Hiragana[17];
extern const u32* const sEndingImagesTopHalfGfxPointers[NUMBER_OF_ENDING_IMAGES];
extern const u32* const sEndingImagesLowerHalfGfxPointers[NUMBER_OF_ENDING_IMAGES];
extern const u32* const sEndingImagesTopHalfTileTablePointers[NUMBER_OF_ENDING_IMAGES];
extern const u32* const sEndingImagesLowerHalfTileTablePointers[NUMBER_OF_ENDING_IMAGES];
extern const u16* const sEndingImagesPalPointers[NUMBER_OF_ENDING_IMAGES];
// ...
extern const u32 sCreditsCharactersGFX[615];
// ...
extern const u32 sEndingImageTextGFX[803];
extern const u32 sEndingImageTextJapGFX[511];
extern const u8 sEndingImageNumbersGFX_Upper[10 * 64];
extern const u8 sEndingImageNumbersGFX_Lower[10 * 64];
extern const u32 sEndingNumbersMiscGX[218];
extern const u32 sEndingSamusPosingSpaceBackgroundGFX[2938];
extern const u32 sEndingSamusPosingSpaceBackgroundTileTable[412];

View File

@ -0,0 +1,10 @@
#ifndef ENDING_AND_GALLERY_DATA_H
#define ENDING_AND_GALLERY_DATA_H
#include "structs/fusion_gallery.h"
#define NUMBER_OF_FUSION_GALLERY_IMAGES 13
extern const struct FusionGalleryImageEntry sFusionGalleryData[NUMBER_OF_FUSION_GALLERY_IMAGES];
#endif /* ENDING_AND_GALLERY_DATA_H */

View File

@ -3,11 +3,7 @@
#include "types.h"
void FusionGalleryVBlank(void);
void FusionGalleryInit(void);
u32 FusionGalleryDisplay(void);
u32 FusionGallerySubroutine(void);
void EndingImageCheckDisplayLetter(u32 offset);
void EndingImageUpdateLettersSpawnDelay(u32 offset);
void EndingImageLoadTextOAM(u32 set);
void EndingImageDisplayLinePermanently(u32 line);
void EndingImageLoadIGTAndPercentageGraphics(void);

11
include/fusion_gallery.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef FUSION_GALLERY_H
#define FUSION_GALLERY_H
#include "types.h"
void FusionGalleryVBlank(void);
void FusionGalleryInit(void);
u32 FusionGalleryDisplay(void);
u32 FusionGallerySubroutine(void);
#endif /* FUSION_GALLERY_H */

View File

@ -5,6 +5,15 @@
#define ENDING_DATA sNonGameplayRamPointer->ending
struct EndingImageOam {
u8 unk_0;
u8 spawnDelay;
u8 unk_2;
u16 xPosition;
u16 yPosition;
const u16* const pFrame;
};
struct EndingData {
u8 stage;
u8 unk_1;
@ -17,8 +26,8 @@ struct EndingData {
u16 unk_E;
u16 creditLineTilemap_1[32];
u16 creditLineTilemap_2[32];
u32 unk_90;
u32 unk_94;
u32 creditLineOffset_1;
u32 creditLineOffset_2;
u8 endingNumber;
u8 completionPercentage;
u8 language;
@ -28,7 +37,7 @@ struct EndingData {
u8 unk_12A[17];
u8 padding_13B[6];
u8 unk_141;
u8 unk_142[6];
u8 endingLettersSpawnDelay[6];
u8 unk_148[17];
u8 padding_159[7];
u8 unk_160[6];

View File

@ -0,0 +1,58 @@
#ifndef FUSION_GALLERY_STRUCT_H
#define FUSION_GALLERY_STRUCT_H
#include "types.h"
#define FUSION_GALLERY_DATA sNonGameplayRamPointer->fusionGallery
struct FusionGalleryImageEntry {
const u32* const pTopGfx;
const u32* const pBottomGfx;
const u32* const pTopTileTable;
const u32* const pBottomTileTable;
const u16* const pPalette;
};
struct FusionGalleryData {
u8 stage;
u8 unk_1;
u16 unk_2;
u16 unk_4;
u8 unk_6;
u16 unk_8;
u16 unk_A;
u16 currentCreditLine;
u16 unk_E;
u16 creditLineTilemap_1[32];
u16 creditLineTilemap_2[32];
u32 unk_90;
u16 unk_94;
u16 unk_96;
u8 unk_98;
u8 currentImage;
u8 language;
u8 oamLength;
u8 padding_9C[136];
u8 unk_124[6];
u8 unk_12A[17];
u8 padding_13B[6];
u8 unk_141;
u8 endingLettersSpawnDelay[6];
u8 unk_148[17];
u8 padding_159[7];
u8 unk_160[6];
u8 unk_166[17];
u8 unk_177;
u8 unk_178;
u8 unk_179;
u8 padding_17A[3];
u8 unk_17D;
u16 oamXPositions[30];
u16 oamYPositions[30];
const u16* oamFramePointers[30];
u8 padding_270[79];
u16 dispcnt;
u16 bldcnt;
};
#endif /* FUSION_GALLERY_STRUCT_H */

View File

@ -12,6 +12,7 @@
#include "structs/menus/title_screen.h"
#include "structs/menus/erase_sram.h"
#include "structs/menus/file_select.h"
#include "structs/fusion_gallery.h"
union NonGameplayRAM {
@ -23,6 +24,7 @@ union NonGameplayRAM {
struct TitleScreenData titleScreen;
struct EraseSramData eraseSram;
struct FileSelectData fileSelect;
struct FusionGalleryData fusionGallery;
u8 inGame[1576];
};

View File

@ -216,9 +216,9 @@ void ColorFadingTransferPaletteOnTransition(void)
unk_5b304();
if (sColorFadingData[gColorFading.type].isWhite)
value = 0x7FFF;
value = COLOR_WHITE;
else
value = 0;
value = COLOR_BLACK;
color = value;
if (sColorFadingData[gColorFading.type].bgColorMask | sColorFadingData[gColorFading.type].objColorMask)

View File

@ -14,74 +14,310 @@
#include "structs/ending_and_gallery.h"
#include "structs/game_state.h"
/**
* @brief 847f8 | 78 | V-blank code for the fusion gallery
*
*/
void FusionGalleryVBlank(void)
{
dma_set(3, gOamData, OAM_BASE, (DMA_ENABLE | DMA_32BIT) << 16 | OAM_SIZE / 4);
write16(REG_DISPCNT, ENDING_DATA.dispcnt);
write16(REG_BLDCNT, ENDING_DATA.bldcnt);
write16(REG_BLDY, gWrittenToBLDY_NonGameplay);
write16(REG_BG0VOFS, (gBG0YPosition / 16) & 0x1FF);
write16(REG_BG1VOFS, (gBG1YPosition / 16) & 0x1FF);
}
void FusionGalleryInit(void)
{
}
u32 FusionGalleryDisplay(void)
{
}
u32 FusionGallerySubroutine(void)
{
}
/**
* @brief 84c34 | 48 | Checks if an ending letter should display
*
* @param offset Offset, to document
*/
void EndingImageCheckDisplayLetter(u32 offset)
void EndingImageUpdateLettersSpawnDelay(u32 offset)
{
if (!ENDING_DATA.unk_124[offset])
return;
if (ENDING_DATA.unk_142[offset])
if (ENDING_DATA.endingLettersSpawnDelay[offset])
{
ENDING_DATA.unk_142[offset]--;
if (ENDING_DATA.unk_142[offset] == 0)
ENDING_DATA.endingLettersSpawnDelay[offset]--;
if (ENDING_DATA.endingLettersSpawnDelay[offset] == 0)
ENDING_DATA.unk_124[offset]++;
}
}
/**
* @brief 84c7c | 26c | Loads a set of OAM for the ending image
*
* @param set Set to load
*/
void EndingImageLoadTextOAM(u32 set)
{
i32 i;
if (ENDING_DATA.language == LANGUAGE_HIRAGANA)
{
if (set == ENDING_IMAGE_OAM_SET_CLEAR_TIME)
{
ENDING_DATA.oamLength = ARRAY_SIZE(sEndingImageOam_ClearTime_Hiragana) + 6;
for (i = 0; i < ARRAY_SIZE(sEndingImageOam_ClearTime_Hiragana); i++)
{
ENDING_DATA.unk_124[i + 6] = sEndingImageOam_ClearTime_Hiragana[i].unk_0;
ENDING_DATA.endingLettersSpawnDelay[i + 6] = sEndingImageOam_ClearTime_Hiragana[i].spawnDelay;
ENDING_DATA.unk_160[i + 6] = sEndingImageOam_ClearTime_Hiragana[i].unk_2;
ENDING_DATA.oamXPositions[i + 6] = sEndingImageOam_ClearTime_Hiragana[i].xPosition;
ENDING_DATA.oamYPositions[i + 6] = sEndingImageOam_ClearTime_Hiragana[i].yPosition;
ENDING_DATA.oamFramePointers[i + 6] = sEndingImageOam_ClearTime_Hiragana[i].pFrame;
}
}
else
{
ENDING_DATA.oamLength = ARRAY_SIZE(sEndingImageOam_YourRate_Hiragana) + 6;
for (i = 0; i < ARRAY_SIZE(sEndingImageOam_YourRate_Hiragana); i++)
{
ENDING_DATA.unk_124[i + 6] = sEndingImageOam_YourRate_Hiragana[i].unk_0;
ENDING_DATA.endingLettersSpawnDelay[i + 6] = sEndingImageOam_YourRate_Hiragana[i].spawnDelay;
ENDING_DATA.unk_160[i + 6] = sEndingImageOam_YourRate_Hiragana[i].unk_2;
ENDING_DATA.oamXPositions[i + 6] = sEndingImageOam_YourRate_Hiragana[i].xPosition;
ENDING_DATA.oamYPositions[i + 6] = sEndingImageOam_YourRate_Hiragana[i].yPosition;
ENDING_DATA.oamFramePointers[i + 6] = sEndingImageOam_YourRate_Hiragana[i].pFrame;
}
}
}
else
{
if (set == ENDING_IMAGE_OAM_SET_CLEAR_TIME)
{
ENDING_DATA.oamLength = ARRAY_SIZE(sEndingImageOam_ClearTime_English) + 6;
for (i = 0; i < ARRAY_SIZE(sEndingImageOam_ClearTime_English); i++)
{
ENDING_DATA.unk_124[i + 6] = sEndingImageOam_ClearTime_English[i].unk_0;
ENDING_DATA.endingLettersSpawnDelay[i + 6] = sEndingImageOam_ClearTime_English[i].spawnDelay;
ENDING_DATA.unk_160[i + 6] = sEndingImageOam_ClearTime_English[i].unk_2;
ENDING_DATA.oamXPositions[i + 6] = sEndingImageOam_ClearTime_English[i].xPosition;
ENDING_DATA.oamYPositions[i + 6] = sEndingImageOam_ClearTime_English[i].yPosition;
ENDING_DATA.oamFramePointers[i + 6] = sEndingImageOam_ClearTime_English[i].pFrame;
}
}
else if (set == ENDING_IMAGE_OAM_SET_YOUR_RATE)
{
ENDING_DATA.oamLength = ARRAY_SIZE(sEndingImageOam_YourRate_English) + 6;
for (i = 0; i < ARRAY_SIZE(sEndingImageOam_YourRate_English); i++)
{
ENDING_DATA.unk_124[i + 6] = sEndingImageOam_YourRate_English[i].unk_0;
ENDING_DATA.endingLettersSpawnDelay[i + 6] = sEndingImageOam_YourRate_English[i].spawnDelay;
ENDING_DATA.unk_160[i + 6] = sEndingImageOam_YourRate_English[i].unk_2;
ENDING_DATA.oamXPositions[i + 6] = sEndingImageOam_YourRate_English[i].xPosition;
ENDING_DATA.oamYPositions[i + 6] = sEndingImageOam_YourRate_English[i].yPosition;
ENDING_DATA.oamFramePointers[i + 6] = sEndingImageOam_YourRate_English[i].pFrame;
}
}
else
{
ENDING_DATA.oamLength = ARRAY_SIZE(sEndingImageOam_Collecting_English) + 6;
for (i = 0; i < ARRAY_SIZE(sEndingImageOam_Collecting_English); i++)
{
ENDING_DATA.unk_124[i + 6] = sEndingImageOam_Collecting_English[i].unk_0;
ENDING_DATA.endingLettersSpawnDelay[i + 6] = sEndingImageOam_Collecting_English[i].spawnDelay;
ENDING_DATA.unk_160[i + 6] = sEndingImageOam_Collecting_English[i].unk_2;
ENDING_DATA.oamXPositions[i + 6] = sEndingImageOam_Collecting_English[i].xPosition;
ENDING_DATA.oamYPositions[i + 6] = sEndingImageOam_Collecting_English[i].yPosition;
ENDING_DATA.oamFramePointers[i + 6] = sEndingImageOam_Collecting_English[i].pFrame;
}
}
}
}
/**
* @brief 84ee8 | c8 | Display a line of text of an ending image permanetly
*
* @param line Line
*/
void EndingImageDisplayLinePermanently(u32 line)
{
i32 i;
if (ENDING_DATA.language == LANGUAGE_HIRAGANA)
{
ENDING_DATA.unk_124[line] = sEndingImageOam_54bf58[line].unk_0;
ENDING_DATA.endingLettersSpawnDelay[line] = sEndingImageOam_54bf58[line].spawnDelay;
ENDING_DATA.unk_160[line] = sEndingImageOam_54bf58[line].unk_2;
ENDING_DATA.oamXPositions[line] = sEndingImageOam_54bf58[line].xPosition;
ENDING_DATA.oamYPositions[line] = sEndingImageOam_54bf58[line].yPosition;
ENDING_DATA.oamFramePointers[line] = sEndingImageOam_54bf58[line].pFrame;
}
else
{
ENDING_DATA.unk_124[line] = sEndingImageOam_54bd54[line].unk_0;
ENDING_DATA.endingLettersSpawnDelay[line] = sEndingImageOam_54bd54[line].spawnDelay;
ENDING_DATA.unk_160[line] = sEndingImageOam_54bd54[line].unk_2;
ENDING_DATA.oamXPositions[line] = sEndingImageOam_54bd54[line].xPosition;
ENDING_DATA.oamYPositions[line] = sEndingImageOam_54bd54[line].yPosition;
ENDING_DATA.oamFramePointers[line] = sEndingImageOam_54bd54[line].pFrame;
}
for (i = 0; i < ENDING_DATA.oamLength - 6; i++)
ENDING_DATA.unk_124[i + 6] = 0;
ENDING_DATA.oamLength = 6;
}
void EndingImageLoadIGTAndPercentageGraphics(void)
{
// https://decomp.me/scratch/vLTLr
i32 hoursTens;
i32 hoursOnes;
i32 minutesTens;
i32 minutesOnes;
i32 secondsTens;
i32 secondsOnes;
i32 percentageHundreds;
i32 percentageTens;
i32 percentageOnes;
i32 offset;
hoursTens = 0;
hoursOnes = gInGameTimer.hours;
while (hoursOnes > 9)
{
hoursOnes -= 10;
hoursTens++;
}
minutesTens = 0;
minutesOnes = gInGameTimer.minutes;
while (minutesOnes > 9)
{
minutesOnes -= 10;
minutesTens++;
}
secondsTens = 0;
secondsOnes = gInGameTimer.seconds;
while (secondsOnes > 9)
{
secondsOnes -= 10;
secondsTens++;
}
if (hoursTens != 0)
{
offset = hoursTens * 64;
dma_set(3, &sEndingImageNumbersGFX_Upper[offset], VRAM_BASE + 0x10000, DMA_ENABLE << 16 | 32);
dma_set(3, &sEndingImageNumbersGFX_Lower[offset], VRAM_BASE + 0x10400, DMA_ENABLE << 16 | 32);
}
offset = hoursOnes * 64;
dma_set(3, &sEndingImageNumbersGFX_Upper[offset], VRAM_BASE + 0x10040, DMA_ENABLE << 16 | 32);
dma_set(3, &sEndingImageNumbersGFX_Lower[offset], VRAM_BASE + 0x10440, DMA_ENABLE << 16 | 32);
offset = minutesTens * 64;
dma_set(3, &sEndingImageNumbersGFX_Upper[offset], VRAM_BASE + 0x100A0, DMA_ENABLE << 16 | 32);
dma_set(3, &sEndingImageNumbersGFX_Lower[offset], VRAM_BASE + 0x104A0, DMA_ENABLE << 16 | 32);
offset = minutesOnes * 64;
dma_set(3, &sEndingImageNumbersGFX_Upper[offset], VRAM_BASE + 0x100E0, DMA_ENABLE << 16 | 32);
dma_set(3, &sEndingImageNumbersGFX_Lower[offset], VRAM_BASE + 0x104E0, DMA_ENABLE << 16 | 32);
offset = secondsTens * 64;
dma_set(3, &sEndingImageNumbersGFX_Upper[offset], VRAM_BASE + 0x10140, DMA_ENABLE << 16 | 32);
dma_set(3, &sEndingImageNumbersGFX_Lower[offset], VRAM_BASE + 0x10540, DMA_ENABLE << 16 | 32);
offset = secondsOnes * 64;
dma_set(3, &sEndingImageNumbersGFX_Upper[offset], VRAM_BASE + 0x10180, DMA_ENABLE << 16 | 32);
dma_set(3, &sEndingImageNumbersGFX_Lower[offset], VRAM_BASE + 0x10580, DMA_ENABLE << 16 | 32);
percentageHundreds = 0;
percentageTens = 0;
percentageOnes = ENDING_DATA.completionPercentage;
while (percentageOnes >= 100)
{
percentageOnes -= 100;
percentageHundreds++;
}
while (percentageOnes >= 10)
{
percentageOnes -= 10;
percentageTens++;
}
if (percentageHundreds != 0)
{
offset = percentageHundreds * 64;
dma_set(3, &sEndingImageNumbersGFX_Upper[offset], VRAM_BASE + 0x101C0, DMA_ENABLE << 16 | 32);
dma_set(3, &sEndingImageNumbersGFX_Lower[offset], VRAM_BASE + 0x105C0, DMA_ENABLE << 16 | 32);
}
if (percentageTens != 0)
{
offset = percentageTens * 64;
dma_set(3, &sEndingImageNumbersGFX_Upper[offset], VRAM_BASE + 0x10200, DMA_ENABLE << 16 | 32);
dma_set(3, &sEndingImageNumbersGFX_Lower[offset], VRAM_BASE + 0x10600, DMA_ENABLE << 16 | 32);
}
offset = percentageOnes * 64;
dma_set(3, &sEndingImageNumbersGFX_Upper[offset], VRAM_BASE + 0x10240, DMA_ENABLE << 16 | 32);
dma_set(3, &sEndingImageNumbersGFX_Lower[offset], VRAM_BASE + 0x10640, DMA_ENABLE << 16 | 32);
}
/**
* @brief 851b4 | 164 | V-blank code for gallery, ending image and credits
*
*/
void GalleryVBlank(void)
{
u32 buffer;
u32 bgPos;
dma_set(3, gOamData, OAM_BASE, (DMA_ENABLE | DMA_32BIT) << 16 | OAM_SIZE / 4);
if (ENDING_DATA.unk_6 == 1)
{
dma_set(3, ENDING_DATA.creditLineTilemap_1, VRAM_BASE + ENDING_DATA.creditLineOffset_1,
DMA_ENABLE << 16 | ARRAY_SIZE(ENDING_DATA.creditLineTilemap_1));
dma_set(3, ENDING_DATA.creditLineTilemap_2, VRAM_BASE + ENDING_DATA.creditLineOffset_2,
DMA_ENABLE << 16 | ARRAY_SIZE(ENDING_DATA.creditLineTilemap_2));
buffer = 0;
dma_set(3, &buffer, VRAM_BASE + 0x800 + ENDING_DATA.creditLineOffset_1,
(DMA_ENABLE | DMA_32BIT | DMA_SRC_FIXED) << 16 | ARRAY_SIZE(ENDING_DATA.creditLineTilemap_1) / 2);
buffer = 0;
dma_set(3, &buffer, VRAM_BASE + 0x800 + ENDING_DATA.creditLineOffset_2,
(DMA_ENABLE | DMA_32BIT | DMA_SRC_FIXED) << 16 | ARRAY_SIZE(ENDING_DATA.creditLineTilemap_2) / 2);
}
else if (ENDING_DATA.unk_6 != 0)
{
dma_set(3, ENDING_DATA.creditLineTilemap_1, VRAM_BASE + 0x800 + ENDING_DATA.creditLineOffset_1,
DMA_ENABLE << 16 | ARRAY_SIZE(ENDING_DATA.creditLineTilemap_1));
dma_set(3, ENDING_DATA.creditLineTilemap_2, VRAM_BASE + 0x800 + ENDING_DATA.creditLineOffset_2,
DMA_ENABLE << 16 | ARRAY_SIZE(ENDING_DATA.creditLineTilemap_2));
buffer = 0;
dma_set(3, &buffer, VRAM_BASE + ENDING_DATA.creditLineOffset_1,
(DMA_ENABLE | DMA_32BIT | DMA_SRC_FIXED) << 16 | ARRAY_SIZE(ENDING_DATA.creditLineTilemap_1) / 2);
buffer = 0;
dma_set(3, &buffer, VRAM_BASE + ENDING_DATA.creditLineOffset_2,
(DMA_ENABLE | DMA_32BIT | DMA_SRC_FIXED) << 16 | ARRAY_SIZE(ENDING_DATA.creditLineTilemap_2) / 2);
}
write16(REG_DISPCNT, ENDING_DATA.dispcnt);
write16(REG_BLDCNT, ENDING_DATA.bldcnt);
write16(REG_BLDALPHA, gWrittenToBLDALPHA_H << 8 | gWrittenToBLDALPHA_L);
write16(REG_BLDY, gWrittenToBLDY_NonGameplay);
write16(REG_BG0VOFS, bgPos = gBG0YPosition / 16 & 0x1FF);
write16(REG_BG1VOFS, bgPos);
write16(REG_BG2VOFS, gBG2YPosition / 16 & 0x1FF);
write16(REG_BG3VOFS, gBG3YPosition / 16 & 0x1FF);
}
/**
@ -184,9 +420,110 @@ u8 CreditsDisplayLine(u32 line)
}
/**
* @brief 859f4 | 18c | Displays the credits
*
* @return u8 bool, ended
*/
u8 CreditsDisplay(void)
{
u8 ended;
i32 temp;
u8 result;
u8 unk_0;
u8 unk_1;
if (ENDING_DATA.unk_1)
{
ended = FALSE;
switch (ENDING_DATA.timer++)
{
case 464:
ENDING_DATA.unk_1++;
break;
case 528:
ENDING_DATA.bldcnt = BLDCNT_BG0_FIRST_TARGET_PIXEL | BLDCNT_ALPHA_BLENDING_EFFECT | BLDCNT_BG2_SECOND_TARGET_PIXEL;
gWrittenToBLDY_NonGameplay = 0;
ENDING_DATA.unk_1++;
break;
case 560:
ENDING_DATA.dispcnt = DCNT_BG2 | DCNT_BG3;
ENDING_DATA.bldcnt = 0;
ended = TRUE;
break;
}
if (ENDING_DATA.unk_1 == 2)
{
if (!(ENDING_DATA.endScreenTimer++ & 3))
{
if (gWrittenToBLDY_NonGameplay)
gWrittenToBLDY_NonGameplay--;
}
}
else if (ENDING_DATA.unk_1 == 3)
{
if (ENDING_DATA.timer & 1)
{
if (gWrittenToBLDALPHA_L)
{
gWrittenToBLDALPHA_L--;
gWrittenToBLDALPHA_H = 16 - gWrittenToBLDALPHA_L;
}
else
ENDING_DATA.unk_1++;
}
}
return ended;
}
if (ENDING_DATA.unk_E > 127)
{
ENDING_DATA.unk_E &= 127;
if (ENDING_DATA.unk_8 == ENDING_DATA.unk_A)
{
ended = CreditsDisplayLine(ENDING_DATA.currentCreditLine);
unk_0 = ended & 0xF0;
ended = ended & 0xF;
if (ended == 0x9)
{
ENDING_DATA.unk_1 = 1;
}
else
{
temp = ENDING_DATA.unk_A * 0x40 + 0x500;
if (temp > 0x7FF)
temp &= 0x7FF;
ENDING_DATA.creditLineOffset_1 = temp + 0xF000;
temp = ENDING_DATA.unk_A * 0x40 + 0x540;
if (temp > 0x7FF)
temp &= 0x7FF;
ENDING_DATA.creditLineOffset_2 = temp + 0xF000;
ENDING_DATA.unk_A += ended;
ENDING_DATA.currentCreditLine++;
ENDING_DATA.unk_6++;
if (unk_0 == 0x80)
ENDING_DATA.unk_6++;
}
}
ENDING_DATA.unk_8++;
}
ENDING_DATA.unk_E += 7;
gBG0YPosition += 7;
return FALSE;
}
/**
@ -837,7 +1174,7 @@ u8 EndingImageDisplay(void)
break;
case 30:
EndingImageLoadTextOAM(0);
EndingImageLoadTextOAM(ENDING_IMAGE_OAM_SET_CLEAR_TIME);
ENDING_DATA.unk_1 = TRUE;
break;
@ -852,7 +1189,7 @@ u8 EndingImageDisplay(void)
break;
case 330:
EndingImageLoadTextOAM(1);
EndingImageLoadTextOAM(ENDING_IMAGE_OAM_SET_YOUR_RATE);
break;
case 375:
@ -864,7 +1201,7 @@ u8 EndingImageDisplay(void)
case 380:
if (ENDING_DATA.language == LANGUAGE_JAPANESE || ENDING_DATA.language == LANGUAGE_ENGLISH ||
ENDING_DATA.language == LANGUAGE_ITALIAN)
EndingImageLoadTextOAM(2);
EndingImageLoadTextOAM(ENDING_IMAGE_OAM_SET_COLLECTING);
break;
case 460:
@ -915,7 +1252,7 @@ u8 EndingImageDisplay(void)
if (ENDING_DATA.unk_1 == TRUE)
{
for (i = 6; i < ENDING_DATA.oamLength; i++)
EndingImageCheckDisplayLetter(i);
EndingImageUpdateLettersSpawnDelay(i);
}
EndingImageDisplayText();
@ -1180,12 +1517,6 @@ void GalleryInit(void)
GalleryVBlank();
}
#define GALLERY_RESET_BG_POS()\
do { \
gBG0YPosition = 0; \
gBG1YPosition = 0; \
} while(0);
/**
* @brief 8761c | 15c | Handles the display of the gallery image
*

258
src/fusion_gallery.c Normal file
View File

@ -0,0 +1,258 @@
#include "fusion_gallery.h"
#include "data/shortcut_pointers.h"
#include "data/fusion_gallery_data.h"
#include "constants/audio.h"
#include "constants/ending_and_gallery.h"
#include "constants/game_state.h"
#include "constants/text.h"
#include "structs/bg_clip.h"
#include "structs/display.h"
#include "structs/fusion_gallery.h"
#include "structs/game_state.h"
#define GALLERY_RESET_BG_POS()\
do { \
gBG0YPosition = 0; \
gBG1YPosition = 0; \
} while(0);
/**
* @brief 847f8 | 78 | V-blank code for the fusion gallery
*
*/
void FusionGalleryVBlank(void)
{
dma_set(3, gOamData, OAM_BASE, (DMA_ENABLE | DMA_32BIT) << 16 | OAM_SIZE / 4);
write16(REG_DISPCNT, FUSION_GALLERY_DATA.dispcnt);
write16(REG_BLDCNT, FUSION_GALLERY_DATA.bldcnt);
write16(REG_BLDY, gWrittenToBLDY_NonGameplay);
write16(REG_BG0VOFS, (gBG0YPosition / 16) & 0x1FF);
write16(REG_BG1VOFS, (gBG1YPosition / 16) & 0x1FF);
}
void FusionGalleryInit(void)
{
u32 zero;
u32 image;
write16(REG_IME, FALSE);
write16(REG_DISPSTAT, read16(REG_DISPSTAT) & ~DSTAT_IF_HBLANK);
write16(REG_IE, read16(REG_IE) & ~IF_HBLANK);
write16(REG_IF, IF_HBLANK);
write16(REG_IME, TRUE);
write16(REG_DISPCNT, 0);
write16(REG_IME, FALSE);
CallbackSetVBlank(FusionGalleryVBlank);
write16(REG_IME, TRUE);
if (gGameModeSub1 == 0)
{
ClearGfxRam();
zero = 0;
dma_set(3, &zero, &gNonGameplayRAM, (DMA_ENABLE | DMA_32BIT | DMA_SRC_FIXED) << 16 | sizeof(gNonGameplayRAM) / 4);
}
image = FUSION_GALLERY_DATA.currentImage;
LZ77UncompVRAM(sFusionGalleryData[image].pTopGfx, VRAM_BASE);
LZ77UncompVRAM(sFusionGalleryData[image].pBottomGfx, VRAM_BASE + 0x8000);
LZ77UncompVRAM(sFusionGalleryData[image].pTopTileTable, VRAM_BASE + 0xE000);
LZ77UncompVRAM(sFusionGalleryData[image].pBottomTileTable, VRAM_BASE + 0xF800);
BitFill(3, 0x4FF04FF, VRAM_BASE + 0xE800, 0x800, 32);
dma_set(3, sFusionGalleryData[image].pPalette, PALRAM_BASE, DMA_ENABLE << 16 | PALRAM_SIZE / 4);
write16(REG_BG0CNT, 0x9C00);
write16(REG_BG1CNT, 0x9E09);
gNextOamSlot = 0;
ResetFreeOAM();
gBG0XPosition = 0;
gBG0YPosition = 0x1000;
gBG1XPosition = 0;
gBG1YPosition = 0x1000;
gBG2XPosition = 0;
gBG2YPosition = 0;
gBG3XPosition = 0;
gBG3YPosition = 0;
write16(REG_BG0HOFS, 0);
write16(REG_BG0VOFS, 0x1000);
write16(REG_BG1HOFS, 0);
write16(REG_BG1VOFS, 0x1000);
write16(REG_BG2HOFS, 0);
write16(REG_BG2VOFS, 0);
write16(REG_BG3HOFS, 0);
write16(REG_BG3VOFS, 0);
FUSION_GALLERY_DATA.unk_2 = 0;
FUSION_GALLERY_DATA.dispcnt = DCNT_BG0 | DCNT_BG1 | DCNT_OBJ;
ENDING_DATA.bldcnt = BLDCNT_BG0_FIRST_TARGET_PIXEL | BLDCNT_BG1_FIRST_TARGET_PIXEL | BLDCNT_BG2_FIRST_TARGET_PIXEL |
BLDCNT_BG3_FIRST_TARGET_PIXEL | BLDCNT_OBJ_FIRST_TARGET_PIXEL | BLDCNT_BACKDROP_FIRST_TARGET_PIXEL |
BLDCNT_ALPHA_BLENDING_EFFECT | BLDCNT_BRIGHTNESS_INCREASE_EFFECT;
FusionGalleryVBlank();
}
/**
* @brief 84a40 | 120 | Handles the display of the fusion gallery image
*
* @return u32 bool, ended
*/
u32 FusionGalleryDisplay(void)
{
u8 imageId;
u32 ended;
i32 velocity;
u32 change;
u8 complPercent;
u8 bit;
ended = FALSE;
change = FALSE;
imageId = FUSION_GALLERY_DATA.currentImage;
complPercent = 0;
if (gChangedInput & KEY_B)
{
FUSION_GALLERY_DATA.bldcnt = BLDCNT_BG0_FIRST_TARGET_PIXEL | BLDCNT_BG1_FIRST_TARGET_PIXEL | BLDCNT_BG2_FIRST_TARGET_PIXEL |
BLDCNT_BG3_FIRST_TARGET_PIXEL | BLDCNT_OBJ_FIRST_TARGET_PIXEL | BLDCNT_BACKDROP_FIRST_TARGET_PIXEL |
BLDCNT_ALPHA_BLENDING_EFFECT | BLDCNT_BRIGHTNESS_INCREASE_EFFECT;
gWrittenToBLDY_NonGameplay = 0;
ended = TRUE;
}
else if (gChangedInput & (KEY_A | KEY_RIGHT))
{
if (imageId < NUMBER_OF_FUSION_GALLERY_IMAGES - 1)
imageId++;
else
imageId = 0;
change++;
}
else if (gChangedInput & KEY_LEFT)
{
if (imageId != 0)
imageId--;
else
imageId = NUMBER_OF_FUSION_GALLERY_IMAGES - 1;
change++;
}
if (change)
{
FUSION_GALLERY_DATA.currentImage = imageId;
FUSION_GALLERY_DATA.bldcnt = BLDCNT_BG0_FIRST_TARGET_PIXEL | BLDCNT_BG1_FIRST_TARGET_PIXEL | BLDCNT_BG2_FIRST_TARGET_PIXEL |
BLDCNT_BG3_FIRST_TARGET_PIXEL | BLDCNT_OBJ_FIRST_TARGET_PIXEL | BLDCNT_BACKDROP_FIRST_TARGET_PIXEL |
BLDCNT_ALPHA_BLENDING_EFFECT | BLDCNT_BRIGHTNESS_INCREASE_EFFECT;
gWrittenToBLDY_NonGameplay = 0;
gGameModeSub1 = 5;
}
change = FALSE;
velocity = 8;
if (FUSION_GALLERY_DATA.unk_2 != 0)
{
if (gButtonInput & KEY_DOWN)
change = TRUE;
velocity = 12;
}
if (!change)
{
if (gBG0YPosition > velocity)
{
gBG0YPosition -= velocity;
gBG1YPosition -= velocity;
}
else
{
GALLERY_RESET_BG_POS();
FUSION_GALLERY_DATA.unk_2 = TRUE;
}
}
else
{
gBG0YPosition += velocity;
gBG1YPosition += velocity;
if (gBG0YPosition > BLOCK_SIZE * 64)
{
gBG0YPosition = BLOCK_SIZE * 64;
gBG1YPosition = BLOCK_SIZE * 64;
}
}
return ended;
}
/**
* @brief 84b60 | d4 | Fusion gallery subroutine
*
* @return u32 bool, ended
*/
u32 FusionGallerySubroutine(void)
{
u32 ended;
ended = FALSE;
FUSION_GALLERY_DATA.stage = 0;
switch (gGameModeSub1)
{
case 0:
case 4:
GalleryInit();
gGameModeSub1 = 1;
break;
case 1:
if (gWrittenToBLDY_NonGameplay != 0)
{
gWrittenToBLDY_NonGameplay--;
break;
}
FUSION_GALLERY_DATA.bldcnt = 0;
gGameModeSub1++;
break;
case 2:
if (GalleryDisplay())
gGameModeSub1++;
break;
case 3:
case 5:
if (gWrittenToBLDY_NonGameplay < 16)
{
if (FUSION_GALLERY_DATA.unk_94++ & 1)
gWrittenToBLDY_NonGameplay++;
break;
}
if (gGameModeSub1 == 3)
ended++;
else
gGameModeSub1 = 4;
break;
}
return ended;
}

View File

@ -338,7 +338,7 @@ void GameOverInit_Unused(void)
UpdateSOUNDCNT_H(0x194F780);
StopAllMusicsAndSounds();
write16(PALRAM_BASE, 0x7FFF);
write16(PALRAM_BASE, COLOR_WHITE);
write16(REG_BG0CNT, 0);
write16(REG_BG1CNT, 0);