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;
|
2021-08-22 00:22:55 +02:00
|
|
|
int target_scroll = 0;
|
|
|
|
|
|
|
|
int scroll_by_episode[20] = { 0 };
|
2021-08-21 23:46:47 +02:00
|
|
|
|
|
|
|
*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;
|
|
|
|
|
2021-08-22 00:22:55 +02:00
|
|
|
/* Smooth scroll update */
|
|
|
|
if(target_scroll != scroll) {
|
|
|
|
int diff = (target_scroll - scroll) * 3 / 16;
|
|
|
|
if(diff == 0) diff = (target_scroll > scroll) ? 1 : -1;
|
|
|
|
scroll += diff;
|
|
|
|
}
|
|
|
|
|
2021-08-21 22:32:22 +02:00
|
|
|
/* 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 &&
|
2021-08-22 00:22:55 +02:00
|
|
|
(s_episode < episode_count - 1
|
|
|
|
|| s_level < episodes[s_episode].level_count - 1)) {
|
2021-08-21 23:57:55 +02:00
|
|
|
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-22 01:21:40 +02:00
|
|
|
if(e.type == KEYEV_DOWN && e.key == KEY_RIGHT) {
|
|
|
|
if(s_level >= 4)
|
|
|
|
s_level -= 4;
|
|
|
|
else if(s_episode > 0) {
|
|
|
|
s_episode--;
|
|
|
|
s_level = (episodes[s_episode].level_count & ~3) +
|
|
|
|
(s_level & 3);
|
|
|
|
if(s_level >= episodes[s_episode].level_count)
|
|
|
|
s_level = episodes[s_episode].level_count - 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(e.type == KEYEV_DOWN && e.key == KEY_LEFT) {
|
|
|
|
if(s_level + 4 < episodes[s_episode].level_count)
|
|
|
|
s_level += 4;
|
|
|
|
else if(s_episode + 1 < episode_count) {
|
|
|
|
s_episode++;
|
|
|
|
s_level &= 3;
|
|
|
|
if(s_level >= episodes[s_episode].level_count)
|
|
|
|
s_level = episodes[s_episode].level_count - 1;
|
|
|
|
}
|
|
|
|
}
|
2021-08-21 22:32:22 +02:00
|
|
|
}
|
|
|
|
if(input_finished)
|
|
|
|
break;
|
|
|
|
|
2021-08-22 00:22:55 +02:00
|
|
|
target_scroll = scroll_by_episode[0]-scroll_by_episode[s_episode];
|
|
|
|
|
2021-08-21 22:32:22 +02:00
|
|
|
/* Rendering */
|
|
|
|
|
|
|
|
dclear(C_BLACK);
|
2021-08-22 00:22:55 +02:00
|
|
|
dimage(330+scroll, DHEIGHT/2 - img_title.height / 2,
|
2021-08-21 22:32:22 +02:00
|
|
|
&img_title);
|
2022-01-24 00:39:12 +01:00
|
|
|
render_player(268+scroll, DHEIGHT/2, time * 0.8, PLAYER_R, 1.0);
|
2021-08-21 23:57:55 +02:00
|
|
|
|
2021-08-22 00:22:55 +02:00
|
|
|
int x=188+scroll, y=40;
|
2021-08-21 23:57:55 +02:00
|
|
|
for(int i = 0; i < episode_count; i++) {
|
|
|
|
episode_t const *e = &episodes[i];
|
2021-08-22 00:22:55 +02:00
|
|
|
scroll_by_episode[i] = x;
|
2021-08-21 23:57:55 +02:00
|
|
|
|
|
|
|
duet_text_opt(x, y, C_WHITE, C_NONE, DTEXT_LEFT, DTEXT_TOP,
|
|
|
|
e->name, -1);
|
2021-08-22 00:22:55 +02:00
|
|
|
x -= 11;
|
2021-08-21 23:57:55 +02:00
|
|
|
|
|
|
|
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);
|
2021-08-22 00:22:55 +02:00
|
|
|
x -= 20;
|
2021-08-21 23:57:55 +02:00
|
|
|
}
|
|
|
|
|
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
|
|
|
}
|