Add "has" helper function to TileClass, so that one can find out if the given tile...
[0ad.git] / binaries / data / mods / public / gui / replaymenu / replay_actions.js
blob3b642e4166dc8bea1c96ea40a4b6c8be32ec4ed4
1 /**
2  * Creates the data for restoring selection, order and filters when returning to the replay menu.
3  */
4 function createReplaySelectionData(selectedDirectory)
6         let replaySelection = Engine.GetGUIObjectByName("replaySelection");
7         let dateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter");
8         let playersFilter = Engine.GetGUIObjectByName("playersFilter");
9         let mapNameFilter = Engine.GetGUIObjectByName("mapNameFilter");
10         let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter");
11         let populationFilter = Engine.GetGUIObjectByName("populationFilter");
12         let durationFilter = Engine.GetGUIObjectByName("durationFilter");
13         let compatibilityFilter = Engine.GetGUIObjectByName("compatibilityFilter");
14         let singleplayerFilter = Engine.GetGUIObjectByName("singleplayerFilter");
15         let victoryConFilter = Engine.GetGUIObjectByName("victoryConditionFilter");
16         let ratedGamesFilter = Engine.GetGUIObjectByName("ratedGamesFilter");
18         return {
19                 "directory": selectedDirectory,
20                 "column": replaySelection.selected_column,
21                 "columnOrder": replaySelection.selected_column_order,
22                 "filters": {
23                         "date": dateTimeFilter.list_data[dateTimeFilter.selected],
24                         "playernames": playersFilter.caption,
25                         "mapName": mapNameFilter.list_data[mapNameFilter.selected],
26                         "mapSize": mapSizeFilter.list_data[mapSizeFilter.selected],
27                         "popCap": populationFilter.list_data[populationFilter.selected],
28                         "duration": durationFilter.list_data[durationFilter.selected],
29                         "compatibility": compatibilityFilter.checked,
30                         "singleplayer": singleplayerFilter.list_data[singleplayerFilter.selected],
31                         "victoryCondition": victoryConFilter.list_data[victoryConFilter.selected],
32                         "ratedGames": ratedGamesFilter.selected
33                 }
34         };
37 /**
38  * Starts the selected visual replay, or shows an error message in case of incompatibility.
39  */
40 function startReplay()
42         var selected = Engine.GetGUIObjectByName("replaySelection").selected;
43         if (selected == -1)
44                 return;
46         var replay = g_ReplaysFiltered[selected];
47         if (isReplayCompatible(replay))
48                 reallyStartVisualReplay(replay.directory);
49         else
50                 displayReplayCompatibilityError(replay);
53 /**
54  * Attempts the visual replay, regardless of the compatibility.
55  *
56  * @param replayDirectory {string}
57  */
58 function reallyStartVisualReplay(replayDirectory)
60         if (!Engine.StartVisualReplay(replayDirectory))
61         {
62                 warn('Replay "' + escapeText(Engine.GetReplayDirectoryName(replayDirectory)) + '" not found! Please click on reload cache.');
63                 return;
64         }
66         Engine.SwitchGuiPage("page_loading.xml", {
67                 "attribs": Engine.GetReplayAttributes(replayDirectory),
68                 "isNetworked": false,
69                 "playerAssignments": {
70                         "local": {
71                                 "name": singleplayerName(),
72                                 "player": -1
73                         }
74                 },
75                 "savedGUIData": "",
76                 "isReplay": true,
77                 "replaySelectionData": createReplaySelectionData(replayDirectory)
78         });
81 /**
82  * Shows an error message stating why the replay is not compatible.
83  *
84  * @param replay {Object}
85  */
86 function displayReplayCompatibilityError(replay)
88         var errMsg;
89         if (replayHasSameEngineVersion(replay))
90         {
91                 let gameMods = replay.attribs.mods || [];
92                 errMsg = translate("This replay needs a different sequence of mods:") + "\n" +
93                         comparedModsString(gameMods, g_EngineInfo.mods);
94         }
95         else
96         {
97                 errMsg = translate("This replay is not compatible with your version of the game!") + "\n";
98                 errMsg += sprintf(translate("Your version: %(version)s"), { "version": g_EngineInfo.engine_version }) + "\n";
99                 errMsg += sprintf(translate("Required version: %(version)s"), { "version": replay.attribs.engine_version });
100         }
102         messageBox(500, 200, errMsg, translate("Incompatible replay"));
106  * Opens the summary screen of the given replay, if its data was found in that directory.
107  */
108 function showReplaySummary()
110         var selected = Engine.GetGUIObjectByName("replaySelection").selected;
111         if (selected == -1)
112                 return;
114         // Load summary screen data from the selected replay directory
115         let simData = Engine.GetReplayMetadata(g_ReplaysFiltered[selected].directory);
117         if (!simData)
118         {
119                 messageBox(500, 200, translate("No summary data available."), translate("Error"));
120                 return;
121         }
123         Engine.SwitchGuiPage("page_summary.xml", {
124                 "sim": simData,
125                 "gui": {
126                         "dialog": false,
127                         "isReplay": true,
128                         "replayDirectory": g_ReplaysFiltered[selected].directory,
129                         "replaySelectionData": createReplaySelectionData(g_ReplaysFiltered[selected].directory)
130                 },
131                 "selectedData": g_SummarySelectedData
132         });
135 function reloadCache()
137         let selected = Engine.GetGUIObjectByName("replaySelection").selected;
138         loadReplays(selected > -1 ? createReplaySelectionData(g_ReplaysFiltered[selected].directory) : "", true);
142  * Callback.
143  */
144 function deleteReplayButtonPressed()
146         if (!Engine.GetGUIObjectByName("deleteReplayButton").enabled)
147                 return;
149         if (Engine.HotkeyIsPressed("session.savedgames.noconfirmation"))
150                 deleteReplayWithoutConfirmation();
151         else
152                 deleteReplay();
155  * Shows a confirmation dialog and deletes the selected replay from the disk in case.
156  */
157 function deleteReplay()
159         // Get selected replay
160         var selected = Engine.GetGUIObjectByName("replaySelection").selected;
161         if (selected == -1)
162                 return;
164         var replay = g_ReplaysFiltered[selected];
166         messageBox(
167                 500, 200,
168                 translate("Are you sure you want to delete this replay permanently?") + "\n" +
169                         escapeText(Engine.GetReplayDirectoryName(replay.directory)),
170                 translate("Delete replay"),
171                 [translate("No"), translate("Yes")],
172                 [null, function() { reallyDeleteReplay(replay.directory); }]
173         );
177  * Attempts to delete the selected replay from the disk.
178  */
179 function deleteReplayWithoutConfirmation()
181         var selected = Engine.GetGUIObjectByName("replaySelection").selected;
182         if (selected > -1)
183                 reallyDeleteReplay(g_ReplaysFiltered[selected].directory);
187  * Attempts to delete the given replay directory from the disk.
189  * @param replayDirectory {string}
190  */
191 function reallyDeleteReplay(replayDirectory)
193         var replaySelection = Engine.GetGUIObjectByName("replaySelection");
194         var selectedIndex = replaySelection.selected;
196         if (!Engine.DeleteReplay(replayDirectory))
197                 error("Could not delete replay!");
199         // Refresh replay list
200         init();
202         replaySelection.selected = Math.min(selectedIndex, g_ReplaysFiltered.length - 1);