Skip to content

Commit

Permalink
Manual: Fade in/out when switching page
Browse files Browse the repository at this point in the history
  • Loading branch information
RocketRobz committed Aug 22, 2024
1 parent ec2e6b1 commit 136fae7
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 60 deletions.
53 changes: 25 additions & 28 deletions manual/arm9/source/graphics/graphics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,15 @@
#include <nds.h>

extern bool fadeType;
extern bool fadeSpeed;
extern bool controlTopBright;
extern bool controlBottomBright;
int fadeDelay = 0;

// u8 bgColor1 = 0xF6;
// u8 bgColor2 = 0xF7;

int screenBrightness = 31;
bool updatePalMidFrame = true;
bool leaveTopBarIntact = false;

u16 bmpImageBuffer[256*192] = {0};
u16 topBarPal[10] = {0}; // For both font and top bar palettes
Expand All @@ -56,12 +55,9 @@ int bg2Main;
int bg3Main;
int bg2Sub;

void ClearBrightness(void) {
fadeType = true;
screenBrightness = 0;
swiWaitForVBlank();
swiWaitForVBlank();
}
bool screenFadedIn(void) { return (screenBrightness == 0); }

bool screenFadedOut(void) { return (screenBrightness > 24); }

// Ported from PAlib (obsolete)
void SetBrightness(u8 screen, s8 bright) {
Expand Down Expand Up @@ -94,28 +90,23 @@ void SetBrightness(u8 screen, s8 bright) {

void vBlankHandler() {
if (fadeType) {
if (!fadeDelay) {
screenBrightness--;
if (screenBrightness < 0) screenBrightness = 0;
}
if (!fadeSpeed) {
fadeDelay++;
if (fadeDelay == 3) fadeDelay = 0;
} else {
fadeDelay = 0;
}
screenBrightness--;
if (screenBrightness < 0) screenBrightness = 0;
} else {
if (!fadeDelay) {
screenBrightness++;
if (screenBrightness > 31) screenBrightness = 31;
}
if (!fadeSpeed) {
fadeDelay++;
if (fadeDelay == 3) fadeDelay = 0;
} else {
fadeDelay = 0;
}
screenBrightness++;
if (screenBrightness > 31) screenBrightness = 31;
}

if (leaveTopBarIntact) {
if (controlTopBright) SetBrightness(0, 0);
if (controlBottomBright && !ms().macroMode) SetBrightness(1, ms().macroMode ? 0 : screenBrightness);
tonccpy(BG_PALETTE + 0xF6, topBarPal, 10 * 2);
while (REG_VCOUNT != 18);
if (controlTopBright) SetBrightness(0, screenBrightness);
tonccpy(BG_PALETTE, pagePal, 256 * 2);
return;
}

if (controlTopBright) SetBrightness(0, screenBrightness);
if (controlBottomBright && !ms().macroMode) SetBrightness(1, screenBrightness);

Expand All @@ -131,6 +122,8 @@ void pageLoad(const std::string &filename) {
pageImage = gif.frame(0).image.imageData;
pageYsize = gif.frame(0).descriptor.h;

while (!screenFadedOut()) { swiWaitForVBlank(); }

/* tonccpy(BG_PALETTE, gif.gct().data(), std::min(0xF6u, gif.gct().size()) * 2);
if (colorTable) {
for (int i = 0; i < (int)std::min(0xF6u, gif.gct().size()); i++) {
Expand All @@ -149,6 +142,10 @@ void pageLoad(const std::string &filename) {

dmaCopyWordsAsynch(0, pageImage.data(), bgGetGfxPtr(bg3Main)+(9*256), 174*256);
if (!ms().macroMode) dmaCopyWordsAsynch(1, pageImage.data()+(174*256), bgGetGfxPtr(bg3Sub), 192*256);

fadeType = true; // Fade in from white
while (!screenFadedIn()) { swiWaitForVBlank(); }

while (dmaBusy(0) || dmaBusy(1));
}

Expand Down
2 changes: 2 additions & 0 deletions manual/arm9/source/graphics/graphics.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#include <nds/ndstypes.h>
#include <string>

bool screenFadedIn(void);
bool screenFadedOut(void);
void SetBrightness(u8 screen, s8 bright);
void pageLoad(const std::string &filename);
void pageScroll();
Expand Down
46 changes: 14 additions & 32 deletions manual/arm9/source/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,14 @@ struct PageLink {
};

bool fadeType = false; // false = out, true = in
bool fadeSpeed = true; // false = slow (for DSi launch effect), true = fast
bool controlTopBright = true;
bool controlBottomBright = true;

// extern int bgColor1;
// extern int bgColor2;
extern u16* colorTable;

extern void ClearBrightness();
extern bool leaveTopBarIntact;

std::vector<DirEntry> manPagesList;
std::vector<PageLink> manPageLinks;
Expand All @@ -67,9 +66,6 @@ int pageYsize = 0;

char filePath[PATH_MAX];

mm_sound_effect snd_launch;
mm_sound_effect snd_select;
mm_sound_effect snd_stop;
mm_sound_effect snd_wrong;
mm_sound_effect snd_back;
mm_sound_effect snd_switch;
Expand Down Expand Up @@ -149,34 +145,10 @@ void stop (void) {
void InitSound() {
mmInitDefaultMem((mm_addr)soundbank_bin);

mmLoadEffect(SFX_LAUNCH);
mmLoadEffect(SFX_SELECT);
mmLoadEffect(SFX_STOP);
mmLoadEffect(SFX_WRONG);
mmLoadEffect(SFX_BACK);
mmLoadEffect(SFX_SWITCH);

snd_launch = {
{ SFX_LAUNCH } , // id
(int)(1.0f * (1<<10)), // rate
0, // handle
255, // volume
128, // panning
};
snd_select = {
{ SFX_SELECT } , // id
(int)(1.0f * (1<<10)), // rate
0, // handle
255, // volume
128, // panning
};
snd_stop = {
{ SFX_STOP } , // id
(int)(1.0f * (1<<10)), // rate
0, // handle
255, // volume
128, // panning
};
snd_wrong = {
{ SFX_WRONG } , // id
(int)(1.0f * (1<<10)), // rate
Expand Down Expand Up @@ -284,19 +256,17 @@ int manualScreen(void) {
std::sort(manPagesList.begin(), manPagesList.end(), [](DirEntry a, DirEntry b) { return a.name == "index.gif"; });

loadPageInfo(manPagesList[0].name.substr(0,manPagesList[0].name.length()-3) + "ini");
pageLoad(manPagesList[0].name);
topBarLoad();
printSmall(true, manPageTitleX, 0, manPageTitle, manPageTitleAlign);
updateText(true);
pageLoad(manPagesList[0].name);

int pressed = 0;
int held = 0;
int repeat = 0;
int currentPage = 0, returnPage = -1;
touchPosition touch;

fadeType = true; // Fade in from white

while (1) {
do {
scanKeys();
Expand Down Expand Up @@ -333,23 +303,31 @@ int manualScreen(void) {
pageScroll();
} else if (repeat & KEY_LEFT) {
if (currentPage > 0) {
leaveTopBarIntact = true;
fadeType = false;
mmEffectEx(&snd_switch);
pageYpos = 0;
currentPage--;
loadPageInfo(manPagesList[currentPage].name.substr(0,manPagesList[currentPage].name.length()-3) + "ini");
pageLoad(manPagesList[currentPage].name);
clearText(true);
printSmall(true, manPageTitleX, 0, manPageTitle, manPageTitleAlign);
updateText(true);
leaveTopBarIntact = false;
}
} else if (repeat & KEY_RIGHT) {
if (currentPage < (int)manPagesList.size()-1) {
leaveTopBarIntact = true;
fadeType = false;
mmEffectEx(&snd_switch);
pageYpos = 0;
currentPage++;
loadPageInfo(manPagesList[currentPage].name.substr(0,manPagesList[currentPage].name.length()-3) + "ini");
pageLoad(manPagesList[currentPage].name);
clearText(true);
printSmall(true, manPageTitleX, 0, manPageTitle, manPageTitleAlign);
updateText(true);
leaveTopBarIntact = false;
}
} else if (pressed & KEY_TOUCH) {
touchPosition touchStart = touch;
Expand Down Expand Up @@ -409,6 +387,9 @@ int manualScreen(void) {
for (uint i=0;i<manPageLinks.size();i++) {
if (((touchStart.px >= manPageLinks[i].x) && (touchStart.px <= (manPageLinks[i].x + manPageLinks[i].w))) &&
(((touchStart.py + pageYpos) >= manPageLinks[i].y - (ms().macroMode ? 0 : 174)) && ((touchStart.py + pageYpos) <= (manPageLinks[i].y - (ms().macroMode ? 0 : 174) + manPageLinks[i].h)))) {
leaveTopBarIntact = true;
fadeType = false;
mmEffectEx(&snd_switch);
pageYpos = 0;
returnPage = currentPage;
for (uint j=0;j<manPagesList.size();j++) {
Expand All @@ -422,6 +403,7 @@ int manualScreen(void) {
clearText(true);
printSmall(true, manPageTitleX, 0, manPageTitle, manPageTitleAlign);
updateText(true);
leaveTopBarIntact = false;
}
}
}
Expand Down
Binary file removed manual/music/launch.wav
Binary file not shown.
Binary file removed manual/music/select.wav
Binary file not shown.
Binary file removed manual/music/stop.wav
Binary file not shown.

0 comments on commit 136fae7

Please sign in to comment.