1 /************************************************************************************
2 
3 	AstroMenace
4 	Hardcore 3D space scroll-shooter with spaceship upgrade possibilities.
5 	Copyright (c) 2006-2019 Mikhail Kurinnoi, Viewizard
6 
7 
8 	AstroMenace is free software: you can redistribute it and/or modify
9 	it under the terms of the GNU General Public License as published by
10 	the Free Software Foundation, either version 3 of the License, or
11 	(at your option) any later version.
12 
13 	AstroMenace is distributed in the hope that it will be useful,
14 	but WITHOUT ANY WARRANTY; without even the implied warranty of
15 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 	GNU General Public License for more details.
17 
18 	You should have received a copy of the GNU General Public License
19 	along with AstroMenace. If not, see <https://www.gnu.org/licenses/>.
20 
21 
22 	Website: https://viewizard.com/
23 	Project: https://github.com/viewizard/astromenace
24 	E-mail: viewizard@viewizard.com
25 
26 *************************************************************************************/
27 
28 // TODO translate comments
29 
30 // NOTE in future, use make_unique() to make unique_ptr-s (since C++14)
31 
32 #include "../core/core.h"
33 #include "../build_config.h"
34 #include "../config/config.h"
35 #include "../ui/font.h"
36 #include "../ui/cursor.h"
37 #include "../assets/audio.h"
38 #include "../assets/texture.h"
39 #include "../script/script.h"
40 #include "../object3d/object3d.h"
41 #include "../gfx/star_system.h"
42 #include "../gfx/shadow_map.h"
43 #include "../command.h"
44 #include "../game/camera.h"
45 #include "../game.h" // FIXME "game.h" should be replaced by individual headers
46 
47 // NOTE switch to nested namespace definition (namespace A::B::C { ... }) (since C++17)
48 namespace viewizard {
49 namespace astromenace {
50 
51 namespace {
52 
53 std::unique_ptr<cMissionScript> MenuScript{};
54 
55 } // unnamed namespace
56 
57 float LastMenuUpdateTime = 0.0f;
58 float MenuContentTransp = 0.0f;
59 float LastMenuOnOffUpdateTime = 0.0f;
60 float MenuBlackTransp = 0.0f;
61 bool NeedOnMenu = false;// если нужно выйти из черного
62 bool NeedOffMenu = false;
63 bool NeedShowMenu = false;
64 bool NeedHideMenu = false;
65 eMenuStatus MenuStatus;
66 eMenuStatus NextMenu;
67 eMenuStatus PrevMenu{eMenuStatus::MAIN_MENU};
68 
69 float Button1Transp = 1.0f;
70 float LastButton1UpdateTime = 0.0f;
71 float Button2Transp = 1.0f;
72 float LastButton2UpdateTime = 0.0f;
73 float Button3Transp = 1.0f;
74 float LastButton3UpdateTime = 0.0f;
75 float Button4Transp = 1.0f;
76 float LastButton4UpdateTime = 0.0f;
77 float Button5Transp = 1.0f;
78 float LastButton5UpdateTime = 0.0f;
79 float Button6Transp = 1.0f;
80 float LastButton6UpdateTime = 0.0f;
81 float Button7Transp = 1.0f;
82 float LastButton7UpdateTime = 0.0f;
83 float Button8Transp = 1.0f;
84 float LastButton8UpdateTime = 0.0f;
85 float Button9Transp = 1.0f;
86 float LastButton9UpdateTime = 0.0f;
87 float Button10Transp = 1.0f;
88 float LastButton10UpdateTime = 0.0f;
89 float Button11Transp = 1.0f;
90 float LastButton11UpdateTime = 0.0f;
91 float Button12Transp = 1.0f;
92 float LastButton12UpdateTime = 0.0f;
93 float Button13Transp = 1.0f;
94 float LastButton13UpdateTime = 0.0f;
95 float Button14Transp = 1.0f;
96 float LastButton14UpdateTime = 0.0f;
97 
98 
99 
100 
101 
102 
103 
104 //------------------------------------------------------------------------------------
105 // инициализация меню
106 //------------------------------------------------------------------------------------
InitMenu(eMenuStatus NewMenuStatus)107 void InitMenu(eMenuStatus NewMenuStatus)
108 {
109 	MenuStatus = NewMenuStatus;
110 
111 	ShadowMap_SizeSetup(eShadowMapSetup::Menu);
112 
113 	// установка курсора на центр
114 	// получаем размер клиентской области
115 	float tmpViewportWidth, tmpViewportHeight;
116 	vw_GetViewport(nullptr, nullptr, &tmpViewportWidth, &tmpViewportHeight);
117 	// установка мышки, чтобы не учитывать перемещения в меню
118 	SDL_WarpMouseInWindow(vw_GetSDLWindow(),
119 			      static_cast<int>((512.0f + 256.0f) / (GameConfig().InternalWidth / tmpViewportWidth)),
120 			      static_cast<int>(384.0f / (GameConfig().InternalHeight / tmpViewportHeight)));
121 
122 
123 
124 	Button1Transp = 1.0f;
125 	LastButton1UpdateTime = 0.0f;
126 	Button2Transp = 1.0f;
127 	LastButton2UpdateTime = 0.0f;
128 	Button3Transp = 1.0f;
129 	LastButton3UpdateTime = 0.0f;
130 	Button4Transp = 1.0f;
131 	LastButton4UpdateTime = 0.0f;
132 	Button5Transp = 1.0f;
133 	LastButton5UpdateTime = 0.0f;
134 	Button6Transp = 1.0f;
135 	LastButton6UpdateTime = 0.0f;
136 	Button7Transp = 1.0f;
137 	LastButton7UpdateTime = 0.0f;
138 	Button8Transp = 1.0f;
139 	LastButton8UpdateTime = 0.0f;
140 	Button9Transp = 1.0f;
141 	LastButton9UpdateTime = 0.0f;
142 	Button10Transp = 1.0f;
143 	LastButton10UpdateTime = 0.0f;
144 	Button11Transp = 1.0f;
145 	LastButton11UpdateTime = 0.0f;
146 	Button12Transp = 1.0f;
147 	LastButton12UpdateTime = 0.0f;
148 	Button13Transp = 1.0f;
149 	LastButton13UpdateTime = 0.0f;
150 	Button14Transp = 1.0f;
151 	LastButton14UpdateTime = 0.0f;
152 	LastMenuUpdateTime = 0.0f;
153 	MenuContentTransp = 0.0f;
154 
155 
156 	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
157 	// иним камеру, всегда до работы со скриптом (!!!)
158 	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
159 	vw_ResizeScene(45.0f, GameConfig().InternalWidth / GameConfig().InternalHeight, 1.0f, 2000.0f);
160 	vw_SetCameraLocation(sVECTOR3D{-50.0f, 30.0f, -50.0f});
161 	vw_SetCameraMoveAroundPoint(sVECTOR3D{0.0f, 0.0f, 0.0f}, 0.0f, sVECTOR3D{0.0f, 0.0f, 0.0f});
162 
163 	// since we use scripts with background animation in the same way as
164 	// games levels do, we should reset game camera first
165 	ResetCamera();
166 
167 	StarSystemInitByType(eDrawType::MENU); // should be before RunScript()
168 
169 	MenuScript.reset(new cMissionScript);
170 
171 	if (GameConfig().MenuScript > 2)
172 		ChangeGameConfig().MenuScript = 0;
173 	switch (GameConfig().MenuScript) {
174 	case 0:
175 		MenuScript->RunScript("script/menu1.xml", vw_GetTimeThread(0));
176 		break;
177 	case 1:
178 		MenuScript->RunScript("script/menu2.xml", vw_GetTimeThread(0));
179 		break;
180 	case 2:
181 		MenuScript->RunScript("script/menu3.xml", vw_GetTimeThread(0));
182 		break;
183 	// на всякий случай
184 	default:
185 		MenuScript->RunScript("script/menu1.xml", vw_GetTimeThread(0));
186 		break;
187 	}
188 	ChangeGameConfig().MenuScript++;
189 
190 	// немного прокручиваем скрипт
191 	float Time1 = vw_GetTimeThread(0);
192 	MenuScript->StartTime = Time1-30;
193 	MenuScript->TimeLastOp = Time1-30;
194 	for (float i=Time1-30; i<Time1; i+=1.0f) {
195 		UpdateAllObject3D(i);
196 		MenuScript->Update(i);
197 	}
198 	MenuScript->StartTime = Time1;
199 	MenuScript->TimeLastOp = Time1;
200 
201 
202 
203 	LastMenuUpdateTime = vw_GetTimeThread(0);
204 	NeedShowMenu = true;
205 	NeedHideMenu = false;
206 	LastMenuOnOffUpdateTime = vw_GetTimeThread(0);
207 	MenuBlackTransp = 1.0f;
208 	NeedOnMenu = true;
209 	NeedOffMenu = false;
210 	SetShowGameCursor(true);
211 }
212 
213 
214 
215 
216 
217 
218 
219 
220 
221 //------------------------------------------------------------------------------------
222 // установка меню
223 //------------------------------------------------------------------------------------
SetOptionsMenu(eMenuStatus Menu)224 void SetOptionsMenu(eMenuStatus Menu)
225 {
226 	switch (Menu) {
227 	case eMenuStatus::OPTIONS:
228 		Options_Width = GameConfig().Width;
229 		Options_Height = GameConfig().Height;
230 		Options_Fullscreen = GameConfig().Fullscreen;
231 		Options_VSync = GameConfig().VSync;
232 		break;
233 
234 	case eMenuStatus::OPTIONS_ADVANCED:
235 		Options_UseGLSL120 = GameConfig().UseGLSL120;
236 		Options_MSAA = GameConfig().MSAA;
237 		Options_CSAA = GameConfig().CSAA;
238 		Options_TexturesAnisotropyLevel = GameConfig().AnisotropyLevel;
239 		Options_ShadowMap = GameConfig().ShadowMap;
240 		break;
241 
242 	case eMenuStatus::CONFCONTROL:
243 		if (!GameConfig().KeyBoardUp)
244 			ChangeGameConfig().KeyBoardUp = SDLK_UP;
245 		if (!GameConfig().KeyBoardDown)
246 			ChangeGameConfig().KeyBoardDown = SDLK_DOWN;
247 		if (!GameConfig().KeyBoardLeft)
248 			ChangeGameConfig().KeyBoardLeft = SDLK_LEFT;
249 		if (!GameConfig().KeyBoardRight)
250 			ChangeGameConfig().KeyBoardRight = SDLK_RIGHT;
251 		if (!GameConfig().KeyBoardPrimary)
252 			ChangeGameConfig().KeyBoardPrimary = SDLK_LCTRL;
253 		if (!GameConfig().KeyBoardSecondary)
254 			ChangeGameConfig().KeyBoardSecondary = SDLK_SPACE;
255 		if (!GameConfig().MousePrimary)
256 			ChangeGameConfig().MousePrimary = SDL_BUTTON_LEFT;
257 		if (!GameConfig().MouseSecondary)
258 			ChangeGameConfig().MouseSecondary = SDL_BUTTON_RIGHT;
259 		if (GameConfig().JoystickPrimary == -1)
260 			ChangeGameConfig().JoystickPrimary = 0;
261 		if (GameConfig().JoystickSecondary == -1)
262 			ChangeGameConfig().JoystickSecondary = 1;
263 		break;
264 
265 	default:
266 		break;
267 	}
268 }
SetMenu(eMenuStatus Menu)269 void SetMenu(eMenuStatus Menu)
270 {
271 	PlayMenuSFX(eMenuSFX::SwitchToAnotherMenu, 1.0f);
272 
273 	switch (Menu) {
274 	case eMenuStatus::PROFILE:
275 		NewProfileName.clear();
276 		vw_SetCurrentUnicodeChar(nullptr);
277 		break;
278 
279 	case eMenuStatus::OPTIONS:
280 	case eMenuStatus::OPTIONS_ADVANCED:
281 	case eMenuStatus::CONFCONTROL:
282 		SetOptionsMenu(Menu);
283 		break;
284 
285 	case eMenuStatus::TOP_SCORES:
286 		InitTopScoresMenu();
287 		break;
288 
289 	case eMenuStatus::MISSION:
290 		MissionListInit();
291 		vw_ResetWheelStatus();
292 		// ставим нужный лист миссий
293 		StartMission = 0;
294 		EndMission = 4;
295 		if (CurrentMission != -1)
296 			if (CurrentMission > 2) { // нужно сдвинуть лист, чтобы выбранный элемент был по середине списка
297 				StartMission = CurrentMission-2;
298 				EndMission = CurrentMission+2;
299 
300 				if (CurrentMission >= AllMission-2) {
301 					StartMission = AllMission-5;
302 					EndMission = AllMission-1;
303 				}
304 			}
305 		break;
306 
307 	case eMenuStatus::INFORMATION:
308 		vw_ResetWheelStatus();
309 		CreateNum = 1;
310 		CreateInfoObject();
311 		break;
312 
313 	case eMenuStatus::CREDITS:
314 		InitCreditsMenu(vw_GetTimeThread(0));
315 		break;
316 
317 	default:
318 		break;
319 
320 	}
321 
322 	NextMenu = Menu;
323 
324 	// прячем текущее меню
325 	NeedShowMenu = false;
326 	NeedHideMenu = true;
327 	LastMenuUpdateTime = vw_GetTimeThread(0);
328 
329 
330 
331 }
332 
333 
334 
SetMenu2(eMenuStatus Menu)335 void SetMenu2(eMenuStatus Menu)
336 {
337 	// текущее меню уже стало невидимым, освобождаем память после воркшопа + выключаем голосовые сообщения
338 	// раньше удалять нельзя - для вывода используем данные из 3д объектов (!)
339 	switch (MenuStatus) {
340 	case eMenuStatus::WORKSHOP:
341 		WorkshopDestroyData();
342 		VoiceNeedMoreEnergy = 0;
343 		VoiceAmmoOut = 0;
344 		break;
345 	default:
346 		break;
347 	}
348 
349 
350 
351 	PrevMenu = MenuStatus;
352 	MenuStatus = Menu;
353 
354 	float Time = vw_GetTimeThread(0);
355 	Button1Transp = 1.0f;
356 	LastButton1UpdateTime = Time;
357 	Button2Transp = 1.0f;
358 	LastButton2UpdateTime = Time;
359 	Button3Transp = 1.0f;
360 	LastButton3UpdateTime = Time;
361 	Button4Transp = 1.0f;
362 	LastButton4UpdateTime = Time;
363 	Button5Transp = 1.0f;
364 	LastButton5UpdateTime = Time;
365 	Button6Transp = 1.0f;
366 	LastButton6UpdateTime = Time;
367 	Button7Transp = 1.0f;
368 	LastButton7UpdateTime = Time;
369 	Button8Transp = 1.0f;
370 	LastButton8UpdateTime = Time;
371 	Button9Transp = 1.0f;
372 	LastButton9UpdateTime = Time;
373 	Button10Transp = 1.0f;
374 	LastButton10UpdateTime = Time;
375 	Button11Transp = 1.0f;
376 	LastButton11UpdateTime = Time;
377 	Button12Transp = 1.0f;
378 	LastButton12UpdateTime = Time;
379 	Button13Transp = 1.0f;
380 	LastButton13UpdateTime = Time;
381 	Button14Transp = 1.0f;
382 	LastButton14UpdateTime = Time;
383 }
384 
385 
386 
387 
388 
389 
390 //------------------------------------------------------------------------------------
391 // прорисовка меню
392 //------------------------------------------------------------------------------------
DrawMenu()393 void DrawMenu()
394 {
395 
396 	// делаем плавное появление меню
397 	if (NeedShowMenu) {
398 		MenuContentTransp = 2.4f*(vw_GetTimeThread(0) - LastMenuUpdateTime);
399 		if (MenuContentTransp >= 1.0f) {
400 			MenuContentTransp = 1.0f;
401 			NeedShowMenu = false;
402 			LastMenuUpdateTime = vw_GetTimeThread(0);
403 
404 			// выводим подсказку, если нужно
405 			if ((MenuStatus == eMenuStatus::PROFILE) &&
406 			    GameConfig().NeedShowHint[0])
407 				SetCurrentDialogBox(eDialogBox::ProfileTipsAndTricks);
408 			if (MenuStatus == eMenuStatus::WORKSHOP) {
409 				if ((CurrentWorkshop == 1) &&
410 				    GameConfig().NeedShowHint[1])
411 					SetCurrentDialogBox(eDialogBox::ShipyardTipsAndTricks);
412 				if ((CurrentWorkshop == 2) &&
413 				    GameConfig().NeedShowHint[2])
414 					SetCurrentDialogBox(eDialogBox::SystemsTipsAndTricks);
415 				if ((CurrentWorkshop == 3) &&
416 				    GameConfig().NeedShowHint[3])
417 					SetCurrentDialogBox(eDialogBox::WeaponryTipsAndTricks);
418 			}
419 		}
420 	}
421 
422 	// делаем полавное угасание меню
423 	if (NeedHideMenu) {
424 		MenuContentTransp = 1.0f - 2.4f*(vw_GetTimeThread(0) - LastMenuUpdateTime);
425 		if (MenuContentTransp <= 0.0f) {
426 			MenuContentTransp = 0.0f;
427 			SetMenu2(NextMenu);
428 			LastMenuUpdateTime = vw_GetTimeThread(0);
429 			NeedShowMenu = true;
430 			NeedHideMenu = false;
431 		}
432 	}
433 
434 
435 	vw_SetCameraMoveAroundPoint(sVECTOR3D{0.0f, 0.0f, 0.0f}, 0.0f, sVECTOR3D{0.0f, 0.0f, 0.0f});
436 	vw_CameraLookAt();
437 
438 
439 
440 
441 	// всегда первым рисуем скайбокс и "далекое" окружение
442 	StarSystemDraw(eDrawType::MENU);
443 
444 
445 
446 
447 	// рисуем название игры, чтобы звезды и корабли пролетали перед ним
448 	vw_Start2DMode(-1,1);
449 	// надпись AstroMenace
450 	sRECT SrcRect, DstRect;
451 	SrcRect(0,0,863,128 );
452 	int StartX = (GameConfig().InternalWidth - 863)/2;
453 	DstRect(StartX,10,StartX+863,10+128);
454 
455 	if ((MenuStatus != eMenuStatus::WORKSHOP) &&
456 	    (MenuStatus != eMenuStatus::INTERFACE) &&
457 	    (MenuStatus != eMenuStatus::OPTIONS) &&
458 	    (MenuStatus != eMenuStatus::CONFCONTROL) &&
459 	    (MenuStatus != eMenuStatus::OPTIONS_ADVANCED)) {
460 		vw_Draw2D(DstRect, SrcRect, GetPreloadedTextureAsset("menu/astromenace.tga"), true, MenuContentTransp);
461 	}
462 
463 	vw_End2DMode();
464 
465 
466 
467 	// рисуем все 3д объекты
468 	DrawAllObject3D(eDrawType::MENU);
469 
470 
471 
472 	// после полной прорисовки делаем обновление данных
473 	UpdateAllObject3D(vw_GetTimeThread(0));
474 	vw_UpdateAllParticleSystems(vw_GetTimeThread(0));
475 
476 
477 
478 
479 	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
480 	// работаем со скриптом, пока он есть
481 	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
482 	if (MenuScript &&
483 	    (!MenuScript->Update(vw_GetTimeThread(0))))
484 		MenuScript.reset();
485 
486 
487 
488 
489 
490 	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
491 	// переходим в 2д режим для прорисовки всех 2д частей
492 	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
493 	vw_Start2DMode(-1,1);
494 
495 	switch (MenuStatus) {
496 	case eMenuStatus::MAIN_MENU:
497 		MainMenu();
498 		break;
499 	case eMenuStatus::TOP_SCORES:
500 		TopScoresMenu();
501 		break;
502 	case eMenuStatus::INTERFACE:
503 		InterfaceMenu(MenuContentTransp, Button10Transp, LastButton10UpdateTime);
504 		break;
505 	case eMenuStatus::OPTIONS:
506 		OptionsMenu(MenuContentTransp, Button10Transp, LastButton10UpdateTime, Button11Transp, LastButton11UpdateTime);
507 		break;
508 	case eMenuStatus::OPTIONS_ADVANCED:
509 		OptionsAdvMenu(MenuContentTransp, Button10Transp, LastButton10UpdateTime, Button11Transp, LastButton11UpdateTime);
510 		break;
511 	case eMenuStatus::INFORMATION:
512 		InformationMenu();
513 		break;
514 	case eMenuStatus::CREDITS:
515 		CreditsMenu();
516 		break;
517 	case eMenuStatus::CONFCONTROL:
518 		ConfControlMenu(MenuContentTransp, Button10Transp, LastButton10UpdateTime);
519 		break;
520 	case eMenuStatus::PROFILE:
521 		ProfileMenu();
522 		break;
523 	case eMenuStatus::DIFFICULTY:
524 		DifficultyMenu();
525 		break;
526 	case eMenuStatus::MISSION:
527 		MissionMenu();
528 		break;
529 	case eMenuStatus::WORKSHOP:
530 		WorkshopMenu();
531 		break;
532 
533 	default:
534 		break;
535 	}
536 
537 
538 
539 
540 	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
541 	// последнее - вывод версии и копирайта
542 	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
543 	vw_SetFontSize(10);
544 
545 	// Version
546 	int VSize = vw_TextWidthUTF32(vw_GetTextUTF32("Version"));
547 	vw_DrawTextUTF32(6, GameConfig().InternalHeight - 16, 0, 0, 1.0f, sRGBCOLOR{eRGBCOLOR::white}, 0.99f, vw_GetTextUTF32("Version"));
548 	vw_DrawText(16 + VSize, GameConfig().InternalHeight - 16, 0, 0, 1.0f, sRGBCOLOR{eRGBCOLOR::white}, 0.99f, GAME_VERSION);
549 	// Copyright
550     int CSize = vw_TextWidth("Copyright © 2007-2019, Viewizard");
551 	vw_DrawText(GameConfig().InternalWidth - 6 - CSize, GameConfig().InternalHeight - 16, 0, 0, 1.0f, sRGBCOLOR{eRGBCOLOR::white}, 0.99f,
552             "Copyright © 2007-2019, Viewizard");
553 
554 	ResetFontSize();
555 	vw_End2DMode();
556 
557 
558 	// если нужно - рисуем в окошке еще одном
559 	switch (MenuStatus) {
560 	case eMenuStatus::INFORMATION:
561 		InformationDrawObject();
562 		break;
563 
564 	default:
565 		break;
566 	}
567 
568 
569 
570 
571 	// черное затемнение, если нужно
572 	if (NeedOnMenu) {
573 		MenuBlackTransp = 1.0f - 2.4f*(vw_GetTimeThread(0) - LastMenuOnOffUpdateTime);
574 		if (MenuBlackTransp <= 0.0f) {
575 			MenuBlackTransp = 0.0f;
576 			NeedOnMenu = false;
577 			LastMenuOnOffUpdateTime = vw_GetTimeThread(0);
578 		}
579 
580 		vw_Start2DMode(-1,1);
581 
582 		SrcRect(0, 0, 2, 2);
583 		DstRect(0, 0, GameConfig().InternalWidth, 768);
584 		vw_Draw2D(DstRect, SrcRect, GetPreloadedTextureAsset("menu/blackpoint.tga"), true, MenuBlackTransp);
585 
586 		vw_End2DMode();
587 	}
588 
589 	// черное затемнение, выключаем воркшоп (готовимся к переходу на игру)
590 	if (NeedOffMenu) {
591 		MenuBlackTransp = 2.4f*(vw_GetTimeThread(0) - LastMenuOnOffUpdateTime);
592 		if (MenuBlackTransp >= 1.0f) {
593 			MenuBlackTransp = 1.0f;
594 			NeedOffMenu = false;
595 			LastMenuOnOffUpdateTime = vw_GetTimeThread(0);
596 			// переход на игру
597 			WorkshopDestroyData();
598 			cCommand::GetInstance().Set(eCommand::SWITCH_FROM_MENU_TO_GAME);
599 		}
600 
601 		vw_Start2DMode(-1,1);
602 
603 		SrcRect(0, 0, 2, 2);
604 		DstRect(0, 0, GameConfig().InternalWidth, 768);
605 		vw_Draw2D(DstRect, SrcRect, GetPreloadedTextureAsset("menu/blackpoint.tga"), true, MenuBlackTransp);
606 
607 		vw_End2DMode();
608 	}
609 
610 }
611 
612 
613 
614 
615 
616 
617 
618 
619 
620 
621 
622 
623 //------------------------------------------------------------------------------------
624 // прорисовка основного меню
625 //------------------------------------------------------------------------------------
MainMenu()626 void MainMenu()
627 {
628 
629 	int Prir = 100;
630 	int X = (GameConfig().InternalWidth - 384) / 2;
631 	int Y = 165;
632 
633 	if (DrawButton384(X,Y, vw_GetTextUTF32("START GAME"), MenuContentTransp, Button1Transp, LastButton1UpdateTime)) {
634 		// если текущего профиля нет - нужно перейти на выбор профилей, если есть - сразу идем на выбор миссий
635 		if (CurrentProfile < 0)
636 			cCommand::GetInstance().Set(eCommand::SWITCH_TO_PROFILE);
637 		else
638 			cCommand::GetInstance().Set(eCommand::SWITCH_TO_MISSION);
639 	}
640 
641 
642 
643 
644 
645 	Y = Y+Prir;
646 	if (DrawButton384(X,Y, vw_GetTextUTF32("TOP SCORES"), MenuContentTransp, Button2Transp, LastButton2UpdateTime))
647 		cCommand::GetInstance().Set(eCommand::SWITCH_TO_TOP_SCORES);
648 
649 	Y = Y+Prir;
650 	if (DrawButton384(X,Y, vw_GetTextUTF32("OPTIONS"), MenuContentTransp, Button3Transp, LastButton3UpdateTime))
651 		cCommand::GetInstance().Set(eCommand::SWITCH_TO_OPTIONS);
652 
653 	Y = Y+Prir;
654 	if (DrawButton384(X,Y, vw_GetTextUTF32("INFORMATION"), MenuContentTransp, Button4Transp, LastButton4UpdateTime))
655 		cCommand::GetInstance().Set(eCommand::SWITCH_TO_INFORMATION);
656 
657 	Y = Y+Prir;
658 	if (DrawButton384(X,Y, vw_GetTextUTF32("CREDITS"), MenuContentTransp, Button5Transp, LastButton5UpdateTime)) {
659 		cCommand::GetInstance().Set(eCommand::SWITCH_TO_CREDITS);
660 		PlayMusicTheme(eMusicTheme::CREDITS, 2000, 2000);
661 	}
662 
663 	Y = Y+Prir;
664 	if (DrawButton384(X,Y, vw_GetTextUTF32("QUIT"), MenuContentTransp, Button6Transp, LastButton6UpdateTime))
665 		SetCurrentDialogBox(eDialogBox::QuitFromGame);
666 
667 }
668 
669 } // astromenace namespace
670 } // viewizard namespace
671