Add a settings menu

Studio BG and Frame Rate can be changed
This commit is contained in:
RocketRobz 2020-05-21 22:47:18 -06:00
parent 1d0161ba41
commit 5a77cda71c
5 changed files with 248 additions and 18 deletions

View File

@ -30,6 +30,7 @@ namespace GFX
// Sprirte Functions.
bool loadCharSprite(const char* t3xPathAllSeasons, const char* t3xPathOneSeason);
void loadBgSprite(void);
void showBgSprite(int zoomIn);
void showCharSprite(int zoomIn, int fadeAlpha);
void DrawGameSelSprite(int img, int x, int y, float ScaleX = 1, float ScaleY = 1);

View File

@ -9,10 +9,11 @@ enum ScreenMode {
SCREEN_MODE_EXIT = -1, // Exit homebrew
SCREEN_MODE_ROCKETROBZ = 0, // RocketRobz logo
SCREEN_MODE_GAME_SELECT = 1, // Game select
SCREEN_MODE_WHAT_TO_DO = 2, // What to do?
SCREEN_MODE_CHANGE_CHARACTER = 3, // Change character
SCREEN_MODE_CHANGE_MUSIC = 4, // Change music
SCREEN_MODE_CHANGE_EMBLEM = 5, // Change emblem
SCREEN_MODE_SETTINGS = 2, // Settings
SCREEN_MODE_WHAT_TO_DO = 3, // What to do?
SCREEN_MODE_CHANGE_CHARACTER = 4, // Change character
SCREEN_MODE_CHANGE_MUSIC = 5, // Change music
SCREEN_MODE_CHANGE_EMBLEM = 6 // Change emblem
};
#ifdef __cplusplus

View File

