mirror of
https://git.checksum.fail/alec/templenes.git
synced 2026-05-26 17:22:55 +00:00
358 lines
6.1 KiB
HolyC
Executable File
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;
|
|
} |