Arma Reforger Explorer  1.1.0.42
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
SCR_SaveEditorUIComponent.c
Go to the documentation of this file.
1 class SCR_SaveEditorUIComponent : ScriptedWidgetComponent
2 {
3  [Attribute()]
4  protected bool m_bIsLoad;
5 
6  [Attribute(ESaveType.USER.ToString(), uiwidget: UIWidgets.Flags, enums: ParamEnumArray.FromEnum(ESaveType))]
7  protected ESaveType m_eReadSaveTypes;
8 
9  [Attribute(ESaveType.USER.ToString(), uiwidget: UIWidgets.ComboBox, enums: ParamEnumArray.FromEnum(ESaveType))]
10  protected ESaveType m_eWriteSaveType;
11 
12  [Attribute()]
13  protected bool m_bCurrentMissionOnly;
14 
15  [Attribute("SaveScroller")]
16  protected string m_sScrollWidgetName;
17 
18  [Attribute("SaveList")]
19  protected string m_sListWidgetName;
20 
21  [Attribute("SaveNameInput")]
22  protected string m_sNameInputWidgetName;
23 
24  [Attribute("ExitButton")]
25  protected string m_sCloseButtonWidgetName;
26 
27  [Attribute("DeleteButton")]
28  protected string m_sDeleteButtonWidgetName;
29 
30  [Attribute("OverrideButton")]
31  protected string m_sOverrideButtonWidgetName;
32 
33  [Attribute("ConfirmButton")]
34  protected string m_sConfirmButtonWidgetName;
35 
36  [Attribute("ConfirmPrompt")]
37  protected string m_sConfirmPromptWidgetName;
38 
39  [Attribute("DeletePrompt")]
40  protected string m_sDeletePromptWidgetName;
41 
42  [Attribute("LoadBadVersionPrompt")]
43  protected string m_sLoadBadVersionPromptWidgetName;
44 
45  [Attribute("LoadBadAddonsPrompt")]
46  protected string m_sLoadBadAddonsPromptWidgetName;
47 
48  [Attribute("EntryName")]
49  protected string m_sEntryNameWidgetName;
50 
51  [Attribute("SaveMetaLine")]
52  protected string m_sEntryMeta;
53 
54  [Attribute("PreviewDate")]
55  protected string m_sEntryDateWidgetName;
56 
57  [Attribute("PreviewTime")]
58  protected string m_sEntryTimeWidgetName;
59 
60  [Attribute("PreviewWorld")]
61  protected string m_sEntryMissionNameWidgetName;
62 
63  [Attribute("EntryVersion")]
64  protected string m_sEntryVersionWidgetName;
65 
66  [Attribute("PreviewImage")]
67  protected string m_sEntryImageWidgetName;
68 
69  [Attribute("SaveImage")]
70  protected string m_sEntryIconWidgetName;
71 
72  [Attribute("false", UIWidgets.CheckBox)]
73  protected bool m_bVerboseDate;
74 
75  [Attribute(uiwidget: UIWidgets.ResourceNamePicker, params: "layout")]
76  protected ResourceName m_sCreateLayout;
77 
78  [Attribute(uiwidget: UIWidgets.ResourceNamePicker, params: "layout")]
79  protected ResourceName m_sEntryLayout;
80 
81  [Attribute("session_save_override")]
82  protected string m_sConfirmPrompt;
83 
84  [Attribute("session_delete")]
85  protected string m_sDeletePrompt;
86 
87  [Attribute("session_load_bad_version")]
88  protected string m_sLoadBadVersionPrompt;
89 
90  [Attribute("session_load_bad_addons")]
91  protected string m_sLoadBadAddonsPrompt;
92 
93  protected Widget m_wRoot;
94  protected ScrollLayoutWidget m_wScroll;
95  protected Widget m_wList;
96  protected Widget m_wLastFocusedEntry;
97 
98  protected SCR_InputButtonComponent m_DeleteButton;
99  protected SCR_InputButtonComponent m_OverrideButton;
100  protected SCR_InputButtonComponent m_ConfirmButton;
101  protected SCR_EditBoxComponent m_SaveNameInput;
102 
103  protected SCR_ConfigurableDialogUi m_ConfirmPrompt;
104  protected SCR_ConfigurableDialogUi m_DeletePrompt;
105  protected SCR_ConfigurableDialogUi m_LoadBadVersionPrompt;
106  protected SCR_ConfigurableDialogUi m_LoadBadAddonsPrompt;
107  protected SCR_LoadingOverlayDialog m_LoadingOverlay;
108 
109  protected float m_fSliderPosY = -1;
110  protected Widget m_wSelectedWidget;
111  protected string m_sSelectedFileName;
112 
113  protected ref map<Widget, string> m_mEntries = new map<Widget, string>();
114  protected ref map<string, string> m_mEntryNames = new map<string, string>(); //--- file name, display name
115  protected ref array<Widget> m_aEntriesHidden = {};
116  protected ref array<Widget> m_aEntriesToShow = {};
117 
119  // Control buttons
121 
122  //------------------------------------------------------------------------------------------------
123  protected void OnClose(SCR_InputButtonComponent button, string actionName)
124  {
125  CloseMenu();
126  }
127 
128  //----------------------------------------------------------------------------------------
129  protected void OnConfirm(SCR_InputButtonComponent button, string actionName)
130  {
131  // Save dialogs
132  if (!m_bIsLoad)
133  {
134  string customName = m_SaveNameInput.GetValue();
135  if (GetGame().GetSaveManager().FileExists(m_eWriteSaveType, customName))
136  {
137  //--- Confirm prompt
138  m_ConfirmPrompt = SCR_ConfigurableDialogUi.CreateFromPreset(SCR_CommonDialogs.DIALOGS_CONFIG, m_sConfirmPrompt);
139  m_ConfirmPrompt.m_OnConfirm.Insert(OnConfirmPrompt);
140  }
141  else
142  {
143  //--- Creating a new file - save directly
144  OnConfirmPrompt();
145  return;
146  }
147 
148  m_ConfirmPrompt.SetTitle(m_SaveNameInput.GetValue());
149  return;
150  }
151 
152  //--- Loading a file leads to restart, ask first
153  string displayName = m_mEntryNames[m_sSelectedFileName];
154  string fileName;
155  if (m_mEntries.Find(GetGame().GetWorkspace().GetFocusedWidget(), fileName))
156  {
157  SCR_MetaStruct meta = GetGame().GetSaveManager().GetMeta(fileName);
158  if (meta)
159  {
160  if (!meta.IsVersionCompatible())
161  {
162  // Warning - incompatible version
163  m_LoadBadVersionPrompt = SCR_ConfigurableDialogUi.CreateFromPreset(SCR_CommonDialogs.DIALOGS_CONFIG, m_sLoadBadVersionPrompt);
164  m_LoadBadVersionPrompt.m_OnConfirm.Insert(LoadEntry);
165  m_LoadBadVersionPrompt.SetTitle(displayName);
166  return;
167  }
168  else if (!meta.AreAddonsCompatible())
169  {
170  // Warning - incompatible addons
171  m_LoadBadAddonsPrompt = SCR_ConfigurableDialogUi.CreateFromPreset(SCR_CommonDialogs.DIALOGS_CONFIG, m_sLoadBadAddonsPrompt);
172  m_LoadBadAddonsPrompt.m_OnConfirm.Insert(LoadEntry);
173  m_LoadBadAddonsPrompt.SetTitle(displayName);
174  return;
175  }
176  }
177 
178  //--- Confirm prompt
179  m_ConfirmPrompt = SCR_ConfigurableDialogUi.CreateFromPreset(SCR_CommonDialogs.DIALOGS_CONFIG, m_sConfirmPrompt);
180  m_ConfirmPrompt.m_OnConfirm.Insert(OnConfirmPrompt);
181  m_ConfirmPrompt.SetTitle(displayName);
182  }
183  }
184 
185  //----------------------------------------------------------------------------------------
186  protected void OnConfirmPrompt()
187  {
188  if (m_bIsLoad)
189  LoadEntry();
190  else
191  SaveEntry();
192 
193  CloseMenu();
194  }
195 
196  //----------------------------------------------------------------------------------------
198  protected void OnDelete(SCR_InputButtonComponent button, string actionName)
199  {
200  // Open delete dialog
201  m_DeletePrompt = SCR_ConfigurableDialogUi.CreateFromPreset(SCR_CommonDialogs.DIALOGS_CONFIG, m_sDeletePrompt); //--- ToDo: Unique tag
202  m_DeletePrompt.m_OnConfirm.Insert(OnDeletePrompt);
203 
204  // Setup string
205  string displayName = m_mEntryNames[m_sSelectedFileName];
206  m_DeletePrompt.SetTitle(displayName);
207  }
208 
209  //----------------------------------------------------------------------------------------
210  protected void OnDeletePrompt()
211  {
212  //--- Delete the file
213  GetGame().GetSaveManager().Delete(m_sSelectedFileName);
214 
215  //--- Update GUI
216  m_mEntries.Remove(m_wSelectedWidget);
217  m_mEntryNames.Remove(m_sSelectedFileName);
218 
219  m_wSelectedWidget.RemoveFromHierarchy();
220  SelectEntry(null, string.Empty);
221  }
222 
223  //----------------------------------------------------------------------------------------
224  protected void CloseMenu()
225  {
226  //--- Confirmation prompt opened, ignore
227  if (GetGame().GetWorkspace().GetModal() != m_wRoot)
228  return;
229 
230  MenuBase menu = MenuBase.Cast(m_wRoot.FindHandler(MenuBase));
231  menu.Close();
232  }
233 
235  // Main operations
237 
238  //------------------------------------------------------------------------------------------------
239  protected void SaveEntry()
240  {
241  string customName = m_SaveNameInput.GetValue();
242  GetGame().GetSaveManager().Save(m_eWriteSaveType, customName);
243  }
244 
245  //----------------------------------------------------------------------------------------
246  protected void LoadEntry()
247  {
248  string fileName;
249  if (m_mEntries.Find(m_wLastFocusedEntry, fileName))
250  {
251  SCR_SaveManagerCore saveManager = GetGame().GetSaveManager();
252 
253  saveManager.RestartAndLoad(fileName);
254 
255  if (saveManager.GetUploadCallback())
256  {
257  saveManager.GetUploadCallback().GetEventOnResponse().Insert(OnLoadEntryUploadResponse);
259  }
260  }
261  }
262 
263  //----------------------------------------------------------------------------------------
264  protected void OnLoadEntryUploadResponse(SCR_BackendCallback callback)
265  {
266  callback.GetEventOnResponse().Remove(OnLoadEntryUploadResponse);
267 
268  if (callback.GetResponseType() != EBackendCallbackResponse.SUCCESS)
269  SCR_CommonDialogs.CreateRequestErrorDialog();
270 
271  if (m_LoadingOverlay)
272  m_LoadingOverlay.Close();
273 
274  CloseMenu();
275  }
276 
278  // Interaction
280 
281  //------------------------------------------------------------------------------------------------
282  protected void SelectEntry(Widget w, string fileName)
283  {
284  string customName = GetGame().GetSaveManager().GetCustomName(fileName);
285  m_SaveNameInput.SetValue(customName);
286 
287  m_wSelectedWidget = w;
288  m_sSelectedFileName = fileName;
289 
290  UpdateButtons();
291  }
292 
293  //------------------------------------------------------------------------------------------------
294  protected void UpdateButtons()
295  {
296  string customName = m_SaveNameInput.GetValue();
297  bool isValid = !customName.IsEmpty();
298  bool isOverride = !m_bIsLoad && customName && GetGame().GetSaveManager().FileExists(m_eWriteSaveType, customName);
299 
300  if (m_bIsLoad)
301  m_DeleteButton.SetEnabled(m_sSelectedFileName && GetGame().GetSaveManager().FileExists(m_sSelectedFileName));
302  else
303  m_DeleteButton.SetEnabled(isOverride);
304 
305  m_OverrideButton.SetVisible(isOverride, false);
306  m_OverrideButton.SetEnabled(isOverride && isValid);
307 
308  m_ConfirmButton.SetVisible(!isOverride, false);
309  m_ConfirmButton.SetEnabled(!isOverride && isValid);
310  }
311 
312  //------------------------------------------------------------------------------------------------
313  protected void OnFrame()
314  {
315  //--- Ignore if all entries were shown
316  if (m_aEntriesHidden.IsEmpty())
317  {
318  GetGame().GetCallqueue().Remove(OnFrame);
319  return;
320  }
321 
322  float sliderPosX, sliderPosY;
323  m_wScroll.GetSliderPos(sliderPosX, sliderPosY);
324 
325  if (sliderPosY != m_fSliderPosY)
326  {
327  float scrollPosX, scrollPosY, scrollSizeW, scrollSizeH;
328  m_wScroll.GetScreenPos(scrollPosX, scrollPosY);
329  m_wScroll.GetScreenSize(scrollSizeW, scrollSizeH);
330 
331  //--- Widget not loaded yet, terminate
332  if (scrollSizeH == 0)
333  return;
334 
335  //--- Find widgets in view
336  foreach (int i, Widget entryWidget: m_aEntriesHidden)
337  {
338  //--- Already shown
339  if (entryWidget.GetOpacity() > 0)
340  continue;
341 
342  float posX, posY, sizeW, sizeH;
343  entryWidget.GetScreenPos(posX, posY);
344  entryWidget.GetScreenSize(sizeW, sizeH);
345 
346  if ((posY + sizeH) > scrollPosY && posY < (scrollPosY + scrollSizeH))
347  {
348  //--- When the entry is in the scrolled view, mark it for showing
349  if (!m_aEntriesToShow.Contains(entryWidget))
350  m_aEntriesToShow.Insert(entryWidget);
351  }
352  else
353  {
354  //--- When the entry is not in the scrolled view, removing it from queue of entries to show again (to prioritize entries that are actually shown)
355  m_aEntriesToShow.RemoveItemOrdered(entryWidget);
356  }
357  }
358  }
359 
360  //--- Process the queue of entries to show, with one entry per frame
361  if (!m_aEntriesToShow.IsEmpty())
362  {
363  Widget entryWidget = m_aEntriesToShow[0];
364  if (entryWidget.GetOpacity() == 0)
365  {
366  TextWidget entryNameWidget = TextWidget.Cast(entryWidget.FindAnyWidget(m_sEntryNameWidgetName));
367  ImageWidget entryImageWidget = ImageWidget.Cast(entryWidget.FindAnyWidget(m_sEntryImageWidgetName));
368  ImageWidget entryIconWidget = ImageWidget.Cast(entryWidget.FindAnyWidget(m_sEntryIconWidgetName));
369 
370  string fileName = m_mEntries[entryWidget];
371  string entryName = GetGame().GetSaveManager().GetCustomName(fileName);
372 
373  SCR_MetaStruct meta = GetGame().GetSaveManager().GetMeta(fileName);
374  if (meta && meta.IsValid())
375  {
376  int y, m, d, hh, mm;
377  meta.GetDateAndTime(y, m, d, hh, mm);
378 
379  SCR_UIInfo info = GetGame().GetSaveManager().GetSaveTypeInfo(fileName);
380  string displayName = entryName;
381  Color imageColor = Color.FromInt(Color.WHITE);
382  if (info)
383  {
384  info.SetIconTo(entryIconWidget);
385  displayName = info.GetName() + " " + displayName; //--- Hardcoded space separator, ToDo: Solve using %1 in the string itself?
386 
387  SCR_ColorUIInfo colorInfo = SCR_ColorUIInfo.Cast(info);
388  if (colorInfo)
389  imageColor = colorInfo.GetColor();
390  }
391  m_mEntryNames.Insert(fileName, displayName);
392 
393  entryNameWidget.SetText(displayName);
394 
395  TextWidget entryDateWidget = TextWidget.Cast(entryWidget.FindAnyWidget(m_sEntryDateWidgetName));
396  entryDateWidget.SetText(SCR_DateTimeHelper.GetDateString(d, m, y, m_bVerboseDate));
397 
398  TextWidget entryTimeWidget = TextWidget.Cast(entryWidget.FindAnyWidget(m_sEntryTimeWidgetName));
399  entryTimeWidget.SetText(SCR_FormatHelper.GetTimeFormattingHoursMinutes(hh, mm));
400 
401  TextWidget entryVersionWidget = TextWidget.Cast(entryWidget.FindAnyWidget(m_sEntryVersionWidgetName));
402  string versionText;
403  bool isVersionCompatible = meta.IsVersionCompatible(versionText);
404  entryVersionWidget.SetText(versionText);
405  if (!isVersionCompatible)
406  entryVersionWidget.SetColor(UIColors.WARNING);
407 
408  Resource missionHeaderResource = Resource.Load(meta.GetHeaderResource());
409  if (missionHeaderResource.IsValid())
410  {
411  SCR_MissionHeader missionHeader = SCR_MissionHeader.Cast(BaseContainerTools.CreateInstanceFromContainer(missionHeaderResource.GetResource().ToBaseContainer()));
412 
413  TextWidget entryMissionNameWidget = TextWidget.Cast(entryWidget.FindAnyWidget(m_sEntryMissionNameWidgetName));
414  entryMissionNameWidget.SetText(missionHeader.m_sName);
415 
416  if (missionHeader.m_sIcon)
417  {
418  entryImageWidget.LoadImageTexture(0, missionHeader.m_sIcon);
419  entryImageWidget.SetColor(imageColor);
420  }
421  }
422 
423  if (!meta.AreAddonsCompatible())
424  {
425  entryIconWidget.SetColor(UIColors.WARNING);
426  }
427  }
428  else
429  {
430  //--- Meta file missing or invalid
431  entryNameWidget.SetText(entryName);
432  entryImageWidget.SetVisible(false);
433 
434  Widget entryMetaWidget = entryWidget.FindAnyWidget(m_sEntryMeta);
435  entryMetaWidget.SetVisible(false);
436 
437  entryIconWidget.SetColor(Color.FromInt(UIColors.WARNING.PackToInt()));
438  }
439 
440  AnimateWidget.Opacity(entryWidget, 1, 3);
441  }
442  else if (entryWidget.GetOpacity() > 0)
443  {
444  //--- Started fading in, move on to the next entry
445  m_aEntriesToShow.RemoveOrdered(0);
446  m_aEntriesHidden.RemoveItemOrdered(entryWidget);
447  }
448  }
449 
450  m_fSliderPosY = sliderPosY;
451  }
452 
454  // Overrides
456 
457  //------------------------------------------------------------------------------------------------
458  override bool OnClick(Widget w, int x, int y, int button)
459  {
460  if (w.GetParent() != m_wList)
461  return false;
462 
463  //--- Save entry
464  string fileName;
465  if (m_mEntries.Find(w, fileName))
466  SelectEntry(w, fileName);
467 
468  return false;
469  }
470 
471  //----------------------------------------------------------------------------------------
472  override bool OnFocus(Widget w, int x, int y)
473  {
474  string fileName;
475 
476  if (m_mEntries.Find(w, fileName))
477  {
478  m_wLastFocusedEntry = w;
479  SelectEntry(w, fileName);
480  }
481 
482  return false;
483  }
484 
485  //----------------------------------------------------------------------------------------
486  override bool OnDoubleClick(Widget w, int x, int y, int button)
487  {
488  if (w.GetParent() != m_wList)
489  return false;
490 
491  //--- Select
492  OnClick(w, x, y, button);
493 
494  //--- Activate
495  OnConfirm(null, string.Empty);
496 
497  return false;
498  }
499 
500  //----------------------------------------------------------------------------------------
501  override void HandlerAttached(Widget w)
502  {
503  if (!GetGame().InPlayMode())
504  return;
505 
506  //--- Find all widgets
507  m_wRoot = w;
508  m_wList = w.FindAnyWidget(m_sListWidgetName);
509  m_wScroll = ScrollLayoutWidget.Cast(w.FindAnyWidget(m_sScrollWidgetName));
510 
511  //--- Name input field
512  m_SaveNameInput = SCR_EditBoxComponent.GetEditBoxComponent(m_sNameInputWidgetName, w);
513  m_SaveNameInput.m_OnChanged.Insert(UpdateButtons);
514 
515  //--- Assign control buttons
516  Widget closeButtonWidget = w.FindAnyWidget(m_sCloseButtonWidgetName);
517  Widget deleteButtonWidget = w.FindAnyWidget(m_sDeleteButtonWidgetName);
518  Widget overrideButtonWidget = w.FindAnyWidget(m_sOverrideButtonWidgetName);
519  Widget confirmButtonWidget = w.FindAnyWidget(m_sConfirmButtonWidgetName);
520 
521  SCR_InputButtonComponent closeButton = SCR_InputButtonComponent.Cast(closeButtonWidget.FindHandler(SCR_InputButtonComponent));
522  m_DeleteButton = SCR_InputButtonComponent.Cast(deleteButtonWidget.FindHandler(SCR_InputButtonComponent));
523  m_OverrideButton = SCR_InputButtonComponent.Cast(overrideButtonWidget.FindHandler(SCR_InputButtonComponent));
524  m_ConfirmButton = SCR_InputButtonComponent.Cast(confirmButtonWidget.FindHandler(SCR_InputButtonComponent));
525 
526  closeButton.m_OnActivated.Insert(OnClose);
527  m_DeleteButton.m_OnActivated.Insert(OnDelete);
528  m_OverrideButton.m_OnActivated.Insert(OnConfirm);
529  m_ConfirmButton.m_OnActivated.Insert(OnConfirm);
530 
531  UpdateButtons();
532 
533  //--- Clear the list first
534  SCR_WidgetHelper.RemoveAllChildren(m_wList);
535 
536  //--- Create new entries
537  array<string> fileNames = {};
538  int fileCount = GetGame().GetSaveManager().GetLocalSaveFiles(fileNames, m_eReadSaveTypes, m_bCurrentMissionOnly);
539  fileNames.Sort();
540 
541  WorkspaceWidget workspace = GetGame().GetWorkspace();
542 
543  //--- Used for testing to artifically inflate the amount of entries
544  int debugCoef = 1;
545 
546  Widget entryWidget;
547  TextWidget entryNameWidget;
548  for (int i = 0; i < fileCount * debugCoef; i++)
549  {
550  int ii = i % fileCount;
551  string fileName = fileNames[ii];
552  entryWidget = workspace.CreateWidgets(m_sEntryLayout, m_wList);
553  m_mEntries.Insert(entryWidget, fileName);
554  m_aEntriesHidden.Insert(entryWidget);
555 
556  //--- Hide by default
557  entryWidget.SetOpacity(0);
558 
559  if (m_bIsLoad && i == 0)
560  SelectEntry(entryWidget, fileName);
561  }
562 
563  //--- Initiate periodic check which will load and show metadata only for entries that are actually shown. Doing it all at once here would be too expensive.
564  GetGame().GetCallqueue().CallLater(OnFrame, 1, true);
565  }
566 
567  //----------------------------------------------------------------------------------------
568  override void HandlerDeattached(Widget w)
569  {
570  GetGame().GetCallqueue().Remove(OnFrame);
571  }
572 }
SCR_ColorUIInfo
Definition: SCR_ColorUIInfo.c:2
m_wRoot
protected Widget m_wRoot
Definition: SCR_ScenarioFrameworkLayerTaskDefend.c:59
SCR_FormatHelper
Definition: SCR_FormatHelper.c:1
GetGame
ArmaReforgerScripted GetGame()
Definition: game.c:1424
SCR_CommonDialogs
Definition: CommonDialogs.c:5
SCR_SaveEditorUIComponent
Definition: SCR_SaveEditorUIComponent.c:1
m_wList
protected Widget m_wList
Definition: SCR_DownloadManagerListComponent.c:12
SCR_BackendCallback
Scripted backend callback class unifying backend response.
Definition: SCR_BackendCallback.c:21
SCR_DateTimeHelper
Definition: SCR_DateTimeHelper.c:1
SCR_WidgetHelper
Definition: SCR_WidgetHelper.c:1
m_LoadingOverlay
protected SCR_LoadingOverlay m_LoadingOverlay
Definition: SCR_BackendImageComponent.c:250
SCR_MetaStruct
Definition: SCR_MetaStruct.c:2
ESaveType
ESaveType
Definition: ESaveType.c:1
Attribute
typedef Attribute
Post-process effect of scripted camera.
UIColors
Definition: Constants.c:16
SCR_SaveManagerCore
Definition: SCR_SaveManagerCore.c:9
SCR_LoadingOverlayDialog
Definition: SCR_LoadingOverlayDialog.c:5
SCR_UIInfo
Definition: SCR_UIInfo.c:7
SCR_ConfigurableDialogUi
Definition: SCR_ConfigurableDialogUI.c:13
EBackendCallbackResponse
EBackendCallbackResponse
Basic callback responses.
Definition: SCR_BackendCallback.c:12
SCR_EditBoxComponent
Definition: SCR_EditBoxComponent.c:8
params
Configs ServerBrowser KickDialogs params
Definition: SCR_NotificationSenderComponent.c:24
callback
DownloadConfigCallback callback
GetSaveManager
SCR_SaveManagerCore GetSaveManager()
Definition: game.c:211
SCR_MissionHeader
Definition: SCR_MissionHeader.c:1
SCR_InputButtonComponent
Definition: SCR_InputButtonComponent.c:1