the active DMOD dir to the DMODs parent directory for that session. Automatic state autosave, save/continue and quicksave/quickload work as expected by saving data to its directory * (bugfix) Save states now properly load even if the DMOD directory has been cut and pasted to a new place * (bugfix) Full state saves now properly setup backgrounds with correct vision modifications instead of assuming it was 0 - Due to minor changes in the save state stuff, I've versioned it so the game will refuse to load old versions (as always, this doesn't affect the normal save files, just the full state saves HD does) * (DinkC) fill_screen works better and colors 0 and 255 are no longer sometimes reversed * (bugfix) M can now be used to turn off the map, previously it only worked to turn it on * (bugfix) Status bar no longer incorrectly draws over full screen bitmaps (like the map in Mystery Island) and is properly reconstructed in full save states git-svn-id: svn://rtsoft.com/rtsvn/projects/RTDink@1484 353e56fe-9613-0410-8469-b96ad8e6f29c
716 lines
No EOL
24 KiB
C++
716 lines
No EOL
24 KiB
C++
#include "PlatformPrecomp.h"
|
|
#include "MainMenu.h"
|
|
#include "Entity/EntityUtils.h"
|
|
#include "DebugMenu.h"
|
|
#include "GameMenu.h"
|
|
#include "LoadMenu.h"
|
|
#include "dink/dink.h"
|
|
#include "DMODMenu.h"
|
|
#include "PauseMenu.h"
|
|
#include "DMODInstallMenu.h"
|
|
#include "PopUpMenu.h"
|
|
#include "OptionsMenu.h"
|
|
#include "AboutMenu.h"
|
|
#include "FileSystem/StreamingInstance.h"
|
|
#include "Entity/CustomInputComponent.h"
|
|
#include "Entity/HTTPComponent.h"
|
|
|
|
bool g_bMainMenuFirstTime = true;
|
|
bool g_bDidVersionCheck = false;
|
|
|
|
Entity * VersionShowScoreMessage(Entity *pMenu, string msg);
|
|
void GetParsedDMODInfo(string dmodPath, string &nameOut, float versionOut, string ©right, string &dmodwebsite, string &description);
|
|
|
|
void ReloadMainMenu(VariantList *pVList)
|
|
{
|
|
MainMenuCreate(pVList->Get(0).GetEntity());
|
|
}
|
|
|
|
void OnVersionDownloadError(VariantList *pVList)
|
|
{
|
|
NetHTTP::eError e = (NetHTTP::eError)pVList->m_variant[1].GetUINT32();
|
|
|
|
string msg = "`4Unable to check for updates. (" + toString(e) + ")";
|
|
if (e == NetHTTP::ERROR_COMMUNICATION_TIMEOUT)
|
|
{
|
|
msg = "`4Unable to check for updates. (timed out)";
|
|
}
|
|
|
|
Entity *pMenu = pVList->m_variant[0].GetComponent()->GetParent();
|
|
|
|
VersionShowScoreMessage(pMenu, msg);
|
|
|
|
//kill current menu
|
|
GetMessageManager()->CallEntityFunction(pMenu, 1000, "OnDelete", NULL);
|
|
pMenu->SetName("MainMenuDelete");
|
|
|
|
//reload the main menu in a bit
|
|
|
|
VariantList vList(pMenu->GetParent());
|
|
GetMessageManager()->CallStaticFunction(ReloadMainMenu, 1000, &vList, TIMER_SYSTEM);
|
|
}
|
|
|
|
|
|
Entity * VersionShowScoreMessage(Entity *pMenu, string msg)
|
|
{
|
|
Entity *pInfo = pMenu->GetEntityByName("Info");
|
|
if (pInfo)
|
|
{
|
|
pInfo->GetComponentByName("TextRender")->GetVar("text")->Set(msg);
|
|
pInfo->RemoveComponentByName("Typer"); // a thing that types stuff
|
|
}
|
|
else
|
|
{
|
|
pInfo = CreateTextLabelEntity(pMenu, "Info", iPhoneMapX(130), iPhoneMapY(220), msg);
|
|
}
|
|
|
|
return pInfo;
|
|
}
|
|
|
|
|
|
void OnVersionDownloadHTTPFinish(VariantList *pVList)
|
|
{
|
|
Entity *pMenu = pVList->m_variant[0].GetComponent()->GetParent();
|
|
|
|
TextScanner t((char*)pVList->m_variant[1].GetString().c_str());
|
|
string line;
|
|
|
|
LogMsg(t.GetAll().c_str());
|
|
|
|
// ShowScoreMessage(pMenu, t.GetParmString("msg",1));
|
|
//GetApp()->GetVar("score_msg")->Set(t.GetParmString("msg",1));
|
|
|
|
string key = PlatformIDAsString(GetEmulatedPlatformID());
|
|
#ifdef RT_IS_BETA
|
|
key += "_beta";
|
|
#endif
|
|
|
|
vector<string> lines;
|
|
|
|
|
|
for (int i = 0; i < t.GetLineCount(); i++)
|
|
{
|
|
lines = StringTokenize(t.GetLine(i), "|");
|
|
|
|
if (lines.size() > 2 && lines[0] == key)
|
|
{
|
|
VersionShowScoreMessage(pMenu, "");
|
|
|
|
float version = StringToFloat(lines[1]);
|
|
if (version > GetApp()->GetVersion() + 0.001f) //the extra for an epsilon to flight floating point weirdness, trust me
|
|
{
|
|
PopUpCreate(pMenu, "New version detected! Download it now?", lines[2],
|
|
"cancel_update", "`wCancel", "url_update", "`wDownload", true);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
VersionShowScoreMessage(pMenu, "No new updates found.");
|
|
|
|
|
|
//kill current menu
|
|
GetMessageManager()->CallEntityFunction(pMenu, 1000, "OnDelete", NULL);
|
|
pMenu->SetName("MainMenuDelete");
|
|
|
|
//reload the main menu in a bit
|
|
|
|
VariantList vList(pMenu->GetParent());
|
|
GetMessageManager()->CallStaticFunction(ReloadMainMenu, 1000, &vList, TIMER_SYSTEM);
|
|
}
|
|
|
|
|
|
|
|
void MainMenuOnSelect(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());
|
|
|
|
if (pEntClicked->GetName() == "New")
|
|
{
|
|
DisableAllButtonsEntity(pEntClicked->GetParent());
|
|
InitDinkPaths(GetBaseAppPath(), "dink", "");
|
|
|
|
//slide it off the screen and then kill the whole menu tree
|
|
SlideScreen(pEntClicked->GetParent(), false);
|
|
GetMessageManager()->CallEntityFunction(pEntClicked->GetParent(), 500, "OnDelete", NULL);
|
|
|
|
GameCreate(pEntClicked->GetParent()->GetParent(), 0, "");
|
|
GetApp()->GetVar("showViewHint")->Set(uint32(0)); //so this won't be shown here
|
|
|
|
}
|
|
|
|
if (pEntClicked->GetName() == "Load")
|
|
{
|
|
DisableAllButtonsEntity(pEntClicked->GetParent());
|
|
InitDinkPaths(GetBaseAppPath(), "dink", "");
|
|
//slide it off the screen and then kill the whole menu tree
|
|
SlideScreen(pEntClicked->GetParent(), false);
|
|
GetMessageManager()->CallEntityFunction(pEntClicked->GetParent(), 500, "OnDelete", NULL);
|
|
LoadMenuCreate(pEntClicked->GetParent()->GetParent());
|
|
}
|
|
|
|
if (pEntClicked->GetName() == "Continue")
|
|
{
|
|
DisableAllButtonsEntity(pEntClicked->GetParent());
|
|
InitDinkPaths(GetBaseAppPath(), "dink", "");
|
|
//slide it off the screen and then kill the whole menu tree
|
|
SlideScreen(pEntClicked->GetParent(), false);
|
|
GetMessageManager()->CallEntityFunction(pEntClicked->GetParent(), 500, "OnDelete", NULL);
|
|
GameCreate(pEntClicked->GetParent()->GetParent(), 0, GetSavePath()+"dink/"+string("continue_state.dat"));
|
|
}
|
|
|
|
if (pEntClicked->GetName() == "Debug")
|
|
{
|
|
//overlay the debug menu over this one
|
|
pEntClicked->GetParent()->RemoveComponentByName("FocusInput");
|
|
DebugMenuCreate(pEntClicked->GetParent());
|
|
}
|
|
|
|
if (pEntClicked->GetName() == "Add-ons")
|
|
{
|
|
DisableAllButtonsEntity(pEntClicked->GetParent());
|
|
//slide it off the screen and then kill the whole menu tree
|
|
SlideScreen(pEntClicked->GetParent(), false);
|
|
GetMessageManager()->CallEntityFunction(pEntClicked->GetParent(), 500, "OnDelete", NULL);
|
|
// DMODInstallMenuCreate(pEntClicked->GetParent()->GetParent(), "files.dinknetwork.com/three_amulets-v1_1.dmod", "");
|
|
DMODMenuCreate(pEntClicked->GetParent()->GetParent());
|
|
}
|
|
|
|
|
|
if (pEntClicked->GetName() == "Options")
|
|
{
|
|
//DisableAllButtonsEntity(pEntClicked->GetParent());
|
|
pEntClicked->GetParent()->RemoveComponentByName("FocusInput");
|
|
pEntClicked->GetParent()->RemoveComponentByName("FocusUpdate");
|
|
|
|
//SlideScreen(pEntClicked->GetParent(), false);
|
|
//GetMessageManager()->CallEntityFunction(pEntClicked->GetParent(), 500, "OnDelete", NULL);
|
|
OptionsMenuCreate(pEntClicked->GetParent());
|
|
}
|
|
|
|
if (pEntClicked->GetName() == "About")
|
|
{
|
|
DisableAllButtonsEntity(pEntClicked->GetParent());
|
|
//RemoveFocusIfNeeded(pEntClicked->GetParent()); //slide it off the screen and then kill the whole menu tree
|
|
SlideScreen(pEntClicked->GetParent(), false);
|
|
GetMessageManager()->CallEntityFunction(pEntClicked->GetParent(), 500, "OnDelete", NULL);
|
|
AboutMenuCreate(pEntClicked->GetParent()->GetParent());
|
|
}
|
|
|
|
if (pEntClicked->GetName() == "rtsoftlogo")
|
|
{
|
|
PopUpCreate(pEntClicked->GetParent(), "Would you like to visit `wrtsoft.com``?", "http://www.rtsoft.com/iphone",
|
|
"cancel", "`wCancel", "url", "`wLaunch", true);
|
|
return;
|
|
}
|
|
|
|
//GetEntityRoot()->PrintTreeAsText(); //useful for debugging
|
|
}
|
|
|
|
|
|
string GetNextDMODToInstall()
|
|
{
|
|
//if (!GetApp()->CanDownloadDMODS()) return ""; //ignore it
|
|
|
|
vector<string> files = GetFilesAtPath(GetSavePath());
|
|
|
|
//LogMsg("listing files");
|
|
|
|
for (unsigned int i=0; i < files.size(); i++)
|
|
{
|
|
//LogMsg(files[i].c_str());
|
|
if (GetFileExtension(files[i]) == "dmod")
|
|
{
|
|
return files[i];
|
|
}
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
void MainOnStartLoading(VariantList *pVList)
|
|
{
|
|
Entity *pBG = pVList->m_variant[0].GetEntity();
|
|
|
|
string fileName = pVList->m_variant[1].GetString();
|
|
|
|
DisableAllButtonsEntity(pBG);
|
|
SlideScreen(pBG, false);
|
|
GetMessageManager()->CallEntityFunction(pBG, 500, "OnDelete", NULL);
|
|
pBG->SetName("MainMenuDelete");
|
|
|
|
string fName = GetNextDMODToInstall();
|
|
if (!fName.empty())
|
|
{
|
|
DMODInstallMenuCreate(pBG->GetParent(), "", GetDMODRootPath(), GetSavePath()+fName);
|
|
} else
|
|
{
|
|
GameCreate(pBG->GetParent(), 0, fileName, "Continuing last game...");
|
|
}
|
|
}
|
|
|
|
|
|
void MainMenuDMODMenuOnSessionNew(VariantList *pVList)
|
|
{
|
|
Entity *pMenu = pVList->Get(0).GetEntity();
|
|
|
|
DisableAllButtonsEntity(pMenu);
|
|
SlideScreen(pMenu, false);
|
|
GetMessageManager()->CallEntityFunction(pMenu, 500, "OnDelete", NULL);
|
|
pMenu->SetName("MainMenuDelete");
|
|
|
|
GameCreate(pMenu->GetParent(), 0, "");
|
|
}
|
|
|
|
void MainMenuDMODMenuOnSessionContinue(VariantList *pVList)
|
|
{
|
|
Entity *pMenu = pVList->Get(0).GetEntity();
|
|
|
|
DisableAllButtonsEntity(pMenu);
|
|
SlideScreen(pMenu, false);
|
|
GetMessageManager()->CallEntityFunction(pMenu, 500, "OnDelete", NULL);
|
|
pMenu->SetName("MainMenuDelete");
|
|
|
|
GameCreate(pMenu->GetParent(), 0, g_dglo.m_savePath + "continue_state.dat");
|
|
}
|
|
|
|
void MainMenuDMODCancel(VariantList *pVList)
|
|
{
|
|
Entity *pMenu = pVList->Get(0).GetEntity();
|
|
|
|
DisableAllButtonsEntity(pMenu);
|
|
SlideScreen(pMenu, false);
|
|
GetMessageManager()->CallEntityFunction(pMenu, 500, "OnDelete", NULL);
|
|
pMenu->SetName("MainMenuDelete");
|
|
//reload the main menu
|
|
MainMenuCreate(pMenu->GetParent());
|
|
}
|
|
|
|
void MainOnStartLoadingDMOD(VariantList *pVList)
|
|
{
|
|
Entity *pBG = pVList->m_variant[0].GetEntity();
|
|
|
|
string fileName = pVList->m_variant[1].GetString();
|
|
|
|
|
|
//first check to see if it's a valid dmod
|
|
string dmoddir = pBG->GetVar("start_full_dmod_dir")->GetString();
|
|
|
|
if (!FileExists(dmoddir + "/dmod.diz"))
|
|
{
|
|
//don't look valid..
|
|
PopUpCreate(pBG, "The DMOD at "+dmoddir+" appears to be missing or damaged. Ignoring it.", "", "CancelDMODLoad", "Continue", "", "", true);
|
|
return;
|
|
}
|
|
|
|
string dmodName, dmodCopyright, dmodwebsite, description;
|
|
float version = 0;
|
|
GetParsedDMODInfo(dmoddir, dmodName, version, dmodCopyright, dmodwebsite, description);
|
|
|
|
InitDinkPaths(GetBaseAppPath(), "dink", dmoddir);
|
|
|
|
//next, see if there is a save-on-quit save state existing for this dmod
|
|
if (FileExists(g_dglo.m_savePath + "/continue_state.dat"))
|
|
{
|
|
PopUpCreate(pBG, "Continue your last session in "+ dmodName+"?", "", "CancelDMODLoad", "Cancel", "SessionContinue", "Continue", true, "SessionNew", "New Game");
|
|
return;
|
|
}
|
|
|
|
DisableAllButtonsEntity(pBG);
|
|
SlideScreen(pBG, false);
|
|
GetMessageManager()->CallEntityFunction(pBG, 500, "OnDelete", NULL);
|
|
pBG->SetName("MainMenuDelete");
|
|
|
|
GameCreate(pBG->GetParent(), 0, "", "Loading "+dmodName);
|
|
|
|
}
|
|
|
|
|
|
void ImportSaveFileIfApplicable(string fName)
|
|
{
|
|
if (GetFileExtension(fName) != "dat") return;
|
|
|
|
if (fName == "save.dat") return; //it's not this one
|
|
if (fName == "state.dat") return; //it's not this one
|
|
if (fName == "continue_state.dat") return; //it's not this one
|
|
if (fName == "autosave.dat") return; //it's not this one
|
|
if (fName == "autosavedb.dat") return; //it's not this one
|
|
if (fName == "quicksave.dat") return; //it's not this one
|
|
if (fName == "quickload.dat") return; //it's not this one
|
|
|
|
|
|
//check for any dmod name specified after a _
|
|
|
|
size_t index = fName.find_last_of('_');
|
|
size_t periodPos = fName.find_last_of('.');
|
|
|
|
if (periodPos == string::npos || GetFileExtension(fName) != "dat") return;
|
|
|
|
string dmodName = "";
|
|
|
|
if (index != string::npos)
|
|
{
|
|
//yeah, it has one
|
|
dmodName = fName.substr(index+1, periodPos-(index+1));
|
|
}
|
|
|
|
//ok, ready to copy it. But figure out where, and what the filename should be
|
|
string destPath = GetSavePath()+"dink/";
|
|
string destFile = fName;
|
|
|
|
//modify if needed for a dmod
|
|
|
|
if (!dmodName.empty())
|
|
{
|
|
destPath = GetDMODRootPath()+dmodName+"/";
|
|
destFile = fName.substr(0, index);
|
|
destFile += fName.substr(periodPos, fName.size()-periodPos);
|
|
}
|
|
|
|
LogMsg("Importing %s to %s", (GetSavePath()+fName).c_str(), (destPath+destFile).c_str());
|
|
GetFileManager()->Copy(GetSavePath()+fName, destPath+destFile, false);
|
|
|
|
RemoveFile(GetSavePath()+fName, false);
|
|
}
|
|
|
|
void CheckForImportedSavedGames()
|
|
{
|
|
if (!GetEmulatedPlatformID() == PLATFORM_ID_IOS) return;
|
|
|
|
vector<string> files = GetFilesAtPath(GetSavePath());
|
|
|
|
for (uint32 i=0; i < files.size(); i++)
|
|
{
|
|
ImportSaveFileIfApplicable(files[i]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void MainMenuContinueLast(VariantList *pVList)
|
|
{
|
|
Entity *pBG = pVList->Get(0).GetEntity();
|
|
|
|
pBG->GetFunction("OnStartLoading")->sig_function.connect(&MainOnStartLoading);
|
|
VariantList vList(pBG, GetSavePath()+string("state.dat"));
|
|
GetMessageManager()->CallEntityFunction(pBG, 1000, "OnStartLoading", &vList);
|
|
g_bMainMenuFirstTime = false;
|
|
|
|
LogMsg("Continuing");
|
|
}
|
|
|
|
void MainMenuContinueLastNewStyle(VariantList *pVList)
|
|
{
|
|
Entity *pBG = pVList->Get(0).GetEntity();
|
|
|
|
//ClearCommandLineParms();
|
|
pBG->GetFunction("OnStartLoading")->sig_function.connect(&MainOnStartLoading);
|
|
VariantList vList(pBG, ReadLastPathSaved()+string("continue_state.dat"));
|
|
GetMessageManager()->CallEntityFunction(pBG, 1000, "OnStartLoading", &vList);
|
|
g_bMainMenuFirstTime = false;
|
|
//WriteLastPathSaved("");
|
|
LogMsg("Continuing");
|
|
}
|
|
|
|
void MainMenuCancelLast(VariantList *pVList)
|
|
{
|
|
Entity *pMenu = pVList->Get(0).GetEntity();
|
|
|
|
WriteLastPathSaved("");
|
|
RemoveFile(GetSavePath()+"state.dat", false);
|
|
|
|
//kill current menu
|
|
GetMessageManager()->CallEntityFunction(pMenu, 0, "OnDelete", NULL);
|
|
pMenu->SetName("MainMenuDelete");
|
|
|
|
//reload the main menu
|
|
MainMenuCreate(pMenu->GetParent());
|
|
}
|
|
|
|
void CheckForNewVersion(Entity *pMenu)
|
|
{
|
|
|
|
pMenu->RemoveComponentByName("HTTP"); //just in case it already exists
|
|
|
|
//get the internet stuff going
|
|
EntityComponent *pComp = pMenu->AddComponent(new HTTPComponent);
|
|
|
|
VariantList vPostData;
|
|
|
|
vPostData.m_variant[0].Set("version");
|
|
vPostData.m_variant[1].Set(toString(GetApp()->GetVersion()));
|
|
pComp->GetFunction("AddPostData")->sig_function(&vPostData);
|
|
|
|
vPostData.m_variant[0].Set("build");
|
|
vPostData.m_variant[1].Set(toString(GetApp()->GetBuild()));
|
|
pComp->GetFunction("AddPostData")->sig_function(&vPostData);
|
|
|
|
vPostData.m_variant[0].Set("platform");
|
|
vPostData.m_variant[1].Set(toString(GetEmulatedPlatformID()));
|
|
pComp->GetFunction("AddPostData")->sig_function(&vPostData);
|
|
|
|
VariantList v;
|
|
|
|
string url;
|
|
uint32 port;
|
|
GetApp()->GetServerInfo(url, port);
|
|
|
|
v.m_variant[0].Set(url);
|
|
v.m_variant[1].Set(port);
|
|
v.m_variant[2].Set("dink/versions.php");
|
|
pComp->GetFunction("OnError")->sig_function.connect(&OnVersionDownloadError);
|
|
pComp->GetFunction("OnFinish")->sig_function.connect(&OnVersionDownloadHTTPFinish);
|
|
pComp->GetFunction("Init")->sig_function(&v);
|
|
|
|
Entity *pEnt = VersionShowScoreMessage(pMenu, "`6");
|
|
EntityComponent *pTyper = pEnt->AddComponent(new TyperComponent);
|
|
pTyper->GetVar("text")->Set("Checking rtsoft.com for updates...");
|
|
pTyper->GetVar("speedMS")->Set(uint32(50));
|
|
}
|
|
|
|
Entity * MainMenuCreate( Entity *pParentEnt, bool bFadeIn )
|
|
{
|
|
CheckForImportedSavedGames();
|
|
|
|
GetApp()->GetVar("showViewHint")->Set(uint32(1)); //show that one tip
|
|
|
|
Entity *pBG = CreateOverlayEntity(pParentEnt, "MainMenu", ReplaceWithDeviceNameInFileName("interface/iphone/bkgd_stone.rttex"), 0,0);
|
|
|
|
OverlayRenderComponent *pOverlay = (OverlayRenderComponent*) pBG->GetComponentByName("OverlayRender");
|
|
if (!pOverlay->GetSurfaceAnim())
|
|
{
|
|
|
|
LogMsg("Can't find media. If running from Visual Studio, make sure you set the active dir to ../bin first!");
|
|
#ifdef WINAPI
|
|
MessageBox(NULL, "Can't find media. If running from Visual Studio, make sure you set the active dir to ../bin and have run media/update_media.bat first!", "Woah nelly!" , 0);
|
|
#endif
|
|
}
|
|
//Entity *pBG = pParentEnt->AddEntity(new Entity);
|
|
GetBaseApp()->ClearError();
|
|
AddFocusIfNeeded(pBG, true);
|
|
|
|
|
|
pBG->GetFunction("ContinueLast")->sig_function.connect(&MainMenuContinueLast);
|
|
pBG->GetFunction("ContinueLastNewStyle")->sig_function.connect(&MainMenuContinueLastNewStyle);
|
|
pBG->GetFunction("CancelLast")->sig_function.connect(&MainMenuCancelLast);
|
|
|
|
Entity *pButtonEntity;
|
|
float x = 50;
|
|
float yStart = 200;
|
|
float y = yStart;
|
|
float ySpacer = 55;
|
|
eFont fontID = FONT_LARGE;
|
|
float fontScale = 1;
|
|
float fireAnimY = 240;
|
|
CL_Vec2f vRtsoftLogoPt = CL_Vec2f(402, 149);
|
|
|
|
CL_Vec2f vNewButPt = CL_Vec2f(26, 199);
|
|
CL_Vec2f vLoadButPt = CL_Vec2f(135, 199);
|
|
CL_Vec2f vAddonButPt = CL_Vec2f(26, 245);
|
|
CL_Vec2f vContinueButPt = CL_Vec2f(246, 198);
|
|
|
|
CL_Vec2f vAboutButPt = CL_Vec2f(251, 245);
|
|
|
|
CL_Vec2f vOptionsButPt = CL_Vec2f(360, 246);
|
|
|
|
if (IsIPADSize)
|
|
{
|
|
vNewButPt = CL_Vec2f(0, 468);
|
|
vLoadButPt = CL_Vec2f(256, 468);
|
|
fireAnimY = GetScreenSizeYf()-256;
|
|
vRtsoftLogoPt = CL_Vec2f(830, 370);
|
|
|
|
vAddonButPt = CL_Vec2f(13, 565);
|
|
vContinueButPt = CL_Vec2f(525, 468);
|
|
vAboutButPt = CL_Vec2f(525, 565);
|
|
vOptionsButPt = CL_Vec2f(748, 565);
|
|
} else if (IsIphone4Size)
|
|
{
|
|
vNewButPt = CL_Vec2f(66, 364);
|
|
vLoadButPt = CL_Vec2f(277, 362);
|
|
fireAnimY = GetScreenSizeYf()-160;
|
|
vRtsoftLogoPt = CL_Vec2f(775, 262);
|
|
|
|
vAddonButPt = CL_Vec2f(67, 453);
|
|
vContinueButPt = CL_Vec2f(498, 364 );
|
|
vAboutButPt = CL_Vec2f(512, 454);
|
|
vOptionsButPt = CL_Vec2f(716, 455);
|
|
}
|
|
|
|
|
|
#ifdef RT_IS_BETA
|
|
Entity *pText = CreateTextLabelEntity(pBG, "text", GetScreenSizeXf()/2, GetScreenSizeYf()-20,
|
|
"`wBeta Version("+GetApp()->GetVersionString()+")");
|
|
SetAlignmentEntity(pText, ALIGNMENT_CENTER);
|
|
|
|
#endif
|
|
|
|
if (!g_bDidVersionCheck && IsDesktop())
|
|
{
|
|
g_bDidVersionCheck = true;
|
|
CheckForNewVersion(pBG);
|
|
return pBG;
|
|
}
|
|
|
|
|
|
Entity *pEntDinkLogo = CreateOverlayEntity(pBG, "dinklogo", ReplaceWithDeviceNameInFileName("interface/iphone/logo_dink.rttex"), 0, 0);
|
|
|
|
pButtonEntity = CreateOverlayEntity(pBG, "flameAnim", ReplaceWithDeviceNameInFileName("interface/iphone/bkgd_anim_fire.rttex"), 0, fireAnimY);
|
|
SetupAnimEntity(pButtonEntity, 1, 4, 0, 0);
|
|
AnimateEntity(pButtonEntity, 0, 3, 125, InterpolateComponent::ON_FINISH_REPEAT, 0);
|
|
|
|
//for android, so the back key (or escape on windows/OSX) will quit out of the game
|
|
EntityComponent *pComp = pBG->AddComponent(new CustomInputComponent);
|
|
//tell the component which key has to be hit for it to be activated
|
|
pComp->GetFunction("OnActivated")->sig_function.connect(1, boost::bind(&App::OnExitApp, GetApp(), _1));
|
|
pComp->GetVar("keycode")->Set(uint32(VIRTUAL_KEY_BACK));
|
|
|
|
pButtonEntity = CreateOverlayButtonEntity(pBG, "rtsoftlogo", ReplaceWithDeviceNameInFileName("interface/iphone/logo_rtsoft.rttex"), vRtsoftLogoPt.x, vRtsoftLogoPt.y);
|
|
SetTouchPaddingEntity(pButtonEntity, CL_Rectf(0, 0, 0, -10)); //no padding, it overlaps other buttons..
|
|
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&MainMenuOnSelect);
|
|
FadeInEntity(pButtonEntity, false, 300, 1000);
|
|
|
|
|
|
static bool bOneTimeDMODLoaded = false;
|
|
|
|
if (!bOneTimeDMODLoaded)
|
|
{
|
|
bOneTimeDMODLoaded = true;
|
|
string dmodfilename;
|
|
string dmodDir = GetDMODRootPath(&dmodfilename);
|
|
|
|
if (dmodfilename != "")
|
|
{
|
|
//jump start a DMOD load
|
|
pBG->GetFunction("OnStartLoadingDMOD")->sig_function.connect(&MainOnStartLoadingDMOD);
|
|
pBG->GetVar("start_full_dmod_dir")->Set(dmodDir + dmodfilename);
|
|
pBG->GetVar("start_dmod_dir")->Set(dmodfilename);
|
|
|
|
VariantList vList(pBG, string(""));
|
|
GetMessageManager()->CallEntityFunction(pBG, 1000, "OnStartLoadingDMOD", &vList);
|
|
|
|
pBG->GetFunction("SessionNew")->sig_function.connect(&MainMenuDMODMenuOnSessionNew);
|
|
pBG->GetFunction("SessionContinue")->sig_function.connect(&MainMenuDMODMenuOnSessionContinue);
|
|
pBG->GetFunction("CancelDMODLoad")->sig_function.connect(&MainMenuDMODCancel);
|
|
|
|
return pBG;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if ( ! GetNextDMODToInstall().empty())
|
|
{
|
|
pBG->GetFunction("OnStartLoading")->sig_function.connect(&MainOnStartLoading);
|
|
VariantList vList(pBG, string(""));
|
|
GetMessageManager()->CallEntityFunction(pBG, 1000, "OnStartLoading", &vList);
|
|
|
|
} else
|
|
{
|
|
|
|
if (FileExists(GetSavePath()+"state.dat"))
|
|
{
|
|
PopUpCreate(pBG, "Continue your last session?", "", "CancelLast", "Cancel", "ContinueLast", "Continue", true);
|
|
return pBG;
|
|
};
|
|
|
|
if (!ReadLastPathSaved().empty())
|
|
{
|
|
|
|
string lastDMOD = ReadLastPathSaved();
|
|
|
|
PopUpCreate(pBG, "Continue your last session?", "", "CancelLast", "Cancel", "ContinueLastNewStyle", "Continue", true);
|
|
return pBG;
|
|
}
|
|
|
|
if (g_bMainMenuFirstTime)
|
|
{
|
|
#ifdef RT_MOGA_ENABLED
|
|
ShowTextMessage("Moga enabled test version - not for distribution");
|
|
#endif
|
|
PlayMenuMusic();
|
|
}
|
|
|
|
ZoomToPositionFromThisOffsetEntity(pEntDinkLogo, CL_Vec2f(0, -300), 2000, INTERPOLATE_EASE_TO, 5);
|
|
pButtonEntity = CreateOverlayButtonEntity(pBG, "New", ReplaceWithDeviceNameInFileName("interface/iphone/main_but_new.rttex"), vNewButPt.x, vNewButPt.y);
|
|
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&MainMenuOnSelect);
|
|
SetTouchPaddingEntity(pButtonEntity, CL_Rectf(0,0,0,0));
|
|
FadeInEntity(pButtonEntity, false, 500, 100);
|
|
|
|
//SetupTextEntity(pButtonEntity, fontID, fontScale);
|
|
pButtonEntity = CreateOverlayButtonEntity(pBG, "Add-ons", ReplaceWithDeviceNameInFileName("interface/iphone/main_but_addon10.rttex"), vAddonButPt.x, vAddonButPt.y);
|
|
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&MainMenuOnSelect);
|
|
//SetupTextEntity(pButtonEntity, fontID, fontScale);
|
|
SetTouchPaddingEntity(pButtonEntity, CL_Rectf(0,0,0,0));
|
|
FadeInEntity(pButtonEntity, false, 500, 1000);
|
|
|
|
pButtonEntity = CreateOverlayButtonEntity(pBG, "Load", ReplaceWithDeviceNameInFileName("interface/iphone/main_but_load.rttex"), vLoadButPt.x, vLoadButPt.y);
|
|
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&MainMenuOnSelect);
|
|
//SetupTextEntity(pButtonEntity, fontID, fontScale);
|
|
SetTouchPaddingEntity(pButtonEntity, CL_Rectf(0,0,0,0));
|
|
FadeInEntity(pButtonEntity, false, 500, 400);
|
|
|
|
pButtonEntity = CreateOverlayButtonEntity(pBG, "Continue", ReplaceWithDeviceNameInFileName("interface/iphone/main_but_continue.rttex"), vContinueButPt.x, vContinueButPt.y);
|
|
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&MainMenuOnSelect);
|
|
SetTouchPaddingEntity(pButtonEntity, CL_Rectf(0,0,0,0));
|
|
FadeInEntity(pButtonEntity, false, 500, 700);
|
|
|
|
if (!FileExists(GetSavePath()+"dink/"+string("continue_state.dat")))
|
|
{
|
|
pButtonEntity->GetVar("color")->Set(MAKE_RGBA(100,100,100,255));
|
|
DisableAllButtonsEntity(pButtonEntity, false);
|
|
}
|
|
|
|
pButtonEntity = CreateOverlayButtonEntity(pBG, "About", ReplaceWithDeviceNameInFileName("interface/iphone/main_but_about.rttex"), vAboutButPt.x, vAboutButPt.y);
|
|
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&MainMenuOnSelect);
|
|
SetTouchPaddingEntity(pButtonEntity, CL_Rectf(0,0,0,0));
|
|
FadeInEntity(pButtonEntity, false, 500, 1300);
|
|
|
|
pButtonEntity = CreateOverlayButtonEntity(pBG, "Options", ReplaceWithDeviceNameInFileName("interface/iphone/main_but_options.rttex"), vOptionsButPt.x, vOptionsButPt.y);
|
|
pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&MainMenuOnSelect);
|
|
SetTouchPaddingEntity(pButtonEntity, CL_Rectf(0,0,0,0));
|
|
FadeInEntity(pButtonEntity, false, 500, 1500);
|
|
DestroyUnusedTextures();
|
|
|
|
|
|
//pButtonEntity = CreateTextButtonEntity(pBG, "Debug", x, y, "Debug and MP3 Music"); y += ySpacer;
|
|
//pButtonEntity->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&MainMenuOnSelect);
|
|
//pButtonEntity->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
|
}
|
|
|
|
if (bFadeIn)
|
|
{
|
|
FadeInEntity(pBG, true, 500, 0);
|
|
} else
|
|
{
|
|
|
|
if (g_bMainMenuFirstTime)
|
|
{
|
|
g_bMainMenuFirstTime = false;
|
|
} else
|
|
{
|
|
SlideScreen(pBG, true);
|
|
}
|
|
}
|
|
|
|
return pBG;
|
|
}
|
|
|
|
|
|
Entity * AddTitle( Entity *pEnt, string title)
|
|
{
|
|
Entity *pTitle;
|
|
|
|
float titleHeight = 25;
|
|
float scale = 1;
|
|
float x = 480/2;
|
|
|
|
pTitle = CreateTextLabelEntity(pEnt, "Title", x, titleHeight, title);
|
|
pTitle->GetVar("scale2d")->Set(CL_Vec2f(scale, scale));
|
|
pTitle->GetComponentByName("TextRender")->GetVar("font")->Set(uint32(FONT_LARGE));
|
|
EntityRetinaRemapIfNeeded(pTitle, true, false, true);
|
|
pTitle->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
|
|
|
return pTitle;
|
|
} |