nouveau mode speedrun + médailles

This commit is contained in:
Tituya 2020-07-26 01:44:42 +02:00
parent db9f1beca4
commit fd6f92c084
13 changed files with 175 additions and 12 deletions

BIN
AST3.g3a

Binary file not shown.

BIN
assets-cg/img/argent.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

BIN
assets-cg/img/bronze.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

BIN
assets-cg/img/createur.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

BIN
assets-cg/img/or.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

BIN
assets-cg/img/speedrun.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

2
include/menu.h Normal file
View File

@ -0,0 +1,2 @@
char start_menu();
char speed_menu(int *id_level);

1
include/times.h Normal file
View File

@ -0,0 +1 @@
void check_medal(unsigned int frame_level, int id_level);

View File

@ -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

View File

@ -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)
{

View File

@ -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;
}

82
src/menu.c Normal file
View File

@ -0,0 +1,82 @@
#include "drawlevel.h"
#include <gint/display.h>
#include <gint/keyboard.h>
#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;
}

35
src/times.c Normal file
View File

@ -0,0 +1,35 @@
#include "times.h"
#include "define.h"
#include <gint/display.h>
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;
}
}