OutRun/src/src/menus.cc

386 lines
12 KiB
C++

#include "../include/menus.h"
#include <gint/display.h>
#include <gint/keyboard.h>
extern bopti_image_t mainscreen;
extern bopti_image_t africa1, desert1, finland1, plains1, usa1;
extern bopti_image_t flag;
extern font_t autofont, autofontsmall;
bool doneTitle = false;
bool doneMainMenu = false;
uint8_t MainMenuSelection=0;
bool doneMenuCircuit = false;
uint8_t CircuitSelection=0;
bool doneMenuCredit = false;
void drawStartTitle( void )
{
uint16_t pulse=0;
doneTitle = false;
while (!doneTitle)
{
dclear( C_BLACK );
dsubimage( 0, 32, &mainscreen, 0, 32, 396, 160, DIMAGE_NONE);
dfont(&autofont);
dprint_opt(198, 2, C_RGB(255,255,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "OUTRUN FOR GRAPH90" );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, "PRESS EXE TO START" );
// CODE HERE TO PRINT WELCOME MENU
dupdate();
pulse++;
getInputStartTitle();
}
}
void getInputStartTitle( void )
{
int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS;
int timeout = 1;
while(1)
{
key_event_t ev = getkey_opt(opt, &timeout);
if(ev.type == KEYEV_NONE) return -1;
int key = ev.key;
if (key==KEY_EXE)
doneTitle = true;
}
}
int drawMainMenu( void )
{
uint16_t pulse=0;
doneMainMenu = false;
MainMenuSelection=0;
while (!doneMainMenu)
{
dimage( 0, 0, &mainscreen);
dfont(&autofont);
dprint_opt(102, 22, C_RGB(0,0,0), C_NONE, DTEXT_LEFT, DTEXT_TOP, "ARCADE GAME" );
if (MainMenuSelection!=0) dprint_opt(100, 20, C_RGB(255,255,255), C_NONE, DTEXT_LEFT, DTEXT_TOP, "ARCADE GAME" );
else dprint_opt(100, 20, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_LEFT, DTEXT_TOP, "ARCADE GAME" );
dprint_opt(102, 62, C_RGB(0,0,0), C_NONE, DTEXT_LEFT, DTEXT_TOP, "TIME ATTACK" );
if (MainMenuSelection!=1) dprint_opt(100, 60, C_RGB(255,255,255), C_NONE, DTEXT_LEFT, DTEXT_TOP, "TIME ATTACK" );
else dprint_opt(100, 60, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_LEFT, DTEXT_TOP, "TIME ATTACK" );
dprint_opt(102, 102, C_RGB(0,0,0), C_NONE, DTEXT_LEFT, DTEXT_TOP, "OPTIONS" );
if (MainMenuSelection!=2) dprint_opt(100, 100, C_RGB(255,255,255), C_NONE, DTEXT_LEFT, DTEXT_TOP, "OPTIONS" );
else dprint_opt(100, 100, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_LEFT, DTEXT_TOP, "OPTIONS" );
dprint_opt(102, 142, C_RGB(0,0,0), C_NONE, DTEXT_LEFT, DTEXT_TOP, "CREDITS" );
if (MainMenuSelection!=3) dprint_opt(100, 140, C_RGB(255,255,255), C_NONE, DTEXT_LEFT, DTEXT_TOP, "CREDITS" );
else dprint_opt(100, 140, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_LEFT, DTEXT_TOP, "CREDITS" );
dprint_opt(102, 182, C_RGB(0,0,0), C_NONE, DTEXT_LEFT, DTEXT_TOP, "QUIT TO OS" );
if (MainMenuSelection!=4) dprint_opt(100, 180, C_RGB(255,255,255), C_NONE, DTEXT_LEFT, DTEXT_TOP, "QUIT TO OS" );
else dprint_opt(100, 180, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_LEFT, DTEXT_TOP, "QUIT TO OS" );
dimage( 10, 10+40*MainMenuSelection, &flag );
// CODE HERE TO PRINT WELCOME MENU
dupdate();
pulse++;
getInputMainMenu();
}
return MainMenuSelection;
}
void getInputMainMenu( void )
{
int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS;
int timeout = 1;
while(1)
{
key_event_t ev = getkey_opt(opt, &timeout);
if(ev.type == KEYEV_NONE) return -1;
int key = ev.key;
if (key==KEY_EXE)
doneMainMenu = true;
if (key==KEY_UP)
{
if (MainMenuSelection==0) MainMenuSelection=4;
else MainMenuSelection--;
}
if (key==KEY_DOWN)
{
if (MainMenuSelection==4) MainMenuSelection=0;
else MainMenuSelection++;
}
}
}
void drawRectangle( uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color, uint8_t thick )
{
for(int u=0; u<=thick; u++)
{
dline( x, y+u, x+w, y+u, color );
dline( x, y+h-u, x+w, y+h-u, color );
dline( x+u, y, x+u, y+h, color );
dline( x+w-u, y, x+w-u, y+h, color );
}
}
int drawMenuCircuitSelect( void )
{
uint16_t pulse=0;
doneMenuCircuit = false;
CircuitSelection=0;
while (!doneMenuCircuit)
{
dclear( C_BLACK );
dsubimage( 0, 32, &mainscreen, 0, 32, 396, 160, DIMAGE_NONE);
dfont(&autofont);
dprint_opt(198, 2, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_TOP, "SELECT A CIRCUIT" );
dimage( 16, 45, &plains1 );
if (CircuitSelection!=0) drawRectangle( 16, 45, 60, 60, C_WHITE, 3 );
else
{
drawRectangle( 16, 45, 60, 60, C_RGB(pulse%256,0,pulse%256), 3 );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, ">> CIRCUIT #1" );
}
dimage( 92, 45, &desert1 );
if (CircuitSelection!=1) drawRectangle( 92, 45, 60, 60, C_WHITE, 3 );
else
{
drawRectangle( 92, 45, 60, 60, C_RGB(pulse%256,0,pulse%256), 3 );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, ">> CIRCUIT #2" );
}
dimage( 168, 45, &usa1 );
if (CircuitSelection!=2) drawRectangle( 168, 45, 60, 60, C_WHITE, 3 );
else
{
drawRectangle( 168, 45, 60, 60, C_RGB(pulse%256,0,pulse%256), 3 );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, ">> CIRCUIT #3" );
}
dimage( 244, 45, &finland1 );
if (CircuitSelection!=3) drawRectangle( 244, 45, 60, 60, C_WHITE, 3 );
else
{
drawRectangle( 244, 45, 60, 60, C_RGB(pulse%256,0,pulse%256), 3 );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, ">> CIRCUIT #4" );
}
dimage( 320, 45, &africa1 );
if (CircuitSelection!=4) drawRectangle( 320, 45, 60, 60, C_WHITE, 3 );
else
{
drawRectangle( 320, 45, 60, 60, C_RGB(pulse%256,0,pulse%256), 3 );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, ">> CIRCUIT #5" );
}
if (CircuitSelection!=5) drawRectangle( 16, 120, 60, 60, C_WHITE, 3 );
else
{
drawRectangle( 16, 120, 60, 60, C_RGB(pulse%256,0,pulse%256), 3 );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, ">> CIRCUIT #6" );
}
if (CircuitSelection!=6) drawRectangle( 92, 120, 60, 60, C_WHITE, 3 );
else
{
drawRectangle( 92, 120, 60, 60, C_RGB(pulse%256,0,pulse%256), 3 );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, ">> CIRCUIT #7" );
}
if (CircuitSelection!=7) drawRectangle( 168, 120, 60, 60, C_WHITE, 3 );
else
{
drawRectangle( 168, 120, 60, 60, C_RGB(pulse%256,0,pulse%256), 3 );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, ">> CIRCUIT #8" );
}
if (CircuitSelection!=8) drawRectangle( 244, 120, 60, 60, C_WHITE, 3 );
else
{
drawRectangle( 244, 120, 60, 60, C_RGB(pulse%256,0,pulse%256), 3 );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, ">> CIRCUIT #9" );
}
if (CircuitSelection!=9) drawRectangle( 320, 120, 60, 60, C_WHITE, 3 );
else
{
drawRectangle( 320, 120, 60, 60, C_RGB(pulse%256,0,pulse%256), 3 );
dprint_opt(198, 222, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_BOTTOM, ">> CIRCUIT #10" );
}
//dimage( 10, 10+40*CircuitSelection, &flag );
// CODE HERE TO PRINT WELCOME MENU
dupdate();
pulse++;
getInputCircuitSelect();
if (CircuitSelection==-1) return -1;
}
return CircuitSelection;
}
void getInputCircuitSelect( void )
{
int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS;
int timeout = 1;
while(1)
{
key_event_t ev = getkey_opt(opt, &timeout);
if(ev.type == KEYEV_NONE) return -1;
int key = ev.key;
if (key==KEY_EXE)
doneMenuCircuit = true;
if (key==KEY_EXIT)
CircuitSelection = -1;
if (key==KEY_UP || key==KEY_LEFT)
{
if (CircuitSelection==0) CircuitSelection=9;
else CircuitSelection--;
}
if (key==KEY_DOWN || key==KEY_RIGHT)
{
if (CircuitSelection==9) CircuitSelection=0;
else CircuitSelection++;
}
}
}
void drawCredit( void )
{
uint16_t pulse=0;
int16_t offset=240;
doneMenuCredit = false;
while (!doneMenuCredit)
{
dclear( 0x0000 );
dimage( 0, 0, &mainscreen );
dfont(&autofont);
dprint_opt(202, offset + 4, C_RGB(0,0,0), C_NONE, DTEXT_CENTER, DTEXT_TOP, "OUTRUN FOR GRAPH90" );
dprint_opt(200, offset + 2, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_TOP, "OUTRUN FOR GRAPH90" );
dfont(&autofontsmall);
dprint_opt(200, offset + 32, C_RGB(255,255,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "PROUDLY CODED BY" );
dprint_opt(200, offset + 62, C_RGB(255,255,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "SLYVTT / MARCH 2022" );
dfont(&autofont);
dprint_opt(202, offset + 124, C_RGB(0,0,0), C_NONE, DTEXT_CENTER, DTEXT_TOP, "CODE :" );
dprint_opt(200, offset + 122, C_RGB(255,0,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "CODE :" );
dfont(&autofontsmall);
dprint_opt(200, offset + 162, C_RGB(255,255,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "SLYVTT" );
dprint_opt(200, offset + 192, C_RGB(255,255,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "WITH SUPPORT FROM LEPHE" );
dfont(&autofont);
dprint_opt(202, offset + 254, C_RGB(0,0,0), C_NONE, DTEXT_CENTER, DTEXT_TOP, "VISUALS" );
dprint_opt(200, offset + 252, C_RGB(255,0,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "VISUALS" );
dfont(&autofontsmall);
dprint_opt(200, offset + 292, C_RGB(255,255,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "SLYVTT" );
dprint_opt(200, offset + 322, C_RGB(255,255,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "WITH SUPPORT FROM INTERNET" );
dprint_opt(200, offset + 352, C_RGB(255,255,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "GOOGLE IS MY BEST FRIEND" );
dfont(&autofont);
dprint_opt(202, offset + 414, C_RGB(0,0,0), C_NONE, DTEXT_CENTER, DTEXT_TOP, "MUSIC" );
dprint_opt(200, offset + 412, C_RGB(255,0,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "MUSIC" );
dfont(&autofontsmall);
dprint_opt(200, offset + 452, C_RGB(255,255,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "SORRY, NO MUSIC ..." );
dprint_opt(200, offset + 482, C_RGB(255,255,255), C_NONE, DTEXT_CENTER, DTEXT_TOP, "... MAYBE ONE DAY !!!" );
dfont(&autofont);
dprint_opt(202, offset + 544, C_RGB(0,0,0), C_NONE, DTEXT_CENTER, DTEXT_TOP, "THANKS FOR PLAYING" );
dprint_opt(202, offset + 574, C_RGB(0,0,0), C_NONE, DTEXT_CENTER, DTEXT_TOP, "HOPE YOU ENJOYED" );
dprint_opt(200, offset + 542, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_TOP, "THANKS FOR PLAYING" );
dprint_opt(200, offset + 572, C_RGB(pulse%256,0,pulse%256), C_NONE, DTEXT_CENTER, DTEXT_TOP, "HOPE YOU ENJOYED" );
dupdate();
pulse++;
offset--;
getInputCredit();
}
return;
}
void getInputCredit( void )
{
int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS;
int timeout = 1;
while(1)
{
key_event_t ev = getkey_opt(opt, &timeout);
if(ev.type == KEYEV_NONE) return -1;
int key = ev.key;
if (key==KEY_EXE)
doneMenuCredit = true;
}
}