1// ==================
2// MULTIPLAYER MENU
3// ==================
4
5component cmpAdr extends panel {
6{
7	size "350 25"
8}
9	string adr { pos "30 1" size "300 20" tooltip "_Connect to this server"
10		onClick { cmd "server_info *cvar:adr<node:parent@num>;" }
11		onRClick { cmd "set adr<node:parent@num> \"\"; check_bookmarks;" }
12	}
13	button resetadr { pos "0 1" size "22 22" icon "icons/garbage" tooltip "_Delete this bookmark"
14		onClick { cmd "set adr<node:parent@num> \"\"; check_bookmarks;" }
15		onRClick { cmd "set adr<node:parent@num> \"\"; check_bookmarks;" }
16	}
17}
18
19window multiplayer
20{
21	confunc mn_push_multiplayer
22	{
23		cmd "game_setmode multiplayer; ui_push mp_serverbrowser;"
24		*cvar:mn_multiplayer_tab = 1
25	}
26
27	/**
28	 * @param <1> window id
29	 * @param <2> name
30	 */
31	confunc game_addmode_multiplayer
32	{
33		// TODO: use this to support several multiplayer game types
34	}
35
36	/** @brief prevent pushing this menu */
37	func onWindowOpened
38	{
39		cmd "ui_pop;"
40		call *node:root.mn_push_multiplayer
41	}
42}
43
44window abstract_multiplayer
45{
46	/** @todo Remove me */
47	{ } // empty properties to fix parsing problem with "image" token (behaviour or property?)
48
49	// ==================
50	// background
51	// ==================
52
53	image background
54	{
55		src		"background/options_bg"
56	}
57
58	// ==================
59	// main navigation
60	// ==================
61
62	cmpMenuButton button_team
63	{
64		string		"_Team"
65		pos			"80 160"
66		onClick		{ cmd "ui_pop;ui_push multiplayer_team;" }
67	}
68
69	cmpMenuButton button_join
70	{
71		string		"_Join"
72		pos			"80 230"
73		onClick		{ cmd "ui_pop; ui_push mp_serverbrowser;" }
74	}
75
76	cmpMenuButton button_create
77	{
78		string		"_Create"
79		pos			"80 300"
80		onClick		{ cmd "ui_pop; ui_push mp_create_server;" }
81	}
82
83	cmpMenuButton button_lobby
84	{
85		string		"_Lobby"
86		pos			"80 385"
87		onClick		{ cmd "irc_connect; ui_push irc;" }
88	}
89
90	cmpMenuButton button_exit
91	{
92		string		"_Back"
93		pos			"80 470"
94		onClick		{ cmd "ui_pop;" }
95	}
96}
97
98// =====================
99// MP TEAM MENU
100// =====================
101window multiplayer_team extends abstract_multiplayer
102{
103	cmpTeamPanel content
104	{
105		{
106			pos		"482 100"
107			size	"480 350"
108		}
109	}
110
111	func onWindowActivate
112	{
113		cmd	"game_teamcomments;"
114	}
115
116	func onWindowOpened
117	{
118		cmd	"game_teamcomments;define cl_teamdef phalanx;"
119	}
120}
121
122window abstract_multiplayer_join extends abstract_multiplayer {
123	// ==================
124	// main navigation
125	// ==================
126
127	tab join_navigation {
128		{
129			pos		"462 73"
130			size	"486 40"
131			cvar	*cvar:mn_multiplayer_tab
132			onChange {
133				if ( *cvar:mn_multiplayer_tab == 1 ) {
134					cmd "ui_pop;ui_push mp_serverbrowser;"
135				} elif ( *cvar:mn_multiplayer_tab == 2 ) {
136
137				} elif ( *cvar:mn_multiplayer_tab == 3 ) {
138					cmd "ui_pop;ui_push mp_bookmarks;"
139				} elif ( *cvar:mn_multiplayer_tab == 4 ) {
140					cmd "irc_connect; ui_push irc;"
141				}
142			}
143		}
144		option internet {
145			label	"_Internet/Lan"
146			value	"1"
147		}
148/*		option lan {
149			label	"_Lan"
150			value	"2"
151		}
152*/
153		option bookmark {
154			label	"_Bookmark"
155			value	"3"
156		}
157/*
158		option bookmark {
159			label	"_Lobby"
160			value	"4"
161		}
162*/
163	}
164}
165
166// ==================
167// SERVER INFO
168// ==================
169window serverinfo
170{
171	/** @todo Remove me */
172	{ } // empty properties to fix parsing problem with "image" token (behaviour or property?)
173
174	image background
175	{
176		src		"background/multiplayer_bg"
177	}
178
179	text server_info
180	{
181		dataid		TEXT_STANDARD
182		pos			"500 200"
183		size		"420 490"
184		lineheight	20
185		tabwidth	250
186		rows		"24"
187	}
188
189	string user_list_str
190	{
191		string		"_Userlist"
192		pos			"50 115"
193		size		"300 20"
194		color		"1 1 1 1"
195		font		"f_normal_bold"
196		contentalign	ALIGN_CC
197	}
198	string user_list_head1
199	{
200		string		"_Name"
201		pos			"50 135"
202		size		"150 20"
203		color		"1 1 1 1"
204		font		"f_verysmall"
205		contentalign	ALIGN_UL
206	}
207	string user_list_head2
208	{
209		string		"_Team"
210		pos			"200 135"
211		size		"150 20"
212		color		"1 1 1 1"
213		font		"f_verysmall"
214		contentalign	ALIGN_UL
215	}
216	text user_list
217	{
218		dataid	TEXT_LIST
219		pos			"50 170"
220		size		"300 380"
221		lineheight	20
222		tabwidth	200
223		font		"f_verysmall"
224		mousefx		true
225		border		3
226		bordercolor	"0 0.5 0 1"
227		padding		10
228		bgcolor		"0.3 0.3 0.3 0.4"
229		rows		"19"
230	}
231
232	string mapstring
233	{
234		string		*cvar:mn_svmapname
235		font		"f_menubig"
236		color		"1 1 1 1"
237		pos			"500 110"
238		size		"300 35"
239	}
240
241	image mappic
242	{
243		src		*cvar:mn_mappic
244		pos			"800 80"
245		texl		"0 0"
246		texh		"128 96"
247	}
248
249	cmpMenuButton button_connect
250	{
251		string		"_Connect"
252		pos			"70 580"
253		onClick		{ cmd "connect *cvar:mn_server_ip;" }
254	}
255
256	button button_exit
257	{
258		tooltip		"_Leave Serverbrowser"
259		background	"buttons/large_blue"
260		pos			"26 720"
261		size		"64 37"
262		flipicon	true
263		icon		"icons/return"
264		onClick		{ cmd "ui_pop; pingservers;" }
265	}
266
267	button button_favorite
268	{
269		string		"_Bookmark"
270		tooltip		"_Add server to bookmarks"
271		pos			"150 720"
272		size		"178 35"
273		background		"ui/button_blue"
274		font		"f_normal_bold"
275		color		"1 1 1 0.8"
276		selectcolor	"1 1 1 1"
277		onClick		{ cmd "bookmark_add;" }
278	}
279
280	func onWindowOpened
281	{
282	}
283
284	func onWindowClosed
285	{
286		cmd	"pingservers; check_bookmarks;"
287	}
288}
289
290// ==================
291// JOIN LAN MENU
292// ==================
293window mp_serverbrowser extends abstract_multiplayer_join
294{
295	timer event {
296		timeout	60000
297		onEvent {
298			cmd "pingservers refresh;"
299		}
300	}
301
302	func set_mn_serverliststr_from_id {
303		if (<1> == 0) {
304			*cvar:mn_serverliststr = "_All"
305		} elif (<1> == 1) {
306			*cvar:mn_serverliststr = "_Free"
307		} elif (<1> == 2) {
308			*cvar:mn_serverliststr = "_Playing"
309		} else {
310			*cvar:mn_serverliststr = "_Invalid"
311		}
312	}
313
314	panel content {
315		{
316			pos			"415 120"
317			size		"608 768"
318		}
319
320		string status_str
321		{
322			string		"_Serverfilter:"
323			pos			"150 7"
324			size		"150 20"
325		}
326		string status_value
327		{
328			string		*cvar:mn_serverliststr
329			pos			"300 7"
330			size		"150 20"
331			contentalign	ALIGN_UC
332		}
333		button status_dec
334		{
335			pos			"455 7"
336			size		"16 16"
337			icon		"icons/prev"
338			onClick		{
339				*cvar:cl_serverlist = ((*cvar:cl_serverlist - 1) % 3)
340				if ( *cvar:cl_serverlist < 0 ) {
341					*cvar:cl_serverlist = 2
342				}
343				call *node:root.set_mn_serverliststr_from_id( *cvar:cl_serverlist )
344				cmd "pingservers refresh;"
345			}
346		}
347		button status_inc
348		{
349			pos			"470 7"
350			size		"16 16"
351			icon		"icons/next"
352			onClick		{
353				*cvar:cl_serverlist = ((*cvar:cl_serverlist + 1) % 3)
354				call *node:root.set_mn_serverliststr_from_id( *cvar:cl_serverlist )
355				cmd "pingservers refresh;"
356			}
357		}
358
359		// ====================
360		// lan / inet buttons
361		// ====================
362
363		// servers_click is CL_ServerListClick_f in cl_main.c
364		/* textlist using tabbed text */
365		text servers
366		{
367			pos			"65 40"
368			width		"430"
369			lineheight	20
370			tabwidth	48
371			font		"f_verysmall"
372			mousefx		true
373			border		3
374			bordercolor	"0 0.5 0 1"
375			padding		10
376			bgcolor		"0.3 0.3 0.3 0.4"
377			rows		"22"
378			dataid		TEXT_LIST
379			onClick		{ cmd "servers_click <lineselected>;" }
380			onRClick	{ cmd "pingservers;" }
381			onViewChange {
382				*node:root.content.servers_scroll@fullsize = <fullsize>
383				*node:root.content.servers_scroll@current = <viewpos>
384				*node:root.content.servers_scroll@viewsize = <viewsize>
385			}
386		}
387
388		vscrollbar servers_scroll {
389			image		"ui/scrollbar_v_green"
390			pos			"500 40"
391			height		"440"
392			current		0
393			viewsize	22
394			fullsize	22
395			onChange	{ *node:parent.servers@viewpos = <current> }
396		}
397
398		button button_serverbrowser_refresh
399		{
400			string		"_Refresh"
401			background		"ui/button_green_small"
402			color		"0 0.8 0 1"
403			font		"f_small"
404			pos			"335 490"
405			size		"176 32"
406			onClick		{ cmd "pingservers refresh;" }
407		}
408
409		// ==================
410		// nickname
411		// ==================
412/*
413		string current_name
414		{
415			string		"_Name:"
416			pos			"65 455"
417			size		"256 20"
418		}
419
420		textentry slot_name
421		{
422			string		*cvar:cl_name
423			background		"ui/button_green_verysmall"
424			color		"0 .78 0 1"
425			selectcolor	"1 1 1 1"
426			contentalign	ALIGN_CL
427			padding		8
428			font		"f_verysmall"
429			pos			"65 475"
430			size		"256 34"
431		}
432*/
433
434		// ===================
435		// connect_to_ip
436		// ===================
437		string current_inet_connect_to_ip
438		{
439			string		"_Connect to IP"
440			pos			"65 520"
441			size		"256 20"
442		}
443
444		textentry slot_ip
445		{
446			string		*cvar:mn_server_ip
447			background		"ui/button_green_verysmall"
448			color		"0 .78 0 1"
449			selectcolor	"1 1 1 1"
450			contentalign	ALIGN_CL
451			padding		8
452			font		"f_verysmall"
453			pos			"65 540"
454			size		"256 34"
455		}
456		button button_inet_connect_to_ip
457		{
458			string		"_Connect"
459			background		"ui/button_green_small"
460			color		"0 0.8 0 1"
461			font		"f_small"
462			pos			"335 540"
463			size		"176 32"
464			onClick		{ cmd "server_info *cvar:mn_server_ip;" }
465		}
466	}
467
468	// ====================
469	// init
470	// ====================
471	func onWindowOpened
472	{
473		*cvar:cl_serverlist = 0
474		cmd "pingservers refresh;"
475		call *node:root.set_mn_serverliststr_from_id( *cvar:cl_serverlist )
476	}
477}
478
479// ==================
480// INTERNET MENU
481// ==================
482
483window mp_bookmarks extends abstract_multiplayer_join
484{
485	panel content {
486		{
487			pos			"470 120"
488			size		"470 580"
489		}
490
491		// ====================
492		// lan / inet buttons
493		// ====================
494
495		string inet_bookmarks
496		{
497			string		"_Bookmarks"
498			font		"f_menubig"
499			color		"0 0.5 0 1"
500			pos			"15 30"
501			size		"440 35"
502			contentalign	ALIGN_UC
503		}
504
505		rows lines {
506			pos			"90 95"
507			size		"310 480"
508			color1		"0 0.08 0 1"
509			color2		"0 0.16 0 1"
510			lineheight	30
511		}
512		cmpAdr adr0  { pos "95 100" num 0 }
513		cmpAdr adr1  { pos "95 130" num 1 }
514		cmpAdr adr2  { pos "95 160" num 2 }
515		cmpAdr adr3  { pos "95 190" num 3 }
516		cmpAdr adr4  { pos "95 220" num 4 }
517		cmpAdr adr5  { pos "95 250" num 5 }
518		cmpAdr adr6  { pos "95 280" num 6 }
519		cmpAdr adr7  { pos "95 310" num 7 }
520		cmpAdr adr8  { pos "95 340" num 8 }
521		cmpAdr adr9  { pos "95 370" num 9 }
522		cmpAdr adr10 { pos "95 400" num 10 }
523		cmpAdr adr11 { pos "95 430" num 11 }
524		cmpAdr adr12 { pos "95 460" num 12 }
525		cmpAdr adr13 { pos "95 490" num 13 }
526		cmpAdr adr14 { pos "95 520" num 14 }
527		cmpAdr adr15 { pos "95 550" num 15 }
528	}
529
530	confunc check_bookmarks {
531		*cvar:i = 0
532		while ( *cvar:i <= 15 ) {
533			if ( *cvar:adr<cvar:i> ne "" ) {
534				*node:root.content.adr<cvar:i>.resetadr@invis = false
535				*node:root.content.adr<cvar:i>.adr@invis = false
536				*node:root.content.adr<cvar:i>.adr@string = *cvar:adr<cvar:i>
537			} else {
538				*node:root.content.adr<cvar:i>.resetadr@invis = true
539				*node:root.content.adr<cvar:i>.adr@invis = true
540			}
541			*cvar:i = ( *cvar:i + 1 )
542		}
543		delete *cvar:i
544	}
545
546	func onWindowOpened {
547		cmd "check_bookmarks;"
548	}
549}
550
551// ==================
552// SERVER MENU
553// ==================
554
555window mp_create_server extends abstract_multiplayer
556{
557	tab create_natigation {
558		{
559			pos	"462 200"
560			size	"500 40"
561			cvar	*cvar:mn_server_config_tab
562			onChange {
563				call *node:root.mp_update_config_navigation
564			}
565		}
566		option map {
567			label	"_Map"
568			value	"1"
569		}
570		option option {
571			label	"_Options"
572			value	"2"
573		}
574		option security {
575			label	"_Security/registration"
576			value	"3"
577		}
578	}
579
580	panel panel_main {
581		{
582			pos			"415 80"
583			size		"608 100"
584		}
585
586		// ===================
587		// HOSTNAME
588		// ===================
589		string current_hostname
590		{
591			string		"_Hostname:"
592			pos			"85 5"
593			size		"256 20"
594		}
595		textentry slot_hostname
596		{
597			string		*cvar:sv_hostname
598			background		"ui/button_green_verysmall"
599			color 		"0 .78 0 1"
600			selectcolor	"1 1 1 1"
601			contentalign	ALIGN_CL
602			padding		8
603			font		"f_verysmall"
604			pos			"245 0"
605			size		"256 34"
606		}
607
608		// ===================
609		// GAME TYPE
610		// ===================
611		string gametype_str
612		{
613			string		"_Gametype:"
614			pos			"85 40"
615			size		"280 20"
616		}
617		selectbox gametype_selector
618		{
619			dataid		TEXT_LIST
620			cvar		*cvar:sv_gametype
621			pos			"245 40"
622			size		"256 215"
623			lineheight	"20"
624			contentalign	ALIGN_UC
625			onChange {
626				cmd "mp_updategametype;mn_getmaps;"
627			}
628		}
629
630		// ===================
631		// TEAMPLAY
632		// ===================
633		string server_teamplay_str
634		{
635			string		"_Teamplay:"
636			pos			"85 70"
637			size		"280 20"
638		}
639		checkbox_blue server_teamplay_value
640		{
641			current		*cvar:sv_teamplay
642			pos			"245 70"
643			size		"20 18"
644		}
645	}
646
647	cmpMapPanel panel_map {
648		{
649			pos		"495 270"
650			size	"475 370"
651		}
652
653		// ===================
654		// GAMETYPE
655		// ===================
656
657		string allowedtype_label
658		{
659			string		"_Allowed gametype:"
660			pos			"10 245"
661			size		"256 20"
662		}
663
664		textlist list_gametypes_text
665		{
666			dataid		TEXT_LIST2
667			pos			"190 245"
668			size		"230 115"
669			font		"f_verysmall"
670			longlines	LONGLINES_WRAP
671			onViewChange {
672				*node:parent.list_gametypes_scroll@fullsize = <fullsize>
673				*node:parent.list_gametypes_scroll@viewsize = <viewsize>
674				*node:parent.list_gametypes_scroll@current = <viewpos>
675			}
676		}
677
678		vscrollbar list_gametypes_scroll {
679			image		"ui/scrollbar_v_green"
680			pos			"420 245"
681			height		"115"
682			hidewhenunused	true
683			onChange {
684				*node:parent.list_gametypes_text@viewpos = <current>
685			}
686		}
687	}
688
689	panel panel_option {
690		{
691			pos			"475 260"
692			size		"460 350"
693		}
694
695		// ===================
696		// MORALE
697		// ===================
698		string morale_str
699		{
700			string		"_Enable morale states:"
701			pos			"25 0"
702			size		"300 20"
703		}
704		checkbox_blue morale_value
705		{
706			current		*cvar:sv_enablemorale
707			pos			"350 1"
708			size		"20 18"
709		}
710		// =======================
711		// ALIEN RUSH
712		// =======================
713		string alienrush_str
714		{
715			string		"_Alien rush:"
716			pos			"25 25"
717			size		"250 20"
718			tooltip		"_Enemies respawn when killed."
719			visiblewhen "*cvar:ai_multiplayeraliens >= 1"
720		}
721		checkbox_blue alienrush_value
722		{
723			current		*cvar:g_endlessaliens
724			pos			"350 26"
725			size		"20 18"
726			visiblewhen "*cvar:ai_multiplayeraliens >= 1"
727		}
728
729		// ===================
730		// MAXCLIENTS
731		// ===================
732		string maxclients_str
733		{
734			string		"_Max. clients:"
735			tooltip		"_Sets the max allowed clients to connect"
736			pos			"25 70"
737			size		"300 20"
738		}
739		string maxclients_value
740		{
741			string		*cvar:sv_maxclients
742			pos			"335 70"
743			size		"50 20"
744			contentalign	ALIGN_UC
745		}
746		spinner_blue maxclients_change
747		{
748			current		*cvar:sv_maxclients
749			pos			"390 70"
750			min			2
751			max			16
752			delta		1
753		}
754
755		// ===================
756		// MAXSOLDIER PER TEAM
757		// ===================
758		string maxperplayer_str
759		{
760			string		"_Max. soldiers per team:"
761			tooltip		"_Sets the max allowed soldiers per team"
762			pos			"25 90"
763			size		"300 20"
764		}
765		string maxperplayer_value
766		{
767			string		*cvar:sv_maxsoldiersperteam
768			pos			"335 90"
769			size		"50 20"
770			contentalign	ALIGN_UC
771		}
772		spinner_blue maxperplayer_change
773		{
774			current		*cvar:sv_maxsoldiersperteam
775			pos			"390 90"
776			min			1
777			max			12
778			delta		1
779		}
780
781		// =====================
782		// MAXSOLDIER PER PLAYER
783		// =====================
784		string maxsoldierperplayer_str
785		{
786			string		"_Max. soldiers per player:"
787			tooltip		"_Sets the max allowed soldiers per player when in teamplay"
788			pos			"25 110"
789			size		"300 20"
790		}
791		string maxsoldierperplayer_value
792		{
793			string		*cvar:sv_maxsoldiersperplayer
794			pos			"335 110"
795			size		"50 20"
796			contentalign	ALIGN_UC
797		}
798		spinner_blue maxsoldierperplayer_change
799		{
800			current		*cvar:sv_maxsoldiersperplayer
801			pos			"390 110"
802			min			1
803			max			12
804			delta		1
805		}
806
807		// ===================
808		// MAX PLAYER PER TEAM
809		// max is half of sv_maxclients
810		// ===================
811		string server_maxplayerperteam_str
812		{
813			string		"_Max. human players per team:"
814			pos			"25 130"
815			size		"300 20"
816		}
817		string server_maxplayerperteam_value
818		{
819			string		*cvar:sv_maxplayersperteam
820			pos			"335 130"
821			size		"50 20"
822			contentalign	ALIGN_UC
823		}
824		spinner_blue maxplayersperteam_change
825		{
826			current		*cvar:sv_maxplayersperteam
827			pos			"390 130"
828			min			1
829			max			8
830			delta		1
831		}
832
833		// ===================
834		// AI_NUMACTORS
835		// ===================
836		string ai_multiplayeraliens_str
837		{
838			string		"_Max. AI actors:"
839			tooltip		"_Max AI actors for teamplay mode"
840			pos			"25 150"
841			size		"300 20"
842		}
843		string ai_multiplayeraliens_value
844		{
845			string		*cvar:ai_multiplayeraliens
846			pos			"335 150"
847			size		"50 20"
848			contentalign	ALIGN_UC
849		}
850		spinner_blue ai_multiplayeraliens_change
851		{
852			current		*cvar:ai_multiplayeraliens
853			pos			"390 150"
854			min			0
855			max			8
856			delta		1
857		}
858
859		// TODO: Allow to set this to 0 to deactivate the round time limit
860		// ===================
861		// ROUND TIMELIMIT
862		// ===================
863		string timelimit_str
864		{
865			string		"_Round time limit in seconds:"
866			pos			"25 170"
867			size		"250 20"
868		}
869		string timelimit_value
870		{
871			string		*cvar:sv_roundtimelimit
872			pos			"335 170"
873			size		"50 20"
874			contentalign	ALIGN_UC
875		}
876		spinner_blue timelimit_change
877		{
878			current		*cvar:sv_roundtimelimit
879			pos			"390 170"
880			min			30
881			max			500
882			delta		5
883		}
884	}
885
886	panel panel_security {
887		{
888			pos			"415 250"
889			size		"608 768"
890		}
891
892		// =====================
893		// PUBLIC - MASTERSERVER
894		// =====================
895		string public_str
896		{
897			string		"_Make this server public:"
898			pos			"85 20"
899			size		"280 20"
900		}
901		checkbox_blue public_value
902		{
903			current		*cvar:sv_public
904			pos			"410 20"
905			size		"20 18"
906		}
907
908		// ===================
909		// SERVER_PASSWORD
910		// ===================
911		string current_server_pwd
912		{
913			string		"_Server-Password:"
914			pos			"85 80"
915			size		"256 20"
916		}
917		textentry slot_server_pwd
918		{
919			string		*cvar:password
920			background		"ui/button_green_verysmall"
921			color 		"0 .78 0 1"
922			selectcolor	"1 1 1 1"
923			contentalign	ALIGN_CL
924			padding		8
925			font		"f_verysmall"
926			pos			"245 75"
927			size		"256 34"
928			ispassword	true
929		}
930
931		// ===================
932		// RCON_PASSWORD
933		// ===================
934		string current_rcon_pwd
935		{
936			string		"_RCON-Password:"
937			pos			"85 140"
938			size		"256 20"
939		}
940		textentry slot_rcon_pwd
941		{
942			string		*cvar:rcon_password
943			background		"ui/button_green_verysmall"
944			color 		"0 .78 0 1"
945			selectcolor	"1 1 1 1"
946			contentalign	ALIGN_CL
947			padding		8
948			font		"f_verysmall"
949			pos			"245 135"
950			size		"256 34"
951			ispassword	true
952		}
953
954	}
955
956	// ===================
957	// FIREWALL TEST
958	// ===================
959
960	/** @todo fix it, it can't support string property */
961	text firewall_str
962	{
963		string		"_Make sure that you've opened the TCP port 27910 in your firewall settings"
964		pos			"500 530"
965		size		"400 100"
966		longlines	LONGLINES_WRAP
967		contentalign	ALIGN_UC
968		font		"f_small"
969		dataid		TEXT_STANDARD
970	}
971
972	// ====================
973	// create_server button
974	// ====================
975
976	cmpMenuButton button_server
977	{
978		string		"_Start server"
979		pos			"570 630"
980		onClick		{ cmd "mp_startserver;" }
981	}
982
983	// ===================
984	// Interaction
985	// ===================
986
987	func mp_update_config_navigation {
988		*node:root.panel_map@invis = true
989		*node:root.panel_option@invis = true
990		*node:root.panel_security@invis = true
991		if ( *cvar:mn_server_config_tab == 1 ) {
992			*node:root.panel_map@invis = false
993		}
994		elif ( *cvar:mn_server_config_tab == 2 ) {
995			*node:root.panel_option@invis = false
996		}
997		elif ( *cvar:mn_server_config_tab == 3 ) {
998			*node:root.panel_security@invis = false
999		}
1000	}
1001
1002	func onWindowOpened
1003	{
1004		cmd "killserver;set sv_maxplayersperteam 8;set sv_roundtimelimit 0;set mn_serverday 1;"
1005		cmd "mp_init_ui;mn_getmaps;"
1006		*cvar:mn_server_config_tab = 1
1007		call *node:root.mp_update_config_navigation
1008		cmd "ui_resetdata TEXT_STANDARD;"
1009		cmd "define g_endlessaliens 0;"
1010	}
1011}
1012
1013// ===========================================
1014// MULTIPLAYER TEAM SELECTION AND WAIT DIALOG
1015// ===========================================
1016window multiplayer_wait extends levelbuttons
1017{
1018	{
1019		fill		true
1020		starlayout	true
1021	}
1022
1023	timer event {
1024		timeout 	2000
1025		// update every 2 sec
1026		onEvent {
1027			cmd "mp_selectteam_init;"
1028		}
1029	}
1030
1031	battlescape render {
1032		pos			"0 0"
1033		size		"1024 768"
1034		align		LAYOUTALIGN_FILL
1035	}
1036
1037	todo widescreen { pos "80 370" string "Center panels"}
1038
1039	panel floor {
1040		{
1041			pos		"0 128"
1042			size	"40 346"
1043			align	LAYOUTALIGN_LEFT
1044			excluderect	{ pos "0 0" size "40 4" }
1045			excluderect	{ pos "6 341" size "35 6" }
1046			excluderect	{ pos "32 333" size "8 8" }
1047		}
1048
1049		image bar_floor
1050		{
1051			src	"hud/bar_floor"
1052			pos		"0 0"
1053			size	"40 346"
1054			texh	"40 346"
1055			ghost	true
1056		}
1057
1058		radiobutton bt0
1059		{
1060			tooltip	"_Level 1"
1061			pos		"6 293"
1062			size	"27 35"
1063			background	"buttons/blue2-1"
1064			value	0
1065			cvar	*cvar:cl_worldlevel
1066			icon	"icons/number_1"
1067		}
1068
1069		radiobutton bt1
1070		{
1071			tooltip	"_Level 2"
1072			pos		"6 253"
1073			size	"27 35"
1074			background	"buttons/blue2-1"
1075			value	1
1076			cvar	*cvar:cl_worldlevel
1077			icon	"icons/number_2"
1078		}
1079
1080		radiobutton bt2
1081		{
1082			tooltip	"_Level 3"
1083			pos		"6 213"
1084			size	"27 35"
1085			background	"buttons/blue2-1"
1086			value	2
1087			cvar	*cvar:cl_worldlevel
1088			icon	"icons/number_3"
1089		}
1090
1091		radiobutton bt3
1092		{
1093			tooltip	"_Level 4"
1094			pos		"6 173"
1095			size	"27 35"
1096			background	"buttons/blue2-1"
1097			value	3
1098			cvar	*cvar:cl_worldlevel
1099			icon	"icons/number_4"
1100		}
1101
1102		radiobutton bt4
1103		{
1104			tooltip	"_Level 5"
1105			pos		"6 133"
1106			size	"27 35"
1107			background	"buttons/blue2-1"
1108			value	4
1109			cvar	*cvar:cl_worldlevel
1110			icon	"icons/number_5"
1111		}
1112
1113		radiobutton bt5
1114		{
1115			tooltip	"_Level 6"
1116			pos		"6 93"
1117			size	"27 35"
1118			background	"buttons/blue2-1"
1119			value	5
1120			cvar	*cvar:cl_worldlevel
1121			icon	"icons/number_6"
1122		}
1123
1124		radiobutton bt6
1125		{
1126			tooltip	"_Level 7"
1127			pos		"6 53"
1128			size	"27 35"
1129			background	"buttons/blue2-1"
1130			value	6
1131			cvar	*cvar:cl_worldlevel
1132			icon	"icons/number_7"
1133		}
1134
1135		radiobutton bt7
1136		{
1137			tooltip	"_Level 8"
1138			pos		"6 13"
1139			size	"27 35"
1140			background	"buttons/blue2-1"
1141			value	7
1142			cvar	*cvar:cl_worldlevel
1143			icon	"icons/number_8"
1144		}
1145	}
1146
1147	panel players {
1148		{
1149			pos		"520 30"
1150			size	"400 250"
1151			padding	5
1152			background	"ui/panel_window"
1153		}
1154
1155		string title
1156		{
1157			string		"_Players connected"
1158			font		"f_big"
1159			color		"1 1 1 1"
1160			pos			"0 5"
1161			size		"415 50"
1162			contentalign	ALIGN_CC
1163		}
1164
1165		panel ready {
1166			{
1167				layout LAYOUT_TOP_DOWN_FLOW
1168				layoutMargin 2
1169				padding		0
1170				pos			"50 50"
1171				size		"16 300"
1172			}
1173
1174			image p0 { size "16 16" }
1175			image p1 { size "16 16" }
1176			image p2 { size "16 16" }
1177			image p3 { size "16 16" }
1178			image p4 { size "16 16" }
1179			image p5 { size "16 16" }
1180			image p6 { size "16 16" }
1181			image p7 { size "16 16" }
1182			image p8 { size "16 16" }
1183			image p9 { size "16 16" }
1184		}
1185
1186		text userlist
1187		{
1188			dataid		TEXT_MULTIPLAYER_USERLIST
1189			pos			"80 50"
1190			size		"150 300"
1191		}
1192
1193		text teamlist
1194		{
1195			dataid		TEXT_MULTIPLAYER_USERTEAM
1196			pos			"200 50"
1197			size		"150 300"
1198		}
1199	}
1200
1201	panel teamselection {
1202		{
1203			pos		"520 290"
1204			size	"400 200"
1205			padding	10
1206			background	"ui/panel_window"
1207		}
1208
1209		string title
1210		{
1211			string		"_Team selection"
1212			font		"f_big"
1213			color		"1 1 1 1"
1214			pos			"0 5"
1215			size		"415 50"
1216			contentalign	ALIGN_CC
1217		}
1218
1219		text teamnum_status
1220		{
1221			dataid		TEXT_STANDARD
1222			pos			"10 50"
1223			size		"380 32"
1224			lineheight	16
1225			tabwidth	60
1226			rows		2
1227			contentalign	ALIGN_CC
1228		}
1229
1230		string teamnum_str
1231		{
1232			string		"_Team preference:"
1233			pos			"25 80"
1234			size		"195 20"
1235		}
1236		string teamnum_value
1237		{
1238			string		*cvar:cl_teamnum
1239			pos			"248 80"
1240			size		"40 20"
1241			contentalign	ALIGN_UR
1242		}
1243		button teamnum_inc
1244		{
1245			visiblewhen	"*cvar:cl_ready != 1"
1246			tooltip		"_Next free team"
1247			icon		"icons/next"
1248			pos			"298 82"
1249			size		"16 16"
1250			padding		0
1251			onClick		{ cmd "teamnum_inc;" }
1252		}
1253		button teamnum_dec
1254		{
1255			visiblewhen	"*cvar:cl_ready != 1"
1256			tooltip		"_Previous free team"
1257			icon		"icons/prev"
1258			pos			"222 82"
1259			size		"16 16"
1260			padding		0
1261			onClick		{ cmd "teamnum_dec;" }
1262		}
1263
1264		checkbox_green cb_ready
1265		{
1266			tooltip		"_Finish the teamselection and start the game"
1267			pos			"200 130"
1268			size		"20 20"
1269			current		*cvar:cl_ready
1270		}
1271		string cb_ready_label
1272		{
1273			string		"_Are you ready?"
1274			tooltip		"_Finish the teamselection and start the game"
1275			pos			"230 130"
1276			size		"180 20"
1277			onClick		{ call *node:parent.cb_ready@toggle }
1278		}
1279	}
1280
1281	panel admin {
1282		{
1283			pos		"50 30"
1284			size	"400 200"
1285			padding	10
1286			background	"ui/panel_window"
1287		}
1288
1289		string title
1290		{
1291			string		"_Admin control"
1292			font		"f_big"
1293			color		"1 1 1 1"
1294			pos			"0 5"
1295			size		"415 50"
1296			contentalign	ALIGN_CC
1297		}
1298
1299		string maxperplayer_str
1300		{
1301			string		"_Max. soldiers per team:"
1302			tooltip		"_Sets the max allowed soldiers per team"
1303			pos			"25 60"
1304			size		"250 20"
1305		}
1306		string maxperplayer_value
1307		{
1308			string		*cvar:sv_maxsoldiersperteam
1309			pos			"280 60"
1310			size		"40 20"
1311			contentalign	ALIGN_UC
1312		}
1313		spinner_blue maxperplayer_change
1314		{
1315			current		*cvar:sv_maxsoldiersperteam
1316			pos			"325 60"
1317			min			1
1318			max			12
1319			delta		1
1320		}
1321
1322		string maxsoldierperplayer_str
1323		{
1324			string		"_Max. soldiers per player:"
1325			tooltip		"_Sets the max allowed soldiers per player when in teamplay"
1326			pos			"25 85"
1327			size		"250 20"
1328		}
1329		string maxsoldierperplayer_value
1330		{
1331			string		*cvar:sv_maxsoldiersperplayer
1332			pos			"280 85"
1333			size		"40 20"
1334			contentalign	ALIGN_UC
1335		}
1336		spinner_blue maxsoldierperplayer_change
1337		{
1338			current		*cvar:sv_maxsoldiersperplayer
1339			pos			"325 85"
1340			min			1
1341			max			12
1342			delta		1
1343		}
1344
1345		string roundlimit_str
1346		{
1347			string		"_Round time limit:"
1348			tooltip		"_Sets the max allowed soldiers per team"
1349			pos			"25 110"
1350			size		"250 20"
1351		}
1352		string roundtimelimit_value
1353		{
1354			string		*cvar:sv_roundtimelimit
1355			pos			"280 110"
1356			size		"40 20"
1357			contentalign	ALIGN_UC
1358		}
1359		spinner_blue roundtimelimit_change
1360		{
1361			current		*cvar:sv_roundtimelimit
1362			pos			"325 110"
1363			min			30
1364			max			500
1365			delta		5
1366		}
1367
1368		button button_force
1369		{
1370			string		"_Force start"
1371			tooltip		"_Launch the game before all teams are ready"
1372			background		"ui/button_blue"
1373			pos			"25 145"
1374			size		"150 30"
1375			color		"0.8 0.8 0.8 1"
1376			selectcolor "1 1 1 1"
1377			onClick		{ cmd "cl_startgame;" }
1378		}
1379	}
1380
1381	panel rcon {
1382		{
1383			pos		"50 290"
1384			size	"400 200"
1385			padding	10
1386			background	"ui/panel_window"
1387		}
1388
1389		string title
1390		{
1391			string		"_Remote Admin Control"
1392			font		"f_big"
1393			color		"1 1 1 1"
1394			pos			"0 5"
1395			size		"415 50"
1396			contentalign	ALIGN_CC
1397		}
1398
1399		string current_rcon_pwd
1400		{
1401			string		"_RCON-Password:"
1402			pos			"25 80"
1403			size		"256 20"
1404		}
1405		textentry slot_rcon_pwd
1406		{
1407			string		*cvar:rcon_password
1408			background		"ui/button_green_verysmall"
1409			color 		"0 .78 0 1"
1410			selectcolor	"1 1 1 1"
1411			contentalign	ALIGN_CL
1412			padding		8
1413			font		"f_verysmall"
1414			pos			"25 110"
1415			size		"250 30"
1416			ispassword	true
1417		}
1418	}
1419
1420	confunc multiplayer_admin_panel {
1421		if (<1> == 0) {
1422			*node:root.admin@invis = true
1423		} else {
1424			*node:root.admin@invis = false
1425		}
1426	}
1427
1428	button invite_players {
1429		string		"_Invite others"
1430		background		"ui/button_blue"
1431		tooltip		"_Invite players that are online in the lobby"
1432		pos			"30 650"
1433		size		"150 40"
1434		disabled	true
1435		color		"0.8 0.8 0.8 1"
1436		selectcolor "1 1 1 1"
1437		onClick {
1438			cmd "irc_invite;"
1439		}
1440	}
1441
1442	/**
1443	 * @param <1> player ID/line
1444	 * @param <2> 0: not ready, 1: ready
1445	 * @todo use an image instead of a color
1446	 */
1447	confunc multiplayer_playerIsReady {
1448		if ( ( <1> < 10 ) and ( <1> >= 0 ) ) {
1449			if ( <2> == 0 ) {
1450				*node:root.players.ready.p<1>@src = "icons/off"
1451				*node:root.players.ready.p<1>@invis = false
1452			} else {
1453				*node:root.players.ready.p<1>@src = "icons/on"
1454				*node:root.players.ready.p<1>@invis = false
1455			}
1456		}
1457	}
1458
1459	/**
1460	 * @param <1> number of players
1461	 */
1462	confunc multiplayer_playerNumber {
1463		*cvar:tmp = "<1>"
1464		while ( *cvar:tmp < 10 ) {
1465			*node:root.players.ready.p<1>@invis = true
1466			*cvar:tmp = ( *cvar:tmp + 1 )
1467		}
1468		delete *cvar:tmp
1469	}
1470
1471	/**
1472	 * @param <1> boolean whether this is a teamplay match
1473	 */
1474	confunc multiplayer_setTeamplay {
1475		// @todo - deactivate team change if the given boolean is false	(0)
1476	}
1477
1478	/**
1479	 * @brief Updates the level status
1480	 * @inherited from levelbuttons window
1481	 * @param <1> Level id (0-7)
1482	 * @param <2> State
1483	 *   0 = disabled (map doesn't have this level),
1484	 *   1 = available (user can switch to this level)
1485	 *   2 = active (the current selected level)
1486	 */
1487	confunc updateLevelStatus {
1488		if ( <2> == 0 ) { *node:root.floor.bt<1>@disabled = true }
1489		elif ( <2> >= 1 ) { *node:root.floor.bt<1>@disabled = false }
1490	}
1491
1492	// ===================
1493	// EVENTS
1494	// ===================
1495
1496	func onWindowOpened
1497	{
1498		cmd "mp_selectteam_init;ui_push hud_chat;"
1499		*cvar:mn_displaypartyinfo = 1
1500		*cvar:mn_entry = ""
1501		*cvar:mn_chatselect = "chat"
1502		*cvar:cl_ready = 0
1503	}
1504
1505	func onWindowClosed
1506	{
1507		delete *cvar:mn_entry
1508		delete *cvar:mn_chatselect
1509		delete *cvar:mn_displaypartyinfo
1510	}
1511}
1512
1513// ==========================
1514// SERVER PASSWORD
1515// ==========================
1516window serverpassword
1517{
1518	{
1519		string		"_Enter server password"
1520		pos			"264 262"
1521		size		"496 247"
1522		dragbutton	true
1523		closebutton	true
1524		background		"ui/popup_alpha_tile"
1525	}
1526
1527	// ===================
1528	// PASSWORD
1529	// ===================
1530	string current_password
1531	{
1532		string		"_Password:"
1533		pos			"66 58"
1534		size		"256 20"
1535	}
1536	textentry slot_password
1537	{
1538		background		"ui/button_green_verysmall"
1539		color		"0 .78 0 1"
1540		selectcolor	"1 1 1 1"
1541		contentalign	ALIGN_CL
1542		padding		8
1543		font		"f_verysmall"
1544		pos			"66 78"
1545		size		"256 34"
1546		string		*cvar:password
1547		ispassword	true
1548	}
1549
1550	button set_password
1551	{
1552		string		"_OK"
1553		background		"ui/button_green_small"
1554		pos			"260 170"
1555		width		"200"
1556		font		"f_menu"
1557		color		"0 0.5 0 1"
1558		selectcolor	"1 1 1 1"
1559		onClick		{ cmd "mn_server_need_password 0;ui_pop;connect;" }
1560	}
1561}
1562
1563// ==========================
1564// GAME INVITATION
1565// ==========================
1566window multiplayer_invite
1567{
1568	{
1569		string		"_Game invitation"
1570		pos			"264 262"
1571		size		"496 247"
1572		dragbutton	true
1573		closebutton	true
1574		background		"ui/popup_alpha_tile"
1575	}
1576
1577	/* store popup data */
1578	string ip { invis true }
1579	string port { invis true }
1580
1581	confunc	multiplayer_invite_server_info {
1582		*node:root.ip@string = <1>
1583		*node:root.port@string = <2>
1584	}
1585
1586	button server_info
1587	{
1588		string		"_Server info"
1589		tooltip		"_Show server information"
1590		background		"ui/button_green_small"
1591		pos			"30 170"
1592		width		"200"
1593		font		"f_menu"
1594		color		"0 0.5 0 1"
1595		selectcolor	"1 1 1 1"
1596		onClick		{
1597			cmd "ui_pop;"
1598			cmd "server_info <node:root.ip@string> <node:root.port@string>;"
1599		}
1600	}
1601
1602	button enter_lobby
1603	{
1604		string		"_Lobby"
1605		tooltip		"_Go into the lobby"
1606		background		"ui/button_green_small"
1607		pos			"260 170"
1608		width		"200"
1609		font		"f_menu"
1610		color		"0 0.5 0 1"
1611		selectcolor	"1 1 1 1"
1612		onClick		{ cmd "ui_pop;ui_push irc;" }
1613	}
1614
1615	string invite_msg
1616	{
1617		string		"_You received a invitation to take part of a multiplayer game. Hit the connect button to connect to the server"
1618		pos			"30 50"
1619		longlines	LONGLINES_WRAP
1620		size		"440 60"
1621	}
1622}
1623