1// ==================
2// CAMPAIGN MENU
3// ==================
4
5// TODO
6// - Add alert if user tries to begin without selecting a load game
7// - Add info about a save when it becomes available
8// - Once we can get the data about a campaign in not just one chunk, display them better
9// - Several campaign windows not yet changed (end game, save game, etc.)
10// - Saving doesn't use fixed slots anymore
11// - cgame webapi support
12
13window campaign
14{
15	{
16		background	"ui/main_bg"
17	}
18
19	// Toolbar across the top of the screen
20	MainMenuToolbar mmtoolbar { }
21
22	// ==================
23	// buttons
24	// ==================
25
26	panel cmp_sel {
27		{
28			size		"1024 435"
29			pos			"0 90"
30			bgcolor		"0.4 0.52 0.5 0.2"
31		}
32
33		MainMenuTab btn_new
34		{
35			pos 		"0 0"
36			string		"_NEW"
37			bgcolor		"0.4 0.515 0.5 1"
38			color		"0 0 0 0.9"
39			onClick		{ cmd "toggle_cmp_new;" }
40		}
41
42		MainMenuTab btn_load
43		{
44			pos 		"135 0"
45			string		"_LOAD"
46			onClick		{ cmd "toggle_cmp_load;" }
47		}
48
49		MainMenu3Btn btn_begin
50		{
51			size 			"250 30"
52			pos 			"774 405"
53			string			"_BEGIN"
54			bgcolor			"0.38 0.48 0.36 1"
55			onMouseEnter 	{ *node:this@bgcolor = "0.59 0.78 0.56 1" }
56			onMouseLeave 	{ *node:this@bgcolor = "0.38 0.48 0.36 1" }
57			onClick			{ cmd "cmp_sel_begin;" }
58		}
59
60		MainMenuExitBtn btn_back
61		{
62			size 			"250 30"
63			pos 			"514 405"
64			string			"_BACK"
65			onClick			{ cmd "ui_pop;" }
66		}
67
68		// Campaigns and descriptions panel
69		panel cmp_cmps {
70			{
71				pos				"10 50"
72				size			"1014 355"
73			}
74
75			// List of campaigns
76			optionlist cmp_list
77			{
78				pos				"10 0"
79				size			"250 355"
80				lineheight		"25"
81				dataid			OPTION_CAMPAIGN_LIST
82				cvar			*cvar:cp_campaign
83				onClick			{ cmd "campaignlist_click <lineselected>;" }
84				color			"0.4 0.515 0.5 1"
85				selectcolor		"1 1 1 1"
86				onChange {
87					cmd "cp_getdescription <cvar:cp_campaign>;"
88				}
89			}
90
91			// Description of selected campaign
92			text cmp_desc
93			{
94				dataid		TEXT_STANDARD
95				pos			"280 0"
96				size		"720 355"
97				lineheight	20
98				rows		18
99			}
100		}
101
102		// List of saved games to load
103		panel cmp_saves
104		{
105			{
106				pos				"10 50"
107				size			"250 355"
108				layout			LAYOUT_TOP_DOWN_FLOW
109				layoutMargin	5
110				invis			true
111			}
112
113			TextBtn save0 {
114				string			*cvar:mn_slot0
115				onClick			{ cmd "set_sel_load_slot 0;" }
116			}
117
118			TextBtn save1 {
119				string			*cvar:mn_slot1
120				onClick			{ cmd "set_sel_load_slot 1;" }
121			}
122
123			TextBtn save2 {
124				string			*cvar:mn_slot2
125				onClick			{ cmd "set_sel_load_slot 2;" }
126			}
127
128			TextBtn save3 {
129				string			*cvar:mn_slot3
130				onClick			{ cmd "set_sel_load_slot 3;" }
131			}
132
133			TextBtn save4 {
134				string			*cvar:mn_slot4
135				onClick			{ cmd "set_sel_load_slot 4;" }
136			}
137
138			TextBtn save5 {
139				string			*cvar:mn_slot5
140				onClick			{ cmd "set_sel_load_slot 5;" }
141			}
142
143			TextBtn save6 {
144				string			*cvar:mn_slot6
145				onClick			{ cmd "set_sel_load_slot 6;" }
146			}
147
148			TextBtn save7 {
149				string			*cvar:mn_slot7
150				onClick			{ cmd "set_sel_load_slot 7;" }
151			}
152		}
153	}
154
155	// Save the proper load slot into a cvar to use later
156	confunc set_sel_load_slot {
157		// <1> = Number of the load slot
158		*cvar:sel_load_slot = <1>
159		*node:root.cmp_sel.btn_begin@ghost = false
160		*node:root.cmp_sel.btn_begin@bgcolor = "0.38 0.48 0.36 1"
161		*node:root.cmp_sel.btn_begin@color = "1 1 1 0.9"
162
163		 // Remove white color from any button that might be saved
164		 // Then add it back to the selected button
165		*cvar:i = 0;
166		while ( *cvar:i < 8 ) {
167			*node:root.cmp_sel.cmp_saves.save<cvar:i>@color = "1 1 1 0.5"
168			*cvar:i = ( *cvar:i + 1 )
169		}
170		delete *cvar:i
171		*node:root.cmp_sel.cmp_saves.save<cvar:sel_load_slot>@color = "1 1 1 0.9"
172	}
173
174	// Tell the begin button what to do depending on the
175	// current selection (start campaign, load campaign)
176	confunc cmp_sel_begin {
177		if (*node:root.cmp_sel.cmp_saves@invis == true) {
178			cmd "cp_start <cvar:cp_campaign>;"
179		}
180		else {
181			if (*cvar:sel_load_slot == 0) {
182				cmd "game_load slot<cvar:sel_load_slot>;"
183			}
184			if (*cvar:sel_load_slot == 1) {
185				cmd "game_load slot<cvar:sel_load_slot>;"
186			}
187			if (*cvar:sel_load_slot == 2) {
188				cmd "game_load slot<cvar:sel_load_slot>;"
189			}
190			if (*cvar:sel_load_slot == 3) {
191				cmd "game_load slot<cvar:sel_load_slot>;"
192			}
193			if (*cvar:sel_load_slot == 4) {
194				cmd "game_load slot<cvar:sel_load_slot>;"
195			}
196			if (*cvar:sel_load_slot == 5) {
197				cmd "game_load slot<cvar:sel_load_slot>;"
198			}
199			if (*cvar:sel_load_slot == 6) {
200				cmd "game_load slot<cvar:sel_load_slot>;"
201			}
202			if (*cvar:sel_load_slot == 7) {
203				cmd "game_load slot<cvar:sel_load_slot>;"
204			}
205			/*
206			 * It should be possible to check whether a save
207			 * has been selected from the cvar and so avoid
208			 * setting out all the if's,  but I can't seem to
209			 * figure out how to test if the cvar is false.
210			if (*cvar:sel_load_slot != false) {
211				cmd "game_load slot<cvar:sel_load_slot>;"
212			}
213			 */
214			else {
215				// Popup message that says SELECT A LOAD
216			}
217
218			// Remove unnecessary cvar
219			delete *cvar:sel_load_slot;
220		}
221	}
222
223	// Switch display when user chooses New Campaign/Load Campaign
224	confunc toggle_cmp_new {
225		*node:root.cmp_sel.btn_new@bgcolor = "0.4 0.515 0.5 1"
226		*node:root.cmp_sel.btn_new@color = "0 0 0 0.9"
227		*node:root.cmp_sel.btn_load@bgcolor = "0.4 0.515 0.5 0.25"
228		*node:root.cmp_sel.btn_load@color = "1 1 1 0.5"
229		*node:root.cmp_sel.cmp_cmps@invis = false
230		*node:root.cmp_sel.cmp_saves@invis = true
231		*node:root.cmp_sel.btn_begin@ghost = false
232		*node:root.cmp_sel.btn_begin@bgcolor = "0.38 0.48 0.36 1"
233		*node:root.cmp_sel.btn_begin@color = "1 1 1 0.9"
234		*node:root.cmp_sel.cmp_saves.save<cvar:sel_load_slot>@color = "0.4 0.515 0.5 1"
235		*cvar:sel_load_slot = false
236	}
237	confunc toggle_cmp_load {
238		*node:root.cmp_sel.btn_load@bgcolor = "0.4 0.515 0.5 1"
239		*node:root.cmp_sel.btn_load@color = "0 0 0 0.9"
240		*node:root.cmp_sel.btn_new@bgcolor = "0.4 0.515 0.5 0.25"
241		*node:root.cmp_sel.btn_new@color = "1 1 1 0.5"
242		*node:root.cmp_sel.cmp_cmps@invis = true
243		*node:root.cmp_sel.cmp_saves@invis = false
244		*node:root.cmp_sel.btn_begin@ghost = true
245		*node:root.cmp_sel.btn_begin@bgcolor = "1 1 1 0.1"
246		*node:root.cmp_sel.btn_begin@color = "1 1 1 0.3"
247	}
248
249	func onWindowOpened
250	{
251		cmd "set sel_load_slot 0;game_setmode;cp_getcampaigns;cp_getdescription <cvar:cp_campaign>;game_comments;toggle_cmp_new;"
252	}
253
254	// Fuzzy screen effect (see assets.ufo)
255	screen overlay { }
256}
257
258window campaign_main
259{
260	/** @todo Remove me */
261	{ } // empty properties to fix parsing problem with "image" token (behaviour or property?)
262
263	// ==================
264	// background
265	// ==================
266
267	image background
268	{
269		src		"background/main_bg"
270	}
271
272	string version
273	{
274		string		*cvar:version
275		pos			"10 744"
276		size		"550 20"
277	}
278
279	// ==================
280	// buttons
281	// ==================
282
283	cmpMenuButton button_continue
284	{
285		string		"_Continue"
286		tooltip		"_Leave this menu and continue playing."
287		pos			"640 170"
288		onClick		{ cmd "game_continue;" }
289	}
290
291	cmpMenuButton button_load
292	{
293		string		"_Load"
294		pos			"640 240"
295		onClick		{ cmd "ui_push load;" }
296	}
297
298	cmpMenuButton button_save
299	{
300		string		"_Save"
301		pos			"640 310"
302		onClick		{ cmd "ui_push save;" }
303	}
304
305	cmpMenuButton button_options
306	{
307		string		"_Options"
308		pos			"640 380"
309		onClick		{ cmd "ui_push options;" }
310	}
311
312	cmpMenuButton button_back
313	{
314		string		"_Exit"
315		pos			"640 520"
316		onClick {
317			if ( *cvar:mn_fastexit == 1 ) {
318				cmd "game_exit;"
319			} else {
320				cmd "ui_push popup_exit_confirmation;"
321			}
322		}
323	}
324}
325
326// ==================
327// QUICK LOAD MENU
328// ==================
329
330window quickload
331{
332	{
333		string		"_Reload campaign"
334		pos			"264 262"
335		size		"496 247"
336		background		"ui/popup_alpha_tile"
337		dragbutton	true
338		closebutton	true
339	}
340
341	string name_label
342	{
343		string		"_Are you sure that you really want to reload the last automatically saved campaign state?"
344		pos			"26 58"
345		size		"440 104"
346		longlines	LONGLINES_WRAP
347	}
348
349	cmpPopupButton button_go
350	{
351		string		"_Load"
352		pos			"266 188"
353		onClick		{ cmd "ui_pop;game_quickload;" *cvar:mn_fastexit = 1; }
354	}
355}
356
357// ==================
358// LOAD MENU
359// ==================
360
361window load
362{
363	/** @todo Remove me */
364	{ } // empty properties to fix parsing problem with "image" token (behaviour or property?)
365
366	// ==================
367	// background
368	// ==================
369
370	image background
371	{
372		src		"background/main_bg"
373	}
374
375	string version
376	{
377		string		*cvar:version
378		pos			"10 744"
379		size		"550 20"
380	}
381
382	string headline
383	{
384		string		"_Load"
385		pos			"610 170"
386		size		"310 30"
387		contentalign	ALIGN_UC
388		font		"f_big"
389	}
390
391	// ==================
392	// slots
393	// ==================
394
395	button slot0
396	{
397		string		""
398		background		"ui/button_green_verysmall"
399		pos			"640 200"
400		size		"256 32"
401		font		"f_verysmall"
402		color		"0 .78 0 1"
403		selectcolor	"1 1 1 1"
404		contentalign	ALIGN_CL
405		padding		8
406		onClick		{ cmd "game_load slot0; game_timestop;" *cvar:mn_fastexit = 1; }
407	}
408	button slot1
409	{
410		string		""
411		background		"ui/button_green_verysmall"
412		pos			"640 235"
413		size		"256 34"
414		font		"f_verysmall"
415		color		"0 .78 0 1"
416		selectcolor	"1 1 1 1"
417		contentalign	ALIGN_CL
418		padding		8
419		onClick		{ cmd "game_load slot1; game_timestop;" *cvar:mn_fastexit = 1; }
420	}
421	button slot2
422	{
423		string		""
424		background		"ui/button_green_verysmall"
425		pos			"640 270"
426		size		"256 34"
427		font		"f_verysmall"
428		color		"0 .78 0 1"
429		selectcolor	"1 1 1 1"
430		contentalign	ALIGN_CL
431		padding		8
432		onClick		{ cmd "game_load slot2; game_timestop;" *cvar:mn_fastexit = 1; }
433	}
434	button slot3
435	{
436		string		""
437		background		"ui/button_green_verysmall"
438		pos			"640 305"
439		size		"256 34"
440		font		"f_verysmall"
441		color		"0 .78 0 1"
442		selectcolor	"1 1 1 1"
443		contentalign	ALIGN_CL
444		padding		8
445		onClick		{ cmd "game_load slot3; game_timestop;" *cvar:mn_fastexit = 1; }
446	}
447	button slot4
448	{
449		string		""
450		background		"ui/button_green_verysmall"
451		pos			"640 340"
452		size		"256 34"
453		font		"f_verysmall"
454		color		"0 .78 0 1"
455		selectcolor	"1 1 1 1"
456		contentalign	ALIGN_CL
457		padding		8
458		onClick		{ cmd "game_load slot4; game_timestop;" *cvar:mn_fastexit = 1; }
459	}
460	button slot5
461	{
462		string		""
463		background		"ui/button_green_verysmall"
464		pos			"640 375"
465		size		"256 34"
466		font		"f_verysmall"
467		color		"0 .78 0 1"
468		selectcolor	"1 1 1 1"
469		contentalign	ALIGN_CL
470		padding		8
471		onClick		{ cmd "game_load slot5; game_timestop;" *cvar:mn_fastexit = 1; }
472	}
473	button slot6
474	{
475		string		""
476		background		"ui/button_green_verysmall"
477		pos			"640 410"
478		size		"256 34"
479		font		"f_verysmall"
480		color		"0 .78 0 1"
481		selectcolor	"1 1 1 1"
482		contentalign	ALIGN_CL
483		padding		8
484		onClick		{ cmd "game_load slot6; game_timestop;" *cvar:mn_fastexit = 1; }
485	}
486	button slot7
487	{
488		string		""
489		background		"ui/button_green_verysmall"
490		pos			"640 445"
491		size		"256 34"
492		font		"f_verysmall"
493		color		"0 .78 0 1"
494		selectcolor	"1 1 1 1"
495		contentalign	ALIGN_CL
496		padding		8
497		onClick		{ cmd "game_load slot7; game_timestop;" *cvar:mn_fastexit = 1; }
498	}
499
500	// ==================
501	// buttons
502	// ==================
503
504	/**
505	 * @param[in] <1> id of the savegame slot
506	 * @param[in] <2> name of the savegame slot
507	 * @param[in] <3> game date of the savegame slot
508	 * @param[in] <4> real date of the savegame slot
509	 */
510	confunc update_save_game_info {
511		*cvar:mn_slot<1> = "<2> - <3>"
512		*node:root.slot<1>@string = *cvar:mn_slot<1>
513		*node:load.slot<1>@tooltip = "<4>"
514		*node:save.slot<1>@tooltip = "<4>"
515	}
516
517	cmpMenuButton button_back
518	{
519		string		"_Back"
520		pos			"640 520"
521		onClick		{ cmd "ui_pop;" }
522	}
523
524	func onWindowOpened
525	{
526		cmd "game_comments;"
527	}
528}
529
530// ==================
531// SAVE MENU
532// ==================
533
534window save
535{
536	/** @todo Remove me */
537	{ } // empty properties to fix parsing problem with "image" token (behaviour or property?)
538
539	// ==================
540	// background
541	// ==================
542
543	image background
544	{
545		src		"background/main_bg"
546	}
547
548	string version
549	{
550		string		*cvar:version
551		pos			"10 744"
552		size		"550 20"
553	}
554
555	string headline
556	{
557		string		"_Save"
558		pos			"610 170"
559		size		"310 30"
560		contentalign	ALIGN_UC
561		font		"f_big"
562	}
563
564	// ==================
565	// slots
566	// ==================
567
568	textentry slot0
569	{
570		string		*cvar:mn_slot0
571		pos			"640 200"
572		size		"256 34"
573		background		"ui/button_green_verysmall"
574		color		"0 .78 0 1"
575		selectcolor	"1 1 1 1"
576		contentalign	ALIGN_CL
577		padding		8
578		font		"f_verysmall"
579		onClick		{ cmd "game_savenamecleanup 0;" }
580		onChange	{ cmd "game_save slot0 *mn_slot0; game_comments 0;" *cvar:mn_fastexit = 1; }
581		onAbort		{ cmd "game_comments 0;" }
582		clickoutabort	true
583	}
584	textentry slot1
585	{
586		string		*cvar:mn_slot1
587		pos			"640 235"
588		size		"256 34"
589		background		"ui/button_green_verysmall"
590		color		"0 .78 0 1"
591		selectcolor	"1 1 1 1"
592		contentalign	ALIGN_CL
593		padding		8
594		font		"f_verysmall"
595		onClick		{ cmd "game_savenamecleanup 1;" }
596		onChange	{ cmd "game_save slot1 *mn_slot1; game_comments 1;" *cvar:mn_fastexit = 1; }
597		onAbort		{ cmd "game_comments 1;" }
598		clickoutabort	true
599	}
600	textentry slot2
601	{
602		string		*cvar:mn_slot2
603		pos			"640 270"
604		size		"256 34"
605		background		"ui/button_green_verysmall"
606		color		"0 .78 0 1"
607		selectcolor	"1 1 1 1"
608		contentalign	ALIGN_CL
609		padding		8
610		font		"f_verysmall"
611		onClick		{ cmd "game_savenamecleanup 2;" }
612		onChange	{ cmd "game_save slot2 *mn_slot2; game_comments 2;" *cvar:mn_fastexit = 1; }
613		onAbort		{ cmd "game_comments 2;" }
614		clickoutabort	true
615	}
616	textentry slot3
617	{
618		string		*cvar:mn_slot3
619		pos			"640 305"
620		size		"256 34"
621		background		"ui/button_green_verysmall"
622		color		"0 .78 0 1"
623		selectcolor	"1 1 1 1"
624		contentalign	ALIGN_CL
625		padding		8
626		font		"f_verysmall"
627		onClick		{ cmd "game_savenamecleanup 3;" }
628		onChange	{ cmd "game_save slot3 *mn_slot3; game_comments 3;" *cvar:mn_fastexit = 1; }
629		onAbort		{ cmd "game_comments 3;" }
630		clickoutabort	true
631	}
632	textentry slot4
633	{
634		string		*cvar:mn_slot4
635		pos			"640 340"
636		size		"256 34"
637		background		"ui/button_green_verysmall"
638		color		"0 .78 0 1"
639		selectcolor	"1 1 1 1"
640		contentalign	ALIGN_CL
641		padding		8
642		font		"f_verysmall"
643		onClick		{ cmd "game_savenamecleanup 4;" }
644		onChange	{ cmd "game_save slot4 *mn_slot4; game_comments 4;" *cvar:mn_fastexit = 1; }
645		onAbort		{ cmd "game_comments 4;" }
646		clickoutabort	true
647	}
648	textentry slot5
649	{
650		string		*cvar:mn_slot5
651		pos			"640 375"
652		size		"256 34"
653		background		"ui/button_green_verysmall"
654		color		"0 .78 0 1"
655		selectcolor	"1 1 1 1"
656		contentalign	ALIGN_CL
657		padding		8
658		font		"f_verysmall"
659		onClick		{ cmd "game_savenamecleanup 5;" }
660		onChange	{ cmd "game_save slot5 *mn_slot5; game_comments 5;" *cvar:mn_fastexit = 1; }
661		onAbort		{ cmd "game_comments 5;" }
662		clickoutabort	true
663	}
664	textentry slot6
665	{
666		string		*cvar:mn_slot6
667		pos			"640 410"
668		size		"256 34"
669		background		"ui/button_green_verysmall"
670		color		"0 .78 0 1"
671		selectcolor	"1 1 1 1"
672		contentalign	ALIGN_CL
673		padding		8
674		font		"f_verysmall"
675		onClick		{ cmd "game_savenamecleanup 6;" }
676		onChange	{ cmd "game_save slot6 *mn_slot6; game_comments 6;" *cvar:mn_fastexit = 1; }
677		onAbort		{ cmd "game_comments 6;" }
678		clickoutabort	true
679	}
680	textentry slot7
681	{
682		string		*cvar:mn_slot7
683		pos			"640 445"
684		size		"256 34"
685		background		"ui/button_green_verysmall"
686		color		"0 .78 0 1"
687		selectcolor	"1 1 1 1"
688		contentalign	ALIGN_CL
689		padding		8
690		font		"f_verysmall"
691		onClick		{ cmd "game_savenamecleanup 7;" }
692		onChange	{ cmd "game_save slot7 *mn_slot7; game_comments 7;" *cvar:mn_fastexit = 1; }
693		onAbort		{ cmd "game_comments 7;" }
694		clickoutabort	true
695	}
696
697	// ==================
698	// buttons
699	// ==================
700
701	cmpMenuButton button_back
702	{
703		string		"_Back"
704		pos			"640 520"
705		onClick		{ cmd "ui_pop;" }
706	}
707
708	func onWindowOpened
709	{
710		cmd "game_comments;"
711	}
712}
713
714// ==================
715// LOST GAME MENU
716// ==================
717
718window lostgame
719{
720	/** @todo Remove me */
721	{ } // empty properties to fix parsing problem with "image" token (behaviour or property?)
722
723	image background
724	{
725		src		"background/losegame_bg"
726	}
727
728	func onWindowOpened
729	{
730		cmd "music_stop;snd_music Crystan-LooseGame;"
731	}
732
733	string title
734	{
735		string		"_You've lost the game"
736		pos			"12 20"
737		size		"1000 35"
738		font		"f_menubig"
739		contentalign	ALIGN_UC
740		color		"0 0.8 0 1"
741	}
742
743	string lostgame_click
744	{
745		string		"_Click to continue"
746		pos			"814 750"
747		size		"200 20"
748		font		"f_verysmall"
749		contentalign	ALIGN_UR
750		color		"0 0.8 0 0.9"
751		ghost		true
752	}
753
754	zone leave
755	{
756		pos "0 0"
757		size "1024 768"
758		onClick {
759			cmd "initmainui;"
760		}
761	}
762
763	// reason why you've lost
764	text reason
765	{
766		dataid	TEXT_STANDARD
767		color		"0 0.8 0 0.9"
768		bgcolor		"0.2 0.2 0.2 0.4"
769		contentalign	ALIGN_UC
770		pos			"30 600"
771		size		"960 140"
772		lineheight	"20"
773		font		"f_normal"
774		onClick		{ call *node:parent.leave@click }
775		onViewChange	{
776			*node:root.reason_scroll@fullsize = <fullsize>
777			*node:root.reason_scroll@current = <viewpos>
778			*node:root.reason_scroll@viewsize = <viewsize>
779		}
780	}
781
782	vscrollbar reason_scroll {
783		image		"ui/scrollbar_v_green"
784		pos			"992 600"
785		height		"140"
786		current		0
787		viewsize	12
788		fullsize	12
789		hidewhenunused true
790		onClick		{ call *node:parent.leave@click }
791		onChange	{ *node:root.reason@viewpos = <current> }
792	}
793}
794
795// ==================
796// END GAME MENU
797// ==================
798
799window endgame
800{
801	/** @todo Remove me */
802	{ } // empty properties to fix parsing problem with "image" token (behaviour or property?)
803
804	image background
805	{
806		src		"background/wingame_bg"
807	}
808
809	string title
810	{
811		string		"_Thank you for playing UFO:Alien Invasion"
812		pos			"12 20"
813		size		"1000 35"
814		font		"f_menubig"
815		contentalign	ALIGN_UC
816		color		"0 0.8 0 1"
817	}
818
819	string endgame_click
820	{
821		string		"_Click to continue"
822		pos			"814 750"
823		size		"200 20"
824		font		"f_verysmall"
825		contentalign	ALIGN_UR
826		color		"0 0.8 0 0.9"
827		ghost		true
828		onClick {
829			cmd "initmainui; seq_start developers;"
830		}
831	}
832
833	zone leave
834	{
835		pos "0 0"
836		size "1024 768"
837		onClick {
838			cmd "initmainui; seq_start developers;"
839		}
840	}
841
842	text reason
843	{
844		dataid		TEXT_STANDARD
845		color		"0 0.8 0 0.9"
846		bgcolor		"0.2 0.2 0.2 0.4"
847		contentalign	ALIGN_UC
848		pos			"30 500"
849		size		"960 240"
850		lineheight	"20"
851		font		"f_normal"
852		onClick		{ call *node:parent.leave@click }
853		onViewChange	{
854			*node:root.reason_scroll@fullsize = <fullsize>
855			*node:root.reason_scroll@current = <viewpos>
856			*node:root.reason_scroll@viewsize = <viewsize>
857		}
858	}
859
860	vscrollbar reason_scroll {
861		image		"ui/scrollbar_v_green"
862		pos			"992 500"
863		height		"240"
864		current		0
865		viewsize	12
866		fullsize	12
867		hidewhenunused true
868		onClick		{ call *node:parent.leave@click }
869		onChange	{ *node:root.reason@viewpos = <current> }
870	}
871
872	func onWindowOpened {
873		cmd "music_stop;snd_music Crystan-WinGame;"
874	}
875}
876
877// ========================
878// POPUP EXIT CONFIRMATION
879// ========================
880window popup_exit_confirmation
881{
882	{
883		string		"_Exit Campaign Confirmation"
884		background		"ui/popup_alpha_tile"
885		pos			"264 262"
886		size		"486 247"
887		dragbutton	true
888		closebutton	true
889	}
890	string exit_confirmation_label
891	{
892		string		"_You will lose all your campaign progress."
893		pos			"26 58"
894		size		"450 60"
895	}
896	cmpPopupButton bt_quit
897	{
898		tooltip		"_Exit current campaign and return to main menu."
899		string		"_Quit anyway"
900		pos			"28 188"
901		onClick		{
902			cmd "ui_pop;"
903			cmd "game_exit;"
904		}
905	}
906	cmpCancelButton bt_dontquit
907	{
908		tooltip		"_Do not quit."
909		pos			"285 188"
910		onClick		{ cmd "ui_pop;" }
911	}
912}
913