diff --git a/AST3.g3a b/AST3.g3a index 2270910..504c558 100644 Binary files a/AST3.g3a and b/AST3.g3a differ diff --git a/assets-cg/img/argent.png b/assets-cg/img/argent.png new file mode 100644 index 0000000..60c4b9d Binary files /dev/null and b/assets-cg/img/argent.png differ diff --git a/assets-cg/img/bronze.png b/assets-cg/img/bronze.png new file mode 100644 index 0000000..ee04fa0 Binary files /dev/null and b/assets-cg/img/bronze.png differ diff --git a/assets-cg/img/createur.png b/assets-cg/img/createur.png new file mode 100644 index 0000000..fc663c3 Binary files /dev/null and b/assets-cg/img/createur.png differ diff --git a/assets-cg/img/or.png b/assets-cg/img/or.png new file mode 100644 index 0000000..2aeb374 Binary files /dev/null and b/assets-cg/img/or.png differ diff --git a/assets-cg/img/speedrun.png b/assets-cg/img/speedrun.png new file mode 100644 index 0000000..1f0df19 Binary files /dev/null and b/assets-cg/img/speedrun.png differ diff --git a/include/menu.h b/include/menu.h new file mode 100644 index 0000000..8e431d8 --- /dev/null +++ b/include/menu.h @@ -0,0 +1,2 @@ +char start_menu(); +char speed_menu(int *id_level); diff --git a/include/times.h b/include/times.h new file mode 100644 index 0000000..75d49c0 --- /dev/null +++ b/include/times.h @@ -0,0 +1 @@ +void check_medal(unsigned int frame_level, int id_level); diff --git a/project.cfg b/project.cfg index 4af7bec..c937845 100644 --- a/project.cfg +++ b/project.cfg @@ -83,3 +83,5 @@ LDFLAGS_CG += -Wl,-Map=build-cg/map # font named "hexa.png", you might write: # # FONT.hexa.png = charset:print grid.size:3x5 grid.padding:1 + +IMG.speedrun.png = profile:p4 diff --git a/src/drawlevel.c b/src/drawlevel.c index 987ed74..8a560da 100644 --- a/src/drawlevel.c +++ b/src/drawlevel.c @@ -12,7 +12,7 @@ extern bopti_image_t img_player; //player extern bopti_image_t img_end; //end of level extern bopti_image_t img_key1; //key 1 extern bopti_image_t img_keyblock; //block link to the key1 -extern bopti_image_t img_blackout; //key 1 +extern bopti_image_t img_blackout; //blackout void draw_player(int x, int y) { diff --git a/src/main.c b/src/main.c index 6ae9aa4..585c1ed 100644 --- a/src/main.c +++ b/src/main.c @@ -7,6 +7,8 @@ #include "setlevel.h" #include "drawlevel.h" #include "collide.h" +#include "menu.h" +#include "times.h" #include "define.h" #define ACCELERATION 0.2 @@ -18,7 +20,7 @@ int callback(volatile int *frame_elapsed) return TIMER_CONTINUE; } -int main(void) +void game(int *id_level, char mode) { volatile int frame_elapsed = 1; int timer = timer_setup(TIMER_ANY, 1000000/FPS, callback, &frame_elapsed); @@ -32,7 +34,6 @@ int main(void) char gravity = 0; //0 down 1 up char check = 0; char blackout = 0; - int id_level = 1; int start_x; int start_y; @@ -45,7 +46,7 @@ int main(void) float vspd = 1.0; int vert_spd = 1; - set_level(id_level, level, &start_x, &start_y, &gravity, check_coin, &appear, &disappear); + set_level(*id_level, level, &start_x, &start_y, &gravity, check_coin, &appear, &disappear); player_x = start_x; player_y = start_y; draw_level(level); @@ -60,13 +61,14 @@ int main(void) { draw_level(level); if(blackout) draw_blackout(player_x, player_y); - draw_player(player_x,player_y); - draw_timer(frame); + draw_player(player_x,player_y); + if(!mode) draw_timer(frame); + else draw_timer(framelevel); - if(id_level==1) + if(*id_level==1) { dprint(85,180,C_RGB(245,245,0),"SHIFT"); - dprint(167,19,C_RGB(110,110,110),"Ne touchez pas ces blocs !"); + dprint(167,19,C_RGB(110,110,110),"Ne touchez pas ces blocs !"); dprint(162,160,C_RGB(110,110,110),"Les clefs agissent"); dprint(162,173,C_RGB(110,110,110),"sur certains blocs"); dprint(315,115,C_RGB(110,110,110),"Bravo !"); @@ -156,15 +158,20 @@ int main(void) vspd = 1; player_x = start_x; player_y = start_y; - set_level(id_level, level, &start_x, &start_y, &gravity, check_coin, &appear, &disappear); + if(mode) check_coin = 0; + set_level(*id_level, level, &start_x, &start_y, &gravity, check_coin, &appear, &disappear); blackout = 0; framelevel = 0; } if(collide_end(player_x, player_y, level, gravity)) { - id_level++; + if(!mode) *id_level+=1; + if(mode) + { + break; + } check_coin = 0; - set_level(id_level, level, &start_x, &start_y, &gravity, check_coin, &appear, &disappear); + set_level(*id_level, level, &start_x, &start_y, &gravity, check_coin, &appear, &disappear); player_x = start_x; player_y = start_y; blackout = 0; @@ -270,7 +277,7 @@ int main(void) dtext(32, Y_POS, C_BLACK, "CONTINUE"); dtext(32, Y_POS + 12, C_BLACK, "EXIT GAME"); dtext(16, Y_POS + (selected * 12), C_BLACK, ">"); - dprint(32, Y_POS + 36, C_RGB(83,255,0), "LEVEL : %d", id_level); + dprint(32, Y_POS + 36, C_RGB(83,255,0), "LEVEL : %d", *id_level); dprint(32, Y_POS + 48, C_RGB(255,178,0), "COIN : %d", coin); dupdate(); if (keydown_any(KEY_SHIFT, KEY_EXE, 0)) @@ -291,5 +298,39 @@ int main(void) } } timer_stop(timer); + if(mode) + { + dclear(C_WHITE); + dprint_opt(198, 112, C_WHITE, C_BLACK, DTEXT_LEFT, DTEXT_TOP, "%u.%02u",(framelevel)/FPS, (framelevel)%FPS); + check_medal(framelevel, *id_level); + dupdate(); + getkey(); + if(!speed_menu(id_level)) + { + mode = 1; + game(id_level, mode); + } + } +} + +int main(void) +{ + char mode = 0; + int valeur = start_menu(); + if(!valeur) //normal game + { + int id_level = 1; + mode = 0; + game(&id_level, mode); + } + else if(valeur==1) + { + int id_level = 1; + if(!speed_menu(&id_level)) + { + mode = 1; + game(&id_level, mode); + } + } return 0; } diff --git a/src/menu.c b/src/menu.c new file mode 100644 index 0000000..e388f1c --- /dev/null +++ b/src/menu.c @@ -0,0 +1,82 @@ +#include "drawlevel.h" +#include +#include +#include "setlevel.h" + +char start_menu() +{ + char menu_loop = 1; + char selection = 0; + int Y_POS = 90; + while(menu_loop) + { + clearevents(); + dclear(C_WHITE); + selection += keydown(KEY_DOWN) - keydown(KEY_UP); + if (selection == 2) selection = 0; + else if (selection == -1) selection = 1; + dtext(32, Y_POS, C_BLACK, "PLAY"); + dtext(32, Y_POS + 12, C_BLACK, "SPEEDRUN MODE"); + dtext(16, Y_POS + (selection * 12), C_BLACK, ">"); + dupdate(); + if (keydown_any(KEY_SHIFT, KEY_EXE, 0)) + { + switch (selection) + { + case 0: + return selection; + break; + case 1: + return selection; + break; + } + } + if(keydown_any(KEY_EXIT, KEY_MENU, 0)) return -1; + while (keydown_any(KEY_UP, KEY_DOWN, 0)) clearevents(); + } + return selection; +} + +char speed_menu(int *id_level) +{ + + char level[351]; + char gravity = 0; //0 down 1 up + int start_x; + int start_y; + char check_coin = 0; + int appear = 10; + int disappear = 13; + + char menu_loop = 1; + char check = 1; + extern bopti_image_t img_speedrun; + + while(menu_loop) + { + clearevents(); + dclear(C_WHITE); + *id_level += keydown(KEY_RIGHT) - keydown(KEY_LEFT); + if (*id_level == 11) *id_level = 1; + else if (*id_level == 0) *id_level = 10; + set_level(*id_level, level, &start_x, &start_y, &gravity, check_coin, &appear, &disappear); + draw_level(level); + dimage(0,0,&img_speedrun); + dtext(340, 214, C_GREEN, "< PLAY >"); + dtext(190, 45, C_BLACK, "Time : "); + dprint(80,20,C_BLACK,"Level : %d",*id_level); + dupdate(); + if (keydown_any(KEY_SHIFT, KEY_EXE, 0)) + { + if(!check) + { + del_level(level); + return 0; + } + } + else check = 0; + if(keydown_any(KEY_EXIT, KEY_MENU, 0)) return 1; + while (keydown_any(KEY_RIGHT, KEY_LEFT, 0)) clearevents(); + } + return 0; +} diff --git a/src/times.c b/src/times.c new file mode 100644 index 0000000..e87c4ad --- /dev/null +++ b/src/times.c @@ -0,0 +1,35 @@ +#include "times.h" +#include "define.h" +#include + +extern bopti_image_t img_bronze; +extern bopti_image_t img_argent; +extern bopti_image_t img_or; +extern bopti_image_t img_createur; + +void check_medal(unsigned int frame_level, int id_level) +{ + switch(id_level) + { + case 1: + { + unsigned int time = 6; + unsigned int time2 = 5; + if(frame_level/FPS < time || (frame_level/FPS <= time && frame_level%FPS <= time2)) dimage(380,8,&img_createur); + if(frame_level/FPS < time*1.05 || (frame_level/FPS <= time*1.05 && frame_level%FPS <= time2*1.05)) dimage(360,8,&img_or); + if(frame_level/FPS < time*1.2 || (frame_level/FPS <= time*1.2 && frame_level%FPS <= time2*1.2)) dimage(340,8,&img_argent); + if(frame_level/FPS < time*1.5|| (frame_level/FPS <= time*1.5 && frame_level%FPS <= time2*1.5)) dimage(320,8,&img_bronze); + break; + } + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + case 6: + break; + } +}