Files

358 lines
6.1 KiB
HolyC
Executable File

// vim: set ft=c:
extern U0 initCart(U8 *rom_filename);
#define GUI_IDLE_TIMEOUT 30
class GUIModal
{
U8 *title;
I64 x,y;
I64 w,h;
};
GUIModal *modal_about=CAlloc(sizeof(GUIModal));
modal_about->title = "ABOUT";
modal_about->x = 40;
modal_about->y = 40;
modal_about->w = 120;
modal_about->h = 60;
U32 frame_count = 0;
CDC *ms_pointer = GRRead("Pointer.GR");
DCColorChg(ms_pointer, LTPURPLE, 255);
Bool gui_focus = FALSE;
GUIModal *modal_focus = NULL;
I64 menu_focus = -1;
I64 item_clicked = -1;
I64 mouse_old_x, mouse_old_y;
I64 mouse_new_x, mouse_new_y;
I64 idle_ctr = 0;
U8 **menu_bar=CAlloc(sizeof(U64)*6);
menu_bar[0] = "GAME";
menu_bar[1] = "CONFIG";
menu_bar[2] = "CHEATS";
menu_bar[3] = "MISC";
menu_bar[4] = "HELP";
U8 **menu_items=NULL;
U8 **menu_game=CAlloc(sizeof(U64)*10);
menu_game[0] = "LOAD ROM";
menu_game[1] = "RESET";
menu_game[2] = "";
menu_game[3] = "LOAD STATE";
menu_game[4] = "SAVE STATE";
menu_game[5] = "";
menu_game[6] = "EXIT";
U8 **menu_config=CAlloc(sizeof(U64)*10);
menu_config[0] = "JOYPAD 1";
menu_config[1] = "JOYPAD 2";
U8 **menu_cheats=CAlloc(sizeof(U64)*10);
menu_cheats[0] = "ADD";
menu_cheats[1] = "VIEW/EDIT";
menu_cheats[2] = "TOGGLE";
U8 **menu_misc=CAlloc(sizeof(U64)*10);
menu_misc[0] = "SCALE2FIT";
U8 **menu_help=CAlloc(sizeof(U64)*10);
menu_help[0] = "ABOUT";
I64 GUIFontChr(I64 ch)
{
I64 i=0;
while (gui_font_str[i])
{
if (gui_font_str[i]==ch)
{
return 5*i;
}
i++;
}
return 0;
}
U0 GUIPrint(CDC *dc, I64 x, I64 y, U8 *str)
{
I64 i,j,k=0;
U8 *font_ptr;
while (str[k])
{
font_ptr = GUI_FONT_TBL + GUIFontChr(str[k]);
for (j=0; j<5; j++)
{
for (i=0; i<8; i++)
{
if (font_ptr[j] & 1 << i)
{
GrPlot(dc, x+(7-i), y+j);
}
}
}
k++;
x+=8;
}
}
U0 GUIPrintShadow(CDC *dc, I64 x, I64 y, I64 c1=15, I64 c2=0, U8 *str)
{
dc->color=c2;
GUIPrint(dc, x+1, y+1, str);
dc->color=c1;
GUIPrint(dc, x, y, str);
}
U0 GUIDrawModal()
{
GUIModal *m=modal_focus;
if (m)
{
//testing
TG_Canvas->color=12;
GrRect(TG_Canvas,m->x,m->y,m->w,m->h);
}
}
U0 GUIDrawMenuHeader()
{
I64 i = 0;
if (mouse_new_y<12 || gui_focus)
{
TG_Canvas->color=7;
GrRect(TG_Canvas, 0, 0, 320, 12);
while (menu_bar[i])
{
if (i+1==menu_focus)
{
GUIPrintShadow(TG_Canvas, (64*i) - 64, 2, YELLOW, 0, menu_bar[i++]);
}
else
{
if (mouse_new_x > (64*i+1) && mouse_new_x < (64*i+1)+64 &&
mouse_new_y > -1 && mouse_new_y < 12)
{
GUIPrintShadow(TG_Canvas, (64*i) - 64, 2, CYAN, 0, menu_bar[i++]);
}
else
{
GUIPrintShadow(TG_Canvas, (64*i) - 64, 2, 15, 0, menu_bar[i++]);
}
}
}
}
}
U0 GUIGetMenuItems()
{
switch (menu_focus)
{
case 1:
menu_items = menu_game;
break;
case 2:
menu_items = menu_config;
break;
case 3:
menu_items = menu_cheats;
break;
case 4:
menu_items = menu_misc;
break;
case 5:
menu_items = menu_help;
break;
default:
menu_items = NULL;
break;
}
}
U0 GUIDrawMenuFocused()
{
I64 menu_size = 0;
I64 i = 0;
if (menu_focus)
{
GUIGetMenuItems;
while (menu_items[i++])
{
menu_size++;
}
i = 0;
TG_Canvas->color=LTGRAY;
GrRect(TG_Canvas, (64*menu_focus)-64, 12, 96, 2+10*menu_size);
TG_Canvas->color=WHITE;
GrLine(TG_Canvas, (64*menu_focus)-64, 12, (64*menu_focus)-64, 14+10*menu_size);
GrLine(TG_Canvas, (64*menu_focus)-64, 12, (64*menu_focus)+32, 12);
TG_Canvas->color=DKGRAY;
GrLine(TG_Canvas, (64*menu_focus)+32, 13, (64*menu_focus)+32, 14+10*menu_size);
GrLine(TG_Canvas, (64*menu_focus)-63, 14+10*menu_size, (64*menu_focus)+32, 14+10*menu_size);
while (menu_items && menu_items[i])
{
if (mouse_new_x > (64*menu_focus)-64 && mouse_new_x < (64*menu_focus) + 32 &&
mouse_new_y > 4+((i+1)*10) && mouse_new_y < 4+((i+1)*10)+10)
{
GUIPrintShadow(TG_Canvas, (64*menu_focus)-62, 4+(i*10), CYAN, 0, menu_items[i++]);
}
else
{
GUIPrintShadow(TG_Canvas, (64*menu_focus)-62, 4+(i*10), 15, 0, menu_items[i++]);
}
}
}
}
U0 GUIDetectMenuItemClick()
{
I64 i = 0;
I64 menu_size = 0;
GUIGetMenuItems;
while (menu_items[i++])
{
menu_size++;
}
if ((mouse_new_x < (64*menu_focus)-64 || mouse_new_x > (64*menu_focus) + 32) ||
mouse_new_y > 4+((menu_size+1)*10)+10)
{
item_clicked = -1;
gui_focus = FALSE;
menu_focus = -1;
return;
}
i = 0;
while (menu_items && menu_items[i])
{
if (mouse_new_x > (64*menu_focus)-64 && mouse_new_x < (64*menu_focus) + 32 &&
mouse_new_y > 4+((i+1)*10) && mouse_new_y < 4+((i+1)*10)+10)
{
item_clicked = i;
return;
}
i++;
}
}
U0 GUIDrawPointer()
{
GrBlot(TG_Canvas, mouse_new_x, mouse_new_y, ms_pointer);
}
U0 UpdateGUI()
{
mouse_new_x = TG_MouseX;
mouse_new_y = TG_MouseY;
if (ms.lb && mouse_new_y<12)
{
gui_focus = TRUE;
menu_focus = RoundUp(mouse_new_x, 64) / 64;
}
if (ms.lb && mouse_new_y>11 && menu_focus)
{
GUIDetectMenuItemClick;
if (item_clicked > -1)
{
switch (item_clicked)
{
case 0:
switch (menu_focus)
{
case 1:
modal_focus = NULL;
break;
case 4:
fit_screen = !fit_screen;
if (fit_screen)
{
menu_misc[0] = "SCALE2FIT +";
}
else
{
menu_misc[0] = "SCALE2FIT";
}
break;
case 5:
modal_focus = modal_about;
break;
default:
break;
}
break;
case 1:
switch (menu_focus)
{
case 1:
reset = TRUE;
break;
default:
break;
}
break;
case 6:
switch (menu_focus)
{
case 1:
quit = TRUE;
break;
default:
break;
}
break;
default:
break;
}
item_clicked = -1;
gui_focus = FALSE;
menu_focus = -1;
}
}
if (menu_focus<1 && !modal_focus)
{
gui_focus = FALSE;
}
if (menu_focus>0 || modal_focus)
{
paused = TRUE;
}
else
{
paused = FALSE;
}
if ( mouse_old_x == mouse_new_x &&
mouse_old_y == mouse_new_y)
{
if (!idle_ctr)
{
idle_ctr = frame_count;
}
}
else
{
idle_ctr = 0;
}
if (!idle_ctr || (frame_count < idle_ctr + GUI_IDLE_TIMEOUT) || gui_focus)
{ //Draw mouse pointer
if (modal_focus)
{
GUIDrawModal;
}
GUIDrawMenuHeader;
GUIDrawMenuFocused;
GUIDrawPointer;
}
mouse_old_x = mouse_new_x;
mouse_old_y = mouse_new_y;
}