Subversion Repositories Games.Chess Giants

Rev

Rev 179 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 179 Rev 180
Line 13... Line 13...
13
#define GAMETYPE_TWOPLAYERS 3
13
#define GAMETYPE_TWOPLAYERS 3
14
 
14
 
15
 
15
 
16
// global variables used in this module only
16
// global variables used in this module only
17
static int newgame_type = 0;
17
static int newgame_type = 0;
18
static bool is_internet_available = false;
18
static HWND hThisDialogWnd = NULL;
19
static bool is_chessserver_reachable = false;
-
 
20
 
19
 
21
 
20
 
22
// prototypes of local functions
21
// prototypes of local functions
23
static void StartThread_ThisDialog (void *thread_parms);
22
static void StartThread_ThisDialog (void *thread_parms);
24
static int CALLBACK DialogProc_ThisDialog (HWND hWnd, unsigned int message, WPARAM wParam, LPARAM lParam);
23
static int CALLBACK DialogProc_ThisDialog (HWND hWnd, unsigned int message, WPARAM wParam, LPARAM lParam);
-
 
24
static void StartThread_TestConnectionInBackground (void *thread_parms);
25
 
25
 
26
 
26
 
27
void DialogBox_NewGame (void)
27
void DialogBox_NewGame (void)
28
{
28
{
29
   // helper function to fire up the modeless dialog box
29
   // helper function to fire up the modeless dialog box
30
 
30
 
31
   // HACK to prevent the player to click and block the view angles while the slide-in is not finished
31
   // HACK to prevent the player to click and block the view angles while the slide-in is not finished
32
   command_ignoretime = current_time + 2.0f; // allow 2 seconds
32
   command_ignoretime = current_time + 2.0f; // allow 2 seconds
33
 
33
 
34
   is_dialogbox_displayed = true;
34
   is_dialogbox_displayed = true;
-
 
35
   hThisDialogWnd = NULL;
35
   _beginthread (StartThread_ThisDialog, 0, NULL); // so fire up a new one
36
   _beginthread (StartThread_ThisDialog, 0, NULL); // so fire up a new one
-
 
37
 
-
 
38
   // start the thread that will tell whether Internet works
-
 
39
   _beginthread (StartThread_TestConnectionInBackground, 0, NULL);
36
 
40
 
37
   the_scene.gui.want_spinwheel = true; // start spinning wheel
41
   the_scene.gui.want_spinwheel = true; // start spinning wheel
38
 
42
 
39
   return; // return as soon as the thread is fired up
43
   return; // return as soon as the thread is fired up
40
}
44
}
Line 71... Line 75...
71
   SetWindowText (hMainWnd, PROGRAM_NAME); // update window title
75
   SetWindowText (hMainWnd, PROGRAM_NAME); // update window title
72
   the_board.reevaluate = true; // evaluate the new board
76
   the_board.reevaluate = true; // evaluate the new board
73
   the_scene.update = true; // update scene
77
   the_scene.update = true; // update scene
74
 
78
 
75
   return; // finished, a new game of the chosen type is being fired up
79
   return; // finished, a new game of the chosen type is being fired up
76
}
-
 
77
 
-
 
78
 
-
 
79
static void StartThread_TestConnectionInBackground (void *thread_parms)
-
 
80
{
-
 
81
   // this function runs in a separate thread and tests the connectivity to the chess server in the background
-
 
82
 
-
 
83
   char icmp_send_buffer[32] = "Chess Giants connectivity test";
-
 
84
   void *icmp_recv_buffer[sizeof (ICMP_ECHO_REPLY) + sizeof (icmp_send_buffer)];
-
 
85
   char ascii_hostname[256];
-
 
86
   struct hostent *hostinfo;
-
 
87
   uint32_t server_ipaddr;
-
 
88
   HANDLE icmp_descriptor;
-
 
89
 
-
 
90
   // since this is a synchronous operation, it's a good idea to do this on this separate thread
-
 
91
   ConvertTo7BitASCII (ascii_hostname, sizeof (ascii_hostname), options.network.server_address);
-
 
92
   if ((hostinfo = gethostbyname (ascii_hostname)) != NULL)
-
 
93
   {
-
 
94
      // DO NOT CONNECT TO THE SERVER AND DISCONNECT IMMEDIATELY ELSE IT WILL RESULT IN AN IP BAN. Use an ICMP ping instead.
-
 
95
      server_ipaddr = inet_addr (inet_ntoa (*(struct in_addr *) hostinfo->h_addr_list[0]));
-
 
96
      icmp_descriptor = IcmpCreateFile ();
-
 
97
      if ((icmp_descriptor != INVALID_HANDLE_VALUE)
-
 
98
          && (IcmpSendEcho (icmp_descriptor, server_ipaddr, icmp_send_buffer, sizeof (icmp_send_buffer), NULL, icmp_recv_buffer, sizeof (icmp_recv_buffer), 5000) != 0)
-
 
99
          && (((ICMP_ECHO_REPLY *) icmp_recv_buffer)->Status == 0))
-
 
100
         is_chessserver_reachable = true; // on success, remember we could reach the chess server
-
 
101
   }
-
 
102
 
-
 
103
   return; // _endthread() implied
-
 
104
}
80
}
105
 
