mirror of
https://github.com/GTAmodding/re3.git
synced 2024-11-15 05:39:01 +00:00
Merge pull request #789 from erorcun/master
rewrite CFO + postfx/pipeline options
This commit is contained in:
commit
770a1f8012
9 changed files with 1175 additions and 887 deletions
|
@ -435,29 +435,17 @@ CMenuManager::ThingsToDoBeforeGoingBack()
|
|||
}
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
for (int i = 0; i < numCustomFrontendOptions; i++) {
|
||||
FrontendOption &option = customFrontendOptions[i];
|
||||
if (option.type != FEOPTION_REDIRECT && option.type != FEOPTION_GOBACK && m_nCurrScreen == option.screen) {
|
||||
if (option.returnPrevPageFunc)
|
||||
option.returnPrevPageFunc();
|
||||
CMenuScreenCustom::CMenuEntry &option = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption];
|
||||
|
||||
if (m_nCurrOption == option.screenOptionOrder && (option.type == FEOPTION_DYNAMIC || option.type == FEOPTION_BUILTIN_ACTION))
|
||||
if(option.buttonPressFunc)
|
||||
option.buttonPressFunc(FEOPTION_ACTION_FOCUSLOSS);
|
||||
if (option.m_Action == MENUACTION_CFO_DYNAMIC)
|
||||
if(option.m_CFODynamic->buttonPressFunc)
|
||||
option.m_CFODynamic->buttonPressFunc(FEOPTION_ACTION_FOCUSLOSS);
|
||||
|
||||
if (option.type == FEOPTION_SELECT && option.onlyApplyOnEnter && option.lastSavedValue != option.displayedValue)
|
||||
option.displayedValue = *option.value = option.lastSavedValue;
|
||||
}
|
||||
}
|
||||
if (option.m_Action == MENUACTION_CFO_SELECT && option.m_CFOSelect->onlyApplyOnEnter && option.m_CFOSelect->lastSavedValue != option.m_CFOSelect->displayedValue)
|
||||
option.m_CFOSelect->displayedValue = *option.m_CFO->value = option.m_CFOSelect->lastSavedValue;
|
||||
|
||||
if (m_nCurrScreen > lastOgScreen) {
|
||||
for (int i = 0; i < numCustomFrontendScreens; i++) {
|
||||
FrontendScreen& screen = customFrontendScreens[i];
|
||||
if (m_nCurrScreen == screen.id && screen.returnPrevPageFunc) {
|
||||
screen.returnPrevPageFunc();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (aScreens[m_nCurrScreen].returnPrevPageFunc) {
|
||||
aScreens[m_nCurrScreen].returnPrevPageFunc();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -476,18 +464,15 @@ CMenuManager::GetPreviousPageOption()
|
|||
prevPage = prevPage == MENUPAGE_NONE ? (!m_bGameNotLoaded ? MENUPAGE_PAUSE_MENU : MENUPAGE_START_MENU) : prevPage;
|
||||
|
||||
for (int i = 0; i < NUM_MENUROWS; i++) {
|
||||
if (aScreens[prevPage].m_aEntries[i].m_SaveSlot == SAVESLOT_CFO) {
|
||||
FrontendOption &option = customFrontendOptions[aScreens[prevPage].m_aEntries[i].m_TargetMenu];
|
||||
if(option.type == FEOPTION_REDIRECT && option.to == m_nCurrScreen) {
|
||||
if (aScreens[prevPage].m_aEntries[i].m_Action >= MENUACTION_NOTHING) { // CFO check
|
||||
if (aScreens[prevPage].m_aEntries[i].m_TargetMenu == m_nCurrScreen) {
|
||||
return i;
|
||||
}
|
||||
} else if (aScreens[prevPage].m_aEntries[i].m_TargetMenu == m_nCurrScreen) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
// Couldn't find current screen option on previous page, use default behaviour (maybe save-related screen?)
|
||||
return !m_bGameNotLoaded ? aScreens[m_nCurrScreen].m_ParentEntry[1] : aScreens[m_nCurrScreen].m_ParentEntry[0];
|
||||
|
||||
// This shouldn't happen
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -856,13 +841,6 @@ CMenuManager::Draw()
|
|||
str = TheText.Get(aScreens[m_nCurrScreen].m_aEntries[0].m_EntryName);
|
||||
break;
|
||||
default:
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
if (aScreens[m_nCurrScreen].m_aEntries[0].m_SaveSlot == SAVESLOT_CFO) {
|
||||
FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[0].m_TargetMenu];
|
||||
str = (wchar*)option.leftText;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
str = TheText.Get(aScreens[m_nCurrScreen].m_aEntries[0].m_EntryName);
|
||||
break;
|
||||
}
|
||||
|
@ -961,30 +939,22 @@ CMenuManager::Draw()
|
|||
#endif
|
||||
default:
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
bool custom = m_nCurrScreen > lastOgScreen;
|
||||
CCustomScreenLayout *custom = aScreens[m_nCurrScreen].layout;
|
||||
if (custom) {
|
||||
for (int i = 0; i < numCustomFrontendScreens; i++) {
|
||||
FrontendScreen& screen = customFrontendScreens[i];
|
||||
if (m_nCurrScreen == screen.id) {
|
||||
columnWidth = screen.columnWidth;
|
||||
headerHeight = screen.headerHeight;
|
||||
lineHeight = screen.lineHeight;
|
||||
CFont::SetFontStyle(FONT_LOCALE(screen.font));
|
||||
CFont::SetScale(MENU_X(MENU_TEXT_SIZE_X = screen.fontScaleX), MENU_Y(MENU_TEXT_SIZE_Y = screen.fontScaleY));
|
||||
if (screen.alignment == FESCREEN_LEFT_ALIGN) {
|
||||
CFont::SetCentreOff();
|
||||
CFont::SetRightJustifyOff();
|
||||
} else if (screen.alignment == FESCREEN_RIGHT_ALIGN) {
|
||||
CFont::SetCentreOff();
|
||||
CFont::SetRightJustifyOn();
|
||||
} else {
|
||||
CFont::SetRightJustifyOff();
|
||||
CFont::SetCentreOn();
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (i == numCustomFrontendScreens - 1)
|
||||
custom = false;
|
||||
columnWidth = custom->columnWidth;
|
||||
headerHeight = custom->headerHeight;
|
||||
lineHeight = custom->lineHeight;
|
||||
CFont::SetFontStyle(FONT_LOCALE(custom->font));
|
||||
CFont::SetScale(MENU_X(MENU_TEXT_SIZE_X = custom->fontScaleX), MENU_Y(MENU_TEXT_SIZE_Y = custom->fontScaleY));
|
||||
if (custom->alignment == FESCREEN_LEFT_ALIGN) {
|
||||
CFont::SetCentreOff();
|
||||
CFont::SetRightJustifyOff();
|
||||
} else if (custom->alignment == FESCREEN_RIGHT_ALIGN) {
|
||||
CFont::SetCentreOff();
|
||||
CFont::SetRightJustifyOn();
|
||||
} else {
|
||||
CFont::SetRightJustifyOff();
|
||||
CFont::SetCentreOn();
|
||||
}
|
||||
}
|
||||
if (!custom)
|
||||
|
@ -1068,28 +1038,22 @@ CMenuManager::Draw()
|
|||
leftText = TheText.Get(gString);
|
||||
}
|
||||
} else {
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
if (aScreens[m_nCurrScreen].m_aEntries[i].m_SaveSlot == SAVESLOT_CFO){
|
||||
FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[i].m_TargetMenu];
|
||||
leftText = (wchar*)option.leftText;
|
||||
} else
|
||||
#endif
|
||||
leftText = TheText.Get(aScreens[m_nCurrScreen].m_aEntries[i].m_EntryName);
|
||||
}
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
if (aScreens[m_nCurrScreen].m_aEntries[i].m_SaveSlot == SAVESLOT_CFO) {
|
||||
FrontendOption &option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[i].m_TargetMenu];
|
||||
if (option.type == FEOPTION_SELECT) {
|
||||
if (option.onlyApplyOnEnter){
|
||||
if (aScreens[m_nCurrScreen].m_aEntries[i].m_Action < MENUACTION_NOTHING) { // CFO check
|
||||
CMenuScreenCustom::CMenuEntry &option = aScreens[m_nCurrScreen].m_aEntries[i];
|
||||
if (option.m_Action == MENUACTION_CFO_SELECT) {
|
||||
if (option.m_CFOSelect->onlyApplyOnEnter){
|
||||
if (m_nCurrOption != i) {
|
||||
if (option.displayedValue != option.lastSavedValue)
|
||||
if (option.m_CFOSelect->displayedValue != option.m_CFOSelect->lastSavedValue)
|
||||
SetHelperText(3); // Restored original value
|
||||
|
||||
// option.displayedValue = option.lastSavedValue = *option.value;
|
||||
// option.displayedValue = option.lastSavedValue = *option.m_CFO->value;
|
||||
|
||||
} else {
|
||||
if (option.displayedValue != *option.value)
|
||||
if (option.m_CFOSelect->displayedValue != *option.m_CFO->value)
|
||||
SetHelperText(1); // Enter to apply
|
||||
else if (m_nHelperTextMsgId == 1)
|
||||
ResetHelperText(); // Applied
|
||||
|
@ -1098,13 +1062,13 @@ CMenuManager::Draw()
|
|||
}
|
||||
|
||||
if (m_nCurrOption != lastOption && lastOption == i) {
|
||||
FrontendOption &oldOption = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[lastOption].m_TargetMenu];
|
||||
if (oldOption.type == FEOPTION_DYNAMIC || oldOption.type == FEOPTION_BUILTIN_ACTION)
|
||||
if(oldOption.buttonPressFunc)
|
||||
oldOption.buttonPressFunc(FEOPTION_ACTION_FOCUSLOSS);
|
||||
CMenuScreenCustom::CMenuEntry &oldOption = aScreens[m_nCurrScreen].m_aEntries[lastOption];
|
||||
if (oldOption.m_Action == MENUACTION_CFO_DYNAMIC)
|
||||
if(oldOption.m_CFODynamic->buttonPressFunc)
|
||||
oldOption.m_CFODynamic->buttonPressFunc(FEOPTION_ACTION_FOCUSLOSS);
|
||||
|
||||
if (oldOption.onlyApplyOnEnter && oldOption.type == FEOPTION_SELECT)
|
||||
oldOption.displayedValue = oldOption.lastSavedValue = *oldOption.value;
|
||||
if (oldOption.m_Action == MENUACTION_CFO_SELECT && oldOption.m_CFOSelect->onlyApplyOnEnter)
|
||||
oldOption.m_CFOSelect->displayedValue = oldOption.m_CFOSelect->lastSavedValue = *oldOption.m_CFO->value;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -1338,29 +1302,24 @@ CMenuManager::Draw()
|
|||
rightText = TheText.Get(CVehicle::m_bDisableMouseSteering ? "FEM_OFF" : "FEM_ON");
|
||||
break;
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
case MENUACTION_TRIGGERFUNC:
|
||||
FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[i].m_TargetMenu];
|
||||
if (m_nCurrScreen == option.screen && i == option.screenOptionOrder) {
|
||||
if (option.type == FEOPTION_SELECT) {
|
||||
// To whom manipulate option.value of static options externally (like RestoreDef functions)
|
||||
if (*option.value != option.lastSavedValue)
|
||||
option.displayedValue = option.lastSavedValue = *option.value;
|
||||
case MENUACTION_CFO_DYNAMIC:
|
||||
case MENUACTION_CFO_SELECT:
|
||||
CMenuScreenCustom::CMenuEntry &option = aScreens[m_nCurrScreen].m_aEntries[i];
|
||||
if (option.m_Action == MENUACTION_CFO_SELECT) {
|
||||
// To whom manipulate option.m_CFO->value of static options externally (like RestoreDef functions)
|
||||
if (*option.m_CFO->value != option.m_CFOSelect->lastSavedValue)
|
||||
option.m_CFOSelect->displayedValue = option.m_CFOSelect->lastSavedValue = *option.m_CFO->value;
|
||||
|
||||
if (option.displayedValue >= option.numRightTexts || option.displayedValue < 0)
|
||||
option.displayedValue = 0;
|
||||
if (option.m_CFOSelect->displayedValue >= option.m_CFOSelect->numRightTexts || option.m_CFOSelect->displayedValue < 0)
|
||||
option.m_CFOSelect->displayedValue = 0;
|
||||
|
||||
rightText = (wchar*)option.rightTexts[option.displayedValue];
|
||||
rightText = TheText.Get(option.m_CFOSelect->rightTexts[option.m_CFOSelect->displayedValue]);
|
||||
|
||||
} else if (option.type == FEOPTION_DYNAMIC) {
|
||||
if (option.drawFunc) {
|
||||
rightText = option.drawFunc(&isOptionDisabled, m_nCurrOption == i);
|
||||
}
|
||||
} else if (option.m_Action == MENUACTION_CFO_DYNAMIC) {
|
||||
if (option.m_CFODynamic->drawFunc) {
|
||||
rightText = option.m_CFODynamic->drawFunc(&isOptionDisabled, m_nCurrOption == i);
|
||||
}
|
||||
} else {
|
||||
debug("A- screen:%d option:%d - totalCo: %d, coId: %d, coScreen:%d, coOption:%d\n", m_nCurrScreen, i, numCustomFrontendOptions, aScreens[m_nCurrScreen].m_aEntries[i].m_TargetMenu, option.screen, option.screenOptionOrder);
|
||||
assert(0 && "Custom frontend options is borked");
|
||||
}
|
||||
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
@ -1575,13 +1534,9 @@ CMenuManager::Draw()
|
|||
break;
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
default:
|
||||
if (m_nCurrScreen > lastOgScreen) {
|
||||
for (int i = 0; i < numCustomFrontendScreens; i++) {
|
||||
FrontendScreen& screen = customFrontendScreens[i];
|
||||
if (m_nCurrScreen == screen.id && screen.showLeftRightHelper) {
|
||||
DisplayHelperText();
|
||||
break;
|
||||
}
|
||||
if (aScreens[m_nCurrScreen].layout) {
|
||||
if (aScreens[m_nCurrScreen].layout->showLeftRightHelper) {
|
||||
DisplayHelperText();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -2614,17 +2569,10 @@ CMenuManager::DrawFrontEndNormal()
|
|||
break;
|
||||
default:
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
bool custom = m_nPrevScreen > lastOgScreen;
|
||||
CCustomScreenLayout *custom = aScreens[m_nPrevScreen].layout;
|
||||
if (custom) {
|
||||
for (int i = 0; i < numCustomFrontendScreens; i++) {
|
||||
FrontendScreen& screen = customFrontendScreens[i];
|
||||
if (m_nPrevScreen == screen.id) {
|
||||
previousSprite = screen.sprite;
|
||||
break;
|
||||
}
|
||||
if (i == numCustomFrontendScreens - 1)
|
||||
custom = false;
|
||||
}
|
||||
previousSprite = custom->sprite;
|
||||
break;
|
||||
}
|
||||
if (!custom)
|
||||
#endif
|
||||
|
@ -2680,15 +2628,9 @@ CMenuManager::DrawFrontEndNormal()
|
|||
break;
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
default:
|
||||
bool custom = m_nCurrScreen > lastOgScreen;
|
||||
CCustomScreenLayout *custom = aScreens[m_nCurrScreen].layout;
|
||||
if (custom) {
|
||||
for (int i = 0; i < numCustomFrontendScreens; i++) {
|
||||
FrontendScreen& screen = customFrontendScreens[i];
|
||||
if (m_nCurrScreen == screen.id) {
|
||||
currentSprite = screen.sprite;
|
||||
break;
|
||||
}
|
||||
}
|
||||
previousSprite = custom->sprite;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
@ -3303,10 +3245,6 @@ CMenuManager::InitialiseChangedLanguageSettings()
|
|||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
CustomFrontendOptionsPopulate();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3496,6 +3434,9 @@ CMenuManager::LoadSettings()
|
|||
strcpy(m_PrefsSkinFile, DEFAULT_SKIN_NAME);
|
||||
strcpy(m_aSkinName, DEFAULT_SKIN_NAME);
|
||||
}
|
||||
#ifdef LOAD_INI_SETTINGS
|
||||
LoadINISettings(); // needs frontend options to be loaded
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -5088,29 +5029,28 @@ CMenuManager::ProcessButtonPresses(void)
|
|||
return;
|
||||
#endif
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
case MENUACTION_TRIGGERFUNC:
|
||||
FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu];
|
||||
if (m_nCurrScreen == option.screen && m_nCurrOption == option.screenOptionOrder) {
|
||||
if (option.type == FEOPTION_SELECT) {
|
||||
if (!option.onlyApplyOnEnter) {
|
||||
option.displayedValue++;
|
||||
if (option.displayedValue >= option.numRightTexts || option.displayedValue < 0)
|
||||
option.displayedValue = 0;
|
||||
}
|
||||
option.changeFunc(option.displayedValue);
|
||||
*option.value = option.lastSavedValue = option.displayedValue;
|
||||
|
||||
} else if (option.type == FEOPTION_DYNAMIC) {
|
||||
if (option.buttonPressFunc)
|
||||
option.buttonPressFunc(FEOPTION_ACTION_SELECT);
|
||||
} else if (option.type == FEOPTION_REDIRECT) {
|
||||
ChangeScreen(option.to, option.option, true, option.fadeIn);
|
||||
} else if (option.type == FEOPTION_GOBACK) {
|
||||
goBack = true;
|
||||
case MENUACTION_CFO_SELECT:
|
||||
case MENUACTION_CFO_DYNAMIC:
|
||||
CMenuScreenCustom::CMenuEntry &option = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption];
|
||||
if (option.m_Action == MENUACTION_CFO_SELECT) {
|
||||
if (!option.m_CFOSelect->onlyApplyOnEnter) {
|
||||
option.m_CFOSelect->displayedValue++;
|
||||
if (option.m_CFOSelect->displayedValue >= option.m_CFOSelect->numRightTexts || option.m_CFOSelect->displayedValue < 0)
|
||||
option.m_CFOSelect->displayedValue = 0;
|
||||
}
|
||||
} else {
|
||||
debug("B- screen:%d option:%d - totalCo: %d, coId: %d, coScreen:%d, coOption:%d\n", m_nCurrScreen, m_nCurrOption, numCustomFrontendOptions, aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu, option.screen, option.screenOptionOrder);
|
||||
assert(0 && "Custom frontend options are borked");
|
||||
int8 oldValue = *option.m_CFO->value;
|
||||
|
||||
*option.m_CFO->value = option.m_CFOSelect->lastSavedValue = option.m_CFOSelect->displayedValue;
|
||||
|
||||
if (option.m_CFOSelect->save)
|
||||
SaveSettings();
|
||||
|
||||
if (option.m_CFOSelect->displayedValue != oldValue && option.m_CFOSelect->changeFunc)
|
||||
option.m_CFOSelect->changeFunc(oldValue, option.m_CFOSelect->displayedValue);
|
||||
|
||||
} else if (option.m_Action == MENUACTION_CFO_DYNAMIC) {
|
||||
if (option.m_CFODynamic->buttonPressFunc)
|
||||
option.m_CFODynamic->buttonPressFunc(FEOPTION_ACTION_SELECT);
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -5118,14 +5058,6 @@ CMenuManager::ProcessButtonPresses(void)
|
|||
}
|
||||
}
|
||||
ProcessOnOffMenuOptions();
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
if (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_SaveSlot == SAVESLOT_CFO) {
|
||||
FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu];
|
||||
if (option.type == FEOPTION_BUILTIN_ACTION && option.buttonPressFunc) {
|
||||
option.buttonPressFunc(FEOPTION_ACTION_SELECT);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (goBack) {
|
||||
|
@ -5328,32 +5260,34 @@ CMenuManager::ProcessButtonPresses(void)
|
|||
SaveSettings();
|
||||
break;
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
case MENUACTION_TRIGGERFUNC:
|
||||
FrontendOption& option = customFrontendOptions[aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu];
|
||||
if (m_nCurrScreen == option.screen && m_nCurrOption == option.screenOptionOrder) {
|
||||
if (option.type == FEOPTION_SELECT) {
|
||||
if (changeValueBy > 0) {
|
||||
option.displayedValue++;
|
||||
if (option.displayedValue >= option.numRightTexts)
|
||||
option.displayedValue = 0;
|
||||
} else {
|
||||
option.displayedValue--;
|
||||
if (option.displayedValue < 0)
|
||||
option.displayedValue = option.numRightTexts - 1;
|
||||
}
|
||||
if (!option.onlyApplyOnEnter) {
|
||||
option.changeFunc(option.displayedValue);
|
||||
*option.value = option.lastSavedValue = option.displayedValue;
|
||||
}
|
||||
} else if (option.type == FEOPTION_DYNAMIC && option.buttonPressFunc) {
|
||||
option.buttonPressFunc(changeValueBy > 0 ? FEOPTION_ACTION_RIGHT : FEOPTION_ACTION_LEFT);
|
||||
case MENUACTION_CFO_SELECT:
|
||||
case MENUACTION_CFO_DYNAMIC:
|
||||
CMenuScreenCustom::CMenuEntry &option = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption];
|
||||
if (option.m_Action == MENUACTION_CFO_SELECT) {
|
||||
if (changeValueBy > 0) {
|
||||
option.m_CFOSelect->displayedValue++;
|
||||
if (option.m_CFOSelect->displayedValue >= option.m_CFOSelect->numRightTexts)
|
||||
option.m_CFOSelect->displayedValue = 0;
|
||||
} else {
|
||||
option.m_CFOSelect->displayedValue--;
|
||||
if (option.m_CFOSelect->displayedValue < 0)
|
||||
option.m_CFOSelect->displayedValue = option.m_CFOSelect->numRightTexts - 1;
|
||||
}
|
||||
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
|
||||
}
|
||||
else {
|
||||
debug("C- screen:%d option:%d - totalCo: %d, coId: %d, coScreen:%d, coOption:%d\n", m_nCurrScreen, m_nCurrOption, numCustomFrontendOptions, aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_TargetMenu, option.screen, option.screenOptionOrder);
|
||||
assert(0 && "Custom frontend options are borked");
|
||||
if (!option.m_CFOSelect->onlyApplyOnEnter) {
|
||||
int8 oldValue = *option.m_CFO->value;
|
||||
|
||||
*option.m_CFO->value = option.m_CFOSelect->lastSavedValue = option.m_CFOSelect->displayedValue;
|
||||
|
||||
if (option.m_CFOSelect->save)
|
||||
SaveSettings();
|
||||
|
||||
if (option.m_CFOSelect->displayedValue != oldValue && option.m_CFOSelect->changeFunc)
|
||||
option.m_CFOSelect->changeFunc(oldValue, option.m_CFOSelect->displayedValue);
|
||||
}
|
||||
} else if (option.m_Action == MENUACTION_CFO_DYNAMIC && option.m_CFODynamic->buttonPressFunc) {
|
||||
option.m_CFODynamic->buttonPressFunc(changeValueBy > 0 ? FEOPTION_ACTION_RIGHT : FEOPTION_ACTION_LEFT);
|
||||
}
|
||||
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
|
||||
|
||||
break;
|
||||
#endif
|
||||
|
|
|
@ -156,9 +156,6 @@ enum eSaveSlot
|
|||
SAVESLOT_7,
|
||||
SAVESLOT_8,
|
||||
SAVESLOT_LABEL = 36,
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
SAVESLOT_CFO
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef MENU_MAP
|
||||
|
@ -238,19 +235,32 @@ enum eMenuScreen
|
|||
MENUPAGE_KEYBOARD_CONTROLS = 55,
|
||||
MENUPAGE_MOUSE_CONTROLS = 56,
|
||||
MENUPAGE_MISSION_RETRY = 57,
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
|
||||
#ifdef MENU_MAP
|
||||
MENUPAGE_MAP,
|
||||
#endif
|
||||
MENUPAGE_UNK, // 58 in game. Map page is added above, because last screen in CMenuScreens should always be empty to make CFO work
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
MENUPAGES = 65 // for some room to add more screen
|
||||
#ifdef GRAPHICS_MENU_OPTIONS
|
||||
MENUPAGE_GRAPHICS_SETTINGS,
|
||||
#else
|
||||
MENUPAGES
|
||||
MENUPAGE_ADVANCED_DISPLAY_SETTINGS,
|
||||
#endif
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
MENUPAGE_DETECT_JOYSTICK,
|
||||
#endif
|
||||
|
||||
#endif
|
||||
MENUPAGE_UNK, // originally 58. Custom screens are inserted above, because last screen in CMenuScreens should always be empty to make CFO work
|
||||
MENUPAGES
|
||||
|
||||
};
|
||||
|
||||
enum eMenuAction
|
||||
{
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
MENUACTION_CFO_SELECT = -2,
|
||||
MENUACTION_CFO_DYNAMIC = -1,
|
||||
#endif
|
||||
MENUACTION_NOTHING,
|
||||
MENUACTION_LABEL,
|
||||
MENUACTION_CHANGEMENU,
|
||||
|
@ -373,9 +383,6 @@ enum eMenuAction
|
|||
//#ifdef NO_ISLAND_LOADING
|
||||
// MENUACTION_ISLANDLOADING,
|
||||
//#endif
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
MENUACTION_TRIGGERFUNC
|
||||
#endif
|
||||
};
|
||||
|
||||
enum eCheckHover
|
||||
|
@ -458,6 +465,7 @@ struct BottomBarOption
|
|||
int32 screenId;
|
||||
};
|
||||
|
||||
#ifndef CUSTOM_FRONTEND_OPTIONS
|
||||
struct CMenuScreen
|
||||
{
|
||||
char m_ScreenName[8];
|
||||
|
@ -470,9 +478,91 @@ struct CMenuScreen
|
|||
int32 m_Action; // eMenuAction
|
||||
char m_EntryName[8];
|
||||
int32 m_SaveSlot; // eSaveSlot
|
||||
int32 m_TargetMenu; // eMenuScreen // FrontendOption ID if it's a custom option
|
||||
int32 m_TargetMenu; // eMenuScreen
|
||||
} m_aEntries[NUM_MENUROWS];
|
||||
};
|
||||
extern CMenuScreen aScreens[MENUPAGES];
|
||||
#else
|
||||
#include "frontendoption.h"
|
||||
struct CCustomScreenLayout {
|
||||
eMenuSprites sprite;
|
||||
int columnWidth;
|
||||
int headerHeight;
|
||||
int lineHeight;
|
||||
int8 font;
|
||||
int8 alignment;
|
||||
bool showLeftRightHelper;
|
||||
float fontScaleX;
|
||||
float fontScaleY;
|
||||
};
|
||||
|
||||
struct CCFO
|
||||
{
|
||||
int8 *value;
|
||||
const char *save;
|
||||
};
|
||||
|
||||
struct CCFOSelect : CCFO
|
||||
{
|
||||
char** rightTexts;
|
||||
int8 numRightTexts;
|
||||
bool onlyApplyOnEnter;
|
||||
int8 displayedValue; // only if onlyApplyOnEnter enabled for now
|
||||
int8 lastSavedValue; // only if onlyApplyOnEnter enabled
|
||||
ChangeFunc changeFunc;
|
||||
|
||||
CCFOSelect() {};
|
||||
CCFOSelect(int8* value, const char* save, const char** rightTexts, int8 numRightTexts, bool onlyApplyOnEnter, ChangeFunc changeFunc){
|
||||
this->value = value;
|
||||
if (value)
|
||||
this->lastSavedValue = this->displayedValue = *value;
|
||||
|
||||
this->save = save;
|
||||
this->rightTexts = (char**)rightTexts;
|
||||
this->numRightTexts = numRightTexts;
|
||||
this->onlyApplyOnEnter = onlyApplyOnEnter;
|
||||
this->changeFunc = changeFunc;
|
||||
}
|
||||
};
|
||||
|
||||
struct CCFODynamic : CCFO
|
||||
{
|
||||
DrawFunc drawFunc;
|
||||
ButtonPressFunc buttonPressFunc;
|
||||
|
||||
CCFODynamic() {};
|
||||
CCFODynamic(int8* value, const char* save, DrawFunc drawFunc, ButtonPressFunc buttonPressFunc){
|
||||
this->value = value;
|
||||
this->save = save;
|
||||
this->drawFunc = drawFunc;
|
||||
this->buttonPressFunc = buttonPressFunc;
|
||||
}
|
||||
};
|
||||
|
||||
struct CMenuScreenCustom
|
||||
{
|
||||
char m_ScreenName[8];
|
||||
int32 m_PreviousPage[2]; // eMenuScreen
|
||||
CCustomScreenLayout *layout;
|
||||
ReturnPrevPageFunc returnPrevPageFunc;
|
||||
|
||||
struct CMenuEntry
|
||||
{
|
||||
int32 m_Action; // eMenuAction - below zero is CFO
|
||||
char m_EntryName[8];
|
||||
struct {
|
||||
union {
|
||||
CCFO *m_CFO; // for initializing
|
||||
CCFOSelect *m_CFOSelect;
|
||||
CCFODynamic *m_CFODynamic;
|
||||
};
|
||||
int32 m_SaveSlot; // eSaveSlot
|
||||
int32 m_TargetMenu; // eMenuScreen
|
||||
};
|
||||
} m_aEntries[NUM_MENUROWS];
|
||||
};
|
||||
extern CMenuScreenCustom aScreens[MENUPAGES];
|
||||
#endif
|
||||
|
||||
class CMenuManager
|
||||
{
|
||||
|
@ -703,6 +793,5 @@ VALIDATE_SIZE(CMenuManager, 0x564);
|
|||
#endif
|
||||
|
||||
extern CMenuManager FrontEndMenuManager;
|
||||
extern CMenuScreen aScreens[MENUPAGES];
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -86,7 +86,6 @@
|
|||
#include "ZoneCull.h"
|
||||
#include "Zones.h"
|
||||
#include "debugmenu.h"
|
||||
#include "frontendoption.h"
|
||||
#include "postfx.h"
|
||||
#include "custompipes.h"
|
||||
#include "crossplatform.h"
|
||||
|
@ -314,16 +313,6 @@ bool CGame::InitialiseOnceAfterRW(void)
|
|||
DMAudio.SetMusicFadeVol(127);
|
||||
CWorld::Players[0].SetPlayerSkin(CMenuManager::m_PrefsSkinFile);
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
// Apparently this func. can be run multiple times at the start.
|
||||
if (numCustomFrontendOptions == 0 && numCustomFrontendScreens == 0) {
|
||||
// needs stored language and TheText to be loaded, and last TheText reload is at the start of here
|
||||
CustomFrontendOptionsPopulate();
|
||||
}
|
||||
#endif
|
||||
#ifdef LOAD_INI_SETTINGS
|
||||
LoadINISettings(); // needs frontend options to be loaded
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,8 +2,10 @@
|
|||
#include "Frontend.h"
|
||||
#ifdef PC_MENU
|
||||
|
||||
// If you want to add new options, please don't do that here and see CustomFrontendOptionsPopulate in re3.cpp.
|
||||
// Please don't touch this file, except for bug fixing or ports.
|
||||
// Check MenuScreensCustom.cpp
|
||||
|
||||
#ifndef CUSTOM_FRONTEND_OPTIONS
|
||||
CMenuScreen aScreens[MENUPAGES] = {
|
||||
// MENUPAGE_NONE = 0
|
||||
{ "", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0, },
|
||||
|
@ -434,14 +436,6 @@ CMenuScreen aScreens[MENUPAGES] = {
|
|||
},
|
||||
#endif
|
||||
|
||||
#ifdef MENU_MAP
|
||||
// MENUPAGE_MAP
|
||||
{ "FEG_MAP", 1, MENUPAGE_NONE, MENUPAGE_NONE, 5, 2,
|
||||
MENUACTION_UNK110, "", SAVESLOT_NONE, MENUPAGE_NONE, // to prevent cross/enter to go back
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE,
|
||||
},
|
||||
#endif
|
||||
|
||||
// MENUPAGE_UNK
|
||||
{ "", 0, MENUPAGE_NONE, MENUPAGE_NONE, 0, 0,
|
||||
|
||||
|
@ -449,4 +443,5 @@ CMenuScreen aScreens[MENUPAGES] = {
|
|||
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
|
804
src/core/MenuScreensCustom.cpp
Normal file
804
src/core/MenuScreensCustom.cpp
Normal file
|
@ -0,0 +1,804 @@
|
|||
#include "common.h"
|
||||
#include "platform.h"
|
||||
#include "crossplatform.h"
|
||||
#include "Renderer.h"
|
||||
#include "Frontend.h"
|
||||
#include "Font.h"
|
||||
#include "Camera.h"
|
||||
#include "main.h"
|
||||
#include "MBlur.h"
|
||||
#include "postfx.h"
|
||||
#include "custompipes.h"
|
||||
#include "RwHelper.h"
|
||||
|
||||
// Menu screens array is at the bottom of the file.
|
||||
|
||||
#ifdef PC_MENU
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
|
||||
#ifdef IMPROVED_VIDEOMODE
|
||||
#define VIDEOMODE_SELECTOR MENUACTION_CFO_SELECT, "FEM_SCF", { new CCFOSelect((int8*)&FrontEndMenuManager.m_nPrefsWindowed, nil, screenModes, 2, true, ScreenModeAfterChange) },
|
||||
#else
|
||||
#define VIDEOMODE_SELECTOR
|
||||
#endif
|
||||
|
||||
#ifdef MULTISAMPLING
|
||||
#define MULTISAMPLING_SELECTOR MENUACTION_CFO_DYNAMIC, "FED_AAS", { new CCFODynamic((int8*)&FrontEndMenuManager.m_nPrefsMSAALevel, "MultiSampling", MultiSamplingDraw, MultiSamplingButtonPress) },
|
||||
#else
|
||||
#define MULTISAMPLING_SELECTOR
|
||||
#endif
|
||||
|
||||
#ifdef CUTSCENE_BORDERS_SWITCH
|
||||
#define CUTSCENE_BORDERS_TOGGLE MENUACTION_CFO_SELECT, "FEM_CSB", { new CCFOSelect((int8 *)&CMenuManager::m_PrefsCutsceneBorders, "CutsceneBorders", off_on, 2, false, nil) },
|
||||
#else
|
||||
#define CUTSCENE_BORDERS_TOGGLE
|
||||
#endif
|
||||
|
||||
#ifdef FREE_CAM
|
||||
#define FREE_CAM_TOGGLE MENUACTION_CFO_SELECT, "FEC_FRC", { new CCFOSelect((int8*)&TheCamera.bFreeCam, "FreeCam", off_on, 2, false, nil) },
|
||||
#else
|
||||
#define FREE_CAM_TOGGLE
|
||||
#endif
|
||||
|
||||
#ifdef PS2_ALPHA_TEST
|
||||
#define DUALPASS_SELECTOR MENUACTION_CFO_SELECT, "FEM_2PR", { new CCFOSelect((int8*)&gPS2alphaTest, "PS2AlphaTest", off_on, 2, false, nil) },
|
||||
#else
|
||||
#define DUALPASS_SELECTOR
|
||||
#endif
|
||||
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
#define POSTFX_SELECTORS \
|
||||
MENUACTION_CFO_SELECT, "FED_VPL", { new CCFOSelect((int8*)&CustomPipes::VehiclePipeSwitch, "VehiclePipeline", vehPipelineNames, ARRAY_SIZE(vehPipelineNames), false, nil) }, \
|
||||
MENUACTION_CFO_SELECT, "FED_PRM", { new CCFOSelect((int8*)&CustomPipes::RimlightEnable, "NeoRimLight", off_on, 2, false, nil) }, \
|
||||
MENUACTION_CFO_SELECT, "FED_WLM", { new CCFOSelect((int8*)&CustomPipes::LightmapEnable, "NeoLightMaps", off_on, 2, false, nil) }, \
|
||||
MENUACTION_CFO_SELECT, "FED_RGL", { new CCFOSelect((int8*)&CustomPipes::GlossEnable, "NeoRoadGloss", off_on, 2, false, nil) },
|
||||
#else
|
||||
#define POSTFX_SELECTORS
|
||||
#endif
|
||||
|
||||
#ifdef EXTENDED_PIPELINES
|
||||
#define PIPELINES_SELECTOR \
|
||||
MENUACTION_CFO_SELECT, "FED_CLF", { new CCFOSelect((int8*)&CPostFX::EffectSwitch, "ColourFilter", filterNames, ARRAY_SIZE(filterNames), false, nil) }, \
|
||||
MENUACTION_CFO_SELECT, "FED_MBL", { new CCFOSelect((int8*)&CPostFX::MotionBlurOn, "MotionBlur", off_on, 2, false, nil) },
|
||||
#else
|
||||
#define PIPELINES_SELECTOR
|
||||
#endif
|
||||
|
||||
const char *filterNames[] = { "FEM_NON", "FEM_SIM", "FEM_NRM", "FEM_MOB" };
|
||||
const char *vehPipelineNames[] = { "FED_MFX", "FED_NEO" };
|
||||
const char *off_on[] = { "FEM_OFF", "FEM_ON" };
|
||||
|
||||
void RestoreDefGraphics(int8 action) {
|
||||
if (action != FEOPTION_ACTION_SELECT)
|
||||
return;
|
||||
|
||||
#ifdef PS2_ALPHA_TEST
|
||||
gPS2alphaTest = false;
|
||||
#endif
|
||||
#ifdef MULTISAMPLING
|
||||
FrontEndMenuManager.m_nPrefsMSAALevel = FrontEndMenuManager.m_nDisplayMSAALevel = 0;
|
||||
#endif
|
||||
#ifdef GRAPHICS_MENU_OPTIONS // otherwise Frontend will handle those
|
||||
CMenuManager::m_PrefsFrameLimiter = true;
|
||||
CMenuManager::m_PrefsVsyncDisp = true;
|
||||
CMenuManager::m_PrefsVsync = true;
|
||||
CMenuManager::m_PrefsUseWideScreen = false;
|
||||
FrontEndMenuManager.m_nDisplayVideoMode = FrontEndMenuManager.m_nPrefsVideoMode;
|
||||
#ifdef GTA3_1_1_PATCH
|
||||
if (_dwOperatingSystemVersion == OS_WIN98) {
|
||||
CMBlur::BlurOn = false;
|
||||
CMBlur::MotionBlurClose();
|
||||
} else {
|
||||
CMBlur::BlurOn = true;
|
||||
CMBlur::MotionBlurOpen(Scene.camera);
|
||||
}
|
||||
#else
|
||||
CMBlur::BlurOn = true;
|
||||
#endif
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
#endif
|
||||
}
|
||||
|
||||
void RestoreDefDisplay(int8 action) {
|
||||
if (action != FEOPTION_ACTION_SELECT)
|
||||
return;
|
||||
|
||||
#ifdef CUTSCENE_BORDERS_SWITCH
|
||||
CMenuManager::m_PrefsCutsceneBorders = true;
|
||||
#endif
|
||||
#ifdef FREE_CAM
|
||||
TheCamera.bFreeCam = false;
|
||||
#endif
|
||||
#ifdef GRAPHICS_MENU_OPTIONS // otherwise Frontend will handle those
|
||||
CMenuManager::m_PrefsBrightness = 256;
|
||||
CMenuManager::m_PrefsLOD = 1.2f;
|
||||
CRenderer::ms_lodDistScale = 1.2f;
|
||||
CMenuManager::m_PrefsShowSubtitles = true;
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef MORE_LANGUAGES
|
||||
void LangPolSelect(int8 action)
|
||||
{
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_POLISH;
|
||||
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
|
||||
FrontEndMenuManager.InitialiseChangedLanguageSettings();
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
}
|
||||
|
||||
void LangRusSelect(int8 action)
|
||||
{
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_RUSSIAN;
|
||||
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
|
||||
FrontEndMenuManager.InitialiseChangedLanguageSettings();
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
}
|
||||
|
||||
void LangJapSelect(int8 action)
|
||||
{
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_JAPANESE;
|
||||
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
|
||||
FrontEndMenuManager.InitialiseChangedLanguageSettings();
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef MULTISAMPLING
|
||||
void GraphicsGoBack() {
|
||||
}
|
||||
#else
|
||||
void GraphicsGoBack() {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = FrontEndMenuManager.m_nPrefsMSAALevel;
|
||||
}
|
||||
|
||||
void MultiSamplingButtonPress(int8 action) {
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel != FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
FrontEndMenuManager.m_nPrefsMSAALevel = FrontEndMenuManager.m_nDisplayMSAALevel;
|
||||
_psSelectScreenVM(FrontEndMenuManager.m_nPrefsVideoMode);
|
||||
FrontEndMenuManager.SetHelperText(0);
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
} else if (action == FEOPTION_ACTION_LEFT || action == FEOPTION_ACTION_RIGHT) {
|
||||
if (FrontEndMenuManager.m_bGameNotLoaded) {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel += (action == FEOPTION_ACTION_RIGHT ? 1 : -1);
|
||||
|
||||
int i = 0;
|
||||
int maxAA = RwD3D8EngineGetMaxMultiSamplingLevels();
|
||||
while (maxAA != 1) {
|
||||
i++;
|
||||
maxAA >>= 1;
|
||||
}
|
||||
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel < 0)
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = i;
|
||||
else if (FrontEndMenuManager.m_nDisplayMSAALevel > i)
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = 0;
|
||||
}
|
||||
} else if (action == FEOPTION_ACTION_FOCUSLOSS) {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel != FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = FrontEndMenuManager.m_nPrefsMSAALevel;
|
||||
FrontEndMenuManager.SetHelperText(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wchar* MultiSamplingDraw(bool *disabled, bool userHovering) {
|
||||
static wchar unicodeTemp[64];
|
||||
if (userHovering) {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel == FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
if (FrontEndMenuManager.m_nHelperTextMsgId == 1) // Press enter to apply
|
||||
FrontEndMenuManager.ResetHelperText();
|
||||
} else {
|
||||
FrontEndMenuManager.SetHelperText(1);
|
||||
}
|
||||
} else {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel != FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = FrontEndMenuManager.m_nPrefsMSAALevel;
|
||||
}
|
||||
}
|
||||
|
||||
if (!FrontEndMenuManager.m_bGameNotLoaded)
|
||||
*disabled = true;
|
||||
|
||||
switch (FrontEndMenuManager.m_nDisplayMSAALevel) {
|
||||
case 0:
|
||||
return TheText.Get("FEM_OFF");
|
||||
default:
|
||||
sprintf(gString, "%iX", 1 << (FrontEndMenuManager.m_nDisplayMSAALevel));
|
||||
AsciiToUnicode(gString, unicodeTemp);
|
||||
return unicodeTemp;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef IMPROVED_VIDEOMODE
|
||||
const char* screenModes[] = { "FED_FLS", "FED_WND" };
|
||||
void ScreenModeAfterChange(int8 before, int8 after)
|
||||
{
|
||||
_psSelectScreenVM(FrontEndMenuManager.m_nPrefsVideoMode); // apply same resolution
|
||||
FrontEndMenuManager.SetHelperText(0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
wchar selectedJoystickUnicode[128];
|
||||
|
||||
wchar* DetectJoystickDraw(bool* disabled, bool userHovering) {
|
||||
int numButtons;
|
||||
int found = -1;
|
||||
const char *joyname;
|
||||
if (userHovering) {
|
||||
for (int i = 0; i <= GLFW_JOYSTICK_LAST; i++) {
|
||||
if ((joyname = glfwGetJoystickName(i))) {
|
||||
const uint8* buttons = glfwGetJoystickButtons(i, &numButtons);
|
||||
for (int j = 0; j < numButtons; j++) {
|
||||
if (buttons[j]) {
|
||||
found = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found != -1)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found != -1 && PSGLOBAL(joy1id) != found) {
|
||||
if (PSGLOBAL(joy1id) != -1 && PSGLOBAL(joy1id) != found)
|
||||
PSGLOBAL(joy2id) = PSGLOBAL(joy1id);
|
||||
else
|
||||
PSGLOBAL(joy2id) = -1;
|
||||
|
||||
strcpy(gSelectedJoystickName, joyname);
|
||||
PSGLOBAL(joy1id) = found;
|
||||
}
|
||||
}
|
||||
if (PSGLOBAL(joy1id) == -1)
|
||||
AsciiToUnicode("Not found", selectedJoystickUnicode);
|
||||
else
|
||||
AsciiToUnicode(gSelectedJoystickName, selectedJoystickUnicode);
|
||||
|
||||
return selectedJoystickUnicode;
|
||||
}
|
||||
#endif
|
||||
|
||||
CMenuScreenCustom aScreens[MENUPAGES] = {
|
||||
// MENUPAGE_NONE = 0
|
||||
{ "", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil, },
|
||||
|
||||
// MENUPAGE_STATS = 1
|
||||
{ "FET_STA", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_NEW_GAME = 2
|
||||
{ "FET_SGA", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FES_SNG", { nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME_RELOAD },
|
||||
MENUACTION_POPULATESLOTS_CHANGEMENU, "GMLOAD", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_LOAD_SLOT },
|
||||
MENUACTION_POPULATESLOTS_CHANGEMENU, "FES_DGA", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_DELETE_SLOT },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_BRIEFS = 3
|
||||
{ "FET_BRE", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_SETTINGS = 4
|
||||
{ "FET_CON", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_CTRLCONFIG, "FEC_CCF", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS },
|
||||
MENUACTION_CTRLDISPLAY, "FEC_CDP", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS },
|
||||
MENUACTION_CTRLVIBRATION, "FEC_VIB", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_SOUND_SETTINGS = 5
|
||||
{ "FET_AUD", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_MUSICVOLUME, "FEA_MUS", { nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS },
|
||||
MENUACTION_SFXVOLUME, "FEA_SFX", { nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS },
|
||||
MENUACTION_AUDIOHW, "FEA_3DH", { nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS },
|
||||
MENUACTION_SPEAKERCONF, "FEA_SPK", { nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS },
|
||||
MENUACTION_DYNAMICACOUSTIC, "FET_DAM", { nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS },
|
||||
MENUACTION_RADIO, "FEA_RSS", { nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS },
|
||||
MENUACTION_RESTOREDEF, "FET_DEF", { nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
#ifndef GRAPHICS_MENU_OPTIONS
|
||||
// MENUPAGE_DISPLAY_SETTINGS = 6
|
||||
{ "FET_DIS", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_BRIGHTNESS, "FED_BRI", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
MENUACTION_DRAWDIST, "FEM_LOD", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
MENUACTION_FRAMESYNC, "FEM_VSC", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
MENUACTION_FRAMELIMIT, "FEM_FRM", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
#ifndef EXTENDED_COLOURFILTER
|
||||
MENUACTION_TRAILS, "FED_TRA", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
#endif
|
||||
MENUACTION_SUBTITLES, "FED_SUB", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
MENUACTION_WIDESCREEN, "FED_WIS", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
MENUACTION_SCREENRES, "FED_RES", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
VIDEOMODE_SELECTOR
|
||||
MULTISAMPLING_SELECTOR
|
||||
MENUACTION_CHANGEMENU, "FET_ADV", { nil, SAVESLOT_NONE, MENUPAGE_ADVANCED_DISPLAY_SETTINGS },
|
||||
MENUACTION_RESTOREDEF, "FET_DEF", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
#else
|
||||
// MENUPAGE_DISPLAY_SETTINGS = 6
|
||||
{ "FET_DIS", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_BRIGHTNESS, "FED_BRI", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
MENUACTION_DRAWDIST, "FEM_LOD", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
CUTSCENE_BORDERS_TOGGLE
|
||||
FREE_CAM_TOGGLE
|
||||
MENUACTION_SUBTITLES, "FED_SUB", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
MENUACTION_CFO_DYNAMIC, "FET_DEF", { new CCFODynamic(nil, nil, nil, RestoreDefDisplay) },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
#endif
|
||||
|
||||
// MENUPAGE_LANGUAGE_SETTINGS = 7
|
||||
{ "FET_LAN", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_LANG_ENG, "FEL_ENG", { nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS },
|
||||
MENUACTION_LANG_FRE, "FEL_FRE", { nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS },
|
||||
MENUACTION_LANG_GER, "FEL_GER", { nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS },
|
||||
MENUACTION_LANG_ITA, "FEL_ITA", { nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS },
|
||||
MENUACTION_LANG_SPA, "FEL_SPA", { nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS },
|
||||
#ifdef MORE_LANGUAGES
|
||||
MENUACTION_CFO_DYNAMIC, "FEL_POL", { new CCFODynamic(nil, nil, nil, LangPolSelect) },
|
||||
MENUACTION_CFO_DYNAMIC, "FEL_RUS", { new CCFODynamic(nil, nil, nil, LangRusSelect) },
|
||||
MENUACTION_CFO_DYNAMIC, "FEL_JAP", { new CCFODynamic(nil, nil, nil, LangJapSelect) },
|
||||
#endif
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_CHOOSE_LOAD_SLOT = 8
|
||||
{ "FET_LG", MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FESZ_CA", { nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME },
|
||||
MENUACTION_CHECKSAVE, "FEM_SL0", { nil, SAVESLOT_1, MENUPAGE_LOAD_SLOT_CONFIRM },
|
||||
MENUACTION_CHECKSAVE, "FEM_SL1", { nil, SAVESLOT_2, MENUPAGE_LOAD_SLOT_CONFIRM },
|
||||
MENUACTION_CHECKSAVE, "FEM_SL2", { nil, SAVESLOT_3, MENUPAGE_LOAD_SLOT_CONFIRM },
|
||||
MENUACTION_CHECKSAVE, "FEM_SL3", { nil, SAVESLOT_4, MENUPAGE_LOAD_SLOT_CONFIRM },
|
||||
MENUACTION_CHECKSAVE, "FEM_SL4", { nil, SAVESLOT_5, MENUPAGE_LOAD_SLOT_CONFIRM },
|
||||
MENUACTION_CHECKSAVE, "FEM_SL5", { nil, SAVESLOT_6, MENUPAGE_LOAD_SLOT_CONFIRM },
|
||||
MENUACTION_CHECKSAVE, "FEM_SL6", { nil, SAVESLOT_7, MENUPAGE_LOAD_SLOT_CONFIRM },
|
||||
MENUACTION_CHECKSAVE, "FEM_SL7", { nil, SAVESLOT_8, MENUPAGE_LOAD_SLOT_CONFIRM },
|
||||
},
|
||||
|
||||
// MENUPAGE_CHOOSE_DELETE_SLOT = 9
|
||||
{ "FET_DG", MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FESZ_CA", { nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL0", { nil, SAVESLOT_1, MENUPAGE_DELETE_SLOT_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL1", { nil, SAVESLOT_2, MENUPAGE_DELETE_SLOT_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL2", { nil, SAVESLOT_3, MENUPAGE_DELETE_SLOT_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL3", { nil, SAVESLOT_4, MENUPAGE_DELETE_SLOT_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL4", { nil, SAVESLOT_5, MENUPAGE_DELETE_SLOT_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL5", { nil, SAVESLOT_6, MENUPAGE_DELETE_SLOT_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL6", { nil, SAVESLOT_7, MENUPAGE_DELETE_SLOT_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL7", { nil, SAVESLOT_8, MENUPAGE_DELETE_SLOT_CONFIRM },
|
||||
},
|
||||
|
||||
// MENUPAGE_NEW_GAME_RELOAD = 10
|
||||
{ "FET_NG", MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, nil, nil,
|
||||
MENUACTION_LABEL, "FESZ_QR", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEM_NO", { nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME },
|
||||
MENUACTION_NEWGAME, "FEM_YES", { nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME_RELOAD },
|
||||
},
|
||||
|
||||
// MENUPAGE_LOAD_SLOT_CONFIRM = 11
|
||||
{ "FET_LG", MENUPAGE_CHOOSE_LOAD_SLOT, MENUPAGE_CHOOSE_LOAD_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FESZ_QL", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEM_NO", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_LOAD_SLOT },
|
||||
MENUACTION_CHANGEMENU, "FEM_YES", { nil, SAVESLOT_NONE, MENUPAGE_LOADING_IN_PROGRESS },
|
||||
},
|
||||
|
||||
// MENUPAGE_DELETE_SLOT_CONFIRM = 12
|
||||
{ "FET_DG", MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FESZ_QD", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEM_NO", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_DELETE_SLOT },
|
||||
MENUACTION_CHANGEMENU, "FEM_YES", { nil, SAVESLOT_NONE, MENUPAGE_DELETING },
|
||||
},
|
||||
|
||||
// MENUPAGE_NO_MEMORY_CARD = 13
|
||||
{ "FES_NOC", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
// hud adjustment page in mobile
|
||||
},
|
||||
|
||||
// MENUPAGE_LOADING_IN_PROGRESS = 14
|
||||
{ "FET_LG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_LABEL, "FED_LDW", { nil, SAVESLOT_NONE, MENUPAGE_LOAD_SLOT_CONFIRM },
|
||||
},
|
||||
|
||||
// MENUPAGE_DELETING_IN_PROGRESS = 15
|
||||
{ "FET_DG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_LABEL, "FEDL_WR", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_PS2_LOAD_FAILED = 16
|
||||
{ "FET_LG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_LABEL, "FES_LOE", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_DELETE_FAILED = 17
|
||||
{ "FET_DG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_LABEL, "FES_DEE", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEC_OKK", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_DELETE_SLOT },
|
||||
},
|
||||
|
||||
// MENUPAGE_DEBUG_MENU = 18
|
||||
{ "FED_DBG", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_RELOADIDE, "FED_RID", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_RELOADIPL, "FED_RIP", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_SETDBGFLAG, "FED_DFL", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_SWITCHBIGWHITEDEBUGLIGHT, "FED_DLS", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_PEDROADGROUPS, "FED_SPR", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CARROADGROUPS, "FED_SCR", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_COLLISIONPOLYS, "FED_SCP", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_PARSEHEAP, "FED_PAH", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_SHOWCULL, "FED_SCZ", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_DEBUGSTREAM, "FED_DSR", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_MEMORY_CARD_DEBUG = 19
|
||||
{ "FEM_MCM", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_REGMEMCARD1, "FEM_RMC", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_TESTFORMATMEMCARD1, "FEM_TFM", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_TESTUNFORMATMEMCARD1, "FEM_TUM", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CREATEROOTDIR, "FEM_CRD", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CREATELOADICONS, "FEM_CLI", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_FILLWITHGUFF, "FEM_FFF", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_SAVEONLYTHEGAME, "FEM_SOG", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_SAVEGAME, "FEM_STG", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_SAVEGAMEUNDERGTA, "FEM_STS", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CREATECOPYPROTECTED, "FEM_CPD", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_MEMORY_CARD_TEST = 20
|
||||
{ "FEM_MC2", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_MULTIPLAYER_MAIN = 21
|
||||
{ "FET_MP", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_PS2_SAVE_FAILED = 22
|
||||
{ "MCDNSP", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_MEMCARDSAVECONFIRM, "JAILB_U", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_PS2_SAVE_FAILED_2 = 23
|
||||
{ "MCGNSP", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_MEMCARDSAVECONFIRM, "JAILB_U", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// Unused in PC but anyway
|
||||
// MENUPAGE_SAVE = 24
|
||||
#ifdef PS2_SAVE_DIALOG
|
||||
{ "FET_SG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FESZ_SA", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT },
|
||||
MENUACTION_RESUME_FROM_SAVEZONE, "FESZ_CA", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
#else
|
||||
{ "FET_SG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_LABEL, "FES_SCG", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_POPULATESLOTS_CHANGEMENU, "GMSAVE", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT },
|
||||
MENUACTION_RESUME_FROM_SAVEZONE, "FESZ_CA", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
#endif
|
||||
|
||||
// MENUPAGE_NO_MEMORY_CARD_2 = 25
|
||||
{ "FES_NOC", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FESZ_CA", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_CHOOSE_SAVE_SLOT = 26
|
||||
{ "FET_SG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_RESUME_FROM_SAVEZONE, "FESZ_CA", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL1", { nil, SAVESLOT_1, MENUPAGE_SAVE_OVERWRITE_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL2", { nil, SAVESLOT_2, MENUPAGE_SAVE_OVERWRITE_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL3", { nil, SAVESLOT_3, MENUPAGE_SAVE_OVERWRITE_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL4", { nil, SAVESLOT_4, MENUPAGE_SAVE_OVERWRITE_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL5", { nil, SAVESLOT_5, MENUPAGE_SAVE_OVERWRITE_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL6", { nil, SAVESLOT_6, MENUPAGE_SAVE_OVERWRITE_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL7", { nil, SAVESLOT_7, MENUPAGE_SAVE_OVERWRITE_CONFIRM },
|
||||
MENUACTION_CHANGEMENU, "FEM_SL8", { nil, SAVESLOT_8, MENUPAGE_SAVE_OVERWRITE_CONFIRM },
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVE_OVERWRITE_CONFIRM = 27
|
||||
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FESZ_QO", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEM_YES", { nil, SAVESLOT_NONE, MENUPAGE_SAVING_IN_PROGRESS },
|
||||
MENUACTION_CHANGEMENU, "FEM_NO", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT },
|
||||
},
|
||||
|
||||
// MENUPAGE_MULTIPLAYER_MAP = 28
|
||||
{ "FET_MAP", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_MULTIPLAYER_CONNECTION = 29
|
||||
{ "FET_CON", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_MULTIPLAYER_FIND_GAME = 30
|
||||
{ "FET_FG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_MULTIPLAYER_MODE = 31
|
||||
{ "FET_GT", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_MULTIPLAYER_CREATE = 32
|
||||
{ "FET_HG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_MULTIPLAYER_START = 33
|
||||
{ "FEN_STA", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_SKIN_SELECT_OLD = 34
|
||||
{ "FET_PS", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC = 35
|
||||
{ "FET_CTL", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_CTRLMETHOD, "FET_CME", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC },
|
||||
MENUACTION_KEYBOARDCTRLS,"FET_RDK", { nil, SAVESLOT_NONE, MENUPAGE_KEYBOARD_CONTROLS },
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
MENUACTION_CHANGEMENU, "FEC_JOD", { nil, SAVESLOT_NONE, MENUPAGE_DETECT_JOYSTICK },
|
||||
#endif
|
||||
MENUACTION_CHANGEMENU, "FET_AMS", { nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS },
|
||||
MENUACTION_RESTOREDEF, "FET_DEF", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD1 = 36
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
MENUACTION_GETKEY, "FEC_PLB", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1 },
|
||||
MENUACTION_GETKEY, "FEC_CWL", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1 },
|
||||
MENUACTION_GETKEY, "FEC_CWR", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1 },
|
||||
MENUACTION_GETKEY, "FEC_LKT", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1 },
|
||||
MENUACTION_GETKEY, "FEC_PJP", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1 },
|
||||
MENUACTION_GETKEY, "FEC_PSP", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1 },
|
||||
MENUACTION_GETKEY, "FEC_TLF", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1 },
|
||||
MENUACTION_GETKEY, "FEC_TRG", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1 },
|
||||
MENUACTION_GETKEY, "FEC_CCM", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1 },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD2 = 37
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD3 = 38
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
MENUACTION_GETKEY, "FEC_LUP", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3 },
|
||||
MENUACTION_GETKEY, "FEC_LDN", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3 },
|
||||
MENUACTION_GETKEY, "FEC_SMS", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3 },
|
||||
MENUACTION_SHOWHEADBOB, "FEC_GSL", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3 },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_PC_OLD4 = 39
|
||||
{ "FET_CTL", MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_CONTROLLER_DEBUG = 40
|
||||
{ "FEC_DBG", MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
MENUACTION_GETKEY, "FEC_TGD", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG },
|
||||
MENUACTION_GETKEY, "FEC_TDO", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG },
|
||||
MENUACTION_GETKEY, "FEC_TSS", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG },
|
||||
MENUACTION_GETKEY, "FEC_SMS", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_OPTIONS = 41
|
||||
{ "FET_OPT", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FET_CTL", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC },
|
||||
MENUACTION_LOADRADIO, "FET_AUD", { nil, SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS },
|
||||
MENUACTION_CHANGEMENU, "FET_DIS", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
#ifdef GRAPHICS_MENU_OPTIONS
|
||||
MENUACTION_CHANGEMENU, "FET_GRA", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS },
|
||||
#endif
|
||||
MENUACTION_CHANGEMENU, "FET_LAN", { nil, SAVESLOT_NONE, MENUPAGE_LANGUAGE_SETTINGS },
|
||||
MENUACTION_PLAYERSETUP, "FET_PSU", { nil, SAVESLOT_NONE, MENUPAGE_SKIN_SELECT },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_EXIT = 42
|
||||
{ "FET_QG", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_LABEL, "FEQ_SRE", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_DONTCANCEL, "FEM_NO", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CANCELGAME, "FEM_YES", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVING_IN_PROGRESS = 43
|
||||
{ "", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FES_WAR", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVE_SUCCESSFUL = 44
|
||||
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FES_SSC", { nil, SAVESLOT_LABEL, MENUPAGE_NONE },
|
||||
MENUACTION_RESUME_FROM_SAVEZONE, "FEC_OKK", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT },
|
||||
},
|
||||
|
||||
// MENUPAGE_DELETING = 45
|
||||
{ "FET_DG", MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FED_DLW", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_DELETE_SUCCESS = 46
|
||||
{ "FET_DG", MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "DEL_FNM", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEC_OKK", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_DELETE_SLOT },
|
||||
},
|
||||
|
||||
// MENUPAGE_SAVE_FAILED = 47
|
||||
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FEC_SVU", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEC_OKK", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT },
|
||||
},
|
||||
|
||||
// MENUPAGE_LOAD_FAILED = 48
|
||||
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FEC_SVU", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_LOAD_FAILED_2 = 49
|
||||
{ "FET_LG", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, nil, nil,
|
||||
MENUACTION_LABEL, "FEC_LUN", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_CHOOSE_LOAD_SLOT },
|
||||
},
|
||||
|
||||
// MENUPAGE_FILTER_GAME = 50
|
||||
{ "FIL_FLT", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
// MENUPAGE_START_MENU = 51
|
||||
{ "FEM_MM", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FEN_STA", { nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME },
|
||||
MENUACTION_CHANGEMENU, "FET_OPT", { nil, SAVESLOT_NONE, MENUPAGE_OPTIONS },
|
||||
MENUACTION_CHANGEMENU, "FEM_QT", { nil, SAVESLOT_NONE, MENUPAGE_EXIT },
|
||||
},
|
||||
|
||||
// MENUPAGE_PAUSE_MENU = 52
|
||||
{ "FET_PAU", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_RESUME, "FEM_RES", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEN_STA", { nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME },
|
||||
#ifdef MENU_MAP
|
||||
MENUACTION_CHANGEMENU, "FEG_MAP", { nil, SAVESLOT_NONE, MENUPAGE_MAP },
|
||||
#endif
|
||||
MENUACTION_CHANGEMENU, "FEP_STA", { nil, SAVESLOT_NONE, MENUPAGE_STATS },
|
||||
MENUACTION_CHANGEMENU, "FEP_BRI", { nil, SAVESLOT_NONE, MENUPAGE_BRIEFS },
|
||||
MENUACTION_CHANGEMENU, "FET_OPT", { nil, SAVESLOT_NONE, MENUPAGE_OPTIONS },
|
||||
MENUACTION_CHANGEMENU, "FEM_QT", { nil, SAVESLOT_NONE, MENUPAGE_EXIT },
|
||||
},
|
||||
|
||||
// MENUPAGE_CHOOSE_MODE = 53
|
||||
{ "FEN_STA", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FET_SP", { nil, SAVESLOT_NONE, MENUPAGE_NEW_GAME },
|
||||
MENUACTION_INITMP, "FET_MP", { nil, SAVESLOT_NONE, MENUPAGE_MULTIPLAYER_MAIN },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
|
||||
// MENUPAGE_SKIN_SELECT = 54
|
||||
{ "FET_PSU", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_MULTIPLAYER_MAIN },
|
||||
},
|
||||
|
||||
// MENUPAGE_KEYBOARD_CONTROLS = 55
|
||||
{ "FET_STI", MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC },
|
||||
},
|
||||
|
||||
// MENUPAGE_MOUSE_CONTROLS = 56
|
||||
{ "FET_MTI", MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, nil, nil,
|
||||
MENUACTION_MOUSESENS, "FEC_MSH", { nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS },
|
||||
MENUACTION_INVVERT, "FEC_IVV", { nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS },
|
||||
MENUACTION_MOUSESTEER, "FET_MST", { nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
// MENUPAGE_MISSION_RETRY = 57
|
||||
#ifdef MISSION_REPLAY
|
||||
|
||||
{ "M_FAIL", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil,
|
||||
MENUACTION_LABEL, "FESZ_RM", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CHANGEMENU, "FEM_YES", { nil, SAVESLOT_NONE, MENUPAGE_LOADING_IN_PROGRESS },
|
||||
MENUACTION_REJECT_RETRY, "FEM_NO", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
#else
|
||||
{ "", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
// mission failed, wanna restart page in mobile
|
||||
},
|
||||
#endif
|
||||
|
||||
#ifdef MENU_MAP
|
||||
// MENUPAGE_MAP
|
||||
{ "FEG_MAP", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
MENUACTION_UNK110, "", { nil, SAVESLOT_NONE, MENUPAGE_NONE }, // to prevent cross/enter to go back
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
#endif
|
||||
|
||||
#ifdef GRAPHICS_MENU_OPTIONS
|
||||
// MENUPAGE_GRAPHICS_SETTINGS
|
||||
{ "FET_GRA", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS,
|
||||
new CCustomScreenLayout({MENUSPRITE_MAINMENU, 50, 0, 20, FONT_HEADING, FESCREEN_LEFT_ALIGN, true, MEDIUMTEXT_X_SCALE, MEDIUMTEXT_Y_SCALE}), GraphicsGoBack,
|
||||
|
||||
MENUACTION_SCREENRES, "FED_RES", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS },
|
||||
MENUACTION_WIDESCREEN, "FED_WIS", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS },
|
||||
VIDEOMODE_SELECTOR
|
||||
MENUACTION_FRAMESYNC, "FEM_VSC", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
MENUACTION_FRAMELIMIT, "FEM_FRM", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
MULTISAMPLING_SELECTOR
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
POSTFX_SELECTORS
|
||||
#else
|
||||
MENUACTION_TRAILS, "FED_TRA", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||
#endif
|
||||
#ifdef EXTENDED_PIPELINES
|
||||
PIPELINES_SELECTOR
|
||||
#endif
|
||||
DUALPASS_SELECTOR
|
||||
MENUACTION_CFO_DYNAMIC, "FET_DEF", { new CCFODynamic(nil, nil, nil, RestoreDefGraphics) },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
#else
|
||||
// MENUPAGE_ADVANCED_DISPLAY_SETTINGS
|
||||
{ "FET_ADV", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS,
|
||||
new CCustomScreenLayout({MENUSPRITE_MAINMENU, 50, 0, 20, FONT_HEADING, FESCREEN_LEFT_ALIGN, true, MEDIUMTEXT_X_SCALE, MEDIUMTEXT_Y_SCALE}), nil,
|
||||
|
||||
DUALPASS_SELECTOR
|
||||
CUTSCENE_BORDERS_TOGGLE
|
||||
FREE_CAM_TOGGLE
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
POSTFX_SELECTORS
|
||||
#endif
|
||||
#ifdef EXTENDED_PIPELINES
|
||||
PIPELINES_SELECTOR
|
||||
#endif
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
#endif
|
||||
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
// MENUPAGE_DETECT_JOYSTICK
|
||||
{ "FEC_JOD", MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC,
|
||||
new CCustomScreenLayout({MENUSPRITE_MAINMENU, 40, 60, 20, FONT_BANK, FESCREEN_LEFT_ALIGN, false, MEDIUMTEXT_X_SCALE, MEDIUMTEXT_Y_SCALE}), nil,
|
||||
|
||||
MENUACTION_LABEL, "FEC_JPR", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
MENUACTION_CFO_DYNAMIC, "FEC_JDE", { new CCFODynamic(nil, nil, DetectJoystickDraw, nil) },
|
||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||
},
|
||||
#endif
|
||||
|
||||
// MENUPAGE_UNK
|
||||
{ "", MENUPAGE_NONE, MENUPAGE_NONE, nil, nil,
|
||||
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
|
@ -64,6 +64,7 @@
|
|||
#include "debugmenu.h"
|
||||
#include "Clock.h"
|
||||
#include "custompipes.h"
|
||||
#include "frontendoption.h"
|
||||
|
||||
GlobalScene Scene;
|
||||
|
||||
|
@ -404,6 +405,13 @@ Initialise3D(void *param)
|
|||
DebugMenuInit();
|
||||
DebugMenuPopulate();
|
||||
#endif // !DEBUGMENU
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
// Apparently this func. can be run multiple times at the start.
|
||||
if (numCustomFrontendOptions == 0 && numCustomFrontendScreens == 0) {
|
||||
// needs stored language and TheText to be loaded, and last TheText reload is at the start of here
|
||||
CustomFrontendOptionsPopulate();
|
||||
}
|
||||
#endif
|
||||
bool ret = CGame::InitialiseRenderWare();
|
||||
#ifdef EXTENDED_PIPELINES
|
||||
CustomPipes::CustomPipeInit(); // need Scene.world for this
|
||||
|
|
452
src/core/re3.cpp
452
src/core/re3.cpp
|
@ -1,7 +1,6 @@
|
|||
#include <csignal>
|
||||
#define WITHWINDOWS
|
||||
#include "common.h"
|
||||
#include "platform.h"
|
||||
#include "crossplatform.h"
|
||||
#include "Renderer.h"
|
||||
#include "Credits.h"
|
||||
|
@ -16,7 +15,6 @@
|
|||
#include "Boat.h"
|
||||
#include "Heli.h"
|
||||
#include "Automobile.h"
|
||||
#include "Ped.h"
|
||||
#include "Console.h"
|
||||
#include "Debug.h"
|
||||
#include "Hud.h"
|
||||
|
@ -26,10 +24,8 @@
|
|||
#include "Radar.h"
|
||||
#include "debugmenu.h"
|
||||
#include "Frontend.h"
|
||||
#include "Text.h"
|
||||
#include "WaterLevel.h"
|
||||
#include "main.h"
|
||||
#include "MBlur.h"
|
||||
#include "postfx.h"
|
||||
#include "custompipes.h"
|
||||
|
||||
|
@ -76,388 +72,39 @@ mysrand(unsigned int seed)
|
|||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
#include "frontendoption.h"
|
||||
#include "Font.h"
|
||||
|
||||
void ReloadFrontendOptions(void)
|
||||
{
|
||||
CustomFrontendOptionsPopulate();
|
||||
}
|
||||
|
||||
void RestoreDefGraphics(int8 action) {
|
||||
if (action != FEOPTION_ACTION_SELECT)
|
||||
return;
|
||||
|
||||
#ifdef PS2_ALPHA_TEST
|
||||
gPS2alphaTest = false;
|
||||
#endif
|
||||
#ifdef MULTISAMPLING
|
||||
FrontEndMenuManager.m_nPrefsMSAALevel = FrontEndMenuManager.m_nDisplayMSAALevel = 0;
|
||||
#endif
|
||||
#ifdef GRAPHICS_MENU_OPTIONS // otherwise Frontend will handle those
|
||||
CMenuManager::m_PrefsFrameLimiter = true;
|
||||
CMenuManager::m_PrefsVsyncDisp = true;
|
||||
CMenuManager::m_PrefsVsync = true;
|
||||
CMenuManager::m_PrefsUseWideScreen = false;
|
||||
FrontEndMenuManager.m_nDisplayVideoMode = FrontEndMenuManager.m_nPrefsVideoMode;
|
||||
#ifdef GTA3_1_1_PATCH
|
||||
if (_dwOperatingSystemVersion == OS_WIN98) {
|
||||
CMBlur::BlurOn = false;
|
||||
CMBlur::MotionBlurClose();
|
||||
} else {
|
||||
CMBlur::BlurOn = true;
|
||||
CMBlur::MotionBlurOpen(Scene.camera);
|
||||
}
|
||||
#else
|
||||
CMBlur::BlurOn = true;
|
||||
#endif
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
#endif
|
||||
}
|
||||
|
||||
void RestoreDefDisplay(int8 action) {
|
||||
if (action != FEOPTION_ACTION_SELECT)
|
||||
return;
|
||||
|
||||
#ifdef CUTSCENE_BORDERS_SWITCH
|
||||
CMenuManager::m_PrefsCutsceneBorders = true;
|
||||
#endif
|
||||
#ifdef FREE_CAM
|
||||
TheCamera.bFreeCam = false;
|
||||
#endif
|
||||
#ifdef GRAPHICS_MENU_OPTIONS // otherwise Frontend will handle those
|
||||
CMenuManager::m_PrefsBrightness = 256;
|
||||
CMenuManager::m_PrefsLOD = 1.2f;
|
||||
CRenderer::ms_lodDistScale = 1.2f;
|
||||
CMenuManager::m_PrefsShowSubtitles = true;
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef MULTISAMPLING
|
||||
void MultiSamplingGoBack() {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = FrontEndMenuManager.m_nPrefsMSAALevel;
|
||||
}
|
||||
|
||||
void MultiSamplingButtonPress(int8 action) {
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel != FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
FrontEndMenuManager.m_nPrefsMSAALevel = FrontEndMenuManager.m_nDisplayMSAALevel;
|
||||
_psSelectScreenVM(FrontEndMenuManager.m_nPrefsVideoMode);
|
||||
FrontEndMenuManager.SetHelperText(0);
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
} else if (action == FEOPTION_ACTION_LEFT || action == FEOPTION_ACTION_RIGHT) {
|
||||
if (FrontEndMenuManager.m_bGameNotLoaded) {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel += (action == FEOPTION_ACTION_RIGHT ? 1 : -1);
|
||||
|
||||
int i = 0;
|
||||
int maxAA = RwD3D8EngineGetMaxMultiSamplingLevels();
|
||||
while (maxAA != 1) {
|
||||
i++;
|
||||
maxAA >>= 1;
|
||||
}
|
||||
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel < 0)
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = i;
|
||||
else if (FrontEndMenuManager.m_nDisplayMSAALevel > i)
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = 0;
|
||||
}
|
||||
} else if (action == FEOPTION_ACTION_FOCUSLOSS) {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel != FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = FrontEndMenuManager.m_nPrefsMSAALevel;
|
||||
FrontEndMenuManager.SetHelperText(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wchar* MultiSamplingDraw(bool *disabled, bool userHovering) {
|
||||
static wchar unicodeTemp[64];
|
||||
if (userHovering) {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel == FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
if (FrontEndMenuManager.m_nHelperTextMsgId == 1) // Press enter to apply
|
||||
FrontEndMenuManager.ResetHelperText();
|
||||
} else {
|
||||
FrontEndMenuManager.SetHelperText(1);
|
||||
}
|
||||
} else {
|
||||
if (FrontEndMenuManager.m_nDisplayMSAALevel != FrontEndMenuManager.m_nPrefsMSAALevel) {
|
||||
FrontEndMenuManager.m_nDisplayMSAALevel = FrontEndMenuManager.m_nPrefsMSAALevel;
|
||||
}
|
||||
}
|
||||
|
||||
if (!FrontEndMenuManager.m_bGameNotLoaded)
|
||||
*disabled = true;
|
||||
|
||||
switch (FrontEndMenuManager.m_nDisplayMSAALevel) {
|
||||
case 0:
|
||||
return TheText.Get("FEM_OFF");
|
||||
default:
|
||||
sprintf(gString, "%iX", 1 << (FrontEndMenuManager.m_nDisplayMSAALevel));
|
||||
AsciiToUnicode(gString, unicodeTemp);
|
||||
return unicodeTemp;
|
||||
}
|
||||
}
|
||||
const char* multisamplingKey = "MultiSampling";
|
||||
#endif
|
||||
|
||||
#ifdef MORE_LANGUAGES
|
||||
void LangPolSelect(int8 action)
|
||||
{
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_POLISH;
|
||||
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
|
||||
FrontEndMenuManager.InitialiseChangedLanguageSettings();
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
}
|
||||
|
||||
void LangRusSelect(int8 action)
|
||||
{
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_RUSSIAN;
|
||||
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
|
||||
FrontEndMenuManager.InitialiseChangedLanguageSettings();
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
}
|
||||
|
||||
void LangJapSelect(int8 action)
|
||||
{
|
||||
if (action == FEOPTION_ACTION_SELECT) {
|
||||
FrontEndMenuManager.m_PrefsLanguage = CMenuManager::LANGUAGE_JAPANESE;
|
||||
FrontEndMenuManager.m_bFrontEnd_ReloadObrTxtGxt = true;
|
||||
FrontEndMenuManager.InitialiseChangedLanguageSettings();
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef IMPROVED_VIDEOMODE
|
||||
void ScreenModeChange(int8 displayedValue)
|
||||
{
|
||||
if (displayedValue != FrontEndMenuManager.m_nPrefsWindowed) {
|
||||
FrontEndMenuManager.m_nPrefsWindowed = displayedValue;
|
||||
_psSelectScreenVM(FrontEndMenuManager.m_nPrefsVideoMode); // apply same resolution
|
||||
FrontEndMenuManager.SetHelperText(0);
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef FREE_CAM
|
||||
void FreeCamChange(int8 displayedValue)
|
||||
{
|
||||
TheCamera.bFreeCam = !!displayedValue;
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
const char* freeCamKey = "FreeCam";
|
||||
#endif
|
||||
|
||||
#ifdef CUTSCENE_BORDERS_SWITCH
|
||||
void BorderModeChange(int8 displayedValue)
|
||||
{
|
||||
CMenuManager::m_PrefsCutsceneBorders = !!displayedValue;
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
const char* cutsceneBordersKey = "CutsceneBorders";
|
||||
#endif
|
||||
|
||||
#ifdef PS2_ALPHA_TEST
|
||||
void PS2AlphaTestChange(int8 displayedValue)
|
||||
{
|
||||
gPS2alphaTest = !!displayedValue;
|
||||
FrontEndMenuManager.SaveSettings();
|
||||
}
|
||||
const char* ps2alphaKey = "PS2AlphaTest";
|
||||
#endif
|
||||
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
wchar selectedJoystickUnicode[128];
|
||||
|
||||
wchar* DetectJoystickDraw(bool* disabled, bool userHovering) {
|
||||
int numButtons;
|
||||
int found = -1;
|
||||
const char *joyname;
|
||||
if (userHovering) {
|
||||
for (int i = 0; i <= GLFW_JOYSTICK_LAST; i++) {
|
||||
if ((joyname = glfwGetJoystickName(i))) {
|
||||
const uint8* buttons = glfwGetJoystickButtons(i, &numButtons);
|
||||
for (int j = 0; j < numButtons; j++) {
|
||||
if (buttons[j]) {
|
||||
found = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found != -1)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found != -1 && PSGLOBAL(joy1id) != found) {
|
||||
if (PSGLOBAL(joy1id) != -1 && PSGLOBAL(joy1id) != found)
|
||||
PSGLOBAL(joy2id) = PSGLOBAL(joy1id);
|
||||
else
|
||||
PSGLOBAL(joy2id) = -1;
|
||||
|
||||
strcpy(gSelectedJoystickName, joyname);
|
||||
PSGLOBAL(joy1id) = found;
|
||||
}
|
||||
}
|
||||
if (PSGLOBAL(joy1id) == -1)
|
||||
AsciiToUnicode("Not found", selectedJoystickUnicode);
|
||||
else
|
||||
AsciiToUnicode(gSelectedJoystickName, selectedJoystickUnicode);
|
||||
|
||||
return selectedJoystickUnicode;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Important: Make sure to read the warnings/informations in frontendoption.h!!
|
||||
// If you will hardcode any text, please use AllocUnicode! wchar_t size differs between platforms
|
||||
void
|
||||
CustomFrontendOptionsPopulate(void)
|
||||
{
|
||||
RemoveCustomFrontendOptions(); // if exist
|
||||
|
||||
// -- Graphics/display seperation preperation starts - don't add options in here!
|
||||
#ifdef GRAPHICS_MENU_OPTIONS
|
||||
int graphicsMenu = FrontendScreenAdd("FET_GRA", MENUSPRITE_MAINMENU, MENUPAGE_OPTIONS, 50, 0, 20,
|
||||
FONT_HEADING, MEDIUMTEXT_X_SCALE, MEDIUMTEXT_Y_SCALE, FESCREEN_LEFT_ALIGN, true);
|
||||
|
||||
int newDisplayMenu = FrontendScreenAdd("FET_DIS", MENUSPRITE_MAINMENU, MENUPAGE_OPTIONS, 50, 0, 20,
|
||||
FONT_HEADING, MEDIUMTEXT_X_SCALE, MEDIUMTEXT_Y_SCALE, FESCREEN_LEFT_ALIGN, true);
|
||||
|
||||
FrontendOptionSetCursor(MENUPAGE_OPTIONS, 2, true);
|
||||
FrontendOptionAddRedirect(TheText.Get("FET_DIS"), newDisplayMenu, 0);
|
||||
FrontendOptionSetCursor(MENUPAGE_OPTIONS, 3);
|
||||
FrontendOptionAddRedirect(TheText.Get("FET_GRA"), graphicsMenu, 0);
|
||||
|
||||
#define SWITCH_TO_GRAPHICS_MENU FrontendOptionSetCursor(graphicsMenu, -1);
|
||||
#define SWITCH_TO_DISPLAY_MENU FrontendOptionSetCursor(newDisplayMenu, -1);
|
||||
#define CLONE_OPTION(a, b, c, d) FrontendOptionAddBuiltinAction(a, b, c, d);
|
||||
#define ADD_BACK FrontendOptionAddBackButton(TheText.Get("FEDS_TB"));
|
||||
#define ADD_RESTORE_DEFAULTS(a) FrontendOptionAddDynamic(TheText.Get("FET_DEF"), nil, nil, a, nil);
|
||||
#else
|
||||
int advancedDisplayMenu = FrontendScreenAdd("FET_ADV", MENUSPRITE_MAINMENU, MENUPAGE_DISPLAY_SETTINGS, 50, 0, 20,
|
||||
FONT_HEADING, MEDIUMTEXT_X_SCALE, MEDIUMTEXT_Y_SCALE, FESCREEN_LEFT_ALIGN, true);
|
||||
bool movedToAdvMenu = false;
|
||||
|
||||
#define SWITCH_TO_GRAPHICS_MENU \
|
||||
if (GetNumberOfMenuOptions(MENUPAGE_DISPLAY_SETTINGS) >= 12) { \
|
||||
FrontendOptionSetCursor(advancedDisplayMenu, -1); \
|
||||
movedToAdvMenu = true; \
|
||||
} else { \
|
||||
FrontendOptionSetCursor(MENUPAGE_DISPLAY_SETTINGS, -3); \
|
||||
}
|
||||
|
||||
#define SWITCH_TO_DISPLAY_MENU SWITCH_TO_GRAPHICS_MENU
|
||||
#define CLONE_OPTION(a, b, c, d)
|
||||
#define ADD_BACK
|
||||
#define ADD_RESTORE_DEFAULTS(a)
|
||||
#endif
|
||||
// -- Graphics/display seperation preperation end
|
||||
|
||||
const wchar* off_on[] = { TheText.Get("FEM_OFF"), TheText.Get("FEM_ON") };
|
||||
|
||||
#ifdef MORE_LANGUAGES
|
||||
FrontendOptionSetCursor(MENUPAGE_LANGUAGE_SETTINGS, -2);
|
||||
FrontendOptionAddDynamic(TheText.Get("FEL_POL"), nil, nil, LangPolSelect, nil);
|
||||
FrontendOptionAddDynamic(TheText.Get("FEL_RUS"), nil, nil, LangRusSelect, nil);
|
||||
FrontendOptionAddDynamic(TheText.Get("FEL_JAP"), nil, nil, LangJapSelect, nil);
|
||||
#endif
|
||||
|
||||
#ifdef MENU_MAP
|
||||
FrontendOptionSetCursor(MENUPAGE_PAUSE_MENU, 2);
|
||||
FrontendOptionAddRedirect(TheText.Get("FEG_MAP"), MENUPAGE_MAP);
|
||||
#endif
|
||||
|
||||
// -- Start of graphics menu - add options in display order!
|
||||
|
||||
SWITCH_TO_GRAPHICS_MENU
|
||||
CLONE_OPTION(TheText.Get("FED_RES"), MENUACTION_SCREENRES, nil, nil);
|
||||
CLONE_OPTION(TheText.Get("FED_WIS"), MENUACTION_WIDESCREEN, nil, nil)
|
||||
|
||||
#ifdef IMPROVED_VIDEOMODE
|
||||
const wchar* screenModes[] = { TheText.Get("FED_FLS"), TheText.Get("FED_WND") };
|
||||
// Storing isn't enabled because it's handled in Frontend
|
||||
FrontendOptionAddSelect(TheText.Get("FEM_SCF"), screenModes, 2, (int8*)&FrontEndMenuManager.m_nPrefsWindowed, true, ScreenModeChange, nil);
|
||||
#endif
|
||||
|
||||
CLONE_OPTION(TheText.Get("FEM_VSC"), MENUACTION_FRAMESYNC, nil, nil);
|
||||
CLONE_OPTION(TheText.Get("FEM_FRM"), MENUACTION_FRAMELIMIT, nil, nil);
|
||||
|
||||
#ifdef MULTISAMPLING
|
||||
SWITCH_TO_GRAPHICS_MENU
|
||||
FrontendOptionAddDynamic(TheText.Get("FED_AAS"), MultiSamplingDraw, (int8*)&FrontEndMenuManager.m_nPrefsMSAALevel, MultiSamplingButtonPress, MultiSamplingGoBack, multisamplingKey);
|
||||
#endif
|
||||
|
||||
CLONE_OPTION(TheText.Get("FED_TRA"), MENUACTION_TRAILS, nil, nil);
|
||||
|
||||
#ifdef PS2_ALPHA_TEST
|
||||
SWITCH_TO_GRAPHICS_MENU
|
||||
FrontendOptionAddSelect(TheText.Get("FEM_2PR"), off_on, 2, (int8*)&gPS2alphaTest, false, PS2AlphaTestChange, nil, ps2alphaKey);
|
||||
#endif
|
||||
|
||||
ADD_RESTORE_DEFAULTS(RestoreDefGraphics)
|
||||
ADD_BACK
|
||||
|
||||
// ---- End of Graphics Menu ----
|
||||
|
||||
// -- Start of Display menu - add options in display order!
|
||||
|
||||
SWITCH_TO_DISPLAY_MENU
|
||||
CLONE_OPTION(TheText.Get("FED_BRI"), MENUACTION_BRIGHTNESS, nil, nil);
|
||||
CLONE_OPTION(TheText.Get("FEM_LOD"), MENUACTION_DRAWDIST, nil, nil);
|
||||
|
||||
#ifdef CUTSCENE_BORDERS_SWITCH
|
||||
SWITCH_TO_DISPLAY_MENU
|
||||
FrontendOptionAddSelect(TheText.Get("FEM_CSB"), off_on, 2, (int8 *)&CMenuManager::m_PrefsCutsceneBorders, false, BorderModeChange, nil, cutsceneBordersKey);
|
||||
#endif
|
||||
|
||||
#ifdef FREE_CAM
|
||||
SWITCH_TO_DISPLAY_MENU
|
||||
FrontendOptionAddSelect(TheText.Get("FEC_FRC"), off_on, 2, (int8*)&TheCamera.bFreeCam, false, FreeCamChange, nil, freeCamKey);
|
||||
#endif
|
||||
|
||||
CLONE_OPTION(TheText.Get("FED_SUB"), MENUACTION_SUBTITLES, nil, nil);
|
||||
|
||||
// Add link to advanced graphics menu if it's filled.
|
||||
#ifndef GRAPHICS_MENU_OPTIONS
|
||||
if (movedToAdvMenu) {
|
||||
FrontendOptionSetCursor(MENUPAGE_DISPLAY_SETTINGS, -3);
|
||||
FrontendOptionAddRedirect(TheText.Get("FET_ADV"), advancedDisplayMenu, 0);
|
||||
|
||||
FrontendOptionSetCursor(advancedDisplayMenu, -1);
|
||||
FrontendOptionAddBackButton(TheText.Get("FEDS_TB"));
|
||||
}
|
||||
#endif
|
||||
|
||||
ADD_RESTORE_DEFAULTS(RestoreDefDisplay)
|
||||
ADD_BACK
|
||||
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
int detectJoystickMenu = FrontendScreenAdd("FEC_JOD", MENUSPRITE_MAINMENU, MENUPAGE_CONTROLLER_PC, 40, 60, 20,
|
||||
FONT_BANK, MEDIUMTEXT_X_SCALE, MEDIUMTEXT_Y_SCALE, FESCREEN_LEFT_ALIGN, false);
|
||||
|
||||
FrontendOptionSetCursor(detectJoystickMenu, 0);
|
||||
|
||||
FrontendOptionAddBuiltinAction(TheText.Get("FEC_JPR"), MENUACTION_LABEL, nil, nil);
|
||||
FrontendOptionAddDynamic(TheText.Get("FEC_JDE"), DetectJoystickDraw, nil, nil, nil);
|
||||
FrontendOptionAddBackButton(TheText.Get("FEDS_TB"));
|
||||
|
||||
FrontendOptionSetCursor(MENUPAGE_CONTROLLER_PC, 2);
|
||||
FrontendOptionAddRedirect(TheText.Get("FEC_JOD"), detectJoystickMenu, 1);
|
||||
#endif
|
||||
// Moved to an array in MenuScreensCustom.cpp, but APIs are still available. see frontendoption.h
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef LOAD_INI_SETTINGS
|
||||
#include "ini_parser.hpp"
|
||||
|
||||
linb::ini cfg;
|
||||
int CheckAndReadIniInt(const char *cat, const char *key, int original)
|
||||
{
|
||||
const char *value = (cfg.get(cat, key, "").c_str());
|
||||
if (value && value[0] != '\0')
|
||||
return atoi(value);
|
||||
|
||||
return original;
|
||||
}
|
||||
|
||||
float CheckAndReadIniFloat(const char *cat, const char *key, float original)
|
||||
{
|
||||
const char *value = (cfg.get(cat, key, "").c_str());
|
||||
if (value && value[0] != '\0')
|
||||
return atof(value);
|
||||
|
||||
return original;
|
||||
}
|
||||
|
||||
void LoadINISettings()
|
||||
{
|
||||
linb::ini cfg;
|
||||
cfg.load_file("re3.ini");
|
||||
char defaultStr[4];
|
||||
|
||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||
// Written by assuming the codes below will run after _InputInitialiseJoys().
|
||||
|
@ -491,28 +138,43 @@ void LoadINISettings()
|
|||
#endif
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
for (int i = 0; i < numCustomFrontendOptions; i++) {
|
||||
FrontendOption& option = customFrontendOptions[i];
|
||||
if (option.save) {
|
||||
// CFO only supports saving uint8 right now
|
||||
sprintf(defaultStr, "%u", *option.value);
|
||||
option.lastSavedValue = option.displayedValue = *option.value = atoi(cfg.get("FrontendOptions", option.save, defaultStr).c_str());
|
||||
for (int i = 0; i < MENUPAGES; i++) {
|
||||
for (int j = 0; j < NUM_MENUROWS; j++) {
|
||||
CMenuScreenCustom::CMenuEntry &option = aScreens[i].m_aEntries[j];
|
||||
if (option.m_Action == MENUACTION_NOTHING)
|
||||
break;
|
||||
|
||||
// CFO check
|
||||
if (option.m_Action < MENUACTION_NOTHING && option.m_CFO->save) {
|
||||
// CFO only supports saving uint8 right now
|
||||
*option.m_CFO->value = CheckAndReadIniInt("FrontendOptions", option.m_CFO->save, *option.m_CFO->value);
|
||||
if (option.m_Action == MENUACTION_CFO_SELECT) {
|
||||
option.m_CFOSelect->lastSavedValue = option.m_CFOSelect->displayedValue = *option.m_CFO->value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef NO_ISLAND_LOADING
|
||||
sprintf(defaultStr, "%u", CMenuManager::m_PrefsIslandLoading);
|
||||
CMenuManager::m_PrefsIslandLoading = atoi(cfg.get("FrontendOptions", "NoIslandLoading", defaultStr).c_str());
|
||||
CMenuManager::m_PrefsIslandLoading = CheckAndReadIniInt("FrontendOptions", "NoIslandLoading", CMenuManager::m_PrefsIslandLoading);
|
||||
CMenuManager::m_DisplayIslandLoading = CMenuManager::m_PrefsIslandLoading;
|
||||
#endif
|
||||
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
CPostFX::Intensity = CheckAndReadIniFloat("CustomPipesValues", "PostFXIntensity", CPostFX::Intensity);
|
||||
#endif
|
||||
#ifdef EXTENDED_PIPELINES
|
||||
CustomPipes::VehicleShininess = CheckAndReadIniFloat("CustomPipesValues", "NeoVehicleShininess", CustomPipes::VehicleShininess);
|
||||
CustomPipes::VehicleSpecularity = CheckAndReadIniFloat("CustomPipesValues", "NeoVehicleSpecularity", CustomPipes::VehicleSpecularity);
|
||||
CustomPipes::RimlightMult = CheckAndReadIniFloat("CustomPipesValues", "RimlightMult", CustomPipes::RimlightMult);
|
||||
CustomPipes::LightmapMult = CheckAndReadIniFloat("CustomPipesValues", "LightmapMult", CustomPipes::LightmapMult);
|
||||
CustomPipes::GlossMult = CheckAndReadIniFloat("CustomPipesValues", "GlossMult", CustomPipes::GlossMult);
|
||||
#endif
|
||||
}
|
||||
|
||||
void SaveINISettings()
|
||||
{
|
||||
linb::ini cfg;
|
||||
cfg.load_file("re3.ini");
|
||||
bool changed = false;
|
||||
char temp[4];
|
||||
|
||||
|
@ -523,13 +185,18 @@ void SaveINISettings()
|
|||
}
|
||||
#endif
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
for (int i = 0; i < numCustomFrontendOptions; i++) {
|
||||
FrontendOption &option = customFrontendOptions[i];
|
||||
if (option.save) {
|
||||
if (atoi(cfg.get("FrontendOptions", option.save, "xxx").c_str()) != *option.value) { // if .ini doesn't have that key compare with xxx, so we can add it
|
||||
changed = true;
|
||||
sprintf(temp, "%u", *option.value);
|
||||
cfg.set("FrontendOptions", option.save, temp);
|
||||
for (int i = 0; i < MENUPAGES; i++) {
|
||||
for (int j = 0; j < NUM_MENUROWS; j++) {
|
||||
CMenuScreenCustom::CMenuEntry &option = aScreens[i].m_aEntries[j];
|
||||
if (option.m_Action == MENUACTION_NOTHING)
|
||||
break;
|
||||
|
||||
if (option.m_Action < MENUACTION_NOTHING && option.m_CFO->save) {
|
||||
if (atoi(cfg.get("FrontendOptions", option.m_CFO->save, "xxx").c_str()) != *option.m_CFO->value) { // if .ini doesn't have that key compare with xxx, so we can add it
|
||||
changed = true;
|
||||
sprintf(temp, "%u", *option.m_CFO->value);
|
||||
cfg.set("FrontendOptions", option.m_CFO->save, temp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -888,9 +555,6 @@ DebugMenuPopulate(void)
|
|||
DebugMenuAddCmd("Debug", "Catalina Fly Away", CHeli::MakeCatalinaHeliFlyAway);
|
||||
DebugMenuAddVarBool8("Debug", "Script Heli On", &CHeli::ScriptHeliOn, nil);
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
DebugMenuAddCmd("Debug", "Reload custom frontend options", ReloadFrontendOptions);
|
||||
#endif
|
||||
DebugMenuAddVarBool8("Debug", "Toggle popping heads on headshot", &CPed::bPopHeadsOnHeadshot, nil);
|
||||
DebugMenuAddCmd("Debug", "Start Credits", CCredits::Start);
|
||||
DebugMenuAddCmd("Debug", "Stop Credits", CCredits::Stop);
|
||||
|
|
|
@ -1,20 +1,14 @@
|
|||
#include "common.h"
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
#include "frontendoption.h"
|
||||
#include "Frontend.h"
|
||||
#include "Text.h"
|
||||
|
||||
int numCustomFrontendOptions = 0;
|
||||
FrontendOption *customFrontendOptions;
|
||||
|
||||
int numCustomFrontendScreens = 0;
|
||||
FrontendScreen* customFrontendScreens;
|
||||
|
||||
int numFrontendOptionReplacements = 0;
|
||||
CMenuScreen::CMenuEntry* frontendOptionReplacements;
|
||||
|
||||
int lastOgScreen = MENUPAGES; // means no new pages
|
||||
|
||||
int numCustomFrontendOptions = 0;
|
||||
int numCustomFrontendScreens = 0;
|
||||
|
||||
int optionCursor = -2;
|
||||
int currentMenu;
|
||||
bool optionOverwrite = false;
|
||||
|
@ -32,8 +26,7 @@ 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];
|
||||
int option = FrontEndMenuManager.GetPreviousPageOption();
|
||||
|
||||
FrontEndMenuManager.ThingsToDoBeforeGoingBack();
|
||||
|
||||
|
@ -58,7 +51,7 @@ GetLastMenuScreen()
|
|||
{
|
||||
int8 page = -1;
|
||||
for (int i = 0; i < MENUPAGES; i++) {
|
||||
if (strcmp(aScreens[i].m_ScreenName, "") == 0 && aScreens[i].unk == 0)
|
||||
if (strcmp(aScreens[i].m_ScreenName, "") == 0 && aScreens[i].m_PreviousPage[0] == MENUPAGE_NONE)
|
||||
break;
|
||||
|
||||
++page;
|
||||
|
@ -66,89 +59,23 @@ GetLastMenuScreen()
|
|||
return page;
|
||||
}
|
||||
|
||||
// Used before populating options, but effective in InitialiseChangedLanguageSettings and debugmenu
|
||||
void
|
||||
RemoveCustomFrontendOptions()
|
||||
{
|
||||
if (numCustomFrontendOptions != 0) {
|
||||
|
||||
for (int i = 0; i < MENUPAGES; i++) {
|
||||
for (int j = 0; j < NUM_MENUROWS; j++) {
|
||||
if (aScreens[i].m_aEntries[j].m_SaveSlot == SAVESLOT_CFO) {
|
||||
int ogOptionId = customFrontendOptions[aScreens[i].m_aEntries[j].m_TargetMenu].ogOptionId;
|
||||
|
||||
if (customFrontendOptions[aScreens[i].m_aEntries[j].m_TargetMenu].type == FEOPTION_SELECT)
|
||||
free(customFrontendOptions[aScreens[i].m_aEntries[j].m_TargetMenu].rightTexts);
|
||||
|
||||
if (ogOptionId == -1) {
|
||||
int k;
|
||||
for (k = j; k < NUM_MENUROWS - 1; k++) {
|
||||
memcpy(&aScreens[i].m_aEntries[k], &aScreens[i].m_aEntries[k + 1], sizeof(CMenuScreen::CMenuEntry));
|
||||
}
|
||||
aScreens[i].m_aEntries[k].m_Action = MENUACTION_NOTHING;
|
||||
aScreens[i].m_aEntries[k].m_SaveSlot = SAVESLOT_NONE;
|
||||
aScreens[i].m_aEntries[k].m_EntryName[0] = '\0';
|
||||
j--;
|
||||
} else {
|
||||
memcpy(&aScreens[i].m_aEntries[j], &frontendOptionReplacements[ogOptionId], sizeof(CMenuScreen::CMenuEntry));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
free(customFrontendOptions);
|
||||
numCustomFrontendOptions = 0;
|
||||
|
||||
if (numFrontendOptionReplacements != 0) {
|
||||
free(frontendOptionReplacements);
|
||||
numFrontendOptionReplacements = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (numCustomFrontendScreens == 0)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < MENUPAGES; i++) {
|
||||
if (i > lastOgScreen) {
|
||||
aScreens[i].m_ScreenName[0] = '\0';
|
||||
aScreens[i].unk = 0;
|
||||
}
|
||||
}
|
||||
free(customFrontendScreens);
|
||||
numCustomFrontendScreens = 0;
|
||||
lastOgScreen = MENUPAGES;
|
||||
}
|
||||
|
||||
int8 RegisterNewScreen(const char *name, int prevPage)
|
||||
int8 RegisterNewScreen(const char *name, int prevPage, ReturnPrevPageFunc returnPrevPageFunc)
|
||||
{
|
||||
if (lastOgScreen == MENUPAGES)
|
||||
lastOgScreen = GetLastMenuScreen();
|
||||
|
||||
numCustomFrontendScreens++;
|
||||
if (numCustomFrontendScreens == 1)
|
||||
customFrontendScreens = (FrontendScreen*)malloc(5 * sizeof(FrontendScreen));
|
||||
else if (numCustomFrontendScreens % 5 == 1)
|
||||
customFrontendScreens = (FrontendScreen*)realloc(customFrontendScreens, (numCustomFrontendScreens + 4) * sizeof(FrontendScreen));
|
||||
|
||||
assert(customFrontendScreens != nil && "Custom frontend screens can't be allocated");
|
||||
|
||||
int id = lastOgScreen + numCustomFrontendScreens;
|
||||
assert(id < MENUPAGES && "No room for new custom frontend screens! Increase MENUPAGES");
|
||||
strncpy(aScreens[id].m_ScreenName, name, 8);
|
||||
aScreens[id].m_PreviousPage[0] = aScreens[id].m_PreviousPage[1] = prevPage;
|
||||
aScreens[id].unk = 1;
|
||||
aScreens[id].returnPrevPageFunc = returnPrevPageFunc;
|
||||
return id;
|
||||
}
|
||||
|
||||
int8 RegisterNewOption()
|
||||
{
|
||||
numCustomFrontendOptions++;
|
||||
if (numCustomFrontendOptions == 1)
|
||||
customFrontendOptions = (FrontendOption*)malloc(5 * sizeof(FrontendOption));
|
||||
else if (numCustomFrontendOptions % 5 == 1)
|
||||
customFrontendOptions = (FrontendOption*)realloc(customFrontendOptions, (numCustomFrontendOptions + 4) * sizeof(FrontendOption));
|
||||
|
||||
assert(customFrontendOptions != nil && "Custom frontend options can't be allocated");
|
||||
|
||||
uint8 numOptions = GetNumberOfMenuOptions(currentMenu);
|
||||
uint8 curIdx;
|
||||
if (optionCursor < 0) {
|
||||
|
@ -159,30 +86,11 @@ int8 RegisterNewOption()
|
|||
if (!optionOverwrite) {
|
||||
if (aScreens[currentMenu].m_aEntries[curIdx].m_Action != MENUACTION_NOTHING) {
|
||||
for (int i = numOptions - 1; i >= curIdx; i--) {
|
||||
memcpy(&aScreens[currentMenu].m_aEntries[i + 1], &aScreens[currentMenu].m_aEntries[i], sizeof(CMenuScreen::CMenuEntry));
|
||||
memcpy(&aScreens[currentMenu].m_aEntries[i + 1], &aScreens[currentMenu].m_aEntries[i], sizeof(CMenuScreenCustom::CMenuEntry));
|
||||
}
|
||||
}
|
||||
}
|
||||
optionCursor++;
|
||||
|
||||
if (optionOverwrite) {
|
||||
numFrontendOptionReplacements++;
|
||||
if (numFrontendOptionReplacements == 1)
|
||||
frontendOptionReplacements = (CMenuScreen::CMenuEntry*)malloc(5 * sizeof(CMenuScreen::CMenuEntry));
|
||||
else if (numFrontendOptionReplacements % 5 == 1)
|
||||
frontendOptionReplacements = (CMenuScreen::CMenuEntry*)realloc(frontendOptionReplacements, (numFrontendOptionReplacements + 4) * sizeof(CMenuScreen::CMenuEntry));
|
||||
|
||||
memcpy(&frontendOptionReplacements[numFrontendOptionReplacements - 1], &aScreens[currentMenu].m_aEntries[curIdx], sizeof(CMenuScreen::CMenuEntry));
|
||||
customFrontendOptions[numCustomFrontendOptions - 1].ogOptionId = numFrontendOptionReplacements - 1;
|
||||
} else {
|
||||
customFrontendOptions[numCustomFrontendOptions - 1].ogOptionId = -1;
|
||||
}
|
||||
customFrontendOptions[numCustomFrontendOptions - 1].screen = currentMenu;
|
||||
|
||||
aScreens[currentMenu].m_aEntries[curIdx].m_Action = MENUACTION_TRIGGERFUNC;
|
||||
aScreens[currentMenu].m_aEntries[curIdx].m_SaveSlot = SAVESLOT_CFO;
|
||||
aScreens[currentMenu].m_aEntries[curIdx].m_TargetMenu = numCustomFrontendOptions - 1;
|
||||
aScreens[currentMenu].m_aEntries[curIdx].m_EntryName[0] = 1; // just something to fool it
|
||||
return curIdx;
|
||||
}
|
||||
|
||||
|
@ -193,110 +101,78 @@ void FrontendOptionSetCursor(int screen, int8 option, bool overwrite)
|
|||
optionOverwrite = overwrite;
|
||||
}
|
||||
|
||||
void FrontendOptionAddBuiltinAction(const wchar* leftText, int action, ButtonPressFunc buttonPressFunc, ReturnPrevPageFunc returnPrevPageFunc) {
|
||||
void FrontendOptionAddBuiltinAction(const char* gxtKey, int action, int targetMenu, int saveSlot) {
|
||||
int8 screenOptionOrder = RegisterNewOption();
|
||||
|
||||
FrontendOption& option = customFrontendOptions[numCustomFrontendOptions - 1];
|
||||
CMenuScreenCustom::CMenuEntry &option = aScreens[currentMenu].m_aEntries[screenOptionOrder];
|
||||
|
||||
// To fool the Frontend, we will still display the text passed via first param.
|
||||
// We can't use custom text on those :shrug:
|
||||
switch (action) {
|
||||
case MENUACTION_SCREENRES:
|
||||
strcpy(aScreens[currentMenu].m_aEntries[screenOptionOrder].m_EntryName, "FED_RES");
|
||||
strcpy(option.m_EntryName, "FED_RES");
|
||||
break;
|
||||
case MENUACTION_AUDIOHW:
|
||||
strcpy(aScreens[currentMenu].m_aEntries[screenOptionOrder].m_EntryName, "FEA_3DH");
|
||||
strcpy(option.m_EntryName, "FEA_3DH");
|
||||
break;
|
||||
default:
|
||||
strncpy(option.m_EntryName, gxtKey, 8);
|
||||
break;
|
||||
}
|
||||
aScreens[currentMenu].m_aEntries[screenOptionOrder].m_Action = action;
|
||||
option.type = FEOPTION_BUILTIN_ACTION;
|
||||
option.buttonPressFunc = buttonPressFunc;
|
||||
TextCopy(option.leftText, leftText);
|
||||
option.screenOptionOrder = screenOptionOrder;
|
||||
option.returnPrevPageFunc = returnPrevPageFunc;
|
||||
option.save = nil;
|
||||
option.m_Action = action;
|
||||
option.m_SaveSlot = saveSlot;
|
||||
option.m_TargetMenu = targetMenu;
|
||||
}
|
||||
|
||||
void FrontendOptionAddSelect(const wchar* leftText, const wchar** rightTexts, int8 numRightTexts, int8 *var, bool onlyApplyOnEnter, ChangeFunc changeFunc, ReturnPrevPageFunc returnPrevPageFunc, const char* saveName)
|
||||
void FrontendOptionAddSelect(const char* gxtKey, const char** rightTexts, int8 numRightTexts, int8 *var, bool onlyApplyOnEnter, ChangeFunc changeFunc, const char* saveName)
|
||||
{
|
||||
int8 screenOptionOrder = RegisterNewOption();
|
||||
|
||||
CMenuScreenCustom::CMenuEntry &option = aScreens[currentMenu].m_aEntries[screenOptionOrder];
|
||||
option.m_Action = MENUACTION_CFO_SELECT;
|
||||
strncpy(option.m_EntryName, gxtKey, 8);
|
||||
option.m_CFOSelect = new CCFOSelect();
|
||||
option.m_CFOSelect->rightTexts = (char**)malloc(numRightTexts * sizeof(char*));
|
||||
memcpy(option.m_CFOSelect->rightTexts, rightTexts, numRightTexts * sizeof(char*));
|
||||
option.m_CFOSelect->numRightTexts = numRightTexts;
|
||||
option.m_CFOSelect->value = var;
|
||||
if (var) {
|
||||
option.m_CFOSelect->displayedValue = *var;
|
||||
option.m_CFOSelect->lastSavedValue = *var;
|
||||
}
|
||||
option.m_CFOSelect->save = saveName;
|
||||
option.m_CFOSelect->onlyApplyOnEnter = onlyApplyOnEnter;
|
||||
option.m_CFOSelect->changeFunc = changeFunc;
|
||||
}
|
||||
|
||||
void FrontendOptionAddDynamic(const char* gxtKey, DrawFunc drawFunc, int8 *var, ButtonPressFunc buttonPressFunc, const char* saveName)
|
||||
{
|
||||
int8 screenOptionOrder = RegisterNewOption();
|
||||
|
||||
FrontendOption& option = customFrontendOptions[numCustomFrontendOptions - 1];
|
||||
option.type = FEOPTION_SELECT;
|
||||
TextCopy(option.leftText, leftText);
|
||||
option.rightTexts = (wchar**)malloc(numRightTexts * sizeof(wchar*));
|
||||
memcpy(option.rightTexts, rightTexts, numRightTexts * sizeof(wchar*));
|
||||
option.numRightTexts = numRightTexts;
|
||||
option.value = var;
|
||||
option.displayedValue = *var;
|
||||
option.lastSavedValue = *var;
|
||||
option.save = saveName;
|
||||
option.onlyApplyOnEnter = onlyApplyOnEnter;
|
||||
option.changeFunc = changeFunc;
|
||||
option.screenOptionOrder = screenOptionOrder;
|
||||
option.returnPrevPageFunc = returnPrevPageFunc;
|
||||
}
|
||||
|
||||
void FrontendOptionAddDynamic(const wchar* leftText, DrawFunc drawFunc, int8 *var, ButtonPressFunc buttonPressFunc, ReturnPrevPageFunc returnPrevPageFunc, const char* saveName)
|
||||
{
|
||||
int8 screenOptionOrder = RegisterNewOption();
|
||||
|
||||
FrontendOption& option = customFrontendOptions[numCustomFrontendOptions - 1];
|
||||
option.type = FEOPTION_DYNAMIC;
|
||||
option.drawFunc = drawFunc;
|
||||
option.buttonPressFunc = buttonPressFunc;
|
||||
TextCopy(option.leftText, leftText);
|
||||
option.value = var;
|
||||
option.save = saveName;
|
||||
option.screenOptionOrder = screenOptionOrder;
|
||||
option.returnPrevPageFunc = returnPrevPageFunc;
|
||||
}
|
||||
|
||||
void FrontendOptionAddRedirect(const wchar* text, int to, int8 selectedOption, bool fadeIn)
|
||||
{
|
||||
int8 screenOptionOrder = RegisterNewOption();
|
||||
|
||||
FrontendOption &option = customFrontendOptions[numCustomFrontendOptions - 1];
|
||||
option.type = FEOPTION_REDIRECT;
|
||||
option.to = to;
|
||||
option.option = selectedOption;
|
||||
option.fadeIn = fadeIn;
|
||||
TextCopy(option.leftText, text);
|
||||
option.screenOptionOrder = screenOptionOrder;
|
||||
option.returnPrevPageFunc = nil;
|
||||
option.save = nil;
|
||||
}
|
||||
|
||||
void FrontendOptionAddBackButton(const wchar* text, bool fadeIn)
|
||||
{
|
||||
int8 screenOptionOrder = RegisterNewOption();
|
||||
|
||||
FrontendOption& option = customFrontendOptions[numCustomFrontendOptions - 1];
|
||||
option.type = FEOPTION_GOBACK;
|
||||
option.fadeIn = fadeIn;
|
||||
TextCopy(option.leftText, text);
|
||||
option.screenOptionOrder = screenOptionOrder;
|
||||
option.returnPrevPageFunc = nil;
|
||||
option.save = nil;
|
||||
CMenuScreenCustom::CMenuEntry &option = aScreens[currentMenu].m_aEntries[screenOptionOrder];
|
||||
option.m_Action = MENUACTION_CFO_DYNAMIC;
|
||||
strncpy(option.m_EntryName, gxtKey, 8);
|
||||
option.m_CFODynamic = new CCFODynamic();
|
||||
option.m_CFODynamic->drawFunc = drawFunc;
|
||||
option.m_CFODynamic->buttonPressFunc = buttonPressFunc;
|
||||
option.m_CFODynamic->value = var;
|
||||
option.m_CFODynamic->save = saveName;
|
||||
}
|
||||
|
||||
uint8 FrontendScreenAdd(const char* gxtKey, eMenuSprites sprite, int prevPage, int columnWidth, int headerHeight, int lineHeight,
|
||||
int8 font, float fontScaleX, float fontScaleY, int8 alignment, bool showLeftRightHelper, ReturnPrevPageFunc returnPrevPageFunc) {
|
||||
|
||||
uint8 screenOrder = RegisterNewScreen(gxtKey, prevPage);
|
||||
uint8 screenOrder = RegisterNewScreen(gxtKey, prevPage, returnPrevPageFunc);
|
||||
|
||||
FrontendScreen &screen = customFrontendScreens[numCustomFrontendScreens - 1];
|
||||
screen.id = screenOrder;
|
||||
screen.sprite = sprite;
|
||||
screen.prevPage = prevPage;
|
||||
strncpy(screen.name, gxtKey, 8);
|
||||
screen.columnWidth = columnWidth;
|
||||
screen.headerHeight = headerHeight;
|
||||
screen.lineHeight = lineHeight;
|
||||
screen.font = font;
|
||||
screen.fontScaleX = fontScaleX;
|
||||
screen.fontScaleY = fontScaleY;
|
||||
screen.alignment = alignment;
|
||||
screen.returnPrevPageFunc = returnPrevPageFunc;
|
||||
CCustomScreenLayout *screen = new CCustomScreenLayout();
|
||||
aScreens[screenOrder].layout = screen;
|
||||
screen->sprite = sprite;
|
||||
screen->columnWidth = columnWidth;
|
||||
screen->headerHeight = headerHeight;
|
||||
screen->lineHeight = lineHeight;
|
||||
screen->font = font;
|
||||
screen->fontScaleX = fontScaleX;
|
||||
screen->fontScaleY = fontScaleY;
|
||||
screen->alignment = alignment;
|
||||
|
||||
return screenOrder;
|
||||
}
|
||||
|
|
|
@ -2,47 +2,23 @@
|
|||
#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.
|
||||
|
||||
// About texts:
|
||||
// All text parameters accept wchar(including hardcoded wchar* and TheText.Get)
|
||||
// except FrontendScreenAdd(it's char[8] GXT key by the design of Frontend).
|
||||
// All texts reload if custom options reloaded too, which includes language changes and via live reload feature in debug menu!
|
||||
|
||||
// Execute direction:
|
||||
// All of the calls below eventually manipulate the aScreens array, so keep in mind to add/replace options in order,
|
||||
// i.e. don't set cursor to 8 first and then 3.
|
||||
|
||||
// Live reload:
|
||||
// You can add/change/undo the new options in-game if you use VS. Change what you want, build the changed bits via "Edit and Continue",
|
||||
// and hit the "Reload custom frontend options" from debug menu. Or call CustomFrontendOptionsPopulate() from somewhere else.
|
||||
|
||||
// ! There are 2 ways to use CFO,
|
||||
// 1st; by adding a new option to the array in MenuScreensCustom.cpp and passing attributes/CBs to it
|
||||
// 2nd; by calling the functions listed at the bottom of this file.
|
||||
|
||||
// -- Option types
|
||||
//
|
||||
// Static/select: You allocate the variable, pass it to function and game sets it from user input among the strings given to function,
|
||||
// then you can handle ChangeFunc(only called on enter if onlyApplyOnEnter set, or set immediately)
|
||||
// and ReturnPrevPageFunc optionally. You can store the option in an INI file if you pass the key(as a char array) to corresponding parameter.
|
||||
// optionally you can add post-change event via ChangeFunc(only called on enter if onlyApplyOnEnter set, or set immediately)
|
||||
// You can store the option in an INI file if you pass the key(as a char array) to corresponding parameter.
|
||||
//
|
||||
// Dynamic: Passing variable to function is only needed if you want to store it, otherwise you should do
|
||||
// all the operations with ButtonPressFunc, this includes allocating the variable.
|
||||
// Left-side text is passed while creating and static, but ofc right-side text is dynamic -
|
||||
// you should return it in DrawFunc, which is called on every draw. ReturnPrevPageFunc is also here if needed.
|
||||
//
|
||||
// Redirect: Redirection to another screen. selectedOption parameter is the highlighted option user will see after the redirection.
|
||||
// you should return it in DrawFunc, which is called on every draw.
|
||||
//
|
||||
// Built-in action: As the name suggests, any action that game has built-in. But as an extra you can set the option text,
|
||||
// and can be informed on button press/focus loss via buttonPressFunc. ReturnPrevPageFunc is also here.
|
||||
|
||||
#define FEOPTION_SELECT 0
|
||||
#define FEOPTION_DYNAMIC 1
|
||||
#define FEOPTION_REDIRECT 2
|
||||
#define FEOPTION_GOBACK 3
|
||||
#define FEOPTION_BUILTIN_ACTION 4
|
||||
|
||||
// -- Returned via ButtonPressFunc() action param.
|
||||
#define FEOPTION_ACTION_LEFT 0
|
||||
|
@ -61,7 +37,7 @@
|
|||
typedef void (*ReturnPrevPageFunc)();
|
||||
|
||||
// for static options
|
||||
typedef void (*ChangeFunc)(int8 displayedValue); // called before updating the value.
|
||||
typedef void (*ChangeFunc)(int8 before, int8 after); // called after updating the value.
|
||||
// only called on enter if onlyApplyOnEnter set, otherwise called on every value change
|
||||
|
||||
// for dynamic options
|
||||
|
@ -69,71 +45,11 @@ typedef wchar* (*DrawFunc)(bool* disabled, bool userHovering); // you must retur
|
|||
// you can also set *disabled if you want to gray it out.
|
||||
typedef void (*ButtonPressFunc)(int8 action); // see FEOPTION_ACTIONs above
|
||||
|
||||
struct FrontendScreen
|
||||
{
|
||||
int id;
|
||||
char name[8];
|
||||
eMenuSprites sprite;
|
||||
int prevPage;
|
||||
int columnWidth;
|
||||
int headerHeight;
|
||||
int lineHeight;
|
||||
int8 font;
|
||||
float fontScaleX;
|
||||
float fontScaleY;
|
||||
int8 alignment;
|
||||
bool showLeftRightHelper;
|
||||
ReturnPrevPageFunc returnPrevPageFunc;
|
||||
};
|
||||
|
||||
struct FrontendOption
|
||||
{
|
||||
int8 type;
|
||||
int8 screenOptionOrder;
|
||||
int32 screen;
|
||||
wchar leftText[128];
|
||||
ReturnPrevPageFunc returnPrevPageFunc;
|
||||
int8* value;
|
||||
int8 displayedValue; // only if onlyApplyOnEnter enabled for now
|
||||
const char* save;
|
||||
int32 ogOptionId; // for replacements, see overwrite parameter of SetCursor
|
||||
|
||||
union {
|
||||
// Only for dynamic / built-in action
|
||||
struct {
|
||||
DrawFunc drawFunc;
|
||||
ButtonPressFunc buttonPressFunc;
|
||||
};
|
||||
|
||||
// Only for static/select
|
||||
struct {
|
||||
wchar** rightTexts;
|
||||
int8 numRightTexts;
|
||||
bool onlyApplyOnEnter;
|
||||
ChangeFunc changeFunc;
|
||||
int8 lastSavedValue; // only if onlyApplyOnEnter enabled
|
||||
};
|
||||
|
||||
// Only for redirect
|
||||
struct {
|
||||
int to;
|
||||
int8 option;
|
||||
bool fadeIn;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
// -- Internal things
|
||||
void RemoveCustomFrontendOptions();
|
||||
void CustomFrontendOptionsPopulate();
|
||||
|
||||
extern int lastOgScreen; // for reloading
|
||||
|
||||
extern int numCustomFrontendOptions;
|
||||
extern FrontendOption* customFrontendOptions;
|
||||
|
||||
extern int numCustomFrontendScreens;
|
||||
extern FrontendScreen* customFrontendScreens;
|
||||
|
||||
// -- To be used in ButtonPressFunc / ChangeFunc(this one would be weird):
|
||||
void ChangeScreen(int screen, int option = 0, bool fadeIn = true);
|
||||
|
@ -141,6 +57,21 @@ void GoBack(bool fadeIn = true);
|
|||
|
||||
uint8 GetNumberOfMenuOptions(int screen);
|
||||
|
||||
// !!! We're now moved to MenuScreensCustom.cpp, which houses an array that keeps all original+custom options.
|
||||
// But you can still use the APIs below, and manipulate aScreens while in game.
|
||||
|
||||
// Limits:
|
||||
// The code relies on that you won't use more then NUM_MENUROWS(18) options on one page, and won't exceed the MENUPAGES of pages.
|
||||
// Also congrats if you can make 18 options visible at once.
|
||||
|
||||
// Texts:
|
||||
// All text parameters accept char[8] GXT key.
|
||||
|
||||
// Execute direction:
|
||||
// All of the calls below eventually manipulate the aScreens array, so keep in mind to add/replace options in order,
|
||||
// i.e. don't set cursor to 8 first and then 3.
|
||||
|
||||
|
||||
// -- Placing the cursor to append/overwrite option
|
||||
//
|
||||
// Done via FrontendOptionSetCursor(screen, position, overwrite = false), parameters explained below:
|
||||
|
@ -152,11 +83,9 @@ uint8 GetNumberOfMenuOptions(int screen);
|
|||
void FrontendOptionSetCursor(int screen, int8 option, bool overwrite = false);
|
||||
|
||||
// var is optional in AddDynamic, enables you to save them in an INI file(also needs passing char array to saveName param. obv), otherwise pass nil/0
|
||||
void FrontendOptionAddBuiltinAction(const wchar* leftText, int action, ButtonPressFunc buttonPressFunc, ReturnPrevPageFunc returnPrevPageFunc);
|
||||
void FrontendOptionAddSelect(const wchar* leftText, const wchar** rightTexts, int8 numRightTexts, int8 *var, bool onlyApplyOnEnter, ChangeFunc changeFunc, ReturnPrevPageFunc returnPrevPageFunc, const char* saveName = nil);
|
||||
void FrontendOptionAddDynamic(const wchar* leftText, DrawFunc rightTextDrawFunc, int8 *var, ButtonPressFunc buttonPressFunc, ReturnPrevPageFunc returnPrevPageFunc, const char* saveName = nil);
|
||||
void FrontendOptionAddRedirect(const wchar* text, int to, int8 selectedOption = 0, bool fadeIn = true);
|
||||
void FrontendOptionAddBackButton(const wchar* text, bool fadeIn = true);
|
||||
void FrontendOptionAddBuiltinAction(const char* gxtKey, int action, int targetMenu = MENUPAGE_NONE, int saveSlot = SAVESLOT_NONE);
|
||||
void FrontendOptionAddSelect(const char* gxtKey, const char** rightTexts, int8 numRightTexts, int8 *var, bool onlyApplyOnEnter, ChangeFunc changeFunc, const char* saveName = nil);
|
||||
void FrontendOptionAddDynamic(const char* gxtKey, DrawFunc rightTextDrawFunc, int8 *var, ButtonPressFunc buttonPressFunc, const char* saveName = nil);
|
||||
|
||||
uint8 FrontendScreenAdd(const char* gxtKey, eMenuSprites sprite, int prevPage, int columnWidth, int headerHeight, int lineHeight, int8 font, float fontScaleX, float fontScaleY, int8 alignment, bool showLeftRightHelper, ReturnPrevPageFunc returnPrevPageFunc = nil);
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue