1 /////////////////////////////////////////
2 //
3 //             OpenLieroX
4 //
5 // code under LGPL, based on JasonBs work,
6 // enhanced by Dark Charlie and Albert Zeyer
7 //
8 //
9 /////////////////////////////////////////
10 
11 
12 // Player menu
13 // Created 30/6/02
14 // Jason Boettcher
15 
16 
17 #include "LieroX.h"
18 #include "Sounds.h"
19 #include "DeprecatedGUI/Graphics.h"
20 #include "DeprecatedGUI/Menu.h"
21 #include "GfxPrimitives.h"
22 #include "FindFile.h"
23 #include "StringUtils.h"
24 #include "DeprecatedGUI/CGuiLayout.h"
25 #include "DeprecatedGUI/CButton.h"
26 #include "DeprecatedGUI/CLabel.h"
27 #include "DeprecatedGUI/CTextbox.h"
28 #include "DeprecatedGUI/CSlider.h"
29 #include "AuxLib.h"
30 #include "ProfileSystem.h"
31 #include "CWorm.h"
32 
33 
34 namespace DeprecatedGUI {
35 
36 CGuiLayout	cNewPlayer;
37 CGuiLayout	cViewPlayers;
38 int			iPlayerMode = 0;
39 float       fPlayerSkinFrame=0;
40 float		fPlayerSkinAngle = 0;
41 bool		bAimingUp = true;
42 bool        bPlayerSkinAnimation = false;
43 Timer *		tAnimTimer = NULL;
44 
45 // Generic
46 enum {
47 	Static=-1,
48 	pp_NewPlayerTab=0,
49 	pp_ViewPlayersTab,
50 	pp_Num
51 };
52 
53 // New player widgets
54 enum {
55 	np_Back=pp_Num + 1,
56 	np_Create,
57 	np_Name,
58 	np_Red, np_Blue, np_Green,
59 	np_Type,
60 	np_AIDiffLbl,
61 	np_AIDiff,
62 	np_PlySkin,
63 	np_Username,
64 	np_Password
65 };
66 
67 // View players widgets
68 enum {
69 	vp_Back=pp_Num + 1,
70 	vp_Name,
71 	vp_Red, vp_Blue, vp_Green,
72 	vp_Players,
73 	vp_Delete,
74 	vp_Apply,
75 	vp_Type,
76 	vp_AIDiffLbl,
77 	vp_AIDiff,
78 	vp_PlySkin
79 };
80 
81 
82 ///////////////////
83 // Initialize the player menu
Menu_PlayerInitialize()84 void Menu_PlayerInitialize()
85 {
86 	tMenu->iMenuType = MNU_PLAYER;
87 
88 	iPlayerMode = 0;
89 	fPlayerSkinAngle = 0;
90 	bAimingUp = true;
91 	CListview *lv;
92 
93 	// Create the buffer
94 	DrawImage(tMenu->bmpBuffer.get(),tMenu->bmpMainBack_common,0,0);
95 	if (tMenu->tFrontendInfo.bPageBoxes)
96 		Menu_DrawBox(tMenu->bmpBuffer.get(), 15,130, 625, 465);
97 	Menu_DrawSubTitle(tMenu->bmpBuffer.get(),SUB_PLAYER);
98 
99 	Menu_RedrawMouse(true);
100 
101 	tAnimTimer = new Timer("Menu_Player animation", null, NULL, 25, false);
102 
103 	// New player
104 	cNewPlayer.Shutdown();
105 	cNewPlayer.Initialize();
106 
107 	cNewPlayer.Add( new CButton(BUT_NEWPLAYER,	tMenu->bmpButtons), pp_NewPlayerTab, 150, 110, 120, 15);
108 	cNewPlayer.Add( new CButton(BUT_VIEWPLAYERS,tMenu->bmpButtons), pp_ViewPlayersTab, 370, 110, 135, 15);
109 
110 	cNewPlayer.Add( new CButton(BUT_BACK, tMenu->bmpButtons),	np_Back, 25,440, 50,15);
111 	cNewPlayer.Add( new CButton(BUT_CREATE, tMenu->bmpButtons), np_Create, 540,440, 70,15);
112 
113 	cNewPlayer.Add( new CLabel("Worm Details", tLX->clHeading),Static, 30, 170, 0,0);
114 	cNewPlayer.Add( new CTextbox(),		       np_Name,  120, 200,120,tLX->cFont.GetHeight());
115 	cNewPlayer.Add( new CLabel("Name",tLX->clNormalLabel), Static, 40, 202,0,  0);
116 	cNewPlayer.Add( new CLabel("Red",tLX->clNormalLabel),  Static, 40, 300,0,  0);
117 	cNewPlayer.Add( new CLabel("Green",tLX->clNormalLabel),Static, 40, 320,0,  0);
118 	cNewPlayer.Add( new CLabel("Blue",tLX->clNormalLabel), Static, 40, 340,0,  0);
119 	cNewPlayer.Add( new CSlider(255),	       np_Red,   115, 300,128,20);
120 	cNewPlayer.Add( new CSlider(255),	       np_Green, 115, 320,128,20);
121 	cNewPlayer.Add( new CSlider(255),	       np_Blue,  115, 340,128,20);
122 
123     cNewPlayer.Add( new CLabel("Skill",tLX->clNormalLabel),np_AIDiffLbl,40,362,0, 0);
124     cNewPlayer.Add( new CSlider(3),            np_AIDiff,115, 360,128,20);
125     cNewPlayer.Add( new CLabel("Skin", tLX->clNormalLabel),Static,40,  262,0,  0);
126     cNewPlayer.Add( new CCombobox(),           np_PlySkin,120,260,120,20);
127     cNewPlayer.Add( new CLabel("Type", tLX->clNormalLabel),Static,40,  232,0,  0);
128     cNewPlayer.Add( new CCombobox(),           np_Type,  120, 230,120,17);
129 
130 	cNewPlayer.SendMessage(np_Name,TXM_SETMAX,MAX_WORM_NAME_LENGTH,0);
131 	cNewPlayer.SendMessage( np_Name, TXM_SETFLAGS, TXF_NOUNICODE, 0); // Disable unicode for backward compatibility
132 
133 
134 	//cNewPlayer.Add( new CLabel("Multiplayer (optional)", tLX->clHeading),Static, 370, 170, 0,0);
135 	//cNewPlayer.Add( new CLabel("Username", tLX->clNormalLabel), Static, 380, 202, 0,0);
136 	//cNewPlayer.Add( new CLabel("Password", tLX->clNormalLabel), Static, 380, 232, 0,0);
137 	cNewPlayer.Add( new CTextbox(),			   np_Username, 470, 200, 110, tLX->cFont.GetHeight());
138 	cNewPlayer.Add( new CTextbox(),			   np_Password, 470, 230, 110, tLX->cFont.GetHeight());
139 
140 	//cNewPlayer.Add( new CLabel("Note: To register a username, visit the OpenLieroX web site", tLX->clSubHeading),Static, 30, 410, 0,0);
141 
142 	// Hide the multiplayer textboxes
143 	cNewPlayer.getWidget(np_Username)->setEnabled(false);
144 	cNewPlayer.getWidget(np_Password)->setEnabled(false);
145 
146     // Hide the AI stuff until 'Computer' type is selected
147     cNewPlayer.getWidget(np_AIDiffLbl)->setEnabled(false);
148 	cNewPlayer.getWidget(np_AIDiff)->setEnabled(false);
149 
150 
151 	cNewPlayer.SendMessage( np_Password, TXM_SETFLAGS, TXF_PASSWORD, 0);
152 	cNewPlayer.SendMessage( np_Password, TXM_SETMAX, 15, 0);
153 	cNewPlayer.SendMessage( np_Username, TXM_SETMAX, 15, 0);
154 
155 	// Set the default colour
156 	cNewPlayer.SendMessage( np_Red,		SLM_SETVALUE, 128, 0);
157 	cNewPlayer.SendMessage( np_Green,	SLM_SETVALUE, 128, 0);
158 	cNewPlayer.SendMessage( np_Blue,	SLM_SETVALUE, 128, 0);
159 
160 	// Player type
161     cNewPlayer.SendMessage( np_Type, CBS_ADDITEM, "Human", PRF_HUMAN->toInt() );
162     cNewPlayer.SendMessage( np_Type, CBS_ADDITEM, "Computer", PRF_COMPUTER->toInt() );
163 
164     Menu_Player_NewPlayerInit();
165 
166 	// View players
167 	cViewPlayers.Shutdown();
168 	cViewPlayers.Initialize();
169 
170 	cViewPlayers.Add( new CButton(BUT_NEWPLAYER,	tMenu->bmpButtons), pp_NewPlayerTab, 150, 110, 120, 15);
171 	cViewPlayers.Add( new CButton(BUT_VIEWPLAYERS,	tMenu->bmpButtons), pp_ViewPlayersTab, 370, 110, 135, 15);
172 
173 	cViewPlayers.Add( new CButton(BUT_BACK, tMenu->bmpButtons),     vp_Back,   25, 440, 50, 15);
174 	cViewPlayers.Add( new CListview(),                              vp_Players,40, 150, 200,170);
175     cViewPlayers.Add( new CLabel("Name", tLX->clNormalLabel),                   Static, 350,172, 0,  0);
176     cViewPlayers.Add( new CTextbox(),                               vp_Name,  400,170, 120,tLX->cFont.GetHeight());
177 	cViewPlayers.Add( new CButton(BUT_DELETE, tMenu->bmpButtons),   vp_Delete, 330,340, 70, 15);
178     cViewPlayers.Add( new CButton(BUT_APPLY, tMenu->bmpButtons),    vp_Apply,  500,340, 55, 15);
179 
180     cViewPlayers.Add( new CLabel("Red",tLX->clNormalLabel),                     Static, 350,250,0,0);
181 	cViewPlayers.Add( new CLabel("Green",tLX->clNormalLabel),                   Static, 350,270,0,0);
182 	cViewPlayers.Add( new CLabel("Blue",tLX->clNormalLabel),                    Static, 350,290,0,0);
183     cViewPlayers.Add( new CSlider(255),	                            vp_Red,    400,250, 128,20);
184 	cViewPlayers.Add( new CSlider(255),	                            vp_Green,  400,270, 128,20);
185 	cViewPlayers.Add( new CSlider(255),	                            vp_Blue,   400,290, 128,20);
186 
187     cViewPlayers.Add( new CLabel("Skill", tLX->clNormalLabel),                  vp_AIDiffLbl,350,312,0, 0);
188     cViewPlayers.Add( new CSlider(3),                               vp_AIDiff, 400,310, 128,20);
189     cViewPlayers.Add( new CLabel("Skin", tLX->clNormalLabel),                   Static, 350,227, 0,  0);
190     cViewPlayers.Add( new CCombobox(),                              vp_PlySkin,400,225, 120,17);
191     cViewPlayers.Add( new CLabel("Type", tLX->clNormalLabel),                   Static, 350,202, 0,  0);
192     cViewPlayers.Add( new CCombobox(),                              vp_Type,   400,200, 120,17);
193 
194 	cViewPlayers.SendMessage(vp_Name,TXM_SETMAX,MAX_WORM_NAME_LENGTH,0);
195 	cViewPlayers.SendMessage(vp_Name, TXM_SETFLAGS, TXF_NOUNICODE, 0); // Disable unicode for backward compatibility
196 
197 	cViewPlayers.SendMessage(vp_Players,		LVM_SETOLDSTYLE, (DWORD)0, 0);
198 
199     // Hide the AI stuff until 'Computer' type is selected
200     cViewPlayers.getWidget(vp_AIDiffLbl)->setEnabled(false);
201 	cViewPlayers.getWidget(vp_AIDiff)->setEnabled(false);
202 
203 
204 	lv = (CListview *)cViewPlayers.getWidget(vp_Players);
205 	lv->AddColumn("Players",24);
206 	lv->AddColumn("",60);
207 
208     cViewPlayers.SendMessage( vp_Type, CBS_ADDITEM, "Human", PRF_HUMAN->toInt() );
209     cViewPlayers.SendMessage( vp_Type, CBS_ADDITEM, "Computer", PRF_COMPUTER->toInt() );
210 }
211 
212 ///////////////
213 // Shutdown
Menu_PlayerShutdown()214 void Menu_PlayerShutdown()
215 {
216 	cNewPlayer.Shutdown();
217 	cViewPlayers.Shutdown();
218 	if (tAnimTimer)  {
219 		tAnimTimer->stop();
220 		delete tAnimTimer;
221 		tAnimTimer = NULL;
222 	}
223 }
224 
225 
226 ///////////////////
227 // Player frame
Menu_PlayerFrame()228 void Menu_PlayerFrame()
229 {
230 	int mouse = 0;
231 
232 	DrawImageAdv(VideoPostProcessor::videoSurface(), tMenu->bmpBuffer, 20,140, 20,140, 620,340);
233 	DrawImageAdv(VideoPostProcessor::videoSurface(), tMenu->bmpBuffer, 140,110,  140,110,  400,30);
234 
235 	if(iPlayerMode == 0)
236 		Menu_Player_NewPlayer(mouse);
237 
238 	else if(iPlayerMode == 1)
239 		Menu_Player_ViewPlayers(mouse);
240 }
241 
242 
243 ///////////////////
244 // Initialize the newplayer settings
Menu_Player_NewPlayerInit()245 void Menu_Player_NewPlayerInit()
246 {
247 	iPlayerMode = 0;
248 
249     cNewPlayer.SendMessage( np_Name,    TXS_SETTEXT, "", 0);
250     cNewPlayer.SendMessage( np_Type,    CBM_SETCURSEL, PRF_HUMAN->toInt(), 0 );
251     cNewPlayer.SendMessage( np_Red,		SLM_SETVALUE, 128, 0);
252 	cNewPlayer.SendMessage( np_Green,	SLM_SETVALUE, 128, 0);
253 	cNewPlayer.SendMessage( np_Blue,	SLM_SETVALUE, 128, 0);
254 
255     // Hide the AI stuff until 'Computer' type is selected
256     cNewPlayer.getWidget(np_AIDiffLbl)->setEnabled(false);
257 	cNewPlayer.getWidget(np_AIDiff)->setEnabled(false);
258 
259     // Fill the skin combo box
260     Menu_Player_FillSkinCombo( (CCombobox *)cNewPlayer.getWidget(np_PlySkin) );
261 
262     // Load the default skin
263 	tMenu->cSkin.Change("default.png");
264     fPlayerSkinFrame = 0;
265     bPlayerSkinAnimation = false;
266     cNewPlayer.FocusWidget(pp_NewPlayerTab);
267 }
268 
269 
270 ///////////////////
271 // Initialize the viewplayer settings
Menu_Player_ViewPlayerInit()272 void Menu_Player_ViewPlayerInit()
273 {
274 	iPlayerMode = 1;
275 
276     // Add the players to the list
277 	CListview *lv = (CListview *)cViewPlayers.getWidget(vp_Players);
278     lv->Clear();
279 
280 	profile_t *p = GetProfiles();
281 	for(; p; p=p->tNext) {
282 		lv->AddItem("",p->iID,tLX->clListView);
283 		if (p->cSkin.getPreview().get())
284 			lv->AddSubitem(LVS_IMAGE, "", p->cSkin.getPreview(), NULL);
285 		else
286 			lv->AddSubitem(LVS_TEXT, " ", (DynDrawIntf*)NULL, NULL);
287 		lv->AddSubitem(LVS_TEXT, p->sName, (DynDrawIntf*)NULL, NULL);
288 	}
289 
290 
291     // Fill the skin combo box
292     Menu_Player_FillSkinCombo( (CCombobox *)cViewPlayers.getWidget(vp_PlySkin) );
293 
294     // Set the name of the first item in the list
295     int sel = cViewPlayers.SendMessage( vp_Players, LVM_GETCURINDEX,(DWORD)0,0);
296 	p = FindProfile(sel);
297     if(p) {
298         cViewPlayers.SendMessage( vp_Name,    TXS_SETTEXT, p->sName,0);
299 
300         cViewPlayers.SendMessage( vp_Red,	    SLM_SETVALUE, p->R, 0);
301 	    cViewPlayers.SendMessage( vp_Green,		SLM_SETVALUE, p->G, 0);
302 	    cViewPlayers.SendMessage( vp_Blue,	    SLM_SETVALUE, p->B, 0);
303         cViewPlayers.SendMessage( vp_Type,		CBM_SETCURSEL,  p->iType, 0);
304         cViewPlayers.SendMessage( vp_AIDiff,	SLM_SETVALUE,   p->nDifficulty, 0);
305 		cViewPlayers.SendMessage( vp_PlySkin,	CBS_SETCURSINDEX,p->cSkin.getFileName(), 0);
306 
307         // Hide the AI stuff if it is a human type of player
308         cViewPlayers.getWidget(vp_AIDiffLbl)->setEnabled(p->iType == PRF_COMPUTER->toInt());
309 	    cViewPlayers.getWidget(vp_AIDiff)->setEnabled(p->iType == PRF_COMPUTER->toInt());
310 
311         // Load the skin
312 		tMenu->cSkin = p->cSkin;
313         fPlayerSkinFrame = 0;
314         bPlayerSkinAnimation = false;
315     }
316     cViewPlayers.FocusWidget(pp_ViewPlayersTab);
317 }
318 
319 
320 ///////////////////
321 // New player section
Menu_Player_NewPlayer(int mouse)322 void Menu_Player_NewPlayer(int mouse)
323 {
324 	gui_event_t *ev = NULL;
325 	mouse_t *Mouse = GetMouse();
326 
327 	// Process & draw the gui
328 	ev = cNewPlayer.Process();
329 	cNewPlayer.Draw(VideoPostProcessor::videoSurface());
330 
331 	Uint8 r = ((CSlider *)cNewPlayer.getWidget(np_Red))->getValue();
332 	Uint8 g = ((CSlider *)cNewPlayer.getWidget(np_Green))->getValue();
333 	Uint8 b = ((CSlider *)cNewPlayer.getWidget(np_Blue))->getValue();
334 
335 
336 	if(ev) {
337 
338 		switch(ev->iControlID) {
339 
340 			case pp_ViewPlayersTab:
341 				if(ev->iEventMsg == BTN_CLICKED) {
342 					Menu_Player_ViewPlayerInit();
343 					return;
344 				}
345 				break;
346 
347 			// Back button
348 			case np_Back:
349 				if(ev->iEventMsg == BTN_CLICKED) {
350 
351 					// Shutdown
352 					Menu_PlayerShutdown();
353 					//SaveProfiles();
354 
355 					// Leave
356 					PlaySoundSample(sfxGeneral.smpClick);
357 					Menu_MainInitialize();
358 					return;
359 				}
360 				break;
361 
362 			// Create
363 			case np_Create:
364 				if(ev->iEventMsg == BTN_CLICKED) {
365 					PlaySoundSample(sfxGeneral.smpClick);
366 
367 					// Get the details
368 					std::string name = ((CTextbox *)cNewPlayer.getWidget(np_Name))->getText();
369 					name = RemoveSpecialChars(name);  // Remove any special characters (backward compatibility)
370 					std::string skin;
371                     cNewPlayer.SendMessage(np_PlySkin, CBS_GETCURSINDEX, &skin, 0);
372 
373 					// Add the profile
374                     WormType* type = ( (int)cNewPlayer.SendMessage(np_Type,CBM_GETCURINDEX,(DWORD)0,0) == PRF_HUMAN->toInt() ) ? PRF_HUMAN : PRF_COMPUTER;
375                     int level = cNewPlayer.SendMessage(np_AIDiff,SLM_GETVALUE,(DWORD)0,0);
376 
377 					AddProfile(name, skin, "", "",r, g, b, type->toInt(), level);
378 
379 					// Shutdown
380 					//Menu_PlayerShutdown();
381 					//SaveProfiles();
382 
383 					//Menu_MainInitialize();
384 					Menu_Player_ViewPlayerInit();
385 					return;
386 				}
387 				break;
388 
389             // Type
390             case np_Type:
391                 if(ev->iEventMsg == CMB_CHANGED) {
392 
393                     int type = cNewPlayer.SendMessage(np_Type,CBM_GETCURINDEX,(DWORD)0,0);
394 
395                     // Hide the AI stuff if it is a human type of player
396                     cNewPlayer.getWidget(np_AIDiffLbl)->setEnabled(type == PRF_COMPUTER->toInt());
397 	                cNewPlayer.getWidget(np_AIDiff)->setEnabled(type == PRF_COMPUTER->toInt());
398                 }
399                 break;
400 
401             // Skin
402             case np_PlySkin:
403                 if(ev->iEventMsg == CMB_CHANGED) {
404                     std::string buf;
405                     cNewPlayer.SendMessage(np_PlySkin, CBS_GETCURSINDEX, &buf, 0);
406 
407                     // Load the skin
408 					tMenu->cSkin.Change(buf);
409                 }
410                 break;
411 		}
412 	}
413 
414 
415 	// Draw the colour
416 	//DrawRectFill(VideoPostProcessor::videoSurface(), 260, 230, 280, 250, Color(r,g,b));
417 	DrawRectFill(VideoPostProcessor::videoSurface(),  255, 195, 285, 225, tLX->clBlack);
418 	Menu_DrawBox(VideoPostProcessor::videoSurface(),  255, 195, 285, 225);
419 	//DrawRect(VideoPostProcessor::videoSurface(),		255, 195, 285, 225, Color(128,128,128));
420 
421 
422 	// Draw the colour component values
423 	tLX->cFont.Draw(VideoPostProcessor::videoSurface(), 250, 303, tLX->clNormalLabel, itoa(r));
424 	tLX->cFont.Draw(VideoPostProcessor::videoSurface(), 250, 323, tLX->clNormalLabel, itoa(g));
425 	tLX->cFont.Draw(VideoPostProcessor::videoSurface(), 250, 343, tLX->clNormalLabel, itoa(b));
426 
427 	if(MouseInRect(255,195,30,30) && Mouse->Up)  {
428 		if (bPlayerSkinAnimation)  {
429 			bPlayerSkinAnimation = false;
430 			tAnimTimer->stop();
431 		} else {
432 			bPlayerSkinAnimation = true;
433 			tAnimTimer->start();
434 		}
435 	}
436 
437 	Menu_Player_DrawWormImage(VideoPostProcessor::videoSurface(), (int)(fPlayerSkinFrame)*7+(int)( fPlayerSkinAngle/151 * 7 )+4, 257, 200, r,g,b);
438 
439 	if(bPlayerSkinAnimation)  {
440 		if (bAimingUp)
441 			fPlayerSkinAngle += tLX->fDeltaTime.seconds()*220;
442 		else
443 			fPlayerSkinAngle -= tLX->fDeltaTime.seconds()*220;
444 
445 		fPlayerSkinFrame += tLX->fDeltaTime.seconds()*7.5f;
446 
447 
448 		if ((int)fPlayerSkinAngle >= 60)  {
449 			fPlayerSkinAngle = 60;
450 			bAimingUp = !bAimingUp;
451 		} else if ((int)fPlayerSkinAngle <= -90) {
452 			fPlayerSkinAngle = -90;
453 			bAimingUp = !bAimingUp;
454 		}
455 	}
456     if( fPlayerSkinFrame >= 3 )
457         fPlayerSkinFrame = 0;
458 
459 
460     // Draw the difficulty level
461     int type = cNewPlayer.SendMessage(np_Type,CBM_GETCURINDEX,(DWORD)0,0);
462     if( type == PRF_COMPUTER->toInt() ) {
463         static const std::string difflevels[] = {"Easy", "Medium", "Hard", "Xtreme"};
464         int level = cNewPlayer.SendMessage(np_AIDiff,SLM_GETVALUE,(DWORD)0,0);
465         tLX->cFont.Draw(VideoPostProcessor::videoSurface(), 250,363,tLX->clNormalLabel,difflevels[level]);
466 
467     }
468 
469 	// Draw the mouse
470 	DrawCursor(VideoPostProcessor::videoSurface());
471 }
472 
473 
474 ///////////////////
475 // View the players screen
Menu_Player_ViewPlayers(int mouse)476 void Menu_Player_ViewPlayers(int mouse)
477 {
478 	mouse_t *Mouse = GetMouse();
479 	gui_event_t *ev = NULL;
480 	std::string buf;
481 
482 	// Process & draw the gui
483 	ev = cViewPlayers.Process();
484 	cViewPlayers.Draw(VideoPostProcessor::videoSurface());
485 
486 	if(ev) {
487 
488 		switch(ev->iControlID) {
489 
490 			case pp_NewPlayerTab:
491 				if(ev->iEventMsg == BTN_CLICKED) {
492 					Menu_Player_NewPlayerInit();
493 					return;
494 				}
495 				break;
496 
497 			// Back button
498 			case vp_Back:
499 				if(ev->iEventMsg == BTN_CLICKED) {
500 
501 					// Shutdown
502 					Menu_PlayerShutdown();
503 					//SaveProfiles();
504 
505 					// Leave
506 					PlaySoundSample(sfxGeneral.smpClick);
507 					Menu_MainInitialize();
508 					return;
509 				}
510 				break;
511 
512 			// Delete
513 			case vp_Delete:
514 				if(ev->iEventMsg == BTN_CLICKED) {
515 
516 					CListview *lv = (CListview *)cViewPlayers.getWidget(vp_Players);
517 					if(!lv) {
518 						errors << "Menu_Player_ViewPlayers: playerlist not found" << endl;
519 						return;
520 					}
521 
522 					int sel = lv->getCurIndex();
523 					profile_t *p = FindProfile(sel);
524 					if(p) {
525 						/*if(p->iType == PRF_HUMAN)*/ {
526 
527 							//
528 							// Show a msgbox confirming deletion
529 							//
530 
531 							// Setup the buffer
532 							Mouse->Button = Mouse->Up = Mouse->Down = 0;
533 							Mouse->X = Mouse->Y = 0;
534 							cViewPlayers.Draw(tMenu->bmpBuffer.get());
535 
536 							// Ask if they are sure they wanna delete it
537 							buf = std::string("Delete player ") + p->sName;
538 							if(Menu_MessageBox("Confirmation",buf,LMB_YESNO) == MBR_YES) {
539 
540 								// Delete the profile
541 								DeleteProfile(p->iID);
542 
543 								// Add the players to the list
544 								lv->Create();
545 								lv->AddColumn("Players",22);
546 								lv->AddColumn("",60);
547 								p = GetProfiles();
548 								for(; p; p=p->tNext) {
549 									//if(p->iType == PRF_COMPUTER)
550 									//	continue;
551 									lv->AddItem("",p->iID,tLX->clListView);
552 									if (p->cSkin.getPreview().get())
553 										lv->AddSubitem(LVS_IMAGE, "", p->cSkin.getPreview(), NULL);
554 									else
555 										lv->AddSubitem(LVS_TEXT, " ", (DynDrawIntf*)NULL, NULL);
556 									lv->AddSubitem(LVS_TEXT, p->sName, (DynDrawIntf*)NULL, NULL);
557 								}
558 							}
559 						}
560 
561                         // Update the details
562                         int sel = cViewPlayers.SendMessage(vp_Players,LVM_GETCURINDEX,(DWORD)0,0);
563 	                    p = FindProfile(sel);
564                         if(p) {
565                             cViewPlayers.SendMessage( vp_Name,		TXS_SETTEXT,    p->sName,0);
566                             cViewPlayers.SendMessage( vp_Red,	    SLM_SETVALUE,   p->R, 0);
567 	                        cViewPlayers.SendMessage( vp_Green,		SLM_SETVALUE,   p->G, 0);
568 	                        cViewPlayers.SendMessage( vp_Blue,	    SLM_SETVALUE,   p->B, 0);
569                             cViewPlayers.SendMessage( vp_Type,		CBM_SETCURSEL,  p->iType, 0);
570                             cViewPlayers.SendMessage( vp_AIDiff,	SLM_SETVALUE,   p->nDifficulty, 0);
571 
572                             // Hide the AI stuff if it is a human type of player
573                             cViewPlayers.getWidget(vp_AIDiffLbl)->setEnabled(p->iType == PRF_COMPUTER->toInt());
574 	                        cViewPlayers.getWidget(vp_AIDiff)->setEnabled(p->iType == PRF_COMPUTER->toInt());
575                         }
576 
577 
578 
579 						// Re-draw the buffer again
580 						DrawImage(tMenu->bmpBuffer.get(),tMenu->bmpMainBack_common,0,0);
581 						if (tMenu->tFrontendInfo.bPageBoxes)
582 							Menu_DrawBox(tMenu->bmpBuffer.get(), 15,130, 625, 465);
583 						Menu_DrawSubTitle(tMenu->bmpBuffer.get(),SUB_PLAYER);
584 						Menu_RedrawMouse(true);
585 
586 					}
587 
588 					// Play a click
589 					PlaySoundSample(sfxGeneral.smpClick);
590 				}
591 				break;
592 
593 
594             // Apply button
595             case vp_Apply:
596                 if( ev->iEventMsg == BTN_CLICKED ) {
597                     int sel = cViewPlayers.SendMessage(vp_Players, LVM_GETCURINDEX, (DWORD)0,0);
598 	                profile_t *p = FindProfile(sel);
599 	                if(p) {
600                         cViewPlayers.SendMessage(vp_Name, TXS_GETTEXT, &p->sName, 0);
601                         p->R = (Uint8)cViewPlayers.SendMessage(vp_Red,SLM_GETVALUE,(DWORD)0,0);
602                         p->G = (Uint8)cViewPlayers.SendMessage(vp_Green,SLM_GETVALUE,(DWORD)0,0);
603                         p->B = (Uint8)cViewPlayers.SendMessage(vp_Blue,SLM_GETVALUE,(DWORD)0,0);
604                         p->iType = ((CCombobox *)cViewPlayers.getWidget(vp_Type))->getSelectedIndex();
605                         p->nDifficulty = cViewPlayers.SendMessage(vp_AIDiff, SLM_GETVALUE,(DWORD)0,0);
606 
607 						// Reload the graphics
608 						std::string buf;
609 						buf = ((CCombobox *)cViewPlayers.getWidget(vp_PlySkin))->getSelectedItem()->sIndex;
610 						p->cSkin.Change(buf);
611 
612                         // Update the item
613                         lv_item_t *it = (lv_item_t *)cViewPlayers.SendMessage(vp_Players, LVM_GETCURITEM, (DWORD)0,0); // TODO: 64bit unsafe (pointer cast)
614                         if(it) {
615                             if(it->tSubitems) {
616 								it->tSubitems->bmpImage = p->cSkin.getPreview();
617                                 if(it->tSubitems->tNext)
618                                     it->tSubitems->tNext->sText = p->sName;
619                             }
620                         }
621 
622                         // Add the players to the list
623 
624                         /*CListview *lv = (CListview *)cViewPlayers.getWidget(vp_Players);
625 						lv->Create();
626 						lv->AddColumn("Players",22);
627 						lv->AddColumn("",60);
628 						p = GetProfiles();
629 						for(; p; p=p->tNext) {
630 							lv->AddItem("",p->iID,tLX->clListView);
631 							lv->AddSubitem(LVS_IMAGE,"",p->bmpWorm);
632 							lv->AddSubitem(LVS_TEXT, p->sName, NULL);
633 						}*/
634                     }
635                 }
636                 break;
637 
638 
639             // Player listbox
640             case vp_Players:
641                 if( ev->iEventMsg == LV_CHANGED ) {
642                     int sel = cViewPlayers.SendMessage(vp_Players,LVM_GETCURINDEX,(DWORD)0,0);
643 	                profile_t *p = FindProfile(sel);
644                     if(p) {
645                         cViewPlayers.SendMessage( vp_Name,		TXS_SETTEXT,    p->sName,0);
646                         cViewPlayers.SendMessage( vp_Red,	    SLM_SETVALUE,   p->R, 0);
647 	                    cViewPlayers.SendMessage( vp_Green,		SLM_SETVALUE,   p->G, 0);
648 	                    cViewPlayers.SendMessage( vp_Blue,	    SLM_SETVALUE,   p->B, 0);
649                         cViewPlayers.SendMessage( vp_Type,		CBM_SETCURSEL,  p->iType, 0);
650                         cViewPlayers.SendMessage( vp_AIDiff,	SLM_SETVALUE,   p->nDifficulty, 0);
651 						cViewPlayers.SendMessage( vp_PlySkin,	CBS_SETCURSINDEX,p->cSkin.getFileName(), 0);
652 
653                         // Load the skin
654 						tMenu->cSkin = p->cSkin;
655 
656                         // Hide the AI stuff if it is a human type of player
657                         cViewPlayers.getWidget(vp_AIDiffLbl)->setEnabled(p->iType == PRF_COMPUTER->toInt());
658 	                    cViewPlayers.getWidget(vp_AIDiff)->setEnabled(p->iType == PRF_COMPUTER->toInt());
659                     }
660                 }
661                 break;
662 
663             // Type
664             case vp_Type:
665                 if( ev->iEventMsg == CMB_CHANGED ) {
666 
667                     int type = cViewPlayers.SendMessage(vp_Type,CBM_GETCURINDEX,(DWORD)0,0);
668 
669                     // Hide the AI stuff if it is a human type of player
670                     cViewPlayers.getWidget(vp_AIDiffLbl)->setEnabled(type == PRF_COMPUTER->toInt());
671 	                cViewPlayers.getWidget(vp_AIDiff)->setEnabled(type == PRF_COMPUTER->toInt());
672                 }
673                 break;
674 
675             // Skin
676             case vp_PlySkin:
677                 if(ev->iEventMsg == CMB_CHANGED) {
678                     std::string buf;
679                     cViewPlayers.SendMessage(vp_PlySkin, CBS_GETCURSINDEX, &buf, 0);
680 
681                     // Load the skin
682 					tMenu->cSkin.Change(buf);
683                 }
684                 break;
685 		}
686 	}
687 
688 
689 	// Show info about the selected player
690 	CListview *lv = (CListview *)cViewPlayers.getWidget(vp_Players);
691 	if(!lv) {
692 		errors << "Menu_Player_ViewPlayers: playerlist not found" << endl;
693 		return;
694 	}
695 
696 	int sel = lv->getCurIndex();
697 	profile_t *p = FindProfile(sel);
698 	if(p) {
699 
700         Uint8 r = ((CSlider *)cViewPlayers.getWidget(vp_Red))->getValue();
701 	    Uint8 g = ((CSlider *)cViewPlayers.getWidget(vp_Green))->getValue();
702 	    Uint8 b = ((CSlider *)cViewPlayers.getWidget(vp_Blue))->getValue();
703 
704         tLX->cFont.Draw(VideoPostProcessor::videoSurface(), 530, 253, tLX->clNormalLabel, itoa(r));
705 	    tLX->cFont.Draw(VideoPostProcessor::videoSurface(), 530, 273, tLX->clNormalLabel, itoa(g));
706 	    tLX->cFont.Draw(VideoPostProcessor::videoSurface(), 530, 293, tLX->clNormalLabel, itoa(b));
707 
708 		// Draw the worm image
709 		DrawRectFill(VideoPostProcessor::videoSurface(),  300, 165, 330, 195, tLX->clBlack);
710 		Menu_DrawBox(VideoPostProcessor::videoSurface(),  300, 165, 330, 195);
711 
712 		Menu_Player_DrawWormImage(VideoPostProcessor::videoSurface(),(int)(fPlayerSkinFrame)*7+(int)( fPlayerSkinAngle/151 * 7 )+4, 301, 170, r, g, b);
713 		if(MouseInRect(300,165,30,30) && Mouse->Up)  {
714 			if (bPlayerSkinAnimation)  {
715 				bPlayerSkinAnimation = false;
716 				tAnimTimer->stop();
717 			} else {
718 				bPlayerSkinAnimation = true;
719 				tAnimTimer->start();
720 			}
721 		}
722 
723         if(bPlayerSkinAnimation)  {
724 			if (bAimingUp)
725 				fPlayerSkinAngle += tLX->fDeltaTime.seconds()*200;
726 			else
727 				fPlayerSkinAngle -= tLX->fDeltaTime.seconds()*200;
728 
729 			fPlayerSkinFrame += tLX->fDeltaTime.seconds()*7.5f;
730 
731 			if (fPlayerSkinAngle >= 60)  {
732 				fPlayerSkinAngle = 60;
733 				bAimingUp = !bAimingUp;
734 			} else if (fPlayerSkinAngle <= -90) {
735 				fPlayerSkinAngle = -90;
736 				bAimingUp = !bAimingUp;
737 			}
738 		}
739         if( fPlayerSkinFrame >= 3.0f )
740             fPlayerSkinFrame = 0;
741 	}
742 
743     // Draw the difficulty level
744     int type = cViewPlayers.SendMessage(vp_Type,CBM_GETCURINDEX,(DWORD)0,0);
745     if( type == PRF_COMPUTER->toInt() ) {
746         static const std::string difflevels[] = {"Easy", "Medium", "Hard", "Xtreme"};
747         int level = (DWORD)CLAMP(cViewPlayers.SendMessage(vp_AIDiff,SLM_GETVALUE,(DWORD)0,0), (DWORD)0, (DWORD)3);
748         tLX->cFont.Draw(VideoPostProcessor::videoSurface(), 530,313,tLX->clNormalLabel, difflevels[level]);
749     }
750 
751 
752 	// Draw the mouse
753 	DrawCursor(VideoPostProcessor::videoSurface());
754 }
755 
756 
757 ///////////////////
758 // Draw the worm image
Menu_Player_DrawWormImage(SDL_Surface * bmpDest,int Frame,int dx,int dy,int ColR,int ColG,int ColB)759 void Menu_Player_DrawWormImage(SDL_Surface * bmpDest, int Frame, int dx, int dy, int ColR, int ColG, int ColB)
760 {
761 	tMenu->cSkin.Colorize(Color(ColR, ColG, ColB));
762 	tMenu->cSkin.Draw(bmpDest, dx + 4, dy, Frame, false, false, true);
763 }
764 
765 
766 
767 	class SkinAdder { public:
768 	   	CCombobox* cb;
SkinAdder(CCombobox * cb_)769 		SkinAdder(CCombobox* cb_) : cb(cb_) {}
operator ()(std::string file)770 		bool operator() (std::string file) {
771 			std::string ext = GetFileExtension(file);
772 			if(stringcasecmp(ext, "png")==0
773 			|| stringcasecmp(ext, "bmp")==0
774 			|| stringcasecmp(ext, "tga")==0
775 			|| stringcasecmp(ext, "pcx")==0) {
776 				size_t slash = findLastPathSep(file);
777 				if(slash != std::string::npos)
778 					file.erase(0, slash+1);
779 
780 				std::string name = file.substr(0, file.size()-4); // the size-calcing here is safe
781 				cb->addItem(file, name);
782 			}
783 			return true;
784 		}
785 	};
786 
787 
788 ///////////////////
789 // Fill the skin combo box
Menu_Player_FillSkinCombo(CCombobox * cb)790 void Menu_Player_FillSkinCombo(CCombobox *cb) {
791     if( !cb )
792         return;
793 
794 	cb->clear();
795 	cb->setSorted(SORT_ASC);
796 	cb->setUnique(true);
797 
798 	SkinAdder skinAdder(cb);
799     FindFiles(skinAdder, "skins", false, FM_REG);
800 
801     // Select the default
802     cb->setCurItemByName("default");
803 }
804 
805 }; // namespace DeprecatedGUI
806