Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_GameModeSetupPlugin.c
Go to the documentation of this file.
1#ifdef WORKBENCH
2[WorkbenchPluginAttribute(name: "Game Mode Setup", description: "Set ups the world for a specific game mode", wbModules: { "WorldEditor" }, awesomeFontCode: 0xF6E8)]
3class SCR_GameModeSetupPlugin : WorkbenchPlugin
4{
5 [Attribute("{6389BA4D41B187DC}Configs/Workbench/GameModeSetup/GameMaster.conf", desc: "Game mode configuration rules", params: "conf class=GameModeSetupConfig", category: "Game Mode Template")]
6 protected ResourceName m_sTemplate;
7
8 //[Attribute(category: "Game Mode Template")] //--- Used only for debugging, game crashes when recompiling Workbench scripts and running the plugin repeatedly.
9 protected ref GameModeSetupConfig m_Config;
10
11 protected bool m_bIsWorldValid;
12 protected bool m_bIsWorldAttentionNeeded;
13 protected bool m_bCanAutogenerateWorld;
14 protected bool m_bIsMissionHeaderValid;
15 protected ref array<SCR_EGameModeSetupPage> m_aPageHistory = { SCR_EGameModeSetupPage.INTRO };
16
17 protected string m_sDialogMessageValidation;
18 protected string m_sDialogMessageGeneration;
19 protected string m_sDialogMessageMissionHeader;
20
21 protected static const string CAPTION_INTRO = "Game Mode Setup";
22 protected static const string CAPTION_VALIDATION = "Game Mode Setup - World Scan";
23 protected static const string CAPTION_VALIDATION_RESULTS = "Game Mode Setup - World Scan Results";
24 protected static const string CAPTION_GENERATION = "Game Mode Setup - World Configuration";
25 protected static const string CAPTION_GENERATION_RESULTS = "Game Mode Setup - World Configuration Completed";
26 protected static const string CAPTION_MISSION_HEADER = "Game Mode Setup - Mission Header";
27 protected static const string CAPTION_MISSION_HEADER_RESULTS = "Game Mode Setup - Mission Header Created";
28 protected static const string CAPTION_OUTRO_GOOD = "Game Mode Setup - Success";
29 protected static const string CAPTION_OUTRO_BAD = "Game Mode Setup - Actions Required";
30
31 protected static const string DESCRIPTION_INTRO = "Welcome to step-by-step setup of a game mode.\nA game mode is a set of rules that define how the world will function.\nWithout it, players won't be able to try your world in game.\nEven opening the world in Game Master requires you to create a Game Master game mode for it.\n\nThe plugin will explain what's needed to get a game mode up an running,\nand offer automatic creation of required configuration.\n\nBefore we start, please select a template of the game mode you wish to set up.\n";
32 protected static const string DESCRIPTION_VALIDATION = "To know what needs to be configured the plugin will scan all entities currently present in the world.\nDepending on the size of the world, this may take several seconds or minutes.\n\nYou can decide to skip this step, but unless you understand how to set up game mode manually,\nit's better to let the plugin check the current status first.";
33 protected static const string DESCRIPTION_VALIDATION_RESULTS = "All entities scanned, results are listed below:\n";
34
35 protected static const string DESCRIPTION_GENERATION = "The plugin can now create required entities in the world.\nThey will be created in the current layer, but you can later move them to any other layer.";
36 protected static const string DESCRIPTION_GENERATION_RESULTS = "Required entities were created in the current layer.\nTry to re-scan the world to see if nothing is missing anymore.\n";
37 protected static const string DESCRIPTION_MISSION_HEADER = "For the game mode to appear in main menu's scenario list, it needs a mission header.\nIt's a config file which exists outside of the world, but points to it.\n\nIn this step you can let the plugin create the file automatically.";
38 protected static const string DESCRIPTION_MISSION_HEADER_RESULTS = "";
39 protected static const string DESCRIPTION_OUTRO_COMPLETE = "Congratulations, the game mode is configured correctly.\n\nGive it a try and hit that Play button!";
40 protected static const string DESCRIPTION_OUTRO_INCOMPLETE = "Configuration was not finished.\nTo ensure the game mode is set up correctly, please fix all issues and go through each step again.";
41
42 //------------------------------------------------------------------------------------------------
43 override void Run()
44 {
45 if (!Workbench.ScriptDialog(CAPTION_INTRO, DESCRIPTION_INTRO, this))
46 return;
47
48 string error;
49 if (!LoadConfig(error))
50 {
51 Print(CAPTION_INTRO + ": " + error, LogLevel.WARNING);
52 if (Workbench.ScriptDialog(CAPTION_INTRO, error, new SCR_GameModeSetupPluginError()) != 0)
53 Run(); // not using ShowPage to prevent filling the history
54
55 return;
56 }
57
58 //--- Next
59 ShowPage(SCR_EGameModeSetupPage.VALIDATION);
60 }
61
62 //------------------------------------------------------------------------------------------------
63 protected void RunValidation()
64 {
65 m_Config.Init();
66
67 SCR_GameModeSetupPluginValidation dialog = new SCR_GameModeSetupPluginValidation();
68 if (!Workbench.ScriptDialog(CAPTION_VALIDATION, DESCRIPTION_VALIDATION, dialog))
69 return;
70
71 m_bIsWorldValid = false;
72 switch (dialog.m_eResult)
73 {
74 case SCR_EGameModeSetupButton.BACK:
75 ShowPrevPage();
76 break;
77
78 case SCR_EGameModeSetupButton.NEXT:
79 m_sDialogMessageValidation = string.Empty;
80 m_bCanAutogenerateWorld = true;
81 m_bIsWorldValid = m_Config.ValidateWorld(m_sDialogMessageValidation, m_bCanAutogenerateWorld);
82 ShowPage(SCR_EGameModeSetupPage.VALIDATION_RESULTS);
83 break;
84
85 case SCR_EGameModeSetupButton.SKIP:
86 ShowPage(SCR_EGameModeSetupPage.GENERATION);
87 break;
88 }
89 }
90
91 //------------------------------------------------------------------------------------------------
92 protected void RunValidationResults()
93 {
94 SCR_GameModeSetupPluginResults dialog = new SCR_GameModeSetupPluginResults();
95 if (!Workbench.ScriptDialog(CAPTION_VALIDATION_RESULTS, DESCRIPTION_VALIDATION_RESULTS + m_sDialogMessageValidation, dialog))
96 return;
97
98 switch (dialog.m_eResult)
99 {
100 case SCR_EGameModeSetupButton.BACK:
101 ShowPrevPage();
102 break;
103
104 case SCR_EGameModeSetupButton.NEXT:
105 if (m_bIsWorldValid)
106 {
107 if (m_bIsMissionHeaderValid)
108 ShowPage(SCR_EGameModeSetupPage.OUTRO);
109 else
110 ShowPage(SCR_EGameModeSetupPage.MISSION_HEADER);
111 }
112 else if (!m_bCanAutogenerateWorld)
113 ShowPage(SCR_EGameModeSetupPage.OUTRO);
114 else
115 ShowPage(SCR_EGameModeSetupPage.GENERATION);
116 break;
117 }
118 }
119
120 //------------------------------------------------------------------------------------------------
121 protected void RunGeneration()
122 {
123 SCR_GameModeSetupPluginGeneration dialog = new SCR_GameModeSetupPluginGeneration();
124 if (!Workbench.ScriptDialog(CAPTION_GENERATION, DESCRIPTION_GENERATION, dialog))
125 return;
126
127 switch (dialog.m_eResult)
128 {
129 case SCR_EGameModeSetupButton.BACK:
130 ShowPrevPage();
131 break;
132
133 case SCR_EGameModeSetupButton.NEXT:
134 m_sDialogMessageGeneration = string.Empty;
135 m_bIsWorldValid = m_Config.GenerateWorld(m_sDialogMessageGeneration);
136 ShowPage(SCR_EGameModeSetupPage.GENERATION_RESULTS);
137 break;
138
139 case SCR_EGameModeSetupButton.SKIP:
140 ShowPage(SCR_EGameModeSetupPage.MISSION_HEADER);
141 break;
142 }
143 }
144
145 //------------------------------------------------------------------------------------------------
146 protected void RunGenerationResults()
147 {
148 SCR_GameModeSetupPluginGenerationResults dialog = new SCR_GameModeSetupPluginGenerationResults();
149 if (!Workbench.ScriptDialog(CAPTION_GENERATION_RESULTS, DESCRIPTION_GENERATION_RESULTS + m_sDialogMessageGeneration, dialog))
150 return;
151
152 switch (dialog.m_eResult)
153 {
154 case SCR_EGameModeSetupButton.BACK:
155 ShowPrevPage();
156 break;
157
158 case SCR_EGameModeSetupButton.NEXT:
159 ShowPage(SCR_EGameModeSetupPage.MISSION_HEADER);
160 break;
161
162 case SCR_EGameModeSetupButton.VALIDATE:
163 ShowPage(SCR_EGameModeSetupPage.VALIDATION);
164 break;
165 }
166 }
167
168 //------------------------------------------------------------------------------------------------
169 protected void RunMissionHeader()
170 {
171 //--- Mission header already exists, skip this step
172 m_bIsMissionHeaderValid = m_Config.ValidateMissionHeader(m_sDialogMessageMissionHeader);
173 if (m_bIsMissionHeaderValid)
174 {
175 m_aPageHistory.Resize(m_aPageHistory.Count() - 1);
176 ShowPage(SCR_EGameModeSetupPage.MISSION_HEADER_RESULTS);
177 return;
178 }
179
180 SCR_GameModeSetupPluginMissionHeader dialog = new SCR_GameModeSetupPluginMissionHeader();
181 if (!Workbench.ScriptDialog(CAPTION_MISSION_HEADER, DESCRIPTION_MISSION_HEADER, dialog))
182 return;
183
184 switch (dialog.m_eResult)
185 {
186 case SCR_EGameModeSetupButton.BACK:
187 ShowPrevPage();
188 break;
189
190 case SCR_EGameModeSetupButton.NEXT:
191 m_sDialogMessageMissionHeader = string.Empty;
192 m_bIsMissionHeaderValid = m_Config.GenerateMissionHeader(m_sTemplate, m_sDialogMessageMissionHeader);
193 ShowPage(SCR_EGameModeSetupPage.MISSION_HEADER_RESULTS);
194 break;
195
196 case SCR_EGameModeSetupButton.SKIP:
197 ShowPage(SCR_EGameModeSetupPage.OUTRO);
198 break;
199 }
200 }
201
202 //------------------------------------------------------------------------------------------------
203 protected void RunMissionHeaderResults()
204 {
205 SCR_GameModeSetupPluginResults dialog = new SCR_GameModeSetupPluginResults();
206 if (!Workbench.ScriptDialog(CAPTION_MISSION_HEADER_RESULTS, DESCRIPTION_MISSION_HEADER_RESULTS + m_sDialogMessageMissionHeader, dialog))
207 return;
208
209 switch (dialog.m_eResult)
210 {
211 case SCR_EGameModeSetupButton.BACK:
212 m_bIsMissionHeaderValid = false;
213 ShowPrevPage();
214 break;
215
216 case SCR_EGameModeSetupButton.NEXT:
217 ShowPage(SCR_EGameModeSetupPage.OUTRO);
218 break;
219 }
220 }
221
222 //------------------------------------------------------------------------------------------------
223 protected void RunOutro()
224 {
225 SCR_GameModeSetupPluginOutro dialog = new SCR_GameModeSetupPluginOutro();
226 if (m_bIsWorldValid && m_bIsMissionHeaderValid)
227 {
228 if (!Workbench.ScriptDialog(CAPTION_OUTRO_GOOD, DESCRIPTION_OUTRO_COMPLETE, dialog))
229 return;
230 }
231 else
232 {
233 if (!Workbench.ScriptDialog(CAPTION_OUTRO_BAD, DESCRIPTION_OUTRO_INCOMPLETE, dialog))
234 return;
235 }
236
237 switch (dialog.m_eResult)
238 {
239 case SCR_EGameModeSetupButton.BACK:
240 ShowPrevPage();
241 break;
242 }
243 }
244
245 //------------------------------------------------------------------------------------------------
246 protected void ShowPage(SCR_EGameModeSetupPage page)
247 {
248 if (!m_aPageHistory.Contains(page))
249 m_aPageHistory.Insert(page);
250
251 switch (page)
252 {
253 case SCR_EGameModeSetupPage.INTRO: Run(); break;
254 case SCR_EGameModeSetupPage.VALIDATION: RunValidation(); break;
255 case SCR_EGameModeSetupPage.VALIDATION_RESULTS: RunValidationResults(); break;
256 case SCR_EGameModeSetupPage.GENERATION: RunGeneration(); break;
257 case SCR_EGameModeSetupPage.GENERATION_RESULTS: RunGenerationResults(); break;
258 case SCR_EGameModeSetupPage.MISSION_HEADER: RunMissionHeader(); break;
259 case SCR_EGameModeSetupPage.MISSION_HEADER_RESULTS: RunMissionHeaderResults(); break;
260 case SCR_EGameModeSetupPage.OUTRO: RunOutro(); break;
261 }
262 }
263
264 //------------------------------------------------------------------------------------------------
265 protected void ShowPrevPage()
266 {
267 int pageHistoryCountMinus1 = m_aPageHistory.Count() - 1;
268 m_aPageHistory.Resize(pageHistoryCountMinus1);
269 ShowPage(m_aPageHistory[pageHistoryCountMinus1 - 1]);
270 }
271
272 //------------------------------------------------------------------------------------------------
273 protected bool LoadConfig(out string error)
274 {
275 string worldPath;
276 SCR_WorldEditorToolHelper.GetWorldEditorAPI().GetWorldPath(worldPath);
277 if (worldPath.IsEmpty())
278 {
279 error = "No world is currently loaded, or the current world is not saved.";
280 return false;
281 }
282
283 if (m_sTemplate.IsEmpty())
284 {
285 error = "No template defined! Please fill the Template field.";
286 return false;
287 }
288
289 Resource templateResource = Resource.Load(m_sTemplate);
290 if (!templateResource.IsValid())
291 {
292 error = "Template config " + FilePath.StripPath(m_sTemplate) + " is invalid.";
293 return false;
294 }
295
296 BaseContainer templateContainer = templateResource.GetResource().ToBaseContainer();
297 m_Config = GameModeSetupConfig.Cast(BaseContainerTools.CreateInstanceFromContainer(templateContainer));
298 if (!m_Config)
299 {
300 error = "Failed to load the " + FilePath.StripPath(m_sTemplate) + " template config.";
301 return false;
302 }
303
304 return true;
305 }
306
307 //------------------------------------------------------------------------------------------------
308 [ButtonAttribute("Cancel")]
309 protected bool ButtonCancel()
310 {
311 return false;
312 }
313
314 //------------------------------------------------------------------------------------------------
315 [ButtonAttribute("Next", true)]
316 protected bool ButtonNext()
317 {
318 return true;
319 }
320}
321
322class SCR_GameModeSetupPluginValidation
323{
324 SCR_EGameModeSetupButton m_eResult;
325
326 //------------------------------------------------------------------------------------------------
327 [ButtonAttribute("Cancel")]
328 protected bool ButtonCancel()
329 {
330 return false;
331 }
332
333 //------------------------------------------------------------------------------------------------
334 [ButtonAttribute("Skip")]
335 protected bool ButtonSkip()
336 {
337 m_eResult = SCR_EGameModeSetupButton.SKIP;
338 return true;
339 }
340
341 //------------------------------------------------------------------------------------------------
342 [ButtonAttribute("Back")]
343 protected bool ButtonBack()
344 {
345 m_eResult = SCR_EGameModeSetupButton.BACK;
346 return true;
347 }
348
349 //------------------------------------------------------------------------------------------------
350 [ButtonAttribute("Scan world", true)]
351 protected bool ButtonValidate()
352 {
353 m_eResult = SCR_EGameModeSetupButton.NEXT;
354 return true;
355 }
356}
357
358class SCR_GameModeSetupPluginResults
359{
360 SCR_EGameModeSetupButton m_eResult;
361
362 //------------------------------------------------------------------------------------------------
363 [ButtonAttribute("Cancel")]
364 protected bool ButtonCancel()
365 {
366 return false;
367 }
368
369 //------------------------------------------------------------------------------------------------
370 [ButtonAttribute("Back")]
371 protected bool ButtonBack()
372 {
373 m_eResult = SCR_EGameModeSetupButton.BACK;
374 return true;
375 }
376
377 //------------------------------------------------------------------------------------------------
378 [ButtonAttribute("Next", true)]
379 protected bool ButtonNext()
380 {
381 m_eResult = SCR_EGameModeSetupButton.NEXT;
382 return true;
383 }
384}
385
386class SCR_GameModeSetupPluginGenerationResults
387{
388 SCR_EGameModeSetupButton m_eResult;
389
390 [ButtonAttribute("Cancel")]
391 protected bool ButtonCancel()
392 {
393 return false;
394 }
395
396 [ButtonAttribute("Re-scan")]
397 protected bool ButtonValidate()
398 {
399 m_eResult = SCR_EGameModeSetupButton.VALIDATE;
400 return true;
401 }
402
403 [ButtonAttribute("Back")]
404 protected bool ButtonBack()
405 {
406 m_eResult = SCR_EGameModeSetupButton.BACK;
407 return true;
408 }
409
410 [ButtonAttribute("Next", true)]
411 protected bool ButtonNext()
412 {
413 m_eResult = SCR_EGameModeSetupButton.NEXT;
414 return true;
415 }
416}
417
418class SCR_GameModeSetupPluginGeneration
419{
420 SCR_EGameModeSetupButton m_eResult;
421
422 //------------------------------------------------------------------------------------------------
423 [ButtonAttribute("Cancel")]
424 protected bool ButtonCancel()
425 {
426 return false;
427 }
428
429 //------------------------------------------------------------------------------------------------
430 [ButtonAttribute("Skip")]
431 protected bool ButtonSkip()
432 {
433 m_eResult = SCR_EGameModeSetupButton.SKIP;
434 return true;
435 }
436
437 //------------------------------------------------------------------------------------------------
438 [ButtonAttribute("Back")]
439 protected bool ButtonBack()
440 {
441 m_eResult = SCR_EGameModeSetupButton.BACK;
442 return true;
443 }
444
445 //------------------------------------------------------------------------------------------------
446 [ButtonAttribute("Create entities", true)]
447 protected bool ButtonGenerate()
448 {
449 m_eResult = SCR_EGameModeSetupButton.NEXT;
450 return true;
451 }
452}
453
454class SCR_GameModeSetupPluginMissionHeader
455{
456 SCR_EGameModeSetupButton m_eResult;
457
458 //------------------------------------------------------------------------------------------------
459 [ButtonAttribute("Cancel")]
460 protected bool ButtonCancel()
461 {
462 return false;
463 }
464
465 //------------------------------------------------------------------------------------------------
466 [ButtonAttribute("Skip")]
467 protected bool ButtonSkip()
468 {
469 m_eResult = SCR_EGameModeSetupButton.SKIP;
470 return true;
471 }
472
473 //------------------------------------------------------------------------------------------------
474 [ButtonAttribute("Back")]
475 protected bool ButtonBack()
476 {
477 m_eResult = SCR_EGameModeSetupButton.BACK;
478 return true;
479 }
480
481 //------------------------------------------------------------------------------------------------
482 [ButtonAttribute("Create header", true)]
483 protected bool ButtonGenerate()
484 {
485 m_eResult = SCR_EGameModeSetupButton.NEXT;
486 return true;
487 }
488}
489
490class SCR_GameModeSetupPluginOutro
491{
492 SCR_EGameModeSetupButton m_eResult;
493
494 //------------------------------------------------------------------------------------------------
495 [ButtonAttribute("Back")]
496 protected bool ButtonBack()
497 {
498 m_eResult = SCR_EGameModeSetupButton.BACK;
499 return true;
500 }
501
502 //------------------------------------------------------------------------------------------------
503 [ButtonAttribute("Close", true)]
504 protected bool ButtonClose()
505 {
506 return false;
507 }
508}
509
510class SCR_GameModeSetupPluginError
511{
512 //------------------------------------------------------------------------------------------------
513 [ButtonAttribute("Back", true)]
514 protected int ButtonBack()
515 {
516 return 1;
517 }
518
519 //------------------------------------------------------------------------------------------------
520 [ButtonAttribute("Close")]
521 protected bool ButtonClose()
522 {
523 return 0;
524 }
525}
526
527[EnumLinear()]
528enum SCR_EGameModeSetupPage
529{
530 INTRO,
531 VALIDATION,
532 VALIDATION_RESULTS,
533 GENERATION,
534 GENERATION_RESULTS,
535 MISSION_HEADER,
536 MISSION_HEADER_RESULTS,
537 OUTRO,
538}
539
540[EnumLinear()]
541enum SCR_EGameModeSetupButton
542{
543 CANCEL,
544 BACK,
545 NEXT,
546 SKIP,
547 VALIDATE,
548}
549#endif // WORKBENCH
string error
GenerateFlowMaps WorkbenchPlugin WorkbenchPluginAttribute("Regenerate river flow-maps", "Generate and save/overwrite river flow-maps", "", "", {"WorldEditor"}, "", 0xf773)
Definition FlowmapTool.c:59
@ CANCEL
SCR_CampaignSeizingComponent SCR_SeizingComponent EnumLinear()] enum SCR_EBaseCaptureState
override void Run()
bool ButtonCancel()
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
class WorkbenchDialog_AbortRetryIgnore ButtonAttribute("OK", true)
Object holding reference to resource. In destructor release the resource.
Definition Resource.c:25
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
SCR_FieldOfViewSettings Attribute
@ BACK
Definition ControlID.c:17
@ VALIDATE
Job is doing deep validation where it attempts to find if any fragment is corrupted.