Fixes some bugs related to deleting saved games (in particular, load/delete was broken if the file was deleted externally while the game was running).
Adds saved game directory to the hotload watch list. Logs error instead of crashing when saved game is not found. Changes Atlas double-click selection to only pick units from the same player. This was SVN commit r11332.
This commit is contained in:
parent
e57730ecce
commit
4eec2bf5d2
@ -26,6 +26,7 @@ function init()
|
|||||||
if (savedGames.length == 0)
|
if (savedGames.length == 0)
|
||||||
{
|
{
|
||||||
gameSelection.list = [ "No saved games found" ];
|
gameSelection.list = [ "No saved games found" ];
|
||||||
|
gameSelection.selected = 0;
|
||||||
getGUIObjectByName("loadGameButton").enabled = false;
|
getGUIObjectByName("loadGameButton").enabled = false;
|
||||||
getGUIObjectByName("deleteGameButton").enabled = false;
|
getGUIObjectByName("deleteGameButton").enabled = false;
|
||||||
return;
|
return;
|
||||||
@ -47,12 +48,21 @@ function loadGame()
|
|||||||
var gameID = gameSelection.list_data[gameSelection.selected];
|
var gameID = gameSelection.list_data[gameSelection.selected];
|
||||||
|
|
||||||
var metadata = Engine.StartSavedGame(gameID);
|
var metadata = Engine.StartSavedGame(gameID);
|
||||||
|
if (!metadata)
|
||||||
Engine.SwitchGuiPage("page_loading.xml", {
|
{
|
||||||
"attribs": metadata.initAttributes,
|
// Probably the file wasn't found
|
||||||
"isNetworked" : false,
|
// Show error and refresh saved game list
|
||||||
"playerAssignments": metadata.gui.playerAssignments
|
error("Could not load saved game '"+gameID+"'");
|
||||||
});
|
init();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Engine.SwitchGuiPage("page_loading.xml", {
|
||||||
|
"attribs": metadata.initAttributes,
|
||||||
|
"isNetworked" : false,
|
||||||
|
"playerAssignments": metadata.gui.playerAssignments
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteGame()
|
function deleteGame()
|
||||||
@ -71,7 +81,7 @@ function reallyDeleteGame(gameID)
|
|||||||
{
|
{
|
||||||
if (!Engine.DeleteSavedGame(gameID))
|
if (!Engine.DeleteSavedGame(gameID))
|
||||||
{
|
{
|
||||||
warn("Could not delete saved game '"+gameID+"'");
|
error("Could not delete saved game '"+gameID+"'");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run init again to refresh saved game list
|
// Run init again to refresh saved game list
|
||||||
|
@ -213,7 +213,6 @@ CScriptVal StartSavedGame(void* cbdata, std::wstring name)
|
|||||||
CScriptValRooted metadata;
|
CScriptValRooted metadata;
|
||||||
std::string savedState;
|
std::string savedState;
|
||||||
Status err = SavedGames::Load(name, guiManager->GetScriptInterface(), metadata, savedState);
|
Status err = SavedGames::Load(name, guiManager->GetScriptInterface(), metadata, savedState);
|
||||||
WARN_IF_ERR(err);
|
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return CScriptVal();
|
return CScriptVal();
|
||||||
|
|
||||||
|
@ -454,7 +454,7 @@ static void InitVfs(const CmdLineArgs& args)
|
|||||||
g_VFS = CreateVfs(cacheSize);
|
g_VFS = CreateVfs(cacheSize);
|
||||||
|
|
||||||
g_VFS->Mount(L"screenshots/", paths.Data()/"screenshots"/"");
|
g_VFS->Mount(L"screenshots/", paths.Data()/"screenshots"/"");
|
||||||
g_VFS->Mount(L"saves/", paths.Data()/"saves"/"");
|
g_VFS->Mount(L"saves/", paths.Data()/"saves"/"", VFS_MOUNT_WATCH);
|
||||||
const OsPath readonlyConfig = paths.RData()/"config"/"";
|
const OsPath readonlyConfig = paths.RData()/"config"/"";
|
||||||
g_VFS->Mount(L"config/", readonlyConfig);
|
g_VFS->Mount(L"config/", readonlyConfig);
|
||||||
if(readonlyConfig != paths.Config())
|
if(readonlyConfig != paths.Config())
|
||||||
|
@ -144,6 +144,10 @@ Status SavedGames::Load(const std::wstring& name, ScriptInterface& scriptInterfa
|
|||||||
const VfsPath basename(L"saves/" + name);
|
const VfsPath basename(L"saves/" + name);
|
||||||
const VfsPath filename = basename.ChangeExtension(L".0adsave");
|
const VfsPath filename = basename.ChangeExtension(L".0adsave");
|
||||||
|
|
||||||
|
// Don't crash just because file isn't found, this can happen if the file is deleted from the OS
|
||||||
|
if (!VfsFileExists(filename))
|
||||||
|
return ERR::FILE_NOT_FOUND;
|
||||||
|
|
||||||
OsPath realPath;
|
OsPath realPath;
|
||||||
WARN_RETURN_STATUS_IF_ERR(g_VFS->GetRealPath(filename, realPath));
|
WARN_RETURN_STATUS_IF_ERR(g_VFS->GetRealPath(filename, realPath));
|
||||||
|
|
||||||
|
@ -478,10 +478,17 @@ QUERYHANDLER(PickSimilarObjects)
|
|||||||
{
|
{
|
||||||
CmpPtr<ICmpTemplateManager> cmpTemplateManager(*g_Game->GetSimulation2(), SYSTEM_ENTITY);
|
CmpPtr<ICmpTemplateManager> cmpTemplateManager(*g_Game->GetSimulation2(), SYSTEM_ENTITY);
|
||||||
ENSURE(cmpTemplateManager);
|
ENSURE(cmpTemplateManager);
|
||||||
std::string templateName = cmpTemplateManager->GetCurrentTemplateName((entity_id_t)msg->id);
|
|
||||||
|
|
||||||
// Since owner selections are meaningless in Atlas, use INVALID_PLAYER
|
entity_id_t ent = msg->id;
|
||||||
msg->ids = EntitySelection::PickSimilarEntities(*g_Game->GetSimulation2(), *g_Game->GetView()->GetCamera(), templateName, INVALID_PLAYER, false, true, true);
|
std::string templateName = cmpTemplateManager->GetCurrentTemplateName(ent);
|
||||||
|
|
||||||
|
// If unit has ownership, only pick units from the same player
|
||||||
|
player_id_t owner = INVALID_PLAYER;
|
||||||
|
CmpPtr<ICmpOwnership> cmpOwnership(*g_Game->GetSimulation2(), ent);
|
||||||
|
if (cmpOwnership)
|
||||||
|
owner = cmpOwnership->GetOwner();
|
||||||
|
|
||||||
|
msg->ids = EntitySelection::PickSimilarEntities(*g_Game->GetSimulation2(), *g_Game->GetView()->GetCamera(), templateName, owner, false, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user