organize levels in episodes

This commit is contained in:
Lephenixnoir 2021-08-21 23:46:47 +02:00
parent 8fbdaaaaae
commit 2338d61023
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
3 changed files with 66 additions and 20 deletions

View File

@ -56,6 +56,12 @@ typedef struct {
rectmeta_t *blocks;
} level_t;
typedef struct {
char const *name;
int level_count;
level_t **levels;
} episode_t;
//---
// Game
//---
@ -143,9 +149,12 @@ extern level_t level13, level14, level15, level16;
extern level_t level17, level18, level19, level20;
extern level_t level21, level22;
extern episode_t episodes[];
extern int episode_count;
//---
// Menu
//---
/* Main menu, returns selected level or -1. */
int main_menu(void);
/* Main menu, sets selected level */
int main_menu(int *episode, int *level);

View File

@ -21,6 +21,41 @@ typedef enum {
State_Finale,
} state_t;
/* All levels, classified by episode */
episode_t episodes[] = {
{
.name = "ignorance",
.level_count = 5,
.levels = (level_t *[]){
&level1, &level2, &level3, &level4, &level5
},
},
{
.name = "denial",
.level_count = 6,
.levels = (level_t *[]){
&level6, &level7, &level8, &level9, &level10,
&level11,
},
},
{
.name = "anger",
.level_count = 5,
.levels = (level_t *[]){
&level12, &level13, &level14, &level15, &level16,
},
},
{
.name = "bargaining",
.level_count = 6,
.levels = (level_t *[]){
&level17, &level18, &level19, &level20, &level21,
&level22,
},
},
};
int episode_count = 4;
void load_level(game_t *game, level_t const *lv)
{
game->level = lv;
@ -51,21 +86,14 @@ int main(void)
/* Azur trickz for less tearing */
r61524_set(0x010, 0x0010);
level_t const *story_levels[] = {
&level1, &level2, &level3, &level4, &level5, &level6, &level7,
&level8, &level9, &level10, &level11, &level12, &level13, &level14,
&level15, &level16, &level17, &level18, &level19, &level20, &level21,
&level22,
NULL,
};
int story_position = main_menu();
story_position = 16;
int current_episode = 0;
int current_level = 0;
main_menu(&current_episode, &current_level);
game_t game;
memset(&game, 0x00, sizeof game);
load_level(&game, story_levels[story_position]);
load_level(&game, episodes[current_episode].levels[current_level]);
state_t state = State_Playing;
@ -133,10 +161,15 @@ int main(void)
// End of level
if(state == State_Playing &&
game.time >= lv->blocks[lv->block_count-1].time + 5) {
if(story_levels[++story_position] == NULL)
current_level++;
if(current_level >= episodes[current_episode].level_count) {
current_episode++;
current_level = 0;
}
if(current_episode >= episode_count)
break;
load_level(&game, story_levels[story_position]);
load_level(&game, episodes[current_episode].levels[current_level]);
state = State_Transition;
game.time_transition = 0;

View File

@ -8,14 +8,18 @@
extern bopti_image_t img_title;
int main_menu(void)
int main_menu(int *episode, int *level)
{
volatile int need_frame = 1;
int timer = timer_configure(TIMER_ANY, 33000, GINT_CALL_SET(&need_frame));
if(timer >= 0) timer_start(timer);
float time = 0;
int selected_level = 0;
int selection = 0;
int scroll = 0;
*episode = 0;
*level = 0;
while(1) {
while (need_frame == 0) sleep();
@ -42,12 +46,12 @@ int main_menu(void)
/* Rendering */
dclear(C_BLACK);
dimage(330, DHEIGHT/2 - img_title.height / 2,
dimage(330 + scroll, DHEIGHT/2 - img_title.height / 2,
&img_title);
render_player(265, DHEIGHT/2, time * 0.8);
render_player(265 + scroll, DHEIGHT/2, time * 0.8);
dupdate();
}
timer_stop(timer);
return selected_level;
return 1;
}