DinkSmallwoodHD/source/GUI/PauseMenu.cpp
seth e0b2d2e5f0 * Some stuff with changing the Dink HD menu key to F1 from Shift-Escape
* Added Dan's .png loading patch (untested)

git-svn-id: svn://rtsoft.com/rtsvn/projects/RTDink@1522 353e56fe-9613-0410-8469-b96ad8e6f29c
2017-10-17 04:33:21 +00:00

429 lines
13 KiB
C++

#include "PlatformPrecomp.h"
#include "PauseMenu.h"
#include "Entity/EntityUtils.h"
#include "dink/dink.h"
#include "MainMenu.h"
#include "DebugMenu.h"
#include "GameMenu.h"
#include "DMODMenu.h"
#include "OptionsMenu.h"
#include "PopUpMenu.h"
#include "Entity/SelectButtonWithCustomInputComponent.h"
void PlayMenuMusic()
{
GetAudioManager()->Play("dink/sound/3.ogg", true, true, true);
}
Entity * DinkQuitGame()
{
SetDinkGameState(DINK_GAME_STATE_NOT_PLAYING);
Entity *pMenu = GetEntityRoot()->GetEntityByName("GameMenu");
assert(pMenu);
if (!pMenu) return NULL;
GetBaseApp()->SetGameTickPause(false);
//AddFocusIfNeeded(pMenu);
SlideScreen(pMenu, false);
GetMessageManager()->CallEntityFunction(pMenu, 500, "OnDelete", NULL);
Entity *pFinalMenu = NULL;
if (g_dglo.m_dmodGameDir.empty())
{
pFinalMenu = MainMenuCreate(pMenu->GetParent(), true);
} else
{
pFinalMenu = DMODMenuCreate(pMenu->GetParent(), true);
}
PlayMenuMusic();
return pFinalMenu;
}
Entity * DinkRestartGame()
{
SetDinkGameState(DINK_GAME_STATE_NOT_PLAYING);
Entity *pMenu = GetEntityRoot()->GetEntityByName("GameMenu");
assert(pMenu);
if (!pMenu) return NULL;
GetBaseApp()->SetGameTickPause(false);
AddFocusIfNeeded(pMenu);
string dmodDirAndPath = RemoveTrailingBackslash(g_dglo.m_dmodGamePathWithDir);
LogMsg("Restarting dmod %s", dmodDirAndPath.c_str());
InitDinkPaths(GetBaseAppPath(), "dink", dmodDirAndPath);
//SlideScreen(pMenu, false);
GetMessageManager()->CallEntityFunction(pMenu, 500, "OnDelete", NULL);
Entity *pFinalMenu = NULL;
GameCreate(pMenu->GetParent(), 0, "", "Restarting...");
/*
if (g_dglo.m_dmodGameDir.empty())
{
pFinalMenu = MainMenuCreate(pMenu->GetParent(), true);
} else
{
pFinalMenu = DMODMenuCreate(pMenu->GetParent(), true);
}
PlayMenuMusic();
*/
return pFinalMenu;
}
void PauseEnd(Entity *pMenu)
{
//slide it off the screen and then kill the whole menu tree
RemoveFocusIfNeeded(pMenu);
DisableAllButtonsEntity(pMenu);
//SlideScreen(pEntClicked->GetParent(), false);
AddFocusIfNeeded(pMenu->GetParent());
FadeOutEntity(pMenu, true, 499);
GetMessageManager()->CallEntityFunction(pMenu, 500, "OnDelete", NULL);
GetBaseApp()->SetGameTickPause(false);
}
void PrepareForPopup(Entity *pMainMenuEnt, VariantList *pVList)
{
SendFakeInputMessageToEntity(GetEntityRoot(), MESSAGE_TYPE_GUI_CLICK_END, pVList->m_variant[0].GetVector2()); //otherwise the menu may never get the touch release message
pMainMenuEnt->RemoveComponentByName("FocusInput");
pMainMenuEnt->RemoveComponentByName("FocusUpdate");
GetMessageManager()->RemoveComponentByName(pMainMenuEnt, 500, "FocusRender");
}
void UpdatePauseButtons(Entity *pMenu)
{
Entity *pEnt = pMenu->GetEntityByName("QuickLoad");
if (!pEnt)
{
assert(0);
return;
}
unsigned int color = MAKE_RGBA(255,255,255,255);
if (!FileExists(DinkGetSavePath()+"quicksave.dat"))
{
//we'll, let's make it look not highlighted
color = MAKE_RGBA(255,255,255,100);
}
MorphToColorEntity(pEnt, false, 500, color, 0);
}
void PauseMenuOnSelect(VariantList *pVList) //0=vec2 point of click, 1=entity sent from
{
Entity *pEntClicked = pVList->m_variant[1].GetEntity();
LogMsg("Clicked %s entity", pEntClicked->GetName().c_str());
Entity *pMenu = GetEntityRoot()->GetEntityByName("PauseMenu");
if (pEntClicked->GetName() == "Back")
{
GetAudioManager()->Play("audio/pause_close.wav");
PauseEnd(pMenu);
}
if (pEntClicked->GetName() == "OldOptions")
{
PauseEnd(pMenu);
g_dglo.m_dirInput[DINK_INPUT_BUTTON5] = true;
g_dglo.m_dirInputFinished[DINK_INPUT_BUTTON5] = true;
}
if (pEntClicked->GetName() == "Map")
{
PauseEnd(pMenu);
g_dglo.m_dirInput[DINK_INPUT_BUTTON6] = true;
g_dglo.m_dirInputFinished[DINK_INPUT_BUTTON6] = true;
}
if (pEntClicked->GetName() == "Keyboard")
{
PauseEnd(pMenu);
g_dglo.m_bFullKeyboardActive = true;
}
if (pEntClicked->GetName() == "Quit")
{
//slide it off the screen and then kill the whole menu tree
RemoveFocusIfNeeded(pMenu);
SaveState(g_dglo.m_savePath+"continue_state.dat");
WriteLastPathSaved("");
//kill our state.dat if it existed, not needed now, this can exist if an iphone goes into suspend, but then is resumed
RemoveFile(GetSavePath()+"state.dat", false);
//SlideScreen(pEntClicked->GetParent()->GetParent(), false);
DinkQuitGame();
}
if (pEntClicked->GetName() == "Debug")
{
//overlay the debug menu over this one
pMenu->RemoveComponentByName("FocusInput");
DebugMenuCreate(pMenu);
}
if (pEntClicked->GetName() == "Options")
{
//overlay the debug menu over this one
PrepareForPopup(pMenu, pVList);
OptionsMenuCreate(pMenu);
}
if (pEntClicked->GetName() == "empty_cache")
{
DinkUnloadGraphicsCache();
LogMsg("Cache emptied");
}
if (pEntClicked->GetName() == "QuickSave")
{
SaveStateWithExtra();
UpdatePauseButtons(pMenu);
PauseEnd(pMenu);
}
if (pEntClicked->GetName() == "QuickLoad")
{
LogMsg("loading state");
string fName = DinkGetSavePath()+"quicksave.dat";
if (FileExists(fName))
{
bool bSuccess = LoadState(fName, true);
if (!bSuccess)
{
RemoveFile(fName, false);
GetAudioManager()->Play("audio/buzzer2.wav");
PopUpCreate(pMenu, "Error loading save state. Probably an older version, sorry.", "", "cancel", "Continue", "", "", true);
} else
{
LoadStateWithExtra();
PauseEnd(pMenu);
}
} else
{
//disabled, play buzzer sound
GetAudioManager()->Play("audio/buzzer2.wav");
}
UpdatePauseButtons(pMenu);
}
//GetEntityRoot()->PrintTreeAsText(); //useful for Pause
}
void OnPauseArcadeInput(VariantList *pVList)
{
int vKey = pVList->Get(0).GetUINT32();
bool bIsDown = pVList->Get(1).GetUINT32() != 0;
//LogMsg("GameMenuArcade: Key %d, down is %d", vKey, int(bIsDown));
Entity *pQuickSaveEnt = GetEntityRoot()->GetEntityByName("QuickSave");
Entity *pQuickLoadEnt = GetEntityRoot()->GetEntityByName("QuickLoad");
if (!EntityHasInputFocus(GetEntityRoot()->GetEntityByName("PauseMenu")))
{
return;
}
if (!bIsDown)
{
switch (vKey)
{
case VIRTUAL_KEY_DIR_LEFT:
BobEntityStop(pQuickSaveEnt);
break;
case VIRTUAL_KEY_DIR_RIGHT:
BobEntityStop(pQuickLoadEnt);
break;
}
}
int bobAmount =iPadMapY(40);
int bobCycleMS = 300;
if (bIsDown)
{
switch (vKey)
{
case VIRTUAL_KEY_DIR_LEFT:
BobEntity(pQuickSaveEnt, bobAmount, 0, bobCycleMS);
break;
case VIRTUAL_KEY_DIR_RIGHT:
BobEntity(pQuickLoadEnt, bobAmount, 0, bobCycleMS);
break;
case VIRTUAL_KEY_GAME_FIRE:
case VIRTUAL_KEY_GAME_INVENTORY:
case VIRTUAL_KEY_GAME_TALK:
if ( IsEntityBobbing(pQuickSaveEnt) )
{
FakeClickAnEntity(pQuickSaveEnt);
} else if (IsEntityBobbing(pQuickLoadEnt) )
{
FakeClickAnEntity(pQuickLoadEnt);
} else
{
GetAudioManager()->Play("audio/buzzer2.wav");
}
break;
default: ;
}
}
}
Entity * PauseMenuCreate(Entity *pParentEnt)
{
//Entity *pBG = pParentEnt->AddEntity(new Entity("PauseMenu"));
Entity * pBG = CreateOverlayRectEntity(pParentEnt, CL_Vec2f(0,0), GetScreenSize(), MAKE_RGBA(0,0,0,140));
pBG->SetName("PauseMenu");
//so we can snag gamepad messages too:
GetBaseApp()->m_sig_arcade_input.connect(pBG->GetFunction("OnArcadeInput")->sig_function);
pBG->GetShared()->GetFunction("OnArcadeInput")->sig_function.connect(&OnPauseArcadeInput);
Entity * pBackdrop = CreateOverlayRectEntity(pBG, CL_Vec2f(0,0), CL_Vec2f(0,0), MAKE_RGBA(0,0,0,140));
Entity *pTextBG = pBG->AddEntity(new Entity("PauseTextBG"));
GetAudioManager()->Play("audio/pause_open.wav");
pBackdrop->GetVar("pos2d")->Set(GetScreenSize()/2);
pTextBG->GetVar("pos2d")->Set(GetScreenSize()/2+CL_Vec2f(0,iPhoneMapY(-30)));
GetBaseApp()->SetGameTickPause(true);
AddFocusIfNeeded(pBG, true);
KillControls();
g_dglo.m_bLastFullKeyboardActive = false;
Entity *pButtonEntity;
float x = 0;
float y = iPhoneMapX(-70);
float ySpacer = iPhoneMapY(40);
eFont fontID = FONT_SMALL;
float fontScale = 1;
pButtonEntity = CreateTextButtonEntity(pBG , "Debug", iPhoneMapX(440), iPhoneMapY(20), "Cheats", false);
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
pButtonEntity->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
//pButtonEntity->GetVar("color")->Set(MAKE_RGBA(0,0,0,0));
//quick save/load buttons first
pButtonEntity = CreateOverlayButtonEntity(pBG , "QuickSave", ReplaceWithLargeInFileName("interface/iphone/button_quicksave.rttex"), iPhoneMapX(85), GetScreenSizeYf()/2);
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
pButtonEntity->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
pButtonEntity = CreateOverlayButtonEntity(pBG , "QuickLoad", ReplaceWithLargeInFileName("interface/iphone/button_quickload.rttex"), iPhoneMapX(395), GetScreenSizeYf()/2);
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
pButtonEntity->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
UpdatePauseButtons(pBG);
pButtonEntity = CreateTextButtonEntity(pTextBG, "Map", x, y, "VIEW MAP", false); y += ySpacer;
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
pButtonEntity->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
SetupTextEntity(pButtonEntity, fontID, fontScale);
if (!DinkCanRunScriptNow())
{
pButtonEntity->GetVar("color")->Set(MAKE_RGBA(255,255,255,50));
}
pButtonEntity = CreateTextButtonEntity(pTextBG, "OldOptions", x, y, "DINK MENU", false); y += ySpacer;
pButtonEntity->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
pButtonEntity->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
SetupTextEntity(pButtonEntity, fontID, fontScale);
if (!DinkCanRunScriptNow())
{
pButtonEntity->GetVar("color")->Set(MAKE_RGBA(255,255,255,50));
}
if (GetApp()->GetUsingTouchScreen())
{
pButtonEntity = CreateTextButtonEntity(pTextBG, "Keyboard", x, y, "FULL KEYBOARD", false); y += ySpacer;
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
pButtonEntity->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
SetupTextEntity(pButtonEntity, fontID,fontScale);
}
pButtonEntity = CreateTextButtonEntity(pTextBG, "Quit", x, y, "QUIT", false); y += ySpacer;
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
pButtonEntity->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
SetupTextEntity(pButtonEntity, fontID, fontScale);
pButtonEntity = CreateTextButtonEntity(pTextBG, "Options", x, y, "OPTIONS", false); y += ySpacer;
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
pButtonEntity->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
SetupTextEntity(pButtonEntity, fontID,fontScale);
pButtonEntity = CreateTextButtonEntity(pTextBG, "Back", x, y, "CONTINUE", false); y += ySpacer;
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
pButtonEntity->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
SetupTextEntity(pButtonEntity, fontID, fontScale);
SetButtonClickSound(pButtonEntity, ""); //no sound
EntityComponent *pKeys = AddHotKeyToButton(pButtonEntity, VIRTUAL_KEY_BACK);
//work around problem of it instantly closing
pKeys->GetVar("disabled")->Set(uint32(1));
GetMessageManager()->SetComponentVariable(pKeys, 500, "disabled", uint32(0)); //enable it again
if (IsDesktop())
{
EntityComponent *pKeys = AddHotKeyToButton(pButtonEntity, VIRTUAL_KEY_F1);
//work around problem of it instantly closing
pKeys->GetVar("disabled")->Set(uint32(1));
GetMessageManager()->SetComponentVariable(pKeys, 500, "disabled", uint32(0)); //enable it again
}
/*
pKeys = AddHotKeyToButton(pButtonEntity, VIRTUAL_KEY_PROPERTIES);
//work around problem of it instantly closing
pKeys->GetVar("disabled")->Set(uint32(1));
GetMessageManager()->SetComponentVariable(pKeys, 1, "disabled", uint32(0)); //enable it again
*/
CL_Rectf size = MeasureEntityAndChildren(pTextBG);
size.expand(iPhoneMapY(27));
pBackdrop->GetVar("size2d")->Set(CL_Vec2f(size.get_width(), size.get_height()));
pBackdrop->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
FadeInEntity(pBG, true, 450);
return pBG;
}