mirror of
https://github.com/halpz/re3.git
synced 2025-06-28 06:16:21 +00:00
Frontend customization functions, freecam toggle, minor things
This commit is contained in:
163
src/extras/frontendoption.cpp
Normal file
163
src/extras/frontendoption.cpp
Normal file
@ -0,0 +1,163 @@
|
||||
#include "common.h"
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
#include "frontendoption.h"
|
||||
|
||||
int numCustomFrontendOptions = 0;
|
||||
FrontendOption *customFrontendOptions;
|
||||
|
||||
int optionCursor = -1;
|
||||
eMenuScreen currentMenu;
|
||||
|
||||
void ChangeScreen(eMenuScreen screen, int option, bool fadeIn)
|
||||
{
|
||||
FrontEndMenuManager.m_nPrevScreen = FrontEndMenuManager.m_nCurrScreen;
|
||||
FrontEndMenuManager.m_nCurrScreen = screen;
|
||||
FrontEndMenuManager.m_nCurrOption = option;
|
||||
if (fadeIn)
|
||||
FrontEndMenuManager.m_nMenuFadeAlpha = 0;
|
||||
}
|
||||
|
||||
void GoBack(bool fadeIn)
|
||||
{
|
||||
int screen = !FrontEndMenuManager.m_bGameNotLoaded ?
|
||||
aScreens[FrontEndMenuManager.m_nCurrScreen].m_PreviousPage[1] : aScreens[FrontEndMenuManager.m_nCurrScreen].m_PreviousPage[0];
|
||||
int option = !FrontEndMenuManager.m_bGameNotLoaded ?
|
||||
aScreens[FrontEndMenuManager.m_nCurrScreen].m_ParentEntry[1] : aScreens[FrontEndMenuManager.m_nCurrScreen].m_ParentEntry[0];
|
||||
|
||||
FrontEndMenuManager.ThingsToDoBeforeGoingBack();
|
||||
|
||||
ChangeScreen((eMenuScreen)screen, option, fadeIn);
|
||||
}
|
||||
|
||||
uint8
|
||||
GetNumberOfMenuOptions(int screen)
|
||||
{
|
||||
uint8 Rows = 0;
|
||||
for (int i = 0; i < NUM_MENUROWS; i++) {
|
||||
if (aScreens[screen].m_aEntries[i].m_Action == MENUACTION_NOTHING)
|
||||
break;
|
||||
|
||||
++Rows;
|
||||
}
|
||||
return Rows;
|
||||
}
|
||||
|
||||
// Used before reloading in InitialiseChangedLanguageSettings and debugmenu
|
||||
void
|
||||
RemoveCustomFrontendOptions()
|
||||
{
|
||||
for (int i = 0; i < MENUPAGES; i++) {
|
||||
for (int j = 0; j < NUM_MENUROWS; j++) {
|
||||
if (aScreens[i].m_aEntries[j].m_Action == MENUACTION_TRIGGERFUNC) {
|
||||
aScreens[i].m_aEntries[j].m_Action = MENUACTION_NOTHING;
|
||||
aScreens[i].m_aEntries[j].m_EntryName[0] = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
free(customFrontendOptions);
|
||||
numCustomFrontendOptions = 0;
|
||||
}
|
||||
|
||||
int8 RegisterNewOption(int screen)
|
||||
{
|
||||
numCustomFrontendOptions++;
|
||||
if (numCustomFrontendOptions == 1)
|
||||
customFrontendOptions = (FrontendOption*)malloc(numCustomFrontendOptions * sizeof(FrontendOption));
|
||||
else
|
||||
customFrontendOptions = (FrontendOption*)realloc(customFrontendOptions, numCustomFrontendOptions * sizeof(FrontendOption));
|
||||
|
||||
uint8 nth = GetNumberOfMenuOptions(screen);
|
||||
if (optionCursor < 0) {
|
||||
if (optionCursor == -1) {
|
||||
if (!strcmp(aScreens[screen].m_aEntries[nth - 1].m_EntryName, "FEDS_TB") || !strcmp(aScreens[screen].m_aEntries[nth - 1].m_EntryName, "FESZ_CA")) {
|
||||
// Move back button one below
|
||||
memcpy(&aScreens[screen].m_aEntries[nth], &aScreens[screen].m_aEntries[nth - 1], sizeof(CMenuScreen::CMenuEntry));
|
||||
nth--;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (aScreens[screen].m_aEntries[optionCursor].m_Action != MENUACTION_NOTHING) {
|
||||
for (int i = nth - 1; i >= optionCursor; i--) {
|
||||
memcpy(&aScreens[screen].m_aEntries[i + 1], &aScreens[screen].m_aEntries[i], sizeof(CMenuScreen::CMenuEntry));
|
||||
}
|
||||
}
|
||||
nth = optionCursor;
|
||||
optionCursor++;
|
||||
}
|
||||
|
||||
aScreens[screen].m_aEntries[nth].m_Action = MENUACTION_TRIGGERFUNC;
|
||||
aScreens[screen].m_aEntries[nth].m_TargetMenu = numCustomFrontendOptions - 1;
|
||||
aScreens[screen].m_aEntries[nth].m_EntryName[0] = 1; // just something to fool it
|
||||
return nth;
|
||||
}
|
||||
|
||||
void FrontendOptionSetPosition(eMenuScreen screen, int8 option)
|
||||
{
|
||||
currentMenu = screen;
|
||||
optionCursor = option;
|
||||
}
|
||||
|
||||
void FrontendOptionAddSelect(const wchar* leftText, const wchar** rightTexts, int8 numRightTexts, int8 *var, bool onlyApplyOnEnter, ChangeFunc changeFunc, ReturnPrevPageFunc returnPrevPageFunc)
|
||||
{
|
||||
int8 screenOptionOrder = RegisterNewOption(currentMenu);
|
||||
|
||||
FrontendOption& option = customFrontendOptions[numCustomFrontendOptions - 1];
|
||||
option.screen = currentMenu;
|
||||
option.type = FEOPTION_SELECT;
|
||||
option.leftText = leftText;
|
||||
option.rightTexts = rightTexts;
|
||||
option.numRightTexts = numRightTexts;
|
||||
option.value = var;
|
||||
option.displayedValue = *var;
|
||||
option.onlyApplyOnEnter = onlyApplyOnEnter;
|
||||
option.changeFunc = changeFunc;
|
||||
option.screenOptionOrder = screenOptionOrder;
|
||||
option.returnPrevPageFunc = returnPrevPageFunc;
|
||||
}
|
||||
|
||||
void FrontendOptionAddDynamic(const wchar* leftText, DrawFunc drawFunc, ButtonPressFunc buttonPressFunc, ReturnPrevPageFunc returnPrevPageFunc)
|
||||
{
|
||||
int8 screenOptionOrder = RegisterNewOption(currentMenu);
|
||||
|
||||
FrontendOption& option = customFrontendOptions[numCustomFrontendOptions - 1];
|
||||
option.screen = currentMenu;
|
||||
option.type = FEOPTION_DYNAMIC;
|
||||
option.drawFunc = drawFunc;
|
||||
option.buttonPressFunc = buttonPressFunc;
|
||||
option.leftText = leftText;
|
||||
option.onlyApplyOnEnter = false;
|
||||
option.screenOptionOrder = screenOptionOrder;
|
||||
option.returnPrevPageFunc = returnPrevPageFunc;
|
||||
}
|
||||
|
||||
void FrontendOptionAddRedirect(const wchar* text, eMenuScreen to, int8 selectedOption, bool fadeIn)
|
||||
{
|
||||
int8 screenOptionOrder = RegisterNewOption(currentMenu);
|
||||
|
||||
FrontendOption &option = customFrontendOptions[numCustomFrontendOptions - 1];
|
||||
option.screen = currentMenu;
|
||||
option.type = FEOPTION_REDIRECT;
|
||||
option.to = to;
|
||||
option.option = selectedOption;
|
||||
option.fadeIn = fadeIn;
|
||||
option.leftText = text;
|
||||
option.onlyApplyOnEnter = false;
|
||||
option.screenOptionOrder = screenOptionOrder;
|
||||
option.returnPrevPageFunc = nil;
|
||||
}
|
||||
|
||||
void FrontendOptionAddBackButton(const wchar* text, bool fadeIn)
|
||||
{
|
||||
int8 screenOptionOrder = RegisterNewOption(currentMenu);
|
||||
|
||||
FrontendOption& option = customFrontendOptions[numCustomFrontendOptions - 1];
|
||||
option.screen = currentMenu;
|
||||
option.type = FEOPTION_GOBACK;
|
||||
option.fadeIn = fadeIn;
|
||||
option.leftText = text;
|
||||
option.onlyApplyOnEnter = false;
|
||||
option.screenOptionOrder = screenOptionOrder;
|
||||
option.returnPrevPageFunc = nil;
|
||||
}
|
||||
#endif
|
86
src/extras/frontendoption.h
Normal file
86
src/extras/frontendoption.h
Normal file
@ -0,0 +1,86 @@
|
||||
#pragma once
|
||||
#include "common.h"
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
#include "Frontend.h"
|
||||
|
||||
// Warning: All of the code relies on that you won't use more then NUM_MENUROWS(18) options on one page. Also congrats if you can make 18 options visible at once.
|
||||
|
||||
|
||||
// Static/select: User allocates variable, passes it to function and it's set automatically from input among the strings given to function,
|
||||
// then you can handle ChangeFunc and ReturnPrevPageFunc if needed.
|
||||
//
|
||||
// Dynamic: Function doesn't accept value pointer, user should do operations with handling ButtonPressFunc.
|
||||
// Right-side text can be set via DrawFunc, which is called on every draw. ReturnPrevPageFunc is also here if needed.
|
||||
|
||||
#define FEOPTION_SELECT 0
|
||||
#define FEOPTION_DYNAMIC 1
|
||||
#define FEOPTION_REDIRECT 2
|
||||
#define FEOPTION_GOBACK 3
|
||||
|
||||
#define FEOPTION_ACTION_LEFT 0
|
||||
#define FEOPTION_ACTION_RIGHT 1
|
||||
#define FEOPTION_ACTION_SELECT 2
|
||||
|
||||
void RemoveCustomFrontendOptions();
|
||||
void CustomFrontendOptionsPopulate();
|
||||
|
||||
// for static and dynamic options
|
||||
typedef void (*ReturnPrevPageFunc)();
|
||||
|
||||
// for static options
|
||||
typedef void (*ChangeFunc)(int8 displayedValue); // called before updating the value
|
||||
|
||||
// for dynamic options
|
||||
typedef void (*DrawFunc)(wchar* out, bool* disabled); // parameters should be set by user, both is allocated. disabled option will be dark yellow
|
||||
typedef void (*ButtonPressFunc)(int8 action); // see FEOPTION_ACTIONs above
|
||||
|
||||
struct FrontendOption
|
||||
{
|
||||
int8 type;
|
||||
int8 screenOptionOrder;
|
||||
eMenuScreen screen;
|
||||
const wchar* leftText;
|
||||
ReturnPrevPageFunc returnPrevPageFunc;
|
||||
|
||||
union {
|
||||
// Only for dynamic
|
||||
struct {
|
||||
DrawFunc drawFunc;
|
||||
ButtonPressFunc buttonPressFunc;
|
||||
};
|
||||
|
||||
// Only for static/select
|
||||
struct {
|
||||
const wchar** rightTexts;
|
||||
int8 numRightTexts;
|
||||
int8 *value;
|
||||
int8 displayedValue; // if onlyApplyOnEnter enabled
|
||||
bool onlyApplyOnEnter;
|
||||
ChangeFunc changeFunc;
|
||||
};
|
||||
|
||||
// Only for redirect
|
||||
struct {
|
||||
eMenuScreen to;
|
||||
int8 option;
|
||||
bool fadeIn;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
extern int numCustomFrontendOptions;
|
||||
extern FrontendOption* customFrontendOptions;
|
||||
|
||||
// To be used in ButtonPressFunc / ChangeFunc(but that would be weird):
|
||||
void ChangeScreen(eMenuScreen screen, int option = 0, bool fadeIn = true);
|
||||
void GoBack(bool fadeIn = true);
|
||||
|
||||
// If option is positive number, all calls will increase it before using it (you can think it as cursor). -1 means before the back button, -2 is end of page
|
||||
void FrontendOptionSetPosition(eMenuScreen screen, int8 option = -1);
|
||||
|
||||
void FrontendOptionAddSelect(const wchar* leftText, const wchar** rightTexts, int8 numRightTexts, int8 *var, bool onlyApplyOnEnter, ChangeFunc changeFunc, ReturnPrevPageFunc returnPrevPageFunc);
|
||||
void FrontendOptionAddDynamic(const wchar* leftText, DrawFunc rightTextDrawFunc, ButtonPressFunc buttonPressFunc, ReturnPrevPageFunc returnPrevPageFunc);
|
||||
void FrontendOptionAddRedirect(const wchar* text, eMenuScreen to, int8 selectedOption = 0, bool fadeIn = true);
|
||||
void FrontendOptionAddBackButton(const wchar* text, bool fadeIn = true);
|
||||
#endif
|
Reference in New Issue
Block a user