Duet/src/menu.c

102 lines
2.8 KiB
C
Raw Normal View History

2021-08-21 22:32:22 +02:00
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/timer.h>
#include <gint/gint.h>
2021-08-21 23:12:08 +02:00
#include <gint/cpu.h>
2021-08-21 22:32:22 +02:00
#include "duet.h"
extern bopti_image_t img_title;
2021-08-22 00:09:37 +02:00
extern bopti_image_t img_levels;
2021-08-21 22:32:22 +02:00
2021-08-21 23:46:47 +02:00
int main_menu(int *episode, int *level)
2021-08-21 22:32:22 +02:00
{
volatile int need_frame = 1;
int timer = timer_configure(TIMER_ANY, 33000, GINT_CALL_SET(&need_frame));
2021-08-21 23:12:08 +02:00
if(timer >= 0) timer_start(timer);
2021-08-21 22:32:22 +02:00
float time = 0;
2021-08-21 23:57:55 +02:00
int s_episode = 0;
int s_level = 0;
2021-08-21 23:46:47 +02:00
int scroll = 0;
*episode = 0;
*level = 0;
2021-08-21 22:32:22 +02:00
while(1) {
2021-08-21 23:12:08 +02:00
while (need_frame == 0) sleep();
need_frame = 0;
2021-08-21 22:32:22 +02:00
time += 1.0 / 30;
/* Keyboard input */
key_event_t e;
bool input_finished = false;
while((e = pollevent()).type != KEYEV_NONE) {
if(e.type == KEYEV_DOWN && e.key == KEY_MENU)
gint_osmenu();
if(e.type == KEYEV_DOWN && e.key == KEY_EXE) {
2021-08-21 23:57:55 +02:00
*episode = s_episode;
*level = s_level;
2021-08-21 22:32:22 +02:00
input_finished = true;
break;
}
2021-08-21 23:57:55 +02:00
if(e.type == KEYEV_DOWN && e.key == KEY_DOWN &&
(s_episode < episode_count
|| s_level < episodes[s_episode].level_count)) {
s_level++;
if(s_level >= episodes[s_episode].level_count) {
s_episode++;
s_level = 0;
}
}
if(e.type == KEYEV_DOWN && e.key == KEY_UP &&
(s_episode > 0 || s_level > 0)) {
s_level--;
if(s_level < 0) {
s_episode--;
s_level = episodes[s_episode].level_count - 1;
}
}
2021-08-21 22:32:22 +02:00
}
if(input_finished)
break;
/* Rendering */
dclear(C_BLACK);
2021-08-21 23:46:47 +02:00
dimage(330 + scroll, DHEIGHT/2 - img_title.height / 2,
2021-08-21 22:32:22 +02:00
&img_title);
2021-08-21 23:46:47 +02:00
render_player(265 + scroll, DHEIGHT/2, time * 0.8);
2021-08-21 23:57:55 +02:00
int x = 180, y=40;
for(int i = 0; i < episode_count; i++) {
episode_t const *e = &episodes[i];
duet_text_opt(x, y, C_WHITE, C_NONE, DTEXT_LEFT, DTEXT_TOP,
e->name, -1);
x -= 13;
for(int j = 0; j < e->level_count; j++) {
int rx = x - 38 * (j/4);
int ry = y + 38 * (j%4);
if(s_episode == i && s_level == j) {
drect(rx+2, ry-2, rx-32, ry+32, C_WHITE);
}
drect(rx, ry, rx-30, ry+30, C_RGB(10, 10, 10));
2021-08-22 00:09:37 +02:00
dsubimage(rx-30, ry, &img_levels, 0, 31*j, 31, 31, DIMAGE_NONE);
2021-08-21 23:57:55 +02:00
}
x -= 35 * ((e->level_count + 3) / 4);
x -= 18;
}
2021-08-21 22:32:22 +02:00
dupdate();
}
timer_stop(timer);
2021-08-21 23:46:47 +02:00
return 1;
2021-08-21 22:32:22 +02:00
}