@ -7,7 +7,10 @@ static C2D_SpriteSheet gameSelSprites;
static C2D_SpriteSheet gameShotSprites;
static C2D_SpriteSheet bgSprite;
static C2D_SpriteSheet chracterSprite;
static bool dochracterSpriteFree = false;
static bool doChracterSpriteFree = false;
static bool doBgSpriteFree = false;
extern int studioBg;
extern bool showCursor;
extern int cursorX;
@ -18,7 +21,7 @@ Result GFX::loadSheets() {
sprites = C2D_SpriteSheetLoad("romfs:/gfx/sprites.t3x");
gameSelSprites = C2D_SpriteSheetLoad("romfs:/gfx/gameSelSprites.t3x");
gameShotSprites = C2D_SpriteSheetLoad("romfs:/gfx/gameShotSprites.t3x");
bgSprite = C2D_SpriteSheetLoad("romfs:/gfx/bgNight_loversBell.t3x");
GFX::loadBgSprite();
return 0;
}
@ -26,30 +29,50 @@ Result GFX::unloadSheets() {
C2D_SpriteSheetFree(sprites);
C2D_SpriteSheetFree(gameSelSprites);
C2D_SpriteSheetFree(gameShotSprites);
C2D_SpriteSheetFree(bgSprite);
if (dochracterSpriteFree) {
if (doBgSpriteFree) {
C2D_SpriteSheetFree(bgSprite);
}
if (doChracterSpriteFree) {
C2D_SpriteSheetFree(chracterSprite);
}
return 0;
}
void GFX::loadBgSprite(void) {
if (doBgSpriteFree) {
C2D_SpriteSheetFree(bgSprite);
}
const char* bgPath;
switch (studioBg) {
case 0:
default:
bgPath = "romfs:/gfx/bg_blue.t3x";
break;
case 1:
bgPath = "romfs:/gfx/bgNight_loversBell.t3x";
break;
}
bgSprite = C2D_SpriteSheetLoad(bgPath);
doBgSpriteFree = true;
}
bool GFX::loadCharSprite(const char* t3xPathAllSeasons, const char* t3xPathOneSeason) {
if (dochracterSpriteFree) {
if (doChracterSpriteFree) {
C2D_SpriteSheetFree(chracterSprite);
}
if (access(t3xPathAllSeasons, F_OK) == 0) {
chracterSprite = C2D_SpriteSheetLoad(t3xPathAllSeasons);
dochracterSpriteFree = true;
doChracterSpriteFree = true;
return true;
} else {
dochracterSpriteFree = false;
doChracterSpriteFree = false;
}
if (access(t3xPathOneSeason, F_OK) == 0) {
chracterSprite = C2D_SpriteSheetLoad(t3xPathOneSeason);
dochracterSpriteFree = true;
doChracterSpriteFree = true;
return true;
} else {
dochracterSpriteFree = false;
doChracterSpriteFree = false;
}
return false;
}

View File

@ -22,6 +22,7 @@ static char verText[32];
extern int iFps;
extern void loadSettings(void);
extern void saveSettings(void);
static int screenmode = 0; // Current screen mode.
int screenmodebuffer = 0;
@ -221,7 +222,15 @@ void controlThread(void) {
fadecolor = 0;
fadeout = true;
}
if (hDown & KEY_SELECT) {
sndSelect();
screenmodebuffer = SCREEN_MODE_SETTINGS;
fadeout = true;
}
}
} else if (screenmode == SCREEN_MODE_SETTINGS) {
extern void settingsMenu(void);
settingsMenu();
} else if (screenmode == SCREEN_MODE_WHAT_TO_DO) {
if (showMessage) {
if ((hDown & KEY_A) || ((hDown & KEY_TOUCH) && touch.px >= 115 && touch.px < 115+90 && touch.py >= 188 && touch.py < 188+47)) {
@ -329,6 +338,8 @@ int main()
gfxInitDefault();
loadSettings();
Gui::init();
GFX::loadSheets();
@ -483,8 +494,6 @@ int main()
sprintf(verText, "Ver. %i.%i.%i", VERSION_MAJOR, VERSION_MINOR, VERSION_MICRO);
loadSettings();
C3D_FrameRate(iFps);
screenon();
@ -525,7 +534,7 @@ int main()
Gui::ScreenDraw(Top);
GFX::DrawSprite(sprites_logo_rocketrobz_idx, 0, 0);
Gui::DrawString(8, 220, 0.50, BLACK, yeartext);
Gui::DrawString(8, 218, 0.50, BLACK, yeartext);
if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect
Gui::ScreenDraw(Bottom);
@ -598,12 +607,17 @@ int main()
}
Gui::DrawString(8, 112, 0.55, BLACK, "<");
Gui::DrawString(304, 112, 0.55, BLACK, ">");
Gui::DrawString(248, 220, 0.50, BLACK, verText);
Gui::DrawString(8, 202, 0.50, BLACK, "START: Exit");
Gui::DrawString(8, 218, 0.50, BLACK, "SELECT: Settings");
Gui::DrawString(248, 218, 0.50, BLACK, verText);
if (showMessage) {
drawCannotEditMsg();
}
if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect
C3D_FrameEnd(0);
} else if (screenmode == SCREEN_MODE_SETTINGS) {
extern void settingsMenuGraphics(void);
settingsMenuGraphics();
} else if (screenmode == SCREEN_MODE_WHAT_TO_DO) {
if ((highlightedGame == 0)
|| (highlightedGame > 1 && whatToChange_cursorPosition == 1)
@ -791,6 +805,8 @@ int main()
runThreads = false;
saveSettings();
commitSaveData();
archiveUnmountAll();

View File

@ -3,14 +3,139 @@
#define settingsIni "sdmc:/3ds/SavvyManager/settings.ini"
#include "common.hpp"
#include "screenMode.h"
#include "inifile.h"
int studioBg = 0;
int iFps = 60;
std::string currentMusicPack = "";
static const char* studioBgName(void) {
switch (studioBg) {
case 0:
default:
return "Blue";
case 1:
return "Lovers Bell";
}
return "null";
}
extern void sndSelect(void);
extern void sndBack(void);
extern void sndHighlight(void);
//static int screenmode = 0;
extern int screenmodebuffer;
//static int subScreenMode = 0;
/*
*/
extern u8 sysRegion;
extern int highlightedGame;
extern int fadealpha;
extern int fadecolor;
extern bool fadein;
extern bool fadeout;
extern float bg_xPos;
extern float bg_yPos;
extern bool showCursor;
extern int cursorX;
extern int cursorY;
extern int cursorAlpha;
extern u32 hDown;
extern touchPosition touch;
extern bool touchingBackButton(void);
static bool displayStudioBg = true;
#define numberOfSettings 1
static int cursorPosition = 0;
static int cursorPositionOnScreen = 0;
static int settingShownFirst = 0;
//static bool modeInited = false;
static char txt_studioBG[32];
static char txt_frameRate[24];
void settingsMenuGraphics(void) {
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
C2D_TargetClear(Top, TRANSPARENT);
C2D_TargetClear(Bottom, TRANSPARENT);
Gui::clearTextBufs();
Gui::ScreenDraw(Top);
if (displayStudioBg) {
GFX::showBgSprite(0);
} else {
Gui::Draw_Rect(0, 0, 400, 240, WHITE); // Fill gaps of BG
for(int w = 0; w < 7; w++) {
for(int h = 0; h < 3; h++) {
GFX::DrawSprite(sprites_phone_bg_idx, -72+bg_xPos+w*72, bg_yPos+h*136);
}
}
}
if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect
Gui::ScreenDraw(Bottom);
Gui::Draw_Rect(0, 0, 320, 240, WHITE); // Fill gaps of BG
for(int w = 0; w < 7; w++) {
for(int h = 0; h < 3; h++) {
GFX::DrawSprite(sprites_phone_bg_idx, -76+bg_xPos+w*72, bg_yPos+h*136);
}
}
cursorX = 248;
cursorY = 64+(48*cursorPositionOnScreen);
Gui::DrawStringCentered(0, 8, 0.55, BLACK, "Settings");
int i2 = 48;
for (int i = settingShownFirst; i < settingShownFirst+3; i++) {
if (i > numberOfSettings) break;
GFX::DrawSprite(sprites_item_button_idx, 16, i2-20);
switch (i) {
case 0:
sprintf(txt_studioBG, "Studio BG: %s", studioBgName());
Gui::DrawString(32, i2, 0.65, BLACK, txt_studioBG);
break;
case 1:
sprintf(txt_frameRate, "Frame Rate: %i", iFps);
Gui::DrawString(32, i2, 0.65, BLACK, txt_frameRate);
break;
default:
break;
}
i2 += 48;
}
GFX::DrawSprite(sprites_button_shadow_idx, 5, 199);
GFX::DrawSprite(sprites_button_red_idx, 5, 195);
GFX::DrawSprite(sprites_arrow_back_idx, 19, 195);
GFX::DrawSprite(sprites_button_b_idx, 44, 218);
GFX::drawCursor();
if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect
C3D_FrameEnd(0);
}
void loadSettings(void) {
CIniFile settingsini(settingsIni);
studioBg = settingsini.GetInt("SAVVY-MANAGER", "STUDIO_BG", studioBg);
iFps = settingsini.GetInt("SAVVY-MANAGER", "FRAME_RATE", iFps);
currentMusicPack = settingsini.GetString("SS2", "CURRENT_MUSIC_PACK", currentMusicPack);
@ -19,9 +144,73 @@ void loadSettings(void) {
void saveSettings(void) {
CIniFile settingsini(settingsIni);
settingsini.SetInt("SAVVY-MANAGER", "STUDIO_BG", studioBg);
settingsini.SetInt("SAVVY-MANAGER", "FRAME_RATE", iFps);
settingsini.SetString("SS2", "CURRENT_MUSIC_PACK", currentMusicPack);
settingsini.SaveIniFile(settingsIni);
settingsini.SaveIniFileModified(settingsIni);
}
void settingsMenu(void) {
if (!fadein && !fadeout) {
if (showCursor) {
if (hDown & KEY_UP) {
sndHighlight();
cursorPosition--;
cursorPositionOnScreen--;
if (cursorPosition < 0) {
cursorPosition = 0;
settingShownFirst = 0;
} else if (cursorPosition < settingShownFirst) {
settingShownFirst--;
}
if (cursorPositionOnScreen < 0) {
cursorPositionOnScreen = 0;
}
}
if (hDown & KEY_DOWN) {
sndHighlight();
cursorPosition++;
cursorPositionOnScreen++;
if (cursorPosition > numberOfSettings) {
cursorPosition = numberOfSettings;
settingShownFirst = numberOfSettings-2;
if (settingShownFirst < 0) settingShownFirst = 0;
if (cursorPositionOnScreen > numberOfSettings) {
cursorPositionOnScreen = numberOfSettings;
}
} else if (cursorPosition > settingShownFirst+2) {
settingShownFirst++;
}
if (cursorPositionOnScreen > 2) {
cursorPositionOnScreen = 2;
}
}
}
if ((hDown & KEY_A) && (cursorPosition <= numberOfSettings)) {
sndSelect();
switch (cursorPosition) {
case 0:
studioBg++;
if (studioBg > 1) studioBg = 0;
displayStudioBg = false;
gspWaitForVBlank();
GFX::loadBgSprite();
displayStudioBg = true;
break;
case 1:
if (iFps==60) iFps = 24;
else if (iFps==24) iFps = 30;
else if (iFps==30) iFps = 60;
C3D_FrameRate(iFps);
break;
}
}
if ((hDown & KEY_B) || ((hDown & KEY_TOUCH) && touchingBackButton())) {
sndBack();
screenmodebuffer = SCREEN_MODE_GAME_SELECT;
fadeout = true;
}
}
}