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