81
 
106
 
82
 
107
static void StartThread_ThisDialog (void *thread_parms)
83
static void StartThread_ThisDialog (void *thread_parms)
108
{
84
{
109
   // this function runs in a separate thread, for that's the only way (seemingly)
85
   // this function runs in a separate thread, for that's the only way (seemingly)
110
   // to implement a non-modal message box using the Common Controls library.
86
   // to implement a non-modal message box using the Common Controls library.
111
 
-
 
112
   is_internet_available = false; // assume Internet doesn't work until told otherwise
-
 
113
   is_chessserver_reachable = false;
-
 
114
 
-
 
115
   // start the thread that will tell whether Internet works
-
 
116
   _beginthread (StartThread_TestConnectionInBackground, 0, NULL); // so fire up a new one
-
 
117
 
87
 
118
   // display the dialog box
88
   // display the dialog box
119
   newgame_type = DialogBox (hAppInstance, MAKEINTRESOURCE (THIS_DIALOG), hMainWnd, DialogProc_ThisDialog);
89
   newgame_type = DialogBox (hAppInstance, MAKEINTRESOURCE (THIS_DIALOG), hMainWnd, DialogProc_ThisDialog);
120
   if (newgame_type > 0)
90
   if (newgame_type > 0)
121
      is_dialogbox_newgame_validated = true;
91
      is_dialogbox_newgame_validated = true;
Line 134... Line 104...
134
   unsigned short wParam_loword;
104
   unsigned short wParam_loword;
135
 
105
 
136
   // filter out the commonly used message values
106
   // filter out the commonly used message values
137
   wParam_hiword = HIWORD (wParam);
107
   wParam_hiword = HIWORD (wParam);
138
   wParam_loword = LOWORD (wParam);
108
   wParam_loword = LOWORD (wParam);
139
 
-
 
140
   // any message will do (mouse move, etc.) -- is the chess server reachable ?
-
 
141
   if (!is_internet_available && is_chessserver_reachable)
-
 
142
   {
-
 
143
      is_internet_available = true; // remember we no longer need to look after that (FLAG THIS BEFORE ANY SendMessage() HAPPENS!)
-
 
144
      Static_SetText (GetDlgItem (hWnd, STATICTEXT_NEWGAME_ONLINEDESCRIPTION), LOCALIZE (L"NewGame_OnlineDescription"));
-
 
145
      EnableWindow (GetDlgItem (hWnd, BUTTON_NEWGAME_ONLINE), true);
-
 
146
      EnableWindow (GetDlgItem (hWnd, STATICTEXT_NEWGAME_ONLINEDESCRIPTION), true);
-
 
147
   }
-
 
148
 
109
 
149
   // have we just fired up this window ?
110
   // have we just fired up this window ?
150
   if (message == WM_INITDIALOG)
111
   if (message == WM_INITDIALOG)
151
   {
112
   {
-
 
113
      hThisDialogWnd = hWnd; // save the dialog handle
-
 
114
 
152
      // center the window
115
      // center the window
153
      CenterWindow (hWnd, hMainWnd);
116
      CenterWindow (hWnd, hMainWnd);
154
 
117
 
155
      // set dialog icons (small one for title bar & big one for task manager)
118
      // set dialog icons (small one for title bar & big one for task manager)
156
      SendMessage (hWnd, WM_SETICON, ICON_SMALL, (LPARAM) LoadIcon (hAppInstance, MAKEINTRESOURCE (ICON_MAIN)));
119
      SendMessage (hWnd, WM_SETICON, ICON_SMALL, (LPARAM) LoadIcon (hAppInstance, MAKEINTRESOURCE (ICON_MAIN)));
Line 177... Line 140...
177
      // convert the status bar message to a hyperlink
140
      // convert the status bar message to a hyperlink
178
      ConvertStaticToHyperlink (GetDlgItem (hWnd, STATICTEXT_NEWGAME_STATUSBAR));
141
      ConvertStaticToHyperlink (GetDlgItem (hWnd, STATICTEXT_NEWGAME_STATUSBAR));
179
 
142
 
180
      // and stop the center message display
143
      // and stop the center message display
181
      the_scene.gui.want_spinwheel = false;
144
      the_scene.gui.want_spinwheel = false;
-
 
145
   }
-
 
146
 
-
 
147
   // else have we been notified that the chess server is reachable ?
-
 
148
   else if (message == WM_USER)
-
 
149
   {
-
 
150
      Static_SetText (GetDlgItem (hWnd, STATICTEXT_NEWGAME_ONLINEDESCRIPTION), LOCALIZE (L"NewGame_OnlineDescription"));
-
 
151
      EnableWindow (GetDlgItem (hWnd, BUTTON_NEWGAME_ONLINE), true);
-
 
152
      EnableWindow (GetDlgItem (hWnd, STATICTEXT_NEWGAME_ONLINEDESCRIPTION), true);
182
   }
153
   }
183
 
154
 
184
   // else did we click the close button on the title bar or hit the escape key ?
155
   // else did we click the close button on the title bar or hit the escape key ?
185
   else if (message == WM_CLOSE)
156
   else if (message == WM_CLOSE)
-
 
157
   {
-
 
158
      hThisDialogWnd = NULL; // forget about the dialog handle
186
      EndDialog (hWnd, 0); // close the dialog box
159
      EndDialog (hWnd, 0); // close the dialog box
-
 
160
   }
187
 
161
 
188
   // else did we take action on one of the controls ?
162
   // else did we take action on one of the controls ?
189
   else if (message == WM_COMMAND)
163
   else if (message == WM_COMMAND)
190
   {
164
   {
191
      // did we cancel the dialog box ? (IDCANCEL is a system-wide dialog box handler value, that catches the ESC key)
165
      // did we cancel the dialog box ? (IDCANCEL is a system-wide dialog box handler value, that catches the ESC key)
Line 209... Line 183...
209
         ShellExecute (NULL, L"open", PROGRAM_URL, NULL, NULL, SW_MAXIMIZE); // open the donation page in the default browser, maximized
183
         ShellExecute (NULL, L"open", PROGRAM_URL, NULL, NULL, SW_MAXIMIZE); // open the donation page in the default browser, maximized
210
   }
184
   }
211
 
185
 
212
   // call the default dialog message processing function to keep things going
186
   // call the default dialog message processing function to keep things going
213
   return (false);
187
   return (false);
-
 
188
}
-
 
189
 
-
 
190
 
-
 
191
static void StartThread_TestConnectionInBackground (void *thread_parms)
-
 
192
{
-
 
193
   // this function runs in a separate thread and tests the connectivity to the chess server in the background
-
 
194
 
-
 
195
   char icmp_send_buffer[32] = "Chess Giants connectivity test";
-
 
196
   void *icmp_recv_buffer[sizeof (ICMP_ECHO_REPLY) + sizeof (icmp_send_buffer)];
-
 
197
   char ascii_hostname[256];
-
 
198
   struct hostent *hostinfo;
-
 
199
   uint32_t server_ipaddr;
-
 
200
   HANDLE icmp_descriptor;
-
 
201
   int wait_count;
-
 
202
   int try_count;
-
 
203
 
-
 
204
   // since this is a synchronous operation, it's a good idea to do this on this separate thread
-
 
205
   ConvertTo7BitASCII (ascii_hostname, sizeof (ascii_hostname), options.network.server_address);
-
 
206
   if ((hostinfo = gethostbyname (ascii_hostname)) != NULL)
-
 
207
   {
-
 
208
      // DO NOT CONNECT TO THE SERVER AND DISCONNECT IMMEDIATELY ELSE IT WILL RESULT IN AN IP BAN. Use an ICMP ping instead.
-
 
209
      server_ipaddr = inet_addr (inet_ntoa (*(struct in_addr *) hostinfo->h_addr_list[0]));
-
 
210
      icmp_descriptor = IcmpCreateFile ();
-
 
211
      for (try_count = 0; try_count < 4; try_count++)
-
 
212
      {
-
 
213
         if ((icmp_descriptor != INVALID_HANDLE_VALUE)
-
 
214
            && (IcmpSendEcho (icmp_descriptor, server_ipaddr, icmp_send_buffer, sizeof (icmp_send_buffer), NULL, icmp_recv_buffer, sizeof (icmp_recv_buffer), 5000) != 0)
-
 
215
            && (((ICMP_ECHO_REPLY *) icmp_recv_buffer)->Status == 0))
-
 
216
         {
-
 
217
            for (wait_count = 0; wait_count < 100; wait_count++)
-
 
218
            {
-
 
219
               if (IsWindow (hThisDialogWnd))
-
 
220
               {
-
 
221
                  PostMessage (hThisDialogWnd, WM_USER, 0, 0); // on success, remember we could reach the chess server
-
 
222
                  break;
-
 
223
               }
-
 
224
               Sleep (100);
-
 
225
            }
-
 
226
            break; // one reply is enough
-
 
227
         }
-
 
228
         Sleep (1000); // wait 1 second before retrying
-
 
229
      }
-
 
230
   }
-
 
231
 
-
 
232
   return; // _endthread() implied
214
}
233
}