source: ps/trunk/binaries/data/mods/public/gui/replaymenu/replay_actions.js@ 23783

Last change on this file since 23783 was 23783, checked in by bb, 4 years ago

Cleanup summary selection

Fixes some issues from rP20644
Reviewed By: Freagarach
Noticed By: elexis
Differential Revision: https://code.wildfiregames.com/D1205

  • Property svn:eol-style set to native
File size: 6.0 KB
Line 
1/**
2 * Creates the data for restoring selection, order and filters when returning to the replay menu.
3 */
4function createReplaySelectionData(selectedDirectory)
5{
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");
17
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 };
35}
36
37/**
38 * Starts the selected visual replay, or shows an error message in case of incompatibility.
39 */
40function startReplay()
41{
42 var selected = Engine.GetGUIObjectByName("replaySelection").selected;
43 if (selected == -1)
44 return;
45
46 var replay = g_ReplaysFiltered[selected];
47 if (isReplayCompatible(replay))
48 reallyStartVisualReplay(replay.directory);
49 else
50 displayReplayCompatibilityError(replay);
51}
52
53/**
54 * Attempts the visual replay, regardless of the compatibility.
55 *
56 * @param replayDirectory {string}
57 */
58function reallyStartVisualReplay(replayDirectory)
59{
60 if (!Engine.StartVisualReplay(replayDirectory))
61 {
62 warn('Replay "' + escapeText(Engine.GetReplayDirectoryName(replayDirectory)) + '" not found! Please click on reload cache.');
63 return;
64 }
65
66 Engine.SwitchGuiPage("page_loading.xml", {
67 "attribs": Engine.GetReplayAttributes(replayDirectory),
68 "playerAssignments": {
69 "local": {
70 "name": singleplayerName(),
71 "player": -1
72 }
73 },
74 "savedGUIData": "",
75 "replaySelectionData": createReplaySelectionData(replayDirectory)
76 });
77}
78
79/**
80 * Shows an error message stating why the replay is not compatible.
81 *
82 * @param replay {Object}
83 */
84function displayReplayCompatibilityError(replay)
85{
86 var errMsg;
87 if (replayHasSameEngineVersion(replay))
88 {
89 let gameMods = replay.attribs.mods || [];
90 errMsg = translate("This replay needs a different sequence of mods:") + "\n" +
91 comparedModsString(gameMods, g_EngineInfo.mods);
92 }
93 else
94 {
95 errMsg = translate("This replay is not compatible with your version of the game!") + "\n";
96 errMsg += sprintf(translate("Your version: %(version)s"), { "version": g_EngineInfo.engine_version }) + "\n";
97 errMsg += sprintf(translate("Required version: %(version)s"), { "version": replay.attribs.engine_version });
98 }
99
100 messageBox(500, 200, errMsg, translate("Incompatible replay"));
101}
102
103/**
104 * Opens the summary screen of the given replay, if its data was found in that directory.
105 */
106function showReplaySummary()
107{
108 var selected = Engine.GetGUIObjectByName("replaySelection").selected;
109 if (selected == -1)
110 return;
111
112 // Load summary screen data from the selected replay directory
113 let simData = Engine.GetReplayMetadata(g_ReplaysFiltered[selected].directory);
114
115 if (!simData)
116 {
117 messageBox(500, 200, translate("No summary data available."), translate("Error"));
118 return;
119 }
120
121 Engine.SwitchGuiPage("page_summary.xml", {
122 "sim": simData,
123 "gui": {
124 "dialog": false,
125 "isReplay": true,
126 "replayDirectory": g_ReplaysFiltered[selected].directory,
127 "replaySelectionData": createReplaySelectionData(g_ReplaysFiltered[selected].directory),
128 "summarySelection": g_SummarySelection
129 }
130 });
131}
132
133function reloadCache()
134{
135 let selected = Engine.GetGUIObjectByName("replaySelection").selected;
136 loadReplays(selected > -1 ? createReplaySelectionData(g_ReplaysFiltered[selected].directory) : "", true);
137}
138
139/**
140 * Callback.
141 */
142function deleteReplayButtonPressed()
143{
144 if (!Engine.GetGUIObjectByName("deleteReplayButton").enabled)
145 return;
146
147 if (Engine.HotkeyIsPressed("session.savedgames.noconfirmation"))
148 deleteReplayWithoutConfirmation();
149 else
150 deleteReplay();
151}
152/**
153 * Shows a confirmation dialog and deletes the selected replay from the disk in case.
154 */
155function deleteReplay()
156{
157 // Get selected replay
158 var selected = Engine.GetGUIObjectByName("replaySelection").selected;
159 if (selected == -1)
160 return;
161
162 var replay = g_ReplaysFiltered[selected];
163
164 messageBox(
165 500, 200,
166 translate("Are you sure you want to delete this replay permanently?") + "\n" +
167 escapeText(Engine.GetReplayDirectoryName(replay.directory)),
168 translate("Delete replay"),
169 [translate("No"), translate("Yes")],
170 [null, function() { reallyDeleteReplay(replay.directory); }]
171 );
172}
173
174/**
175 * Attempts to delete the selected replay from the disk.
176 */
177function deleteReplayWithoutConfirmation()
178{
179 var selected = Engine.GetGUIObjectByName("replaySelection").selected;
180 if (selected > -1)
181 reallyDeleteReplay(g_ReplaysFiltered[selected].directory);
182}
183
184/**
185 * Attempts to delete the given replay directory from the disk.
186 *
187 * @param replayDirectory {string}
188 */
189function reallyDeleteReplay(replayDirectory)
190{
191 var replaySelection = Engine.GetGUIObjectByName("replaySelection");
192 var selectedIndex = replaySelection.selected;
193
194 if (!Engine.DeleteReplay(replayDirectory))
195 error("Could not delete replay!");
196
197 // Refresh replay list
198 init();
199
200 replaySelection.selected = Math.min(selectedIndex, g_ReplaysFiltered.length - 1);
201}
Note: See TracBrowser for help on using the repository browser.