Merge pull request #247 from Retnuhytnuob/fakematchCleanup-RenderHighScoreSprites
Some checks failed
CI / build (push) Has been cancelled

Cleanup RenderHighScoreSprites fakematch
This commit is contained in:
Retnuhytnuob
2026-08-22 03:00:35 -05:00
committed by GitHub
4 changed files with 96 additions and 138 deletions

View File

@@ -183,7 +183,6 @@ void Ereader_AnimateLinkCable(void)
void Ereader_Communicating(void)
{
s32 index;
u16 temp;
UpdateEReaderSpritesViaOam();
if (JOY_NEW(B_BUTTON)) {
@@ -225,8 +224,7 @@ void Ereader_Communicating(void)
}
if (gEReaderStatusAnimSpriteGroup == SG_EREADER_TRANSMITTING) {
gEReaderGeneralTimer++;
temp = gEReaderGeneralTimer; // TODO: FAKEMATCH
if ((gEReaderGeneralTimer & 7) == 0) {
if (gEReaderGeneralTimer % 8 == 0) {
gEReaderHeaderAnimSpriteGroup = SG_21 - gEReaderHeaderAnimSpriteGroup;
}
if (((gLinkStatusResult & 0x7f0000) != 0) &&

View File

@@ -21,7 +21,7 @@ extern s16 gCompletionBannerY;
extern s8 gCompletionBannerPhase;
extern s8 gCompletionBannerSpriteGroup;
extern s8 gHighScoreShowPopupFlag;
extern u8 gHighScorePopupType;
extern s8 gHighScorePopupType;
extern u16 gLinkExchangeCommand;
extern u16 gLinkPacketCounter;
extern s8 gLinkExchangeSendPhase;
@@ -235,7 +235,6 @@ void InitHighScoreData(void)
void HighScore_ShowCompletionBanner(void)
{
u16 temp;
switch(gCompletionBannerPhase)
{
case 0:
@@ -248,9 +247,7 @@ void HighScore_ShowCompletionBanner(void)
case 1:
gCompletionBannerY--;
// TODO: FAKEMATCH - Seth
temp = gHighScoreScreenState.flashDuration;
if((gHighScoreScreenState.flashDuration & 3) == 0)
if(gHighScoreScreenState.flashDuration % 4 == 0)
{
gCompletionBannerSpriteGroup++;
if(gCompletionBannerSpriteGroup > SG_HIGH_SCORE_COMPLETION_BANNER_LOOP_END)
@@ -973,154 +970,132 @@ void UpdateNameEntryCursor(void)
spriteGroup->active = FALSE;
}
// The target keeps two redundant pointer copies alive in the entry block --
// spriteGroup1_ in r4 and spriteGroup2_ in r5 -- which agbcc otherwise deletes
// in cse1, again in loop and again in combine. Two constructs keep them:
// the r4 pin on spriteGroup1_, and the empty asm("") barriers below (they emit
// no instructions and the "r" constraint accepts any register; they only stop
// the alias pointers being coalesced with the pointers they duplicate, and stop
// the OAM pointers being re-folded into base+displacement addressing).
// spriteGroup2_ cannot also be pinned -- the target reuses r5 as a scratch
// register once the alias dies, and a pin would reserve it for the whole
// function. Three barriers is the floor; their exact placement is required for
// a byte-identical match, so do not move or remove them.
void RenderHighScoreSprites(void)
{
int i;
struct SpriteGroup *spriteGroup1;
register struct SpriteGroup *spriteGroup1_ asm("r4");
struct SpriteGroup *spriteGroup2;
struct SpriteGroup *spriteGroup2_;
struct SpriteGroup *spriteGroup3;
struct SpriteGroup *spriteGroup4;
s32 i;
struct SpriteGroup *(highScorePageArrowSG[2]);
struct SpriteGroup *popupSG;
struct SpriteGroup *pressStartSG;
struct OamDataSimple *oamData;
const struct SpriteSet *spriteSet;
const struct SpriteSet * const *spriteSets = gHighScoreScreenSpriteSets;
spriteGroup1 = &gMain.spriteGroups[SG_HIGH_SCORE_PAGE_RIGHT_ARROW];
spriteGroup1_ = spriteGroup1;
spriteGroup2 = &gMain.spriteGroups[SG_HIGH_SCORE_PAGE_LEFT_ARROW];
spriteGroup2_ = spriteGroup2;
asm("" : "=r"(spriteGroup2_) : "0"(spriteGroup2_));
spriteGroup3 = &gMain.spriteGroups[(s8)gHighScorePopupType + SG_HIGH_SCORE_POPUP_LIST_BASE];
spriteGroup4 = &gMain.spriteGroups[gHighScoreScreenState.pressStartBlinkToggle + SG_HIGH_SCORE_PRESS_START_0];
highScorePageArrowSG[0] = &gMain.spriteGroups[SG_HIGH_SCORE_PAGE_RIGHT_ARROW];
highScorePageArrowSG[1] = &gMain.spriteGroups[SG_HIGH_SCORE_PAGE_LEFT_ARROW];
popupSG = &gMain.spriteGroups[gHighScorePopupType + SG_HIGH_SCORE_POPUP_LIST_BASE];
pressStartSG = &gMain.spriteGroups[gHighScoreScreenState.pressStartBlinkToggle + SG_HIGH_SCORE_PRESS_START_0];
if (gScrollXOffset == 0)
{
spriteGroup1->active = TRUE;
spriteGroup2_->active = FALSE;
spriteGroup3->active = gHighScoreShowPopupFlag;
spriteGroup4->active = gHighScoreScreenState.displayModeVisible;
asm("" : : "r"(spriteGroup1_), "r"(spriteGroup2_));
highScorePageArrowSG[0]->active = TRUE;
highScorePageArrowSG[1]->active = FALSE;
popupSG->active = gHighScoreShowPopupFlag;
pressStartSG->active = gHighScoreScreenState.displayModeVisible;
LoadSpriteSets(spriteSets, 9, spriteGroup1);
LoadSpriteSets(gHighScoreScreenSpriteSets, 9, gMain.spriteGroups);
highScorePageArrowSG[0]->baseX = 220;
highScorePageArrowSG[0]->baseY = 144;
oamData = &highScorePageArrowSG[0]->oam[0];
gOamBuffer[oamData->oamId].tileNum = gHighScoreScreenState.flashElapsedFrames * 2 + 2;
gOamBuffer[oamData->oamId].x = oamData->xOffset + highScorePageArrowSG[0]->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + highScorePageArrowSG[0]->baseY;
if (pressStartSG->active == TRUE)
{
spriteGroup1->baseX = 220;
spriteGroup1->baseY = 144;
oamData = &spriteGroup1_->oam[0];
gOamBuffer[oamData->oamId].tileNum = gHighScoreScreenState.flashElapsedFrames * 2 + 2;
gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup1->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup1->baseY;
}
if (spriteGroup4->active == TRUE)
{
spriteGroup4->baseX = 84;
spriteGroup4->baseY = 150;
pressStartSG->baseX = 84;
pressStartSG->baseY = 150;
spriteSet = gHighScoreScreenSpriteSets[gHighScoreScreenState.pressStartBlinkToggle + SG_HIGH_SCORE_PRESS_START_0];
for (i = 0; i < spriteSet->count; i++)
{
oamData = &spriteGroup4->oam[i];
gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup4->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup4->baseY;
oamData = &pressStartSG->oam[i];
gOamBuffer[oamData->oamId].x = oamData->xOffset + pressStartSG->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + pressStartSG->baseY;
}
}
if (spriteGroup3->active == TRUE)
if (popupSG->active == TRUE)
{
switch ((s8)gHighScorePopupType)
switch(gHighScorePopupType)
{
case HIGH_SCORE_POPUP_TRANSMISSION_CONNECT_PROMPT:
case HIGH_SCORE_POPUP_DELETE_CONFIRMATION_PROMPT:
spriteGroup3->baseX = 120;
spriteGroup3->baseY = 100;
popupSG->baseX = 120;
popupSG->baseY = 100;
break;
default:
spriteGroup3->baseX = 120;
spriteGroup3->baseY = 80;
break;
popupSG->baseX = 120;
popupSG->baseY = 80;
}
spriteSet = gHighScoreScreenSpriteSets[(s8)gHighScorePopupType + SG_HIGH_SCORE_POPUP_LIST_BASE];
spriteSet = gHighScoreScreenSpriteSets[SG_HIGH_SCORE_POPUP_LIST_BASE + gHighScorePopupType];
for (i = 0; i < spriteSet->count; i++)
{
oamData = &spriteGroup3->oam[i];
gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup3->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup3->baseY;
oamData = &popupSG->oam[i];
gOamBuffer[oamData->oamId].x = oamData->xOffset + popupSG->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + popupSG->baseY;
}
}
}
else if (gScrollXOffset == 240)
{
spriteGroup1->active = FALSE;
spriteGroup2->active = TRUE;
spriteGroup3->active = gHighScoreShowPopupFlag;
spriteGroup4->active = gHighScoreScreenState.displayModeVisible;
LoadSpriteSets(spriteSets, 9, spriteGroup1);
highScorePageArrowSG[0]->active = FALSE;
highScorePageArrowSG[1]->active = TRUE;
popupSG->active = gHighScoreShowPopupFlag;
pressStartSG->active = gHighScoreScreenState.displayModeVisible;
LoadSpriteSets(gHighScoreScreenSpriteSets, 9, gMain.spriteGroups);
highScorePageArrowSG[1]->baseX = 4;
highScorePageArrowSG[1]->baseY = 144;
oamData = &highScorePageArrowSG[1]->oam[0];
gOamBuffer[oamData->oamId].tileNum = gHighScoreScreenState.flashElapsedFrames * 2 + 2;
gOamBuffer[oamData->oamId].x = oamData->xOffset + highScorePageArrowSG[1]->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + highScorePageArrowSG[1]->baseY;
if (pressStartSG->active == TRUE)
{
spriteGroup2->baseX = 4;
spriteGroup2->baseY = 144;
oamData = &spriteGroup2_->oam[0];
asm("" : "=r"(spriteGroup2_) : "0"(spriteGroup2_));
gOamBuffer[oamData->oamId].tileNum = gHighScoreScreenState.flashElapsedFrames * 2 + 2;
gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup2->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup2->baseY;
}
if (spriteGroup4->active == TRUE)
{
spriteGroup4->baseX = 84;
spriteGroup4->baseY = 150;
pressStartSG->baseX = 84;
pressStartSG->baseY = 150;
spriteSet = gHighScoreScreenSpriteSets[gHighScoreScreenState.pressStartBlinkToggle + SG_HIGH_SCORE_PRESS_START_0];
for (i = 0; i < spriteSet->count; i++)
{
oamData = &spriteGroup4->oam[i];
gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup4->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup4->baseY;
oamData = &pressStartSG->oam[i];
gOamBuffer[oamData->oamId].x = oamData->xOffset + pressStartSG->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + pressStartSG->baseY;
}
}
if (spriteGroup3->active == TRUE)
if (popupSG->active == TRUE)
{
switch ((s8)gHighScorePopupType)
switch (gHighScorePopupType)
{
case HIGH_SCORE_POPUP_TRANSMISSION_CONNECT_PROMPT:
case HIGH_SCORE_POPUP_DELETE_CONFIRMATION_PROMPT:
spriteGroup3->baseX = 120;
spriteGroup3->baseY = 100;
popupSG->baseX = 120;
popupSG->baseY = 100;
break;
default:
spriteGroup3->baseX = 120;
spriteGroup3->baseY = 80;
popupSG->baseX = 120;
popupSG->baseY = 80;
break;
}
spriteSet = gHighScoreScreenSpriteSets[(s8)gHighScorePopupType + SG_HIGH_SCORE_POPUP_LIST_BASE];
spriteSet = gHighScoreScreenSpriteSets[gHighScorePopupType + SG_HIGH_SCORE_POPUP_LIST_BASE];
for (i = 0; i < spriteSet->count; i++)
{
oamData = &spriteGroup3->oam[i];
gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup3->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup3->baseY;
oamData = &popupSG->oam[i];
gOamBuffer[oamData->oamId].x = oamData->xOffset + popupSG->baseX;
gOamBuffer[oamData->oamId].y = oamData->yOffset + popupSG->baseY;
}
}
}
else
{
spriteGroup1->active = FALSE;
spriteGroup2->active = FALSE;
LoadSpriteSets(spriteSets, 9, spriteGroup1);
highScorePageArrowSG[0]->active = FALSE;
highScorePageArrowSG[1]->active = FALSE;
LoadSpriteSets(gHighScoreScreenSpriteSets, 9, gMain.spriteGroups);
}
spriteGroup3->active = FALSE;
spriteGroup4->active = FALSE;
popupSG->active = 0;
pressStartSG->active = 0;
}

View File

@@ -595,7 +595,6 @@ void IntroScene1Torchic_RenderAllSprites(void)
struct SpriteGroup *mainSg2;
struct SpriteGroup *otherSg;
int i;
const u16 *p; // TODO Fakematch
gMain.blendControl = 0xF10;
gMain.blendAlpha = gIntroBlendSrc | (gIntroBlendDst << 8);
@@ -615,13 +614,13 @@ void IntroScene1Torchic_RenderAllSprites(void)
if (puVar1->active == TRUE)
{
const struct SpriteSet *introScene1;
puVar1->baseX = gIntroSpriteEntities[1].posX;
puVar1->baseY = gIntroSpriteEntities[1].posY;
p = &gIntroScene1Torchic_SpriteSets[gIntroSpriteEntities[1].animFrame]->count;
for (i = 0;
i < *p;
i++)
introScene1 = gIntroScene1Torchic_SpriteSets[gIntroSpriteEntities[1].animFrame];
for (i = 0; i < introScene1->count; i++)
{
puVar5 = &puVar1->oam[i];
gOamBuffer[puVar5->oamId].objMode = ST_OAM_OBJ_BLEND;

View File

@@ -669,28 +669,18 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
{
s32 i;
struct MusicPlayerTrack *track;
u16 fadeOI = mplayInfo->fadeOI;
register u32 temp asm("r3");
register u16 mask asm("r2");
u16 fadeOV;
if (fadeOI == 0)
if (mplayInfo->fadeOI == 0)
return;
if (--mplayInfo->fadeOC != 0)
return;
mplayInfo->fadeOC--;
temp = 0xFFFF;
mask = temp;
if (mplayInfo->fadeOC != 0)
return;
mplayInfo->fadeOC = fadeOI;
mplayInfo->fadeOC = mplayInfo->fadeOI;
if (mplayInfo->fadeOV & FADE_IN)
{
mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT);
if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT))
if ((u16)(mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT)) >= (64 << FADE_VOL_SHIFT))
{
mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT);
mplayInfo->fadeOI = 0;
@@ -698,16 +688,13 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
}
else
{
mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT);
if ((s16)(mplayInfo->fadeOV & mask) <= 0)
if ((s16)(mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT)) <= 0)
{
i = mplayInfo->trackCount;
track = mplayInfo->tracks;
while (i > 0)
{
register u32 fadeOV asm("r7");
u32 val;
TrackStop(mplayInfo, track);
@@ -740,7 +727,9 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
{
if (track->flags & MPT_FLG_EXIST)
{
track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT);
fadeOV = mplayInfo->fadeOV;
track->volX = (fadeOV >> FADE_VOL_SHIFT);
track->flags |= MPT_FLG_VOLCHG;
}
@@ -894,16 +883,13 @@ void CgbModVol(struct CgbChannel *chan)
if ((soundInfo->mode & 1) || !CgbPan(chan))
{
chan->pan = 0xFF;
chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4;
chan->eg = (u32)(chan->leftVolume + chan->rightVolume);
chan->eg /= 16;
}
else
{
// Force chan->rightVolume and chan->leftVolume to be read from memory again,
// even though there is no reason to do so.
// The command line option "-fno-gcse" achieves the same result as this.
asm("" : : : "memory");
chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4;
chan->eg = (u32)(chan->leftVolume + chan->rightVolume);
chan->eg /= 16;
if (chan->eg > 15)
chan->eg = 15;
}