diff --git a/programs/games/rforces/trunk/cmp.bat b/programs/games/rforces/trunk/cmp.bat index 59b663e8a2..226f2b268d 100644 --- a/programs/games/rforces/trunk/cmp.bat +++ b/programs/games/rforces/trunk/cmp.bat @@ -1,4 +1,7 @@ -"C:\Program Files\Microsoft Visual Studio 8\VC\bin\cl" /c /O2 /nologo /GS- /GR- /fp:fast rforces.cpp kosFile.cpp kosSyst.cpp mcsmemm.cpp -"C:\Program Files\Microsoft Visual Studio 8\VC\bin\link" /nologo /manifest:no /entry:crtStartUp /subsystem:native /base:0 /fixed /align:16 /nodefaultlib rforces.obj kosFile.obj kosSyst.obj mcsmemm.obj -pe2kos rforces.exe rforces +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" + +@cl /c /O2 /nologo /GS- /GR- /fp:fast rforces.cpp kosFile.cpp kosSyst.cpp mcsmemm.cpp +@link /nologo /manifest:no /entry:crtStartUp /subsystem:native /base:0 /fixed /align:16 /nodefaultlib rforces.obj kosFile.obj kosSyst.obj mcsmemm.obj +@pe2kos rforces.exe rforces +@del rforces.exe pause \ No newline at end of file diff --git a/programs/games/rforces/trunk/kosSyst.cpp b/programs/games/rforces/trunk/kosSyst.cpp index 193f352429..11151cdc21 100644 --- a/programs/games/rforces/trunk/kosSyst.cpp +++ b/programs/games/rforces/trunk/kosSyst.cpp @@ -367,7 +367,7 @@ void sprintf( char *Str, char* Format, ... ) } -// функция -1 завершения процесса +// function -1 termanate process void kos_ExitApp() { int i; @@ -386,7 +386,7 @@ void kos_ExitApp() } -// функция 0 +// function 0 void kos_DefineAndDrawWindow( Word x, Word y, Word sizeX, Word sizeY, @@ -417,7 +417,7 @@ void kos_DefineAndDrawWindow( } -// функция 1 поставить точку +// function 1 void kos_PutPixel( Dword x, Dword y, Dword colour ) { // @@ -431,7 +431,7 @@ void kos_PutPixel( Dword x, Dword y, Dword colour ) } -// функция 2 получить код нажатой клавиши +// function 2 get key code bool kos_GetKey( Byte &keyCode ) { Dword result; @@ -449,7 +449,7 @@ bool kos_GetKey( Byte &keyCode ) } -// функция 3 получить время +// function 3 get system clock Dword kos_GetSystemClock() { // Dword result; @@ -465,7 +465,7 @@ Dword kos_GetSystemClock() } -// функция 4 +// function 4 void kos_WriteTextToWindow( Word x, Word y, @@ -491,8 +491,31 @@ void kos_WriteTextToWindow( } } +// function 4 +void kos_WriteTextWithBg( + Word x, + Word y, + Byte fontType, + Dword textColour, + Dword bgcolour, + char *textPtr, + Dword textLen + ) +{ + Dword arg1, arg2; -// функция 5 пауза, в сотых долях секунды + // + arg1 = ( x << 16 ) | y; + arg2 = ( fontType << 24 ) | textColour; + // + __asm{ + mov edi, bgcolour + } + kos_WriteTextToWindow(x,y,fontType,textColour,textPtr,textLen); +} + + +// function 5 pause, in value is 1/100 of second void kos_Pause( Dword value ) { // @@ -504,7 +527,7 @@ void kos_Pause( Dword value ) } -// функция 7 нарисовать изображение +// function 7 void kos_PutImage( RGB * imagePtr, Word sizeX, Word sizeY, Word x, Word y ) { Dword arg1, arg2; @@ -524,7 +547,7 @@ void kos_PutImage( RGB * imagePtr, Word sizeX, Word sizeY, Word x, Word y ) -// функция 8 определить кнопку +// function 8 void kos_DefineButton( Word x, Word y, Word sizeX, Word sizeY, Dword buttonID, Dword colour ) { Dword arg1, arg2; @@ -544,7 +567,7 @@ void kos_DefineButton( Word x, Word y, Word sizeX, Word sizeY, Dword buttonID, D } -// функция 9 - информация о процессе +// function 9 get process info Dword kos_ProcessInfo( sProcessInfo *targetPtr, Dword processID ) { // Dword result; @@ -562,7 +585,7 @@ Dword kos_ProcessInfo( sProcessInfo *targetPtr, Dword processID ) } -// функция 10 +// function 10 Dword kos_WaitForEvent() { // Dword result; @@ -577,7 +600,7 @@ Dword kos_WaitForEvent() } -// функция 11 +// function 11 Dword kos_CheckForEvent() { // Dword result; @@ -592,7 +615,7 @@ Dword kos_CheckForEvent() } -// функция 12 +// function 12 void kos_WindowRedrawStatus( Dword status ) { __asm{ @@ -603,7 +626,7 @@ void kos_WindowRedrawStatus( Dword status ) } -// функция 13 нарисовать полосу +// function 13 draw filled area void kos_DrawBar( Word x, Word y, Word sizeX, Word sizeY, Dword colour ) { Dword arg1, arg2; @@ -622,7 +645,7 @@ void kos_DrawBar( Word x, Word y, Word sizeX, Word sizeY, Dword colour ) } -// функция 17 +// function 17 bool kos_GetButtonID( Dword &buttonID ) { Dword result; @@ -640,7 +663,7 @@ bool kos_GetButtonID( Dword &buttonID ) } -// функция 23 +// function 23 Dword kos_WaitForEvent( Dword timeOut ) { // Dword result; @@ -655,7 +678,7 @@ Dword kos_WaitForEvent( Dword timeOut ) // return result; } -// функция 26.9 получить значение счётчика времени +// function 26.9 получить значение счётчика времени Dword kos_GetTime() { __asm{ @@ -665,7 +688,7 @@ Dword kos_GetTime() } } -// функция 37 получение информации о состоянии "мыши" +// function 37 получение информации о состоянии "мыши" void kos_GetMouseState( Dword & buttons, int & cursorX, int & cursorY ) { Dword mB; @@ -694,7 +717,7 @@ void kos_GetMouseState( Dword & buttons, int & cursorX, int & cursorY ) cursorY = curY - sPI.processInfo.y_start; } -// функция 37.1 получение координат "мыши" относительно окна +// function 37.1 получение координат "мыши" относительно окна void kos_GetMouseWindowXY( int & cursorX, int & cursorY ) { Word curX; @@ -717,7 +740,7 @@ void kos_GetMouseWindowXY( int & cursorX, int & cursorY ) cursorY = curY; } -// функция 37.2 получение информации о нажатых кнопки "мыши" +// function 37.2 получение информации о нажатых кнопки "мыши" void kos_GetMouseButtonsState( Dword & buttons ) { Dword mB; @@ -732,7 +755,7 @@ void kos_GetMouseButtonsState( Dword & buttons ) buttons = mB; } -// функция 37.4 загрузка курсора "мыши" +// function 37.4 загрузка курсора "мыши" Dword * kos_LoadMouseCursor( Dword * cursor, Dword loadstate ) { //Dword handle; @@ -747,7 +770,7 @@ Dword * kos_LoadMouseCursor( Dword * cursor, Dword loadstate ) //return handle; } -// функция 37.5 установка курсора "мыши" +// function 37.5 установка курсора "мыши" Dword * kos_SetMouseCursor( Dword * handle ) { //Dword handle; @@ -761,7 +784,7 @@ Dword * kos_SetMouseCursor( Dword * handle ) //return handle; } -// функция 37.6 удаление курсора "мыши" +// function 37.6 удаление курсора "мыши" void kos_DeleteMouseCursor( Dword * handle ) { __asm{ @@ -772,7 +795,7 @@ void kos_DeleteMouseCursor( Dword * handle ) } } -// функция 38 нарисовать полосу +// function 38 void kos_DrawLine( Word x1, Word y1, Word x2, Word y2, Dword colour ) { Dword arg1, arg2; @@ -791,7 +814,7 @@ void kos_DrawLine( Word x1, Word y1, Word x2, Word y2, Dword colour ) } -// функция 40 установить маску событий +// function 40 void kos_SetMaskForEvents( Dword mask ) { // @@ -803,7 +826,7 @@ void kos_SetMaskForEvents( Dword mask ) } -// функция 47 вывести в окно приложения число +// function 47 вывести в окно приложения число void kos_DisplayNumberToWindow( Dword value, Dword digitsNum, @@ -832,7 +855,7 @@ void kos_DisplayNumberToWindow( } } -// функция 47 вывести в окно приложения число c фоном +// function 47 вывести в окно приложения число c фоном void kos_DisplayNumberToWindowBg( Dword value, Dword digitsNum, @@ -874,7 +897,7 @@ Dword kos_GetSkinHeight() } } -// функция 70 доступ к файловой системе +// function 70 доступ к файловой системе Dword kos_FileSystemAccess( kosFileInfo *fileInfo ) { // Dword result; @@ -891,7 +914,7 @@ Dword kos_FileSystemAccess( kosFileInfo *fileInfo ) } -// функция 63 вывод символя в окно отладки +// function 63 вывод символя в окно отладки void kos_DebugOutChar( char ccc ) { // @@ -904,7 +927,7 @@ void kos_DebugOutChar( char ccc ) } -// функция 66 режим получения данных от клавиатуры +// function 66 режим получения данных от клавиатуры void kos_SetKeyboardDataMode( Dword mode ) { // @@ -930,8 +953,21 @@ void rtlDebugOutString( char *str ) kos_DebugOutChar( 10 ); } +void kos_DebugNumber(signed int n) +{ + if (n<0) { + kos_DebugOutChar('-'); + n = -n; + } + while (n>10) { + kos_DebugOutChar(n%10 + '0'); + n /= 10; + } + kos_DebugOutChar(n + '0'); + kos_DebugOutChar('\n'); +} -// функция 64 изменение количества памяти, выделенной для программы +// function 64 изменение количества памяти, выделенной для программы bool kos_ApplicationMemoryResize( Dword targetSize ) { Dword result; @@ -949,7 +985,8 @@ bool kos_ApplicationMemoryResize( Dword targetSize ) } -// функция 67 изменить параметры окна, параметр == -1 не меняется +// function 67 change window size and position, +// if param == -1 then value does not change void kos_ChangeWindow( Dword x, Dword y, Dword sizeX, Dword sizeY ) { // diff --git a/programs/games/rforces/trunk/kosSyst.h b/programs/games/rforces/trunk/kosSyst.h index c85b792999..6a0db8b4d6 100644 --- a/programs/games/rforces/trunk/kosSyst.h +++ b/programs/games/rforces/trunk/kosSyst.h @@ -136,9 +136,9 @@ void memset( Byte *dst, Byte filler, Dword count ); void sprintf( char *Str, char* Format, ... ); // Dword rtlInterlockedExchange( Dword *target, Dword value ); -// функция -1 завершения процесса +// function -1 завершения процесса void kos_ExitApp(); -// функция 0 +// function 0 void kos_DefineAndDrawWindow( Word x, Word y, Word sizeX, Word sizeY, @@ -146,13 +146,13 @@ void kos_DefineAndDrawWindow( Byte headerType, Dword headerColour, Dword borderColour ); -// функция 1 поставить точку +// function 1 поставить точку void kos_PutPixel( Dword x, Dword y, Dword colour ); -// функция 2 получить код нажатой клавиши +// function 2 получить код нажатой клавиши bool kos_GetKey( Byte &keyCode ); -// функция 3 получить время +// function 3 получить время Dword kos_GetSystemClock(); -// функция 4 +// function 4 void kos_WriteTextToWindow( Word x, Word y, Byte fontType, @@ -160,27 +160,36 @@ void kos_WriteTextToWindow( char *textPtr, Dword textLen ); -// функция 7 нарисовать изображение +// +void kos_WriteTextWithBg( + Word x, Word y, + Byte fontType, + Dword textColour, + Dword bgcolour, + char *textPtr, + Dword textLen + ); +// function 7 нарисовать изображение void kos_PutImage( RGB * imagePtr, Word sizeX, Word sizeY, Word x, Word y ); -// функция 8 определить кнопку +// function 8 определить кнопку void kos_DefineButton( Word x, Word y, Word sizeX, Word sizeY, Dword buttonID, Dword colour ); -// функция 5 пауза, в сотых долях секунды +// function 5 пауза, в сотых долях секунды void kos_Pause( Dword value ); -// функция 9 информация о процессе +// function 9 информация о процессе Dword kos_ProcessInfo( sProcessInfo *targetPtr, Dword processID = PROCESS_ID_SELF ); -// функция 10 +// function 10 Dword kos_WaitForEvent(); -// функция 11 +// function 11 Dword kos_CheckForEvent(); -// функция 12 +// function 12 void kos_WindowRedrawStatus( Dword status ); -// функция 13 нарисовать прямоугольник +// function 13 нарисовать прямоугольник void kos_DrawBar( Word x, Word y, Word sizeX, Word sizeY, Dword colour ); -// функция 17 +// function 17 bool kos_GetButtonID( Dword &buttonID ); -// функция 23 +// function 23 Dword kos_WaitForEvent( Dword timeOut ); -// функция 26.9 получить значение счётчика времени +// function 26.9 получить значение счётчика времени Dword kos_GetTime(); // enum eNumberBase @@ -189,23 +198,23 @@ enum eNumberBase nbHex, nbBin }; -// функция 37 получение информации о состоянии "мыши" +// function 37 получение информации о состоянии "мыши" void kos_GetMouseState( Dword & buttons, int & cursorX, int & cursorY ); -// функция 37.1 получение координат "мыши" относительно окна +// function 37.1 получение координат "мыши" относительно окна void kos_GetMouseWindowXY( int & cursorX, int & cursorY ); -// функция 37.2 получение информации о нажатых кнопки "мыши" +// function 37.2 получение информации о нажатых кнопки "мыши" void kos_GetMouseButtonsState( Dword & buttons ); -// функция 37.4 загрузка курсора "мыши" +// function 37.4 загрузка курсора "мыши" Dword * kos_LoadMouseCursor( Dword * cursor, Dword loadstate ); -// функция 37.5 установка курсора "мыши" +// function 37.5 установка курсора "мыши" Dword * kos_SetMouseCursor( Dword * handle ); -// функция 37.6 удаление курсора "мыши" +// function 37.6 удаление курсора "мыши" void kos_DeleteMouseCursor( Dword * handle ); -// функция 38 нарисовать полосу +// function 38 нарисовать полосу void kos_DrawLine( Word x1, Word y1, Word x2, Word y2, Dword colour ); -// функция 40 установить маску событий +// function 40 установить маску событий void kos_SetMaskForEvents( Dword mask ); -// функция 47 вывести в окно приложения число +// function 47 вывести в окно приложения число void kos_DisplayNumberToWindow( Dword value, Dword digitsNum, @@ -215,7 +224,7 @@ void kos_DisplayNumberToWindow( eNumberBase nBase = nbDecimal, bool valueIsPointer = false ); -// функция 47 вывести в окно приложения число c фоном +// function 47 вывести в окно приложения число c фоном void kos_DisplayNumberToWindowBg( Dword value, Dword digitsNum, @@ -226,19 +235,22 @@ void kos_DisplayNumberToWindowBg( eNumberBase nBase = nbDecimal, bool valueIsPointer = false ); -// 48.4 get windows title bar height +// function 48.4 get windows title bar height Dword kos_GetSkinHeight(); -// функция 58 доступ к файловой системе +// function 58 доступ к файловой системе Dword kos_FileSystemAccess( kosFileInfo *fileInfo ); -// функция 63 +// function 63 void kos_DebugOutChar( char ccc ); // void rtlDebugOutString( char *str ); -// функция 64 изменить параметры окна, параметр == -1 не меняется +// +void kos_DebugNumber(signed int n); +// +// function 64 изменить параметры окна, параметр == -1 не меняется void kos_ChangeWindow( Dword x, Dword y, Dword sizeX, Dword sizeY ); -// функция 67 изменение количества памяти, выделенной для программы +// function 67 изменение количества памяти, выделенной для программы bool kos_ApplicationMemoryResize( Dword targetSize ); -// функция 66 режим получения данных от клавиатуры +// function 66 режим получения данных от клавиатуры void kos_SetKeyboardDataMode( Dword mode ); // diff --git a/programs/games/rforces/trunk/properties.h b/programs/games/rforces/trunk/properties.h index 6375291d47..814651834c 100644 --- a/programs/games/rforces/trunk/properties.h +++ b/programs/games/rforces/trunk/properties.h @@ -16,7 +16,7 @@ #define WHITE 0x00FFFFFF // Visual properties -#define GAME_NAME "Rocket Forces v1.12 (F2 - new game, Esc - exit) " +#define GAME_NAME "Rocket Forces" #define BG_COLOR BLACK #define TEXT_COLOR WHITE #define CUR_COLOR GREEN diff --git a/programs/games/rforces/trunk/rforces.cpp b/programs/games/rforces/trunk/rforces.cpp index e2e639ebb5..235cd8c6de 100644 --- a/programs/games/rforces/trunk/rforces.cpp +++ b/programs/games/rforces/trunk/rforces.cpp @@ -1,9 +1,13 @@ /* Rocket Forces * Filename: rforces.cpp - * Version 0.1.1 + * Version 0.1 * Copyright (c) Serial 2007 */ +/* Version 0.2 + * Copyright (c) Leency 2018 + */ + #include @@ -26,6 +30,8 @@ cBuilding *house = new cBuilding(); Dword *cur_handle; int score, health; +bool game_over; + struct MouseState { int x, y, lbclick; @@ -35,7 +41,6 @@ struct MouseState void kos_Main() { - Dword btn_id; Dword frame_start, frame_end; OnStart(); Menu(); @@ -45,46 +50,45 @@ void kos_Main() frame_start = kos_GetTime(); switch (kos_CheckForEvent()) { - case EM_WINDOW_REDRAW: - DrawWindow(); - break; case EM_KEY_PRESS: Byte keyCode; kos_GetKey(keyCode); if (keyCode == 27) { - OnExit(); + kos_ExitApp(); } if (keyCode == 51) { OnStart(); } break; - case EM_BUTTON_CLICK: // button pressed; we have only one button, close + case EM_BUTTON_CLICK: + Dword btn_id; if (kos_GetButtonID(btn_id)) { - if (btn_id == 1) OnExit(); + if (btn_id == 1) kos_ExitApp(); } break; - case EM_MOUSE_EVENT: // событие от мыши (нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) + case EM_MOUSE_EVENT: OnMouseMove(); if (ms.lbclick == 1) { OnLMBClick(); } break; + case EM_WINDOW_REDRAW: + DrawWindow(); + break; default: + if (game_over) break; DrawBombs(); DrawRocketsAndCrosses(); DrawExplodes(); + DrawStats(); frame_end = kos_GetTime(); - if (frame_end - frame_start < FRAME_TIME) - { + if (frame_end - frame_start < FRAME_TIME) { kos_Pause(FRAME_TIME - (frame_end - frame_start)); } - if (health <= 0) - { - OnExit(); - } + if (health <= 0) GameOver(); } } } @@ -92,10 +96,13 @@ void kos_Main() void DrawWindow() { kos_WindowRedrawStatus(1); - kos_DefineAndDrawWindow(10, 40, WINDOW_WIDTH + 8, WINDOW_HEIGHT + kos_GetSkinHeight() + 12, 0x34, BG_COLOR, 0, 0, (Dword)header); + kos_DefineAndDrawWindow(10, 40, WINDOW_WIDTH + 12, + WINDOW_HEIGHT + kos_GetSkinHeight() + 12, 0x34, + BG_COLOR, 0, 0, (Dword)header); kos_WindowRedrawStatus(2); - OnMouseMove(); + DrawStats(); + if (health <= 0) GameOver(); // Draw buildings for (int i = 20; i < 5 * 50; i += 50) @@ -213,6 +220,12 @@ void OnMouseMove() Dword old_buttons = ms.buttons; kos_GetMouseWindowXY(ms.x, ms.y); kos_GetMouseButtonsState(ms.buttons); + + if (health <= 0) return; + + //restore mouse cursor when it over Window Header + if (ms.y > 5000) RestoreSystemCursor(); else SetGameCursor(); + if ((old_buttons & 0x00000001) == 0 && (ms.buttons & 0x00000001) == 1) { ms.lbclick = 1; @@ -222,13 +235,6 @@ void OnMouseMove() ms.lbclick = 0; } - kos_DrawBar(8, 10, 6*11, 22, 0); - kos_WriteTextToWindow(8, 10, 0, TEXT_COLOR, "Population: %", 16); - kos_WriteTextToWindow(8, 22, 0, TEXT_COLOR, "Score:", 6); - - kos_DisplayNumberToWindowBg(health, 3, 79, 10, TEXT_COLOR, BG_COLOR, nbDecimal, false); - kos_DisplayNumberToWindowBg(score, 4, 49, 22, TEXT_COLOR, BG_COLOR, nbDecimal, false); - if (ms.x >= 0 && ms.x < WINDOW_WIDTH && ms.y >= 0 && ms.y < WINDOW_HEIGHT) { gun->DrawAngle(ms.x, ms.y, G_COLOR); @@ -245,7 +251,15 @@ void OnMouseMove() kos_DisplayNumberToWindowBg(ms.y, 3, WINDOW_WIDTH - 30, 22, TEXT_COLOR, BG_COLOR, nbDecimal, false); kos_DisplayNumberToWindowBg(ms.buttons, 1, WINDOW_WIDTH - 30, 34, TEXT_COLOR, BG_COLOR, nbDecimal, false); }*/ +} +void DrawStats() +{ + kos_WriteTextWithBg(8, 10, 0xC0, TEXT_COLOR, 0, "Population:", 11); + kos_WriteTextWithBg(8+15*6, 9, 0xC0, TEXT_COLOR, 0, "%", 1); + kos_WriteTextWithBg(8, 22, 0xC0, TEXT_COLOR, 0, "Score:", 6); + kos_DisplayNumberToWindowBg(health, 3, 79, 10, TEXT_COLOR, BG_COLOR, nbDecimal, false); + kos_DisplayNumberToWindowBg(score, 4, 49, 22, TEXT_COLOR, BG_COLOR, nbDecimal, false); } void OnLMBClick() @@ -284,11 +298,7 @@ void OnLMBClick() } } -void OnRMBClick() -{ -} - -void ChangeCursor() +void SetGameCursor() { Dword *cur = new Dword[1024]; for (int i = 0; i < 1024; i++) @@ -329,6 +339,12 @@ void ChangeCursor() kos_SetMouseCursor(cur_handle); } +void RestoreSystemCursor() +{ + if (cur_handle) kos_SetMouseCursor(0); + cur_handle=0; +} + void Menu() { NewGame(); @@ -345,7 +361,7 @@ void OnStart() { cursor = new cCursor(); } - ChangeCursor(); + SetGameCursor(); gun->Enable((WINDOW_WIDTH / 2) - 10, WINDOW_HEIGHT - 30, 10, 20, (WINDOW_WIDTH / 2) - 5, WINDOW_HEIGHT - 20); @@ -366,16 +382,21 @@ void OnStart() health = 100; score = 0; + game_over = false; + rtlSrand(kos_GetTime()); DrawWindow(); } -void OnExit() +void GameOver() { - kos_WriteTextToWindow(WINDOW_WIDTH / 2 - 35, WINDOW_HEIGHT / 2 - 10, 0, TEXT_COLOR, "Game Over", 9); - - kos_Pause(150); - - kos_ExitApp(); + int xcenter = WINDOW_WIDTH / 2; + int y = WINDOW_HEIGHT/ 2 - 40; + kos_WriteTextToWindow(xcenter-50, y, 0x81, TEXT_COLOR, "Game Over", 9); + kos_WriteTextToWindow(xcenter-43, y+36, 0x80, TEXT_COLOR, "[F2] - New game", 0); + kos_WriteTextToWindow(xcenter-43, y+53, 0x80, TEXT_COLOR, "[Ecs] - Exit", 0); + // + RestoreSystemCursor(); + game_over = true; } diff --git a/programs/games/rforces/trunk/rforces.h b/programs/games/rforces/trunk/rforces.h index 6c9f60d5da..b496e8a1b9 100644 --- a/programs/games/rforces/trunk/rforces.h +++ b/programs/games/rforces/trunk/rforces.h @@ -10,10 +10,11 @@ void DrawBombs(); void DrawRocketsAndCrosses(); void DrawExplodes(); void OnMouseMove(); +void DrawStats(); void OnLMBClick(); -void OnRMBClick(); -void ChangeCursor(); +void SetGameCursor(); +void RestoreSystemCursor(); void Menu(); void NewGame(); void OnStart(); -void OnExit(); +void GameOver();