* Saving and loading normal save file isn't as smooth, the dmod data simply isn't in the file, unlike quicksave data. It just adds the exact file uploaded, so having the correct filename matters. (it will strip out the " (1)" at the end though if needed, chrome adds that if a file already exists during a download) * Added Dan's fixed fire graphic on the main menu (ipad size), fixes an animation problem I never noticed before! * Fixed the click to open URL issues (they have to be done on a mouse down, not a mouse up, to get around browser security) * Cleaned up the About screen a bit, made dink network URL first, removed the rtsoft forum URL. Added "and includes additional contributions from Dan Walma." to the HD credits part * Updated FMOD, was able to remove the PRECISE_F32=2 which should improve performance a bit * FPS now locked at 60 fps * Some fixes for playing on mobile, not done git-svn-id: svn://rtsoft.com/rtsvn/projects/RTDink@1630 353e56fe-9613-0410-8469-b96ad8e6f29c
269 lines
11 KiB
C++
269 lines
11 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");
|
|
|
|
if (pDarken)
|
|
{
|
|
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
|
|
|
|
if (!url.empty())
|
|
{
|
|
SetButtonStyleEntity(pLabel, Button2DComponent::BUTTON_STYLE_CLICK_ON_TOUCH); //to get around HTML5 rules on uploading, required because it's only
|
|
}
|
|
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
|
|
|
|
if (!url.empty())
|
|
{
|
|
SetButtonStyleEntity(pLabel, Button2DComponent::BUTTON_STYLE_CLICK_ON_TOUCH); //to get around HTML5 rules on uploading, required because it's only
|
|
}
|
|
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
|
|
|
|
if (!url.empty())
|
|
{
|
|
SetButtonStyleEntity(pLabel, Button2DComponent::BUTTON_STYLE_CLICK_ON_TOUCH); //to get around HTML5 rules on uploading, required because it's only
|
|
}
|
|
FadeInEntity(pButton, true, 300, 450);
|
|
}
|
|
}
|
|
|
|
//GetEntityRoot()->PrintTreeAsText(); //useful for debugging
|
|
}
|