organize levels in episodes
This commit is contained in:
parent
8fbdaaaaae
commit
2338d61023
13
src/duet.h
13
src/duet.h
|
@ -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);
|
||||
|
|
59
src/main.c
59
src/main.c
|
@ -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(¤t_episode, ¤t_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;
|
||||
|
|
14
src/menu.c
14
src/menu.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue