forked from Tituya/AST3_C
fix recursive main and clean menu
This commit is contained in:
parent
a4f600c1ff
commit
86683554e5
|
@ -77,7 +77,7 @@ set(ASSETS_cg
|
|||
assets-cg/img/key1.png
|
||||
assets-cg/img/key2.png
|
||||
assets-cg/img/medals.png
|
||||
assets-cg/img/menu2.png
|
||||
assets-cg/img/menu.png
|
||||
assets-cg/img/new.png
|
||||
assets-cg/img/player.png
|
||||
assets-cg/img/solid.png
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 644 B After Width: | Height: | Size: 654 B |
|
@ -1,3 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
char collide(int x, int y, char level[], char block);
|
||||
char collide_solid(int x, int y, char level[]);
|
||||
char collide_dead(int x, int y, char level[]);
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
void draw_level(char level[]);
|
||||
void draw_player(int x, int y, char type);
|
||||
void draw_timer(unsigned int frame);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#pragma once
|
||||
|
||||
enum MenuCode { MenuLevelSel, MenuAllMode, MenuTutorial, MenuExit };
|
||||
enum MenuPause { MenuContinue, MenuBack };
|
||||
|
||||
enum MenuCode start_menu();
|
||||
char speed_menu(int *id_level);
|
||||
char level_selection(int *id_level);
|
||||
enum MenuPause pause_menu(char level[], int id_level, int coin, int death_count);
|
||||
|
|
|
@ -1,2 +1,4 @@
|
|||
#pragma once
|
||||
|
||||
void replace_all_block(char a, char b, char level[]);
|
||||
void replace_xy_block(int x, int y, char block, char level[]);
|
|
@ -1,3 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
void savefile(void);
|
||||
int loadtime(int idlevel);
|
||||
void restore(void);
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
void set_level(int id_level, char level[], int *startx, int *starty, char *gravity,
|
||||
int *appear, int *disappear, int *nbswitch);
|
||||
void set_gravity(int id_level, char *default_gravity);
|
||||
|
|
|
@ -1,2 +1,4 @@
|
|||
#pragma once
|
||||
|
||||
void check_medal(unsigned int frame_level, int id_level, int x, int y);
|
||||
void draw_time(int id_level);
|
||||
void draw_time(int id_level);
|
219
src/main.c
219
src/main.c
|
@ -15,66 +15,63 @@
|
|||
#include <gint/std/string.h>
|
||||
#include <gint/timer.h>
|
||||
|
||||
#include <gint/std/stdlib.h>
|
||||
#include <gint/rtc.h>
|
||||
|
||||
#define VACCELERATION 0.2
|
||||
#define HACCELERATION 0.4
|
||||
#define MAX_VSPD 9.0
|
||||
#define MAX_HSPD 2.0
|
||||
|
||||
static void startmenu_launcher();
|
||||
static int callback(volatile int *frame_elapsed);
|
||||
static void end(unsigned int frame);
|
||||
static void game(int *id_level, char mode, char *type);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int main(void) {
|
||||
static int run = 0;
|
||||
if (!run) {
|
||||
gint_world_switch(GINT_CALL(restore));
|
||||
srand(rtc_ticks());
|
||||
run = 1;
|
||||
}
|
||||
|
||||
char mode = 0;
|
||||
char type = 1;
|
||||
const enum MenuCode valeur = start_menu(&type);
|
||||
|
||||
switch (valeur) {
|
||||
case MenuLevelSel: {
|
||||
int id_level = 1;
|
||||
if (!speed_menu(&id_level)) {
|
||||
mode = 1;
|
||||
game(&id_level, mode, &type);
|
||||
} else
|
||||
main();
|
||||
} break;
|
||||
case MenuAllMode: {
|
||||
int id_level = 1;
|
||||
mode = 0;
|
||||
game(&id_level, mode, &type);
|
||||
} break;
|
||||
case MenuTutorial: {
|
||||
int id_level = 0;
|
||||
mode = 1;
|
||||
game(&id_level, mode, &type);
|
||||
} break;
|
||||
case MenuExit:
|
||||
gint_world_switch(GINT_CALL(savefile));
|
||||
break;
|
||||
}
|
||||
startmenu_launcher();
|
||||
gint_world_switch(GINT_CALL(savefile));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void startmenu_launcher() {
|
||||
char type = 1;
|
||||
static int menu_run = 1;
|
||||
int id_level = 1;
|
||||
while(menu_run) {
|
||||
const enum MenuCode valeur = start_menu(&type);
|
||||
switch(valeur) {
|
||||
case MenuLevelSel: {
|
||||
int doIRun = level_selection(&id_level);
|
||||
if(doIRun)
|
||||
game(&id_level, 1, &type);
|
||||
} break;
|
||||
case MenuAllMode: {
|
||||
game(&id_level, 0, &type);
|
||||
} break;
|
||||
case MenuTutorial: {
|
||||
id_level = 0;
|
||||
game(&id_level, 1, &type);
|
||||
} break;
|
||||
case MenuExit: {
|
||||
menu_run = 0;
|
||||
} break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int callback(volatile int *frame_elapsed)
|
||||
{
|
||||
*frame_elapsed = 1;
|
||||
return TIMER_CONTINUE;
|
||||
}
|
||||
|
||||
static void end(unsigned int frame)
|
||||
{
|
||||
draw_end((int)frame, 15, 2);
|
||||
sleep_ms(7000);
|
||||
main();
|
||||
}
|
||||
|
||||
static void game(int *id_level, char mode, char *type)
|
||||
{
|
||||
volatile int frame_elapsed = 1;
|
||||
|
@ -94,6 +91,8 @@ static void game(int *id_level, char mode, char *type)
|
|||
int start_y;
|
||||
int death_count = 0;
|
||||
|
||||
char hasReachedEnd = 0;
|
||||
|
||||
int coin = 0;
|
||||
char check_coin = 0;
|
||||
char double_check = 1;
|
||||
|
@ -111,7 +110,6 @@ static void game(int *id_level, char mode, char *type)
|
|||
*type = 2;
|
||||
else if (*type != 3)
|
||||
*type = 1;
|
||||
extern bopti_image_t img_speedrun;
|
||||
set_level(*id_level, level, &start_x, &start_y, &gravity, &appear,
|
||||
&disappear, &nbswitch);
|
||||
player_x = start_x;
|
||||
|
@ -248,27 +246,34 @@ static void game(int *id_level, char mode, char *type)
|
|||
}
|
||||
// Collide with the end
|
||||
if (collide_end(player_x, player_y, level)) {
|
||||
if (!mode && *id_level != 0)
|
||||
//if all mode
|
||||
if (!mode) {
|
||||
*id_level += 1;
|
||||
else
|
||||
break;
|
||||
check_coin = 0;
|
||||
set_level(*id_level, level, &start_x, &start_y,
|
||||
check_coin = 0;
|
||||
check_nbswitch = 0;
|
||||
blackout = 0;
|
||||
double_check = 1;
|
||||
framelevel = 0;
|
||||
|
||||
set_level(*id_level, level, &start_x, &start_y,
|
||||
&gravity, &appear, &disappear, &nbswitch);
|
||||
player_x = start_x;
|
||||
player_y = start_y;
|
||||
check_nbswitch = 0;
|
||||
blackout = 0;
|
||||
double_check = 1;
|
||||
framelevel = 0;
|
||||
if (*id_level == 10 && *type == 1)
|
||||
player_x = start_x;
|
||||
player_y = start_y;
|
||||
|
||||
if (*id_level == 10 && *type == 1)
|
||||
*type = 2;
|
||||
else if (*type != 3)
|
||||
*type = 1;
|
||||
if (*id_level == LEVEL_MAX + 1) {
|
||||
timer_stop(timer);
|
||||
end(frame);
|
||||
else if (*type != 3)
|
||||
*type = 1;
|
||||
//End of all mode
|
||||
if (*id_level == LEVEL_MAX + 1) {
|
||||
timer_stop(timer);
|
||||
game_loop = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
game_loop = 0;
|
||||
}
|
||||
hasReachedEnd = 1;
|
||||
}
|
||||
// Collide with key1 = disappearance of blocks
|
||||
if (collide(player_x, player_y, level, 'k')) {
|
||||
|
@ -408,86 +413,38 @@ static void game(int *id_level, char mode, char *type)
|
|||
if (player_y < -6)
|
||||
player_y = 209;
|
||||
|
||||
// Menu
|
||||
|
||||
// Pause menu
|
||||
if (keydown_any(KEY_EXIT, KEY_MENU, 0)) {
|
||||
timer_pause(timer);
|
||||
char menu_loop = 1;
|
||||
char selected = 0;
|
||||
int Y_POS = 18;
|
||||
char buffer = 1;
|
||||
while (menu_loop) {
|
||||
clearevents();
|
||||
dclear(C_WHITE);
|
||||
draw_level(level);
|
||||
draw_player(player_x, player_y, *type);
|
||||
dimage(0, 0, &img_speedrun);
|
||||
selected += keydown(KEY_DOWN) - keydown(KEY_UP);
|
||||
if (selected == 2)
|
||||
selected = 0;
|
||||
else if (selected == -1)
|
||||
selected = 1;
|
||||
dtext(32, Y_POS, C_BLACK, "CONTINUE");
|
||||
if (!mode)
|
||||
dtext(32, Y_POS + 12, C_BLACK, "MENU");
|
||||
else
|
||||
dtext(32, Y_POS + 12, C_BLACK,
|
||||
"SPEEDRUN MENU");
|
||||
dtext(16, Y_POS + (selected * 12), C_BLACK,
|
||||
">");
|
||||
dprint(180, 45, C_BLACK, "LEVEL : %d",
|
||||
*id_level);
|
||||
dprint(320, 3, C_RGB(255, 178, 0), "COIN : %d",
|
||||
coin);
|
||||
dprint(311, 17, C_RGB(150, 16, 16),
|
||||
"DEATH : %d", death_count);
|
||||
dupdate();
|
||||
if (keydown_any(KEY_SHIFT, KEY_EXE, 0)) {
|
||||
switch (selected) {
|
||||
case 0:
|
||||
menu_loop = 0;
|
||||
timer_start(timer);
|
||||
break;
|
||||
case 1:
|
||||
menu_loop = 0;
|
||||
game_loop = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (keydown_any(KEY_EXIT, KEY_MENU, 0)) {
|
||||
if (!buffer) {
|
||||
menu_loop = 0;
|
||||
game_loop = 0;
|
||||
break;
|
||||
}
|
||||
} else
|
||||
buffer = 0;
|
||||
while (keydown_any(KEY_UP, KEY_DOWN, 0))
|
||||
clearevents();
|
||||
const enum MenuPause valeur = pause_menu(level, *id_level, coin, death_count);
|
||||
switch(valeur) {
|
||||
case MenuContinue: {
|
||||
timer_start(timer);
|
||||
} break;
|
||||
case MenuBack: {
|
||||
game_loop = 0;
|
||||
hasReachedEnd = 0;
|
||||
} break;
|
||||
}
|
||||
}
|
||||
}
|
||||
timer_stop(timer);
|
||||
timer_wait(timer);
|
||||
// when a level is quit
|
||||
if (mode) {
|
||||
if (*id_level == 0) {
|
||||
game_loop = 0;
|
||||
*id_level = 1;
|
||||
}
|
||||
// end of a level with level selection
|
||||
if (game_loop) {
|
||||
float framefloat = framelevel;
|
||||
draw_end(framelevel, *id_level, 0);
|
||||
savetime(framefloat, *id_level);
|
||||
sleep_ms(2500);
|
||||
}
|
||||
if (!speed_menu(id_level)) {
|
||||
mode = 1;
|
||||
death_count = 0;
|
||||
game(id_level, mode, type);
|
||||
} else
|
||||
main();
|
||||
} else
|
||||
main();
|
||||
}
|
||||
|
||||
//if level selection and end
|
||||
if (mode == 1 && *id_level != 0 && hasReachedEnd == 1) {
|
||||
|
||||
float framefloat = framelevel;
|
||||
draw_end(framelevel, *id_level, 0);
|
||||
savetime(framefloat, *id_level);
|
||||
sleep_ms(2500);
|
||||
|
||||
|
||||
int doIRun = level_selection(id_level);
|
||||
if(doIRun)
|
||||
game(id_level, 1, type);
|
||||
} else if(mode == 0 && hasReachedEnd == 1) {
|
||||
draw_end((int)frame, LEVEL_MAX, 2);
|
||||
sleep_ms(7000);
|
||||
}
|
||||
}
|
65
src/menu.c
65
src/menu.c
|
@ -48,7 +48,7 @@ enum MenuCode start_menu(char *type)
|
|||
buffer2 = 0;
|
||||
if (keydown_any(KEY_EXIT, KEY_MENU, 0)) {
|
||||
if (!buffer)
|
||||
return 3;
|
||||
return MenuExit;
|
||||
} else
|
||||
buffer = 0;
|
||||
if (keydown_all(KEY_5, KEY_6))
|
||||
|
@ -56,19 +56,15 @@ enum MenuCode start_menu(char *type)
|
|||
while (keydown_any(KEY_UP, KEY_DOWN, 0))
|
||||
clearevents();
|
||||
}
|
||||
return selection;
|
||||
return MenuExit;
|
||||
}
|
||||
|
||||
char speed_menu(int *id_level)
|
||||
char level_selection(int *id_level)
|
||||
{
|
||||
char level[351];
|
||||
char gravity = -1; // -1 down 1 up
|
||||
int start_x;
|
||||
int start_y;
|
||||
char buffer = 1;
|
||||
int appear = 10;
|
||||
int disappear = 13;
|
||||
int nbswitch = 0;
|
||||
int sto = loadtime(*id_level - 1);
|
||||
char menu_loop = 1;
|
||||
char check = 1;
|
||||
|
@ -84,8 +80,8 @@ char speed_menu(int *id_level)
|
|||
*id_level = LEVEL_MAX;
|
||||
if (keydown(KEY_RIGHT) || keydown(KEY_LEFT))
|
||||
sto = loadtime(*id_level - 1);
|
||||
set_level(*id_level, level, &start_x, &start_y, &gravity,
|
||||
&appear, &disappear, &nbswitch);
|
||||
set_level(*id_level, level, &start_x, &start_y, NULL,
|
||||
NULL, NULL, NULL);
|
||||
draw_level(level);
|
||||
dimage(0, 0, &img_speedrun);
|
||||
if (sto != 0)
|
||||
|
@ -101,16 +97,18 @@ char speed_menu(int *id_level)
|
|||
if (keydown_any(KEY_SHIFT, KEY_EXE, 0)) {
|
||||
if (!check) {
|
||||
del_level(level);
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
} else
|
||||
check = 0;
|
||||
|
||||
if (keydown(KEY_F6)) {
|
||||
draw_time(*id_level);
|
||||
}
|
||||
|
||||
if (keydown_any(KEY_EXIT, KEY_MENU, 0)) {
|
||||
if (!buffer)
|
||||
return 1;
|
||||
return 0;
|
||||
} else
|
||||
buffer = 0;
|
||||
while (keydown_any(KEY_RIGHT, KEY_LEFT, 0))
|
||||
|
@ -119,3 +117,48 @@ char speed_menu(int *id_level)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
enum MenuPause pause_menu(char level[], int id_level, int coin, int death_count) {
|
||||
|
||||
extern bopti_image_t img_speedrun;
|
||||
|
||||
char menu_loop = 1;
|
||||
char selected = 0;
|
||||
int Y_POS = 18;
|
||||
char buffer = 1;
|
||||
|
||||
while (menu_loop) {
|
||||
clearevents();
|
||||
dclear(C_WHITE);
|
||||
draw_level(level);
|
||||
dimage(0, 0, &img_speedrun);
|
||||
selected += keydown(KEY_DOWN) - keydown(KEY_UP);
|
||||
if (selected == 2)
|
||||
selected = 0;
|
||||
else if (selected == -1)
|
||||
selected = 1;
|
||||
dtext(32, Y_POS, C_BLACK, "CONTINUE");
|
||||
dtext(32, Y_POS + 12, C_BLACK, "BACK");
|
||||
dtext(16, Y_POS + (selected * 12), C_BLACK,
|
||||
">");
|
||||
dprint(180, 45, C_BLACK, "LEVEL : %d",
|
||||
id_level);
|
||||
dprint(320, 3, C_RGB(255, 178, 0), "COIN : %d",
|
||||
coin);
|
||||
dprint(311, 17, C_RGB(150, 16, 16),
|
||||
"DEATH : %d", death_count);
|
||||
dupdate();
|
||||
if (keydown_any(KEY_SHIFT, KEY_EXE, 0)) {
|
||||
return selected;
|
||||
}
|
||||
if (keydown_any(KEY_EXIT, KEY_MENU, 0)) {
|
||||
if (!buffer) {
|
||||
return MenuBack;
|
||||
}
|
||||
} else
|
||||
buffer = 0;
|
||||
while (keydown_any(KEY_UP, KEY_DOWN, 0))
|
||||
clearevents();
|
||||
}
|
||||
return MenuBack;
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
#include "util.h"
|
||||
#include <gint/std/stdlib.h>
|
||||
#include <gint/rtc.h>
|
||||
|
||||
int round(float num) {
|
||||
return (num < 0) ? (num - 0.5) : (num + 0.5);
|
||||
|
@ -10,9 +9,6 @@ int round_sup(float num) {
|
|||
return (int)(num+1);
|
||||
}
|
||||
|
||||
/*maybe illegal*/
|
||||
int rand_range(int low, int high)
|
||||
{
|
||||
srand(rtc_ticks());
|
||||
int rand_range(int low, int high) {
|
||||
return (rand() % (high - low)) + low;
|
||||
}
|
Loading…
Reference in New Issue