git-svn-id: svn://rtsoft.com/rtsvn/projects/RTDink@1469 353e56fe-9613-0410-8469-b96ad8e6f29c
251 lines
9.7 KiB
C++
251 lines
9.7 KiB
C++
#include "PlatformPrecomp.h"
|
|
#include "PopUpMenu.h"
|
|
#include "Entity/EntityUtils.h"
|
|
#include "App.h"
|
|
|
|
Entity * PopUpRestoreFocusToOriginalMenu(Entity *pEntClicked)
|
|
{
|
|
Entity *pFinishMenu = GetEntityRoot()->GetEntityByName(pEntClicked->GetParent()->GetParent()->GetVar("finishMenuName")->GetString());
|
|
assert(pFinishMenu);
|
|
|
|
if (pFinishMenu)
|
|
{
|
|
if (pEntClicked->GetParent()->GetParent()->GetVar("requireMoveMessages")->GetUINT32() == 1)
|
|
{
|
|
AddFocusIfNeeded(pFinishMenu, true, 0);
|
|
} else
|
|
{
|
|
pFinishMenu->AddComponent(new FocusInputComponent);
|
|
}
|
|
}
|
|
return pFinishMenu;
|
|
}
|
|
|
|
void ReloadMainMenu(VariantList *pVList);
|
|
|
|
//general purpose pop up menu, I've hardcoded various behaviors here, it knows what to do based on the button name
|
|
|
|
void PopUpMenuOnSelect(VariantList *pVList) //0=vec2 point of click, 1=entity sent from
|
|
{
|
|
Entity *pEntClicked = pVList->m_variant[1].GetEntity();
|
|
|
|
LogMsg("Clicked %s entity at %s", pEntClicked->GetName().c_str(),pVList->m_variant[1].Print().c_str());
|
|
|
|
FadeOutEntity(pEntClicked->GetParent()->GetParent(), true, 300);
|
|
GetMessageManager()->CallEntityFunction(pEntClicked->GetParent()->GetParent(), 500, "OnDelete", NULL);
|
|
DisableAllButtonsEntity(pEntClicked->GetParent()->GetParent());
|
|
Entity *pDarken = GetEntityRoot()->GetEntityByName("pop_up_darken");
|
|
|
|
FadeScreen(pDarken, 0, 0, 400, true);
|
|
KillEntity(pDarken, 400);
|
|
pDarken->SetName("");
|
|
|
|
//set the game pause state back to whatever it was originally
|
|
GetApp()->SetGameTickPause(pEntClicked->GetParent()->GetParent()->GetVar("gamePaused")->GetUINT32() != 0);
|
|
|
|
|
|
if (pEntClicked->GetName() == "url")
|
|
{
|
|
LogMsg("Launch url: %s", pEntClicked->GetVar("url")->GetString().c_str());
|
|
LaunchURL(pEntClicked->GetVar("url")->GetString());
|
|
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
|
} else if (pEntClicked->GetName() == "url_update")
|
|
{
|
|
LogMsg("Launch url: %s", pEntClicked->GetVar("url")->GetString().c_str());
|
|
LaunchURL(pEntClicked->GetVar("url")->GetString());
|
|
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
|
//kill current menu
|
|
//GetMessageManager()->CallEntityFunction(pFinishMenu, 200, "OnDelete", NULL);
|
|
|
|
PopUpCreate(pFinishMenu, "Please close the game and install the new version!", "", "cancel", "", "", "", true);
|
|
|
|
}
|
|
else
|
|
|
|
/*
|
|
if (pEntClicked->GetName() == "music_disable")
|
|
{
|
|
//add control back
|
|
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
|
|
|
GetApp()->GetShared()->GetVar("musicDisabled")->Set(uint32(1));
|
|
GetAudioManager()->SetMusicEnabled(false);
|
|
|
|
string msg = "Music disabled. You can re-enable it from the `wOptions`` menu later.";
|
|
PopUpCreate(pFinishMenu, msg, "", "cancel", "Continue", "", "", true);
|
|
GetAudioManager()->Play(GetApp()->GetMainMenuMusic(), true, true); //because music is disabled this won't play, but it will remember this if
|
|
//we enable music again so we still want it
|
|
|
|
} else
|
|
|
|
if (pEntClicked->GetName() == "music_on")
|
|
{
|
|
//add control back
|
|
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
|
GetAudioManager()->Play(GetApp()->GetMainMenuMusic(), true, true);
|
|
|
|
} else
|
|
|
|
if (pEntClicked->GetName() == "quit_game")
|
|
{
|
|
|
|
Entity *pGameMenu = GetEntityRoot()->GetEntityByName("GameMenu");
|
|
|
|
//GetApp()->SetGameType(GAME_TYPE_NONE);
|
|
//slide it off the screen and then kill the whole menu tree
|
|
SlideScreen(pGameMenu, false, 500, 10);
|
|
GetMessageManager()->CallEntityFunction(pGameMenu, 900, "OnDelete", NULL);
|
|
//SummaryMenuCreate(pGameMenu->GetParent());
|
|
GetBaseApp()->SetGameTickPause(false);
|
|
|
|
|
|
} else
|
|
*/
|
|
|
|
if (pEntClicked->GetName() == "cancel")
|
|
{
|
|
//add control back
|
|
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
|
}if (pEntClicked->GetName() == "cancel_update")
|
|
{
|
|
//add control back
|
|
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
|
//kill current menu
|
|
GetMessageManager()->CallEntityFunction(pFinishMenu, 100, "OnDelete", NULL);
|
|
|
|
VariantList vList(pFinishMenu->GetParent());
|
|
GetMessageManager()->CallStaticFunction(ReloadMainMenu, 200, &vList, TIMER_SYSTEM);
|
|
}
|
|
else
|
|
|
|
if (pEntClicked->GetName() == "reset")
|
|
{
|
|
//add control back
|
|
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
|
GetAudioManager()->Play("audio/tip_start.wav");
|
|
//GetHighScoreManager()->ResetLocalScores();
|
|
//belay that order, show another pop up...
|
|
PopUpCreate(pFinishMenu, "Local high scores have been reset.", "", "cancel", "Continue", "", "", true);
|
|
|
|
} else
|
|
{
|
|
//unhandled
|
|
Entity *pFinishMenu = PopUpRestoreFocusToOriginalMenu(pEntClicked);
|
|
|
|
//call this function on the original guy, just in case they want to do something with it
|
|
VariantList vList(pFinishMenu, pEntClicked->GetName());
|
|
pFinishMenu->GetFunction(pEntClicked->GetName())->sig_function(&vList);
|
|
|
|
}
|
|
|
|
GetEntityRoot()->PrintTreeAsText(); //useful for debugging
|
|
}
|
|
|
|
void PopUpCreate(Entity *pEnt, string msg, string url, string button1Action, string button1Label, string button2Action, string button2Label,
|
|
bool bRequireMoveMessages, string button3Action, string button3Label)
|
|
{
|
|
pEnt->RemoveComponentByName("FocusInput");
|
|
|
|
bool bGamePaused = GetBaseApp()->GetGameTickPause();
|
|
GetBaseApp()->SetGameTickPause(true);
|
|
// GetMessageManager()->RemoveComponentByName(pEnt, 201, "FocusInput"); //hack that works around a problem of pending FocusInput messages coming in
|
|
|
|
//remember where we should give focus to later
|
|
string parentName = pEnt->GetName();
|
|
assert(!parentName.empty());
|
|
|
|
//let's build our own menu right on the GUI branch of the tree
|
|
pEnt = GetEntityRoot()->GetEntityByName("GUI");
|
|
Entity *pDarken = pEnt->AddEntity(new Entity("pop_up_darken"));
|
|
pDarken->AddComponent(new FocusRenderComponent);
|
|
pDarken->AddComponent(new FocusUpdateComponent);
|
|
FadeScreen(pDarken, 0, 0.7, 400, false); //fade the whole GUI
|
|
|
|
//add our prompt
|
|
Entity *pBG = CreateOverlayEntity(pEnt, "pop_up", ReplaceWithLargeInFileName("interface/iphone/pop_up.rttex"), 0,0);
|
|
|
|
//Ok, at this point we can check the image dimensions and center it based on the bitmap size itself
|
|
pBG->GetVar("pos2d")->Set( (GetScreenSize()/2) - pBG->GetVar("size2d")->GetVector2()/2);
|
|
|
|
// pBG->AddComponent(new FocusInputComponent);
|
|
pBG->GetVar("finishMenuName")->Set(parentName);
|
|
|
|
if (bRequireMoveMessages)
|
|
{
|
|
pBG->GetVar("requireMoveMessages")->Set(uint32(1));
|
|
}
|
|
|
|
AddFocusIfNeeded(pBG);
|
|
CL_Vec2f vTextArea = pBG->GetVar("size2d")->GetVector2();
|
|
float padding = 30;
|
|
vTextArea.x -= iPhoneMapX2X(padding*2);
|
|
|
|
//add our msg and word wrap it
|
|
Entity *pText = CreateTextBoxEntity(pBG, "pop_up_text", (pBG->GetVar("size2d")->GetVector2()/2)+CL_Vec2f(0, iPhoneMapY2X(-17)), vTextArea, msg);
|
|
SetAlignmentEntity(pText, ALIGNMENT_CENTER);
|
|
float textHeight = pText->GetVar("size2d")->GetVector2().y;
|
|
|
|
FadeInEntity(pBG, true, 300);
|
|
|
|
//pText->GetVar("color")->Set(MAKE_RGBA(203,177,137,255));
|
|
|
|
pBG->GetVar("gamePaused")->Set(uint32(bGamePaused != 0)); //remember this for later
|
|
Entity *pButton = NULL;
|
|
CL_Vec2f vButtonSize;
|
|
Entity *pLabel;
|
|
Entity *pButton1, *pButton2;
|
|
|
|
float buttonHeight = iPhoneMapY2X(120);
|
|
if (textHeight > iPhoneMapY2X(50))
|
|
{
|
|
//well, we need more space for this much text. Move the buttons down a bit.
|
|
buttonHeight = iPhoneMapY2X(135);
|
|
}
|
|
//add the buttons
|
|
pButton = CreateOverlayEntity(pBG, "button1", ReplaceWithLargeInFileName("interface/iphone/pop_up_button.rttex"), iPhoneMapX2X(21), buttonHeight);
|
|
pButton1 = pButton;
|
|
vButtonSize = pButton->GetVar("size2d")->GetVector2();
|
|
//add the text label
|
|
pLabel = CreateTextButtonEntity(pButton, button1Action, vButtonSize.x/2, vButtonSize.y/2, "`w"+button1Label, false);
|
|
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
|
pLabel->GetFunction("OnButtonSelected")->sig_function.connect(&PopUpMenuOnSelect);
|
|
pLabel->GetVar("url")->Set(url); //just in case we want to know this later, store it in the button itself
|
|
FadeInEntity(pButton, true, 300, 250);
|
|
if (button2Label.empty())
|
|
{
|
|
//we only have one button? Fine, center it.
|
|
pButton->GetVar("pos2d")->Set(iPhoneMapX(88), buttonHeight);
|
|
} else
|
|
{
|
|
pButton = CreateOverlayEntity(pBG, "button2", ReplaceWithLargeInFileName("interface/iphone/pop_up_button.rttex"), iPhoneMapY2X(180), buttonHeight);
|
|
pButton2 = pButton;
|
|
vButtonSize = pButton->GetVar("size2d")->GetVector2();
|
|
//add the text label
|
|
pLabel = CreateTextButtonEntity(pButton, button2Action, vButtonSize.x/2, vButtonSize.y/2, "`w"+button2Label, false);
|
|
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
|
pLabel->GetFunction("OnButtonSelected")->sig_function.connect(&PopUpMenuOnSelect);
|
|
pLabel->GetVar("url")->Set(url); //just in case we want to know this later, store it in the button itself
|
|
FadeInEntity(pButton, true, 300, 350);
|
|
|
|
if (button3Label.empty())
|
|
{
|
|
//we only have two buttons? fine. Done then
|
|
} else
|
|
{
|
|
pButton1->GetVar("pos2d")->Set(iPhoneMapX2X(20), buttonHeight);
|
|
pButton2->GetVar("pos2d")->Set(iPhoneMapX2X(180), buttonHeight);
|
|
|
|
//move stuff around and add a third button
|
|
pButton = CreateOverlayEntity(pBG, "button2", ReplaceWithLargeInFileName("interface/iphone/pop_up_button.rttex"), iPhoneMapX2X(100), buttonHeight);
|
|
vButtonSize = pButton->GetVar("size2d")->GetVector2();
|
|
//add the text label
|
|
pLabel = CreateTextButtonEntity(pButton, button3Action, vButtonSize.x/2, vButtonSize.y/2, "`w"+button3Label, false);
|
|
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
|
pLabel->GetFunction("OnButtonSelected")->sig_function.connect(&PopUpMenuOnSelect);
|
|
pLabel->GetVar("url")->Set(url); //just in case we want to know this later, store it in the button itself
|
|
FadeInEntity(pButton, true, 300, 450);
|
|
}
|
|
}
|
|
|
|
GetEntityRoot()->PrintTreeAsText(); //useful for debugging
|
|
}
|