]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/dialog_welcome.qc
Wrap all status and bitflag checks with parentesis to avoid possible obscure bugs
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / dialog_welcome.qc
1 #include "dialog_welcome.qh"
2
3 #include "image.qh"
4 #include "textlabel.qh"
5 #include "textbox.qh"
6 #include "radiobutton.qh"
7 #include "commandbutton.qh"
8 #include "slider.qh"
9 #include <common/campaign_common.qh>
10
11 void welcomeDialog_resetStrings(entity me)
12 {
13         strcpy(me.serverinfo_name, _("Welcome"));
14         strcpy(me.serverinfo_MOTD, "");
15 }
16
17 float XonoticWelcomeDialog_keyDown(entity me, float key, float ascii, float shift)
18 {
19         switch(key)
20         {
21                 case K_KP_ENTER:
22                 case K_ENTER:
23                 case K_SPACE:
24                         XonoticCommandButton_Click(me.joinButton_ent, me);
25                         return true;
26                 default:
27                         return SUPER(XonoticWelcomeDialog).keyDown(me, key, ascii, shift);
28         }
29 }
30
31 // the same implentation in mousePress apparently works, but for some reason if you try to open
32 // the dialog again it doesn't show up and requires opening it a seconds time to show up
33 bool XonoticWelcomeDialog_mouseRelease(entity me, vector pos)
34 {
35         if (pos.x >= 0 && pos.y >= 0 && pos.x < 1 && pos.y < 1)
36         {
37                 return SUPER(XonoticWelcomeDialog).mouseRelease(me, pos);
38         }
39         me.close(me);
40         return true;
41 }
42
43 void XonoticWelcomeDialog_destroy(entity me)
44 {
45         cvar_set("_menu_welcome_dialog_available", "0");
46 }
47
48 void XonoticWelcomeDialog_readInputArgs(entity me, int argsbuf)
49 {
50         int i = 0;
51         string s;
52         welcomeDialog_resetStrings(me);
53         if(argsbuf >= 0)
54         while((s = bufstr_get(argsbuf, i)) != "")
55         {
56                 if(s == "HOSTNAME")
57                         strcpy(me.serverinfo_name, bufstr_get(argsbuf, ++i));
58                 else if(s == "WELCOME")
59                         strcpy(me.serverinfo_MOTD, bufstr_get(argsbuf, ++i));
60                 else if(s == "CAMPAIGN")
61                 {
62                         strcpy(me.serverinfo_name, campaign_title);
63
64                         int level = stoi(bufstr_get(argsbuf, ++i)) - 1;
65                         string campaign_msg;
66                         if (level < 0 || level >= campaign_entries)
67                                 campaign_msg = strcat("^1Error: invalid level number ", itos(level + 1));
68                         else
69                         {
70                                 string desc = strcat(campaign_shortdesc[level], "\n\n", campaign_longdesc[level]);
71                                 desc = strreplace("\n", "\\n", desc);
72                                 campaign_msg = strreplace("_LEVEL_DESC", desc, bufstr_get(argsbuf, ++i));
73                         }
74                         strcpy(me.serverinfo_MOTD, campaign_msg);
75                         break;
76                 }
77                 else if(s == "RESET")
78                 {
79                         welcomeDialog_resetStrings(me);
80                         break;
81                 }
82                 ++i;
83         }
84         //me.serverinfo_name_ent.setText(me.serverinfo_name_ent, me.serverinfo_name);
85         me.serverinfo_MOTD_ent.setText(me.serverinfo_MOTD_ent, me.serverinfo_MOTD);
86         me.frame.setText(me.frame, me.serverinfo_name);
87 }
88
89 void XonoticWelcomeDialog_draw(entity me)
90 {
91         SUPER(XonoticWelcomeDialog).draw(me);
92
93         if (!(gamestatus & (GAME_ISSERVER | GAME_CONNECTED)))
94                 me.close(me);
95
96         if(me.serverinfo_MOTD == "" && (gamestatus & (GAME_CONNECTED | GAME_ISSERVER)))
97         {
98                 // if serverinfo_MOTD is empty while connected it means we are connected to an old server
99                 // in this case show the csqc welcome message and instantly close the dialog
100                 localcmd("\n+show_info0; defer 2 -show_info0\n");
101                 me.close(me);
102         }
103
104         if (isdemo())
105         {
106                 me.joinButton_ent.disabled = true;
107                 me.spectateButton_ent.disabled = true;
108         }
109         else
110         {
111                 me.joinButton_ent.disabled = false;
112                 me.spectateButton_ent.disabled = false;
113         }
114 }
115
116 void XonoticWelcomeDialog_fill(entity me)
117 {
118         registercvar("_menu_welcome_dialog_available", "0", 0);
119         cvar_set("_menu_welcome_dialog_available", "1");
120
121         me.frame.allowColors = true; // allow color codes in the title
122
123         entity e;
124
125         me.TR(me);
126                 me.TD(me, me.rows - 1, me.columns, me.serverinfo_MOTD_ent = makeXonoticTextBox());
127                         me.serverinfo_MOTD_ent.align = 0.5;
128                         me.serverinfo_MOTD_ent.allowColors = true;
129                         me.serverinfo_MOTD_ent.escapedNewLines = true;
130         me.gotoRC(me, me.rows - 1, 0);
131                 me.TD(me, 1, me.columns / 2, me.joinButton_ent = makeXonoticCommandButton(_("Join"), '0 1 0', "cmd join", COMMANDBUTTON_CLOSE));
132                         me.joinButton_ent.preferredFocusPriority = 1;
133                 me.TD(me, 1, me.columns / 2, me.spectateButton_ent = makeXonoticCommandButton(_("Spectate"), '0 0 0', "cmd spectate", COMMANDBUTTON_CLOSE));
134 }