* Save data import/export added! Quick states automatically load the correct dmod if needed, but aren't able to auto-download them if they aren't installed. (it will give a clear message though) The filename of the uploaded quicksave doesn't matter.
* 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
This commit is contained in:
parent
7b8c9cb79a
commit
c648a1d1fb
13 changed files with 280 additions and 83 deletions
|
@ -119,9 +119,9 @@ set APP_SRC=%APP%\App.cpp %APP%\Component\ActionButtonComponent.cpp %APP%\Compon
|
||||||
%APP%\GUI\PauseMenu.cpp %APP%\GUI\PopUpMenu.cpp %APP%\GUI\QuickTipMenu.cpp %APP%\GUI\ReadTextMenu.cpp %APP%\GUI\ExpiredMenu.cpp
|
%APP%\GUI\PauseMenu.cpp %APP%\GUI\PopUpMenu.cpp %APP%\GUI\QuickTipMenu.cpp %APP%\GUI\ReadTextMenu.cpp %APP%\GUI\ExpiredMenu.cpp
|
||||||
REM **************************************** END SOURCE
|
REM **************************************** END SOURCE
|
||||||
|
|
||||||
:unused so far: -s USE_GLFW=3 -s NO_EXIT_RUNTIME=1 -s FORCE_ALIGNED_MEMORY=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1 -DRT_EMTERPRETER_ENABLED -s TOTAL_MEMORY=16MB
|
:unused so far: -s USE_GLFW=3 -s NO_EXIT_RUNTIME=1 -s FORCE_ALIGNED_MEMORY=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1 -DRT_EMTERPRETER_ENABLED -s TOTAL_MEMORY=16MB -s PRECISE_F32=2
|
||||||
:To skip font loading so it needs no resource files or zlib, add -DC_NO_ZLIB
|
:To skip font loading so it needs no resource files or zlib, add -DC_NO_ZLIB
|
||||||
SET CUSTOM_FLAGS= -DHAS_SOCKLEN_T -DBOOST_ALL_NO_LIB -DPLATFORM_HTML5 -DRT_USE_SDL_AUDIO -DRT_JPG_SUPPORT -DRT_PNG_SUPPORT -DC_GL_MODE -s LEGACY_GL_EMULATION=1 -DPLATFORM_HTML5 -s ALLOW_MEMORY_GROWTH=1 -Wno-c++11-compat-deprecated-writable-strings --ignore-dynamic-linking --memory-init-file 0 -Wno-switch -s PRECISE_F32=2 -Wno-writable-strings -Wno-shift-negative-value
|
SET CUSTOM_FLAGS= -DHAS_SOCKLEN_T -DBOOST_ALL_NO_LIB -DPLATFORM_HTML5 -DRT_USE_SDL_AUDIO -DRT_JPG_SUPPORT -DRT_PNG_SUPPORT -DC_GL_MODE -s LEGACY_GL_EMULATION=1 -DPLATFORM_HTML5 -s ALLOW_MEMORY_GROWTH=1 -Wno-c++11-compat-deprecated-writable-strings --ignore-dynamic-linking --memory-init-file 0 -Wno-switch -Wno-writable-strings -Wno-shift-negative-value
|
||||||
|
|
||||||
:unused: -s FULL_ES2=1 --emrun
|
:unused: -s FULL_ES2=1 --emrun
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 1.9 MiB |
Binary file not shown.
146
source/App.cpp
146
source/App.cpp
|
@ -21,6 +21,8 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "Gamepad/GamepadManager.h"
|
#include "Gamepad/GamepadManager.h"
|
||||||
#include "Gamepad/GamepadProvideriCade.h"
|
#include "Gamepad/GamepadProvideriCade.h"
|
||||||
|
#include "GUI/PopUpMenu.h"
|
||||||
|
#include "GUI/PauseMenu.h"
|
||||||
|
|
||||||
#ifdef PLATFORM_HTML5
|
#ifdef PLATFORM_HTML5
|
||||||
#include "html5/HTML5Utils.h"
|
#include "html5/HTML5Utils.h"
|
||||||
|
@ -232,7 +234,7 @@ bool App::GetForceAspectRatio()
|
||||||
bool App::UseClassicEscapeMenu()
|
bool App::UseClassicEscapeMenu()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (GetEmulatedPlatformID() == PLATFORM_ID_HTML5)
|
if (GetEmulatedPlatformID() == PLATFORM_ID_HTML5 && !GetApp()->GetUsingTouchScreen())
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1050,6 +1052,101 @@ const char * GetBundleName()
|
||||||
return bundleName;
|
return bundleName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ImportSaveState(string physicalFname)
|
||||||
|
{
|
||||||
|
|
||||||
|
Entity *pMenu = GetEntityRoot()->GetEntityByName("GameMenu");
|
||||||
|
|
||||||
|
string originalDMODDir = g_dglo.m_dmodGameDir;
|
||||||
|
string newDMODDir;
|
||||||
|
|
||||||
|
bool bSuccess = GetDMODDirFromState(physicalFname, newDMODDir);
|
||||||
|
//newDMODDir += "/";
|
||||||
|
|
||||||
|
if (!bSuccess)
|
||||||
|
{
|
||||||
|
//RemoveFile(fName, false);
|
||||||
|
GetAudioManager()->Play("audio/buzzer2.wav");
|
||||||
|
PopUpCreate(pMenu, "Error loading save state. Probably an older version, sorry.", "", "cancel", "Continue", "", "", true);
|
||||||
|
SyncPersistentData();
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogMsg("We are in %s, but now we need %s", originalDMODDir.c_str(), newDMODDir.c_str());
|
||||||
|
|
||||||
|
if (!newDMODDir.empty())
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!FileExists(GetDMODRootPath() + newDMODDir + "dmod.diz"))
|
||||||
|
{
|
||||||
|
PopUpCreate(pMenu, "Can't find file " + newDMODDir + "dmod.diz" + ", maybe you need to install the DMOD first?", "", "cancel", "Continue", "", "", true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (originalDMODDir == newDMODDir)
|
||||||
|
{
|
||||||
|
LoadStateWithExtra(physicalFname);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//whole different dmod, we need to get fancy here
|
||||||
|
LogMsg("Switching to correct DMOD dir for this quicksave...");
|
||||||
|
//SetDinkGameState(DINK_GAME_STATE_NOT_PLAYING);
|
||||||
|
|
||||||
|
Entity *pNewMenu = DinkQuitGame();
|
||||||
|
KillEntity(pMenu);
|
||||||
|
|
||||||
|
DisableAllButtonsEntity(pNewMenu);
|
||||||
|
SlideScreen(pNewMenu, false);
|
||||||
|
GetMessageManager()->CallEntityFunction(pNewMenu, 500, "OnDelete", NULL);
|
||||||
|
|
||||||
|
InitDinkPaths(GetBaseAppPath(), "dink", RemoveTrailingBackslash(newDMODDir));
|
||||||
|
GameCreate(pNewMenu->GetParent(), 0, physicalFname);
|
||||||
|
GetBaseApp()->SetGameTickPause(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImportNormalSaveSlot(string fileName, string outputFileName)
|
||||||
|
{
|
||||||
|
//well... directly loading it is possible but.. uhh.. DMODs may need their own startup
|
||||||
|
//scripts so I better just copy the file over instead.
|
||||||
|
Entity *pMenu = GetEntityRoot()->GetEntityByName("GameMenu");
|
||||||
|
|
||||||
|
string path = g_dglo.m_dmodGamePathWithDir;
|
||||||
|
|
||||||
|
if (path.empty())
|
||||||
|
{
|
||||||
|
//must be dink and not a DMOD, special case
|
||||||
|
path = GetSavePath()+"/dink/";
|
||||||
|
}
|
||||||
|
|
||||||
|
//fix outputfilename if it's wrong
|
||||||
|
StripWhiteSpace(outputFileName);
|
||||||
|
int index = outputFileName.find_first_of('(');
|
||||||
|
if (index != string::npos)
|
||||||
|
{
|
||||||
|
//it probably looks like "save2 (2).dat" due to chrome renaming if it existed, fix it
|
||||||
|
outputFileName = outputFileName.substr(0, index - 1) + "."+GetFileExtension(outputFileName);
|
||||||
|
}
|
||||||
|
LogMsg("Copying %s to %s", fileName.c_str(), (path + outputFileName).c_str());
|
||||||
|
|
||||||
|
if (!GetFileManager()->Copy(fileName, path + outputFileName, false))
|
||||||
|
{
|
||||||
|
|
||||||
|
PopUpCreate(pMenu, ("Error copying " + outputFileName + " into "+ g_dglo.m_dmodGamePathWithDir + outputFileName+"!").c_str(), "", "cancel", "Continue", "", "", true);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PopUpCreate(pMenu, "Ok, we've put " + outputFileName +" into the active game directory. You can now load this save slot like normal.", "", "cancel", "Continue", "", "", true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void App::OnMessage( Message &m )
|
void App::OnMessage( Message &m )
|
||||||
{
|
{
|
||||||
m_adManager.OnMessage(m); //gives the AdManager a way to handle messages
|
m_adManager.OnMessage(m); //gives the AdManager a way to handle messages
|
||||||
|
@ -1059,45 +1156,24 @@ void App::OnMessage( Message &m )
|
||||||
{
|
{
|
||||||
if (m.GetType() == MESSAGE_TYPE_HTML5_GOT_UPLOAD)
|
if (m.GetType() == MESSAGE_TYPE_HTML5_GOT_UPLOAD)
|
||||||
{
|
{
|
||||||
LogMsg("Got uploaded file %s", m.GetStringParm().c_str());
|
|
||||||
string fName = m.GetStringParm();
|
string fName = m.GetStringParm();
|
||||||
|
string physicalFname = "proton_temp.tmp";
|
||||||
|
int fileSize = GetFileSize(physicalFname);
|
||||||
|
LogMsg("Got uploaded file %s (as %s). %d bytes", m.GetStringParm().c_str(), physicalFname.c_str(),
|
||||||
|
fileSize);
|
||||||
|
|
||||||
|
|
||||||
|
if (fileSize > 1024 * 1000)
|
||||||
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
|
//well, it's big, let's assume it's a full save state
|
||||||
dmodName = fName.substr(index + 1, periodPos - (index + 1));
|
ImportSaveState(physicalFname);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ImportNormalSaveSlot(physicalFname, fName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//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());
|
|
||||||
|
|
||||||
/*
|
|
||||||
InitDinkPaths(GetBaseAppPath(), "dink", dmoddir);
|
|
||||||
GameCreate(pBG->GetParent(), 0, "", "Loading " + dmodName);
|
|
||||||
GameCreate(pMenu->GetParent(), 0, g_dglo.m_savePath + "continue_state.dat");
|
|
||||||
Entity *pMenu = DinkQuitGame();
|
|
||||||
PopUpCreate(pMenu, "Error loading save state. Probably an older version, sorry.", "", "cancel", "Continue", "", "", true);
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ void CursorComponent::OnInput( VariantList *pVList )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (IsDesktop() || GetEmulatedPlatformID() == PLATFORM_ID_HTML5)
|
if (IsDesktop() || (GetEmulatedPlatformID() == PLATFORM_ID_HTML5 && !GetApp()->GetUsingTouchScreen()) )
|
||||||
{
|
{
|
||||||
|
|
||||||
//controls for a real mouse
|
//controls for a real mouse
|
||||||
|
@ -111,12 +111,10 @@ void CursorComponent::OnInput( VariantList *pVList )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
//controls for a touch screen. Selecting is different
|
//controls for a touch screen. Selecting is different
|
||||||
|
|
||||||
|
|
||||||
switch (eMessageType(int(pVList->Get(0).GetFloat())))
|
switch (eMessageType(int(pVList->Get(0).GetFloat())))
|
||||||
{
|
{
|
||||||
case MESSAGE_TYPE_GUI_CLICK_START:
|
case MESSAGE_TYPE_GUI_CLICK_START:
|
||||||
|
|
|
@ -192,7 +192,7 @@ void AboutMenuAddScrollContent(Entity *pParent)
|
||||||
|
|
||||||
|
|
||||||
string msg =
|
string msg =
|
||||||
GetAppName()+string("`$ ")+GetApp()->GetVersionString()+" Build "+toString(GetApp()->GetBuild())+"``\nCopyright (c) 1997-2017 Robinson Technologies\n"\
|
GetAppName()+string("`$ ")+GetApp()->GetVersionString()+" Build "+toString(GetApp()->GetBuild())+"``\nCopyright (c) 1997-2018 Robinson Technologies\n"\
|
||||||
"\nDink Script Version: `$1.10``\n\n"\
|
"\nDink Script Version: `$1.10``\n\n"\
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -315,40 +315,39 @@ msg += \
|
||||||
//some special links:
|
//some special links:
|
||||||
Entity *pButton;
|
Entity *pButton;
|
||||||
|
|
||||||
pButton = CreateTextButtonEntity(pParent, "email", iPhoneMapX(x), y, "Have a suggestion, bug report, or need help? Tap here to email us", true);
|
if (GetApp()->CanDownloadDMODS())
|
||||||
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&AboutMenuOnSelect);
|
{
|
||||||
y += pButton->GetVar("size2d")->GetVector2().y;
|
pButton = CreateTextButtonEntity(pParent, "dinknetwork", iPhoneMapX(x), y, "Visit the Dink Network (Dink files, forums and more)", true);
|
||||||
y += ySpacer;
|
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&AboutMenuOnSelect);
|
||||||
|
y += pButton->GetVar("size2d")->GetVector2().y;
|
||||||
|
y += ySpacer;
|
||||||
|
}
|
||||||
|
|
||||||
pButton = CreateTextButtonEntity(pParent, "list", iPhoneMapX(x), y, "Subscribe to the RTsoft Newsletter", true);
|
//
|
||||||
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&AboutMenuOnSelect);
|
// pButton = CreateTextButtonEntity(pParent, "email", iPhoneMapX(x), y, "Have a suggestion, bug report, or need help? Tap here to email us", true);
|
||||||
y += pButton->GetVar("size2d")->GetVector2().y;
|
// pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&AboutMenuOnSelect);
|
||||||
y += ySpacer;
|
// y += pButton->GetVar("size2d")->GetVector2().y;
|
||||||
|
// y += ySpacer;
|
||||||
|
|
||||||
|
//
|
||||||
|
// pButton = CreateTextButtonEntity(pParent, "list", iPhoneMapX(x), y, "Subscribe to the RTsoft Newsletter", true);
|
||||||
|
// pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&AboutMenuOnSelect);
|
||||||
|
// y += pButton->GetVar("size2d")->GetVector2().y;
|
||||||
|
// y += ySpacer;
|
||||||
|
|
||||||
|
|
||||||
pButton = CreateTextButtonEntity(pParent, "twitter", iPhoneMapX(x), y, "Click here for the RTsoft twitter page", true);
|
pButton = CreateTextButtonEntity(pParent, "twitter", iPhoneMapX(x), y, "Click here for the RTsoft twitter page", true);
|
||||||
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&AboutMenuOnSelect);
|
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&AboutMenuOnSelect);
|
||||||
y += pButton->GetVar("size2d")->GetVector2().y;
|
y += pButton->GetVar("size2d")->GetVector2().y;
|
||||||
y += ySpacer;
|
y += ySpacer;
|
||||||
|
|
||||||
pButton = CreateTextButtonEntity(pParent, "forums", iPhoneMapX(x), y, "Visit the official RTsoft Dink Forums", true);
|
//
|
||||||
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&AboutMenuOnSelect);
|
// pButton = CreateTextButtonEntity(pParent, "forums", iPhoneMapX(x), y, "Visit the official RTsoft forums", true);
|
||||||
y += pButton->GetVar("size2d")->GetVector2().y;
|
// pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&AboutMenuOnSelect);
|
||||||
y += ySpacer;
|
// y += pButton->GetVar("size2d")->GetVector2().y;
|
||||||
|
// y += ySpacer;
|
||||||
|
|
||||||
|
|
||||||
if (GetApp()->CanDownloadDMODS())
|
|
||||||
{
|
|
||||||
|
|
||||||
pButton = CreateTextButtonEntity(pParent, "dinknetwork", iPhoneMapX(x), y, "Want to download/make DMODs? Tap here to visit the Dink Network", true);
|
|
||||||
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&AboutMenuOnSelect);
|
|
||||||
y += pButton->GetVar("size2d")->GetVector2().y;
|
|
||||||
y += ySpacer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
"\nFound a bug or have a question? Email us at `wsupport@rtsoft.com``.\n"\
|
|
||||||
"\nCheck out our other wacky games:\n";
|
|
||||||
|
|
||||||
vTextBoxPos = CL_Vec2f(iPhoneMapX(x),y);
|
vTextBoxPos = CL_Vec2f(iPhoneMapX(x),y);
|
||||||
msg = "\nIf you like Dink, please check out our other games:\n";
|
msg = "\nIf you like Dink, please check out our other games:\n";
|
||||||
pEnt = CreateTextBoxEntity(pParent, "", vTextBoxPos, vTextBounds, msg);
|
pEnt = CreateTextBoxEntity(pParent, "", vTextBoxPos, vTextBounds, msg);
|
||||||
|
@ -373,9 +372,9 @@ msg += \
|
||||||
{
|
{
|
||||||
string adText = "`wDink Smallwood HD for iOS```8 - Love Dink? Then get it on your iPhone and iPad!";
|
string adText = "`wDink Smallwood HD for iOS```8 - Love Dink? Then get it on your iPhone and iPad!";
|
||||||
|
|
||||||
if (GetEmulatedPlatformID() == PLATFORM_ID_WINDOWS)
|
if (GetEmulatedPlatformID() == PLATFORM_ID_WINDOWS || GetEmulatedPlatformID() == PLATFORM_ID_HTML5)
|
||||||
{
|
{
|
||||||
adText = "`wDink Smallwood HD for mobile```8 - Love Dink? Then get it for your iPhone, iPad, or Android device!";
|
adText = "`wDink Smallwood HD for mobile```8 - Dink also has free native mobile versions available!";
|
||||||
}
|
}
|
||||||
AddBlurb(pParent, x, y, "dink_ad", adText);
|
AddBlurb(pParent, x, y, "dink_ad", adText);
|
||||||
y += iPhoneMapY(blurbSpacingY);
|
y += iPhoneMapY(blurbSpacingY);
|
||||||
|
@ -393,9 +392,9 @@ msg += \
|
||||||
|
|
||||||
vTextBoxPos = CL_Vec2f(iPhoneMapX(x),y);
|
vTextBoxPos = CL_Vec2f(iPhoneMapX(x),y);
|
||||||
|
|
||||||
msg = "`8`$Dink Smallwood HD`` was created by `wSeth A. Robinson`` (code) and `wJustin Martin`` (graphics).\n\n"\
|
msg = "`8`$Dink Smallwood HD`` was created by `wSeth A. Robinson`` (code), `wJustin Martin`` (graphics) and includes additional contributions from Dan Walma.\n\n"\
|
||||||
"`8The original `$Dink Smallwood`` was created by `wSeth A. Robinson`` (engine/scripting/music), `wJustin Martin`` (graphics), `wGreg Smith`` (scripting/music), and `wShawn Teal``. It also featured music by `wJoel Bakker`` and `wMitch Brink``."\
|
"`8The original `$Dink Smallwood`` was created by `wSeth A. Robinson`` (engine/scripting/music), `wJustin Martin`` (graphics), `wGreg Smith`` (scripting/music), and `wShawn Teal``. It also featured music by `wJoel Bakker`` and `wMitch Brink``."\
|
||||||
"\n\nSpecial thanks to `wDan Walma`` and the `wdinksmallwood.net`` community for their `$Dink`` improvements."\
|
"\n\nSpecial thanks to `wDan Walma`` and the `wdinksmallwood.net`` community for their `$Dink`` creations and support over the years!"\
|
||||||
"\n\n"\
|
"\n\n"\
|
||||||
"This product is less buggy thanks to:\n\n`w"\
|
"This product is less buggy thanks to:\n\n`w"\
|
||||||
"Shawn Teal\n"\
|
"Shawn Teal\n"\
|
||||||
|
|
|
@ -69,12 +69,12 @@ Entity * EnterURLMenuCreate(Entity *pParentEnt)
|
||||||
pButtonEntity->GetVar("scale2d")->Set(CL_Vec2f(0.6f, 0.6f));
|
pButtonEntity->GetVar("scale2d")->Set(CL_Vec2f(0.6f, 0.6f));
|
||||||
vTextAreaPos.y += iPhoneMapY(25);
|
vTextAreaPos.y += iPhoneMapY(25);
|
||||||
|
|
||||||
string msg = "Enter a URL to a .dmod file to download and install. (example: http://rtsoft.com/NewQuest.dmod )";
|
string msg = "Enter a URL to a .dmod file to download and install. (example: https://rtsoft.com/NewQuest.dmod )";
|
||||||
|
|
||||||
switch (GetEmulatedPlatformID())
|
switch (GetEmulatedPlatformID())
|
||||||
{
|
{
|
||||||
case PLATFORM_ID_WINDOWS:
|
case PLATFORM_ID_WINDOWS:
|
||||||
msg = "Enter a URL to a .dmod file to download and install. (example: http://rtsoft.com/NewQuest.dmod ) Use Ctrl-V to paste from the clipboard.";
|
msg = "Enter a URL to a .dmod file to download and install. (example: https://rtsoft.com/NewQuest.dmod ) Use Ctrl-V to paste from the clipboard.";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -616,6 +616,15 @@ void BuildControls(float fadeTimeMS)
|
||||||
float trans = 0.0f;
|
float trans = 0.0f;
|
||||||
Entity *pButtonEntity;
|
Entity *pButtonEntity;
|
||||||
|
|
||||||
|
#ifdef PLATFORM_HTML5
|
||||||
|
if (GetTouchesReceived() > 0)
|
||||||
|
{
|
||||||
|
//using a touch screen, go into that mode
|
||||||
|
GetApp()->SetUsingTouchScreen(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
if (GetApp()->GetUsingTouchScreen())
|
if (GetApp()->GetUsingTouchScreen())
|
||||||
{
|
{
|
||||||
if (g_dglo.GetActiveView() != DinkGlobals::VIEW_ZOOMED && IsDrawingDinkStatusBar())
|
if (g_dglo.GetActiveView() != DinkGlobals::VIEW_ZOOMED && IsDrawingDinkStatusBar())
|
||||||
|
|
|
@ -229,6 +229,37 @@ void PauseMenuOnSelect(VariantList *pVList) //0=vec2 point of click, 1=entity se
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pEntClicked->GetName() == "ExportNormalSave")
|
||||||
|
{
|
||||||
|
if (g_lastSaveSlotFileSaved.empty())
|
||||||
|
{
|
||||||
|
PopUpCreate(pMenu, "You haven't used a save machine recently. Go use one and come back!", "", "cancel", "Continue", "", "", true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string fileName = GetFileNameFromString(g_lastSaveSlotFileSaved);
|
||||||
|
|
||||||
|
#ifdef PLATFORM_HTML5
|
||||||
|
HTMLDownloadFileFromFileSystem(g_lastSaveSlotFileSaved, fileName);
|
||||||
|
#else
|
||||||
|
#endif
|
||||||
|
UpdatePauseButtons(pMenu);
|
||||||
|
PauseEnd(pMenu);
|
||||||
|
PopUpCreate(pMenu->GetParent(), "Started download of last save slot saved. (" + fileName + ")", "", "cancel", "Continue", "", "", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pEntClicked->GetName() == "ImportNormalSave")
|
||||||
|
{
|
||||||
|
#ifdef PLATFORM_HTML5
|
||||||
|
HTMLUploadFileToFileSystem();
|
||||||
|
#else
|
||||||
|
|
||||||
|
GetMessageManager()->SendGUIStringEx(MESSAGE_TYPE_HTML5_GOT_UPLOAD, 0, 0, 0, "purpoise_quicksave.dat", 0);
|
||||||
|
#endif
|
||||||
|
PauseEnd(pMenu);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (pEntClicked->GetName() == "ExportQuickSave")
|
if (pEntClicked->GetName() == "ExportQuickSave")
|
||||||
{
|
{
|
||||||
//SaveStateWithExtra(false);
|
//SaveStateWithExtra(false);
|
||||||
|
@ -243,6 +274,10 @@ void PauseMenuOnSelect(VariantList *pVList) //0=vec2 point of click, 1=entity se
|
||||||
#ifdef PLATFORM_HTML5
|
#ifdef PLATFORM_HTML5
|
||||||
|
|
||||||
HTMLDownloadFileFromFileSystem(DinkGetSavePath() + "quicksave.dat", prepend + "_quicksave.dat");
|
HTMLDownloadFileFromFileSystem(DinkGetSavePath() + "quicksave.dat", prepend + "_quicksave.dat");
|
||||||
|
#else
|
||||||
|
|
||||||
|
//Fake message for debugging
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
PauseEnd(pMenu);
|
PauseEnd(pMenu);
|
||||||
ShowQuickMessage("Download started");
|
ShowQuickMessage("Download started");
|
||||||
|
@ -255,6 +290,9 @@ void PauseMenuOnSelect(VariantList *pVList) //0=vec2 point of click, 1=entity se
|
||||||
#ifdef PLATFORM_HTML5
|
#ifdef PLATFORM_HTML5
|
||||||
HTMLUploadFileToFileSystem();
|
HTMLUploadFileToFileSystem();
|
||||||
// HTMLDownloadFileFromFileSystem(DinkGetSavePath() + "quicksave.dat", g_dglo.m_dmodGameDir + "_quicksave.dat");
|
// HTMLDownloadFileFromFileSystem(DinkGetSavePath() + "quicksave.dat", g_dglo.m_dmodGameDir + "_quicksave.dat");
|
||||||
|
#else
|
||||||
|
|
||||||
|
GetMessageManager()->SendGUIStringEx(MESSAGE_TYPE_HTML5_GOT_UPLOAD, 0, 0, 0, "purpoise_quicksave.dat", 0);
|
||||||
#endif
|
#endif
|
||||||
PauseEnd(pMenu);
|
PauseEnd(pMenu);
|
||||||
|
|
||||||
|
@ -420,9 +458,9 @@ Entity * PauseMenuCreate(Entity *pParentEnt)
|
||||||
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
|
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
|
||||||
|
|
||||||
//next button
|
//next button
|
||||||
// pButton = CreateTextButtonEntity(pBG, "ExportNormalSave", vEntPos.x, (vEntPos.y + vEntSize.y / 2) + spacer+spacer, "(Export last save slot save)", true);
|
pButton = CreateTextButtonEntity(pBG, "ExportNormalSave", vEntPos.x, (vEntPos.y + vEntSize.y / 2) + spacer+spacer, "(Export save slot to file)", true);
|
||||||
// SetAlignmentEntity(pButton, ALIGNMENT_DOWN_CENTER);
|
SetAlignmentEntity(pButton, ALIGNMENT_DOWN_CENTER);
|
||||||
// pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
|
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -445,11 +483,13 @@ Entity * PauseMenuCreate(Entity *pParentEnt)
|
||||||
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
|
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
|
||||||
SetButtonStyleEntity(pButton, Button2DComponent::BUTTON_STYLE_CLICK_ON_TOUCH); //to get around HTML5 rules on uploading, required because it's only
|
SetButtonStyleEntity(pButton, Button2DComponent::BUTTON_STYLE_CLICK_ON_TOUCH); //to get around HTML5 rules on uploading, required because it's only
|
||||||
//allowed when initiated by a user click
|
//allowed when initiated by a user click
|
||||||
//
|
|
||||||
// //next button
|
//next button
|
||||||
// pButton = CreateTextButtonEntity(pBG, "ImportNormalSave", vEntPos.x, (vEntPos.y + vEntSize.y / 2) + spacer + spacer, "(Import save slot file)", true);
|
pButton = CreateTextButtonEntity(pBG, "ImportNormalSave", vEntPos.x, (vEntPos.y + vEntSize.y / 2) + spacer + spacer, "(Import save slot file)", true);
|
||||||
// SetAlignmentEntity(pButton, ALIGNMENT_DOWN_CENTER);
|
SetAlignmentEntity(pButton, ALIGNMENT_DOWN_CENTER);
|
||||||
// pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
|
pButton->GetShared()->GetFunction("OnButtonSelected")->sig_function.connect(&PauseMenuOnSelect);
|
||||||
|
SetButtonStyleEntity(pButton, Button2DComponent::BUTTON_STYLE_CLICK_ON_TOUCH); //to get around HTML5 rules on uploading, required because it's only
|
||||||
|
//allowed when initiated by a user click
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,4 +7,5 @@ Entity * PauseMenuCreate(Entity *pParentEnt);
|
||||||
Entity * DinkQuitGame(); //kills dink and loads the appropriate last menu and returns a pointer to it
|
Entity * DinkQuitGame(); //kills dink and loads the appropriate last menu and returns a pointer to it
|
||||||
void PlayMenuMusic();
|
void PlayMenuMusic();
|
||||||
Entity * DinkRestartGame();
|
Entity * DinkRestartGame();
|
||||||
|
Entity * DinkQuitGame();
|
||||||
#endif // PauseMenu_h__
|
#endif // PauseMenu_h__
|
|
@ -213,6 +213,11 @@ void PopUpCreate(Entity *pEnt, string msg, string url, string button1Action, str
|
||||||
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
||||||
pLabel->GetFunction("OnButtonSelected")->sig_function.connect(&PopUpMenuOnSelect);
|
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
|
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);
|
FadeInEntity(pButton, true, 300, 250);
|
||||||
if (button2Label.empty())
|
if (button2Label.empty())
|
||||||
{
|
{
|
||||||
|
@ -228,6 +233,11 @@ void PopUpCreate(Entity *pEnt, string msg, string url, string button1Action, str
|
||||||
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
||||||
pLabel->GetFunction("OnButtonSelected")->sig_function.connect(&PopUpMenuOnSelect);
|
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
|
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);
|
FadeInEntity(pButton, true, 300, 350);
|
||||||
|
|
||||||
if (button3Label.empty())
|
if (button3Label.empty())
|
||||||
|
@ -246,6 +256,11 @@ void PopUpCreate(Entity *pEnt, string msg, string url, string button1Action, str
|
||||||
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
pLabel->GetVar("alignment")->Set(uint32(ALIGNMENT_CENTER));
|
||||||
pLabel->GetFunction("OnButtonSelected")->sig_function.connect(&PopUpMenuOnSelect);
|
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
|
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);
|
FadeInEntity(pButton, true, 300, 450);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ DinkGlobals g_dglo;
|
||||||
DinkGlobalsStatic g_dglos; //static data, made to write/read from disk
|
DinkGlobalsStatic g_dglos; //static data, made to write/read from disk
|
||||||
|
|
||||||
int32 g_spriteRank[C_MAX_SPRITES_AT_ONCE];
|
int32 g_spriteRank[C_MAX_SPRITES_AT_ONCE];
|
||||||
|
string g_lastSaveSlotFileSaved;
|
||||||
|
|
||||||
int32 C_DINK_MEM_MAX_ALLOWED = (1024*1024*20);
|
int32 C_DINK_MEM_MAX_ALLOWED = (1024*1024*20);
|
||||||
int32 C_DINK_TEX_MEM_MAX_ALLOWED = (1024*1024*60);
|
int32 C_DINK_TEX_MEM_MAX_ALLOWED = (1024*1024*60);
|
||||||
|
@ -1016,6 +1016,7 @@ void save_game(int num)
|
||||||
CreateDirectoryRecursively(g_dglo.m_savePath, g_dglo.m_gameDir);
|
CreateDirectoryRecursively(g_dglo.m_savePath, g_dglo.m_gameDir);
|
||||||
sprintf(crap, "%ssave%d.dat", g_dglo.m_savePath.c_str(), num);
|
sprintf(crap, "%ssave%d.dat", g_dglo.m_savePath.c_str(), num);
|
||||||
fp = fopen(crap, "wb");
|
fp = fopen(crap, "wb");
|
||||||
|
g_lastSaveSlotFileSaved = crap;
|
||||||
|
|
||||||
if (!fp)
|
if (!fp)
|
||||||
{
|
{
|
||||||
|
@ -16843,6 +16844,7 @@ string GetDMODRootPath(string *pDMODNameOutOrNull)
|
||||||
|
|
||||||
void InitDinkPaths(string gamePath, string gameDir, string dmodGameDir)
|
void InitDinkPaths(string gamePath, string gameDir, string dmodGameDir)
|
||||||
{
|
{
|
||||||
|
g_lastSaveSlotFileSaved = "";
|
||||||
|
|
||||||
string dmodPath;
|
string dmodPath;
|
||||||
if (!dmodGameDir.empty())
|
if (!dmodGameDir.empty())
|
||||||
|
@ -16881,6 +16883,8 @@ void InitDinkPaths(string gamePath, string gameDir, string dmodGameDir)
|
||||||
|
|
||||||
bool InitDinkEngine()
|
bool InitDinkEngine()
|
||||||
{
|
{
|
||||||
|
g_lastSaveSlotFileSaved = "";
|
||||||
|
|
||||||
OneTimeDinkInit();
|
OneTimeDinkInit();
|
||||||
finiObjects();
|
finiObjects();
|
||||||
SetDefaultVars(true);
|
SetDefaultVars(true);
|
||||||
|
@ -17614,6 +17618,53 @@ bool SaveState(string const &path, bool bSyncSaves)
|
||||||
return bOk; //success
|
return bOk; //success
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GetDMODDirFromState(string const &path, string &dmodDirOut)
|
||||||
|
{
|
||||||
|
LogMsg("Loading %s", path.c_str());
|
||||||
|
FILE *fp = fopen(path.c_str(), "rb");
|
||||||
|
|
||||||
|
if (!fp)
|
||||||
|
{
|
||||||
|
LogMsg("Unable to load state, file not found");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
float version;
|
||||||
|
LoadFromFile(version, fp);
|
||||||
|
if (version < SAVE_FORMAT_VERSION) //save_state_version
|
||||||
|
{
|
||||||
|
LogMsg("Save state from newer version?!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
string unused;
|
||||||
|
|
||||||
|
LoadFromFile(dmodDirOut, fp);
|
||||||
|
LoadFromFile(unused, fp);
|
||||||
|
|
||||||
|
StringReplace("\\", "/", dmodDirOut);
|
||||||
|
bool bDidRemoveTrailingSlash = false;
|
||||||
|
|
||||||
|
if (dmodDirOut[dmodDirOut.length() - 1] == '/')
|
||||||
|
{
|
||||||
|
dmodDirOut = dmodDirOut.substr(0, dmodDirOut.length() - 1);
|
||||||
|
bDidRemoveTrailingSlash = true;
|
||||||
|
}
|
||||||
|
int index = dmodDirOut.find_last_of('/');
|
||||||
|
if (index != string::npos)
|
||||||
|
{
|
||||||
|
//just grab the last dmod dir part
|
||||||
|
dmodDirOut = dmodDirOut.substr(index+1, dmodDirOut.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
if (bDidRemoveTrailingSlash)
|
||||||
|
{
|
||||||
|
//put it back
|
||||||
|
dmodDirOut += "/";
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool LoadState(string const &path, bool bLoadPathsOnly)
|
bool LoadState(string const &path, bool bLoadPathsOnly)
|
||||||
{
|
{
|
||||||
|
@ -17853,12 +17904,18 @@ void SaveAutoSave()
|
||||||
ShowQuickMessage("(Auto-saved)");
|
ShowQuickMessage("(Auto-saved)");
|
||||||
};
|
};
|
||||||
|
|
||||||
void LoadStateWithExtra()
|
void LoadStateWithExtra(string forcedFileName)
|
||||||
{
|
{
|
||||||
if (!lpDDSBack || g_dglo.m_curLoadState != FINISHED_LOADING) return;
|
if (!lpDDSBack || g_dglo.m_curLoadState != FINISHED_LOADING) return;
|
||||||
|
|
||||||
//LogMsg("Loading state");
|
//LogMsg("Loading state");
|
||||||
string fName = DinkGetSavePath()+"quicksave.dat";
|
string fName = DinkGetSavePath()+"quicksave.dat";
|
||||||
|
|
||||||
|
if (!forcedFileName.empty())
|
||||||
|
{
|
||||||
|
fName = forcedFileName;
|
||||||
|
}
|
||||||
|
|
||||||
GetAudioManager()->Play("audio/quick_load.wav");
|
GetAudioManager()->Play("audio/quick_load.wav");
|
||||||
LoadState(fName, false);
|
LoadState(fName, false);
|
||||||
ShowQuickMessage("State loaded.");
|
ShowQuickMessage("State loaded.");
|
||||||
|
|
|
@ -732,6 +732,7 @@ enum eDinkGameState
|
||||||
};
|
};
|
||||||
extern DinkGlobals g_dglo;
|
extern DinkGlobals g_dglo;
|
||||||
extern DinkGlobalsStatic g_dglos; //static data, made to write/read from disk
|
extern DinkGlobalsStatic g_dglos; //static data, made to write/read from disk
|
||||||
|
extern string g_lastSaveSlotFileSaved;
|
||||||
|
|
||||||
bool load_game_small(int num, char * line, int *mytime);
|
bool load_game_small(int num, char * line, int *mytime);
|
||||||
void InitDinkPaths(string gamePath, string gameDir, string dmodGameDir);
|
void InitDinkPaths(string gamePath, string gameDir, string dmodGameDir);
|
||||||
|
@ -752,6 +753,7 @@ void DinkUnloadUnusedGraphicsByUsageTime(unsigned int timeMS);
|
||||||
|
|
||||||
bool LoadState(string const &path, bool bLoadPathsOnly);
|
bool LoadState(string const &path, bool bLoadPathsOnly);
|
||||||
bool SaveState(string const &path, bool bSyncSaves = true);
|
bool SaveState(string const &path, bool bSyncSaves = true);
|
||||||
|
bool GetDMODDirFromState(string const &path, string &dmodDirOut);
|
||||||
eDinkGameState GetDinkGameState();
|
eDinkGameState GetDinkGameState();
|
||||||
void SetDinkGameState(eDinkGameState state);
|
void SetDinkGameState(eDinkGameState state);
|
||||||
void DinkModStrength(int mod);
|
void DinkModStrength(int mod);
|
||||||
|
@ -770,7 +772,7 @@ void DinkAddBow();
|
||||||
bool DinkGetSpeedUpMode();
|
bool DinkGetSpeedUpMode();
|
||||||
void DinkSetSpeedUpMode(bool bSpeedup);
|
void DinkSetSpeedUpMode(bool bSpeedup);
|
||||||
void SaveStateWithExtra();
|
void SaveStateWithExtra();
|
||||||
void LoadStateWithExtra();
|
void LoadStateWithExtra(string forcedFileName="");
|
||||||
void SaveAutoSave();
|
void SaveAutoSave();
|
||||||
void DinkOnForeground();
|
void DinkOnForeground();
|
||||||
string GetDMODStaticRootPath();
|
string GetDMODStaticRootPath();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue