From 86683554e54087a3f8582c0bf9ff2f74ffc4593e Mon Sep 17 00:00:00 2001 From: Tituya Date: Wed, 5 May 2021 01:03:02 +0200 Subject: [PATCH] fix recursive main and clean menu --- CMakeLists.txt | 2 +- assets-cg/img/player.png | Bin 644 -> 654 bytes include/collide.h | 2 + include/drawlevel.h | 2 + include/menu.h | 4 +- include/replace.h | 2 + include/save.h | 2 + include/setlevel.h | 2 + include/times.h | 4 +- src/main.c | 219 ++++++++++++++++----------------------- src/menu.c | 65 ++++++++++-- src/util.c | 6 +- 12 files changed, 160 insertions(+), 150 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59aedfd..093cec8 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/assets-cg/img/player.png b/assets-cg/img/player.png index b6db6a83f8bea894fd379e7ae8e5c77a1b78774b..5b295c409c4945da49b3faa142313f65d9821173 100755 GIT binary patch delta 613 zcmV-r0-F7V1&#%fG=D`&L_t(Ijh&J`XcR#hhM$?;oxQ|_llX(;VQ?WL7O}7q5gXHq zAeI3^h!zrvwS|Q-AZVjDA_^7(YYRKIN#PG@DT?#%31Y_jIg=-oN6 z%=^7NeDm_mC-yyEPQ;+9*ucXE0_XYUN+C0iG#cMHl(EQ6<9||1{oG#qS@n9ID2le+ z0iq~sJ1=%WZzK$=iVGyUr;t|TXBv^^NNqW@)8qExkdJF{;l(l^CPzsoFH!OQtrHwQ z0@G8l_yuujth~6_C3Q8xs-P&W2EeWUL^WHeX2SG=3M1RA91K%bEA8I#>}lqPhA^YG zHhY6aCy^+M+J8P@8VK_gnHo&eDi8W`ipUJ_mtvfQYPHJvt#{o6efkW!V{Txe&E6o@ zNvyN>gS8Cb70+WtVea_4gjK_MI%jOyCsYbtjvx0xXnzevyVchW?RmE3HX9?~Rsryg zMP?SySQci+QJ!F8_ALuHj{kdx03O{16(EG@dxm_WLVo~UmX=`vf;cMzWtxfWZ}7B1 z8rxgfi&sk7NuX;Wmle;j5vKAZDSzh5BZyl#L~mhk?t*J8VAl2gpEJ@m&}J%|!vLs8 z3<6$%KLIm^C+_^cnW)YFF6N7^Z$e=sL3r(^YQ&`ul9ZF`B@6dXb#3O(UoONtDe?IJ zf6P!LZeE4t70+5ks*&1}j%+K#I0Rv<$+1@tkkSXHx_7<0Qp&yw4O*SaL`$qg=nT*1 zgo{nwnk9=9Op?N~ow%6aoctsDlV1;$k-u z#IYa<)j3=}y88UN7>o;dp3*-2*oDc#G4Gl5&@N@S--+w?Jm@Sps%3C2iiFNLy zcs(P^^Ibud@hF=!x<8_zHH4ff>4DJE5fJUAzIy2J+vU*dSzfB6oJSgua-N0hF|-nl z&wOIx{@MTc5WvePpkss({r8a21ptD{C@*dQdz_eNAb(>SzxNSk9n$&UT(941$xZ@Y z0|nFkhOIEg-)ZYG*NQl45D>kEd2kT!u7TUsbGv(_YoMJ}c7_4awFCrw_;n7Zn>F$H z-)3TDW_vT&T>2(dsHF(iUevXurQ #include +#include +#include + #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); + } +} \ No newline at end of file diff --git a/src/menu.c b/src/menu.c index db57af4..4c3394d 100644 --- a/src/menu.c +++ b/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; +} \ No newline at end of file diff --git a/src/util.c b/src/util.c index a57848b..99c9a38 100644 --- a/src/util.c +++ b/src/util.c @@ -1,6 +1,5 @@ #include "util.h" #include -#include 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; } \ No newline at end of file