2021-03-23 14:21:59 +01:00
|
|
|
#include <gint/display.h>
|
|
|
|
#include <gint/keyboard.h>
|
2021-04-30 01:48:00 +02:00
|
|
|
#include <gint/clock.h>
|
2021-03-23 14:21:59 +01:00
|
|
|
#include <gint/timer.h>
|
2021-04-30 01:48:00 +02:00
|
|
|
#include <gint/gint.h>
|
|
|
|
#include <gint/std/string.h>
|
2020-07-02 20:09:23 +02:00
|
|
|
|
2021-04-30 01:48:00 +02:00
|
|
|
#include "setlevel.h"
|
2021-03-23 14:21:59 +01:00
|
|
|
#include "drawlevel.h"
|
2021-04-30 01:48:00 +02:00
|
|
|
#include "collide.h"
|
2020-07-26 01:44:42 +02:00
|
|
|
#include "menu.h"
|
2021-03-23 14:21:59 +01:00
|
|
|
#include "times.h"
|
2021-04-30 01:48:00 +02:00
|
|
|
#include "save.h"
|
|
|
|
#include "define.h"
|
2020-06-25 23:53:57 +02:00
|
|
|
|
2020-08-16 23:12:04 +02:00
|
|
|
#define VACCELERATION 0.2
|
2020-08-17 20:36:46 +02:00
|
|
|
#define HACCELERATION 0.4
|
2020-07-02 20:09:23 +02:00
|
|
|
#define MAX_VSPD 9.0
|
2020-08-17 20:36:46 +02:00
|
|
|
#define FRICTION 0.2
|
2020-07-02 20:09:23 +02:00
|
|
|
|
2020-07-27 01:32:44 +02:00
|
|
|
int main(void);
|
2020-08-27 00:31:22 +02:00
|
|
|
void end(unsigned int frame);
|
2020-07-27 01:32:44 +02:00
|
|
|
|
2021-04-27 18:15:35 +02:00
|
|
|
char run = 0;
|
|
|
|
|
2020-07-02 20:09:23 +02:00
|
|
|
int callback(volatile int *frame_elapsed)
|
|
|
|
{
|
2021-04-30 01:48:00 +02:00
|
|
|
*frame_elapsed = 1;
|
|
|
|
return TIMER_CONTINUE;
|
2020-07-02 20:09:23 +02:00
|
|
|
}
|
|
|
|
|
2020-08-22 01:24:50 +02:00
|
|
|
void game(int *id_level, char mode, char *type)
|
2020-06-25 23:53:57 +02:00
|
|
|
{
|
2020-07-02 20:09:23 +02:00
|
|
|
volatile int frame_elapsed = 1;
|
2021-04-30 02:11:01 +02:00
|
|
|
int timer = timer_configure(TIMER_ANY, 1000000/FPS, GINT_CALL(callback, &frame_elapsed));
|
2020-07-02 20:09:23 +02:00
|
|
|
timer_start(timer);
|
2021-04-30 01:48:00 +02:00
|
|
|
|
2020-07-09 19:29:49 +02:00
|
|
|
char game_loop = 1;
|
2020-07-02 20:09:23 +02:00
|
|
|
unsigned int frame = 0;
|
2020-07-19 18:00:08 +02:00
|
|
|
int framelevel = 0;
|
2020-06-29 22:31:30 +02:00
|
|
|
int player_x = 20, player_y = 20;
|
2020-06-26 01:46:28 +02:00
|
|
|
char level[351];
|
2021-04-30 01:48:00 +02:00
|
|
|
char gravity = 0; //0 down 1 up
|
2020-08-27 00:31:22 +02:00
|
|
|
char check = 1;
|
2020-07-16 02:06:57 +02:00
|
|
|
char blackout = 0;
|
2020-07-01 21:35:52 +02:00
|
|
|
int start_x;
|
|
|
|
int start_y;
|
2020-08-20 01:05:39 +02:00
|
|
|
int death_count = 0;
|
2021-04-30 01:48:00 +02:00
|
|
|
|
2020-08-28 00:36:42 +02:00
|
|
|
int coin = 0;
|
2020-07-06 22:22:22 +02:00
|
|
|
char check_coin = 0;
|
2020-08-20 01:05:39 +02:00
|
|
|
char double_check = 1;
|
2021-04-27 18:15:35 +02:00
|
|
|
char chock = 0;
|
|
|
|
|
2020-07-19 18:00:08 +02:00
|
|
|
int appear = 10;
|
|
|
|
int disappear = 13;
|
2021-04-30 01:48:00 +02:00
|
|
|
int nbswitch = 0;
|
2021-03-23 14:21:59 +01:00
|
|
|
|
2021-04-30 01:48:00 +02:00
|
|
|
char check_nbswitch = 0;
|
2020-07-02 20:09:23 +02:00
|
|
|
float vspd = 1.0;
|
2021-03-21 23:39:09 +01:00
|
|
|
float hspd = 0.0;
|
2021-04-30 01:48:00 +02:00
|
|
|
if(*id_level==10 && *type!=3) *type = 2;
|
|
|
|
else if(*type!=3) *type = 1;
|
2020-07-27 01:32:44 +02:00
|
|
|
extern bopti_image_t img_speedrun;
|
2021-04-30 01:48:00 +02:00
|
|
|
set_level(*id_level, level, &start_x, &start_y, &gravity, &appear, &disappear, &nbswitch);
|
2020-07-01 21:35:52 +02:00
|
|
|
player_x = start_x;
|
|
|
|
player_y = start_y;
|
2020-06-25 23:53:57 +02:00
|
|
|
draw_level(level);
|
2021-04-30 01:48:00 +02:00
|
|
|
while(game_loop)
|
|
|
|
{
|
|
|
|
while(!frame_elapsed) sleep();
|
2020-07-02 20:09:23 +02:00
|
|
|
frame_elapsed = 0;
|
2021-04-30 01:48:00 +02:00
|
|
|
|
2020-07-02 20:09:23 +02:00
|
|
|
frame++;
|
2020-07-04 16:05:52 +02:00
|
|
|
framelevel++;
|
2021-04-30 01:48:00 +02:00
|
|
|
if(!(frame%2))
|
|
|
|
{
|
2020-07-19 01:13:01 +02:00
|
|
|
draw_level(level);
|
2021-04-27 18:15:35 +02:00
|
|
|
if(blackout)
|
|
|
|
draw_blackout(player_x, player_y);
|
|
|
|
|
|
|
|
if(blackout && *id_level == 0) {
|
|
|
|
dtext(20, 20, C_WHITE, "You have touched the blackout item");
|
|
|
|
dtext(20, 40, C_WHITE, "it makes you partially blind");
|
|
|
|
dtext(20, 60, C_WHITE, "until your death :p");
|
|
|
|
}
|
|
|
|
if(chock > 0 && *id_level == 0) {
|
|
|
|
dtext(20, 165, C_BLACK, "You have touched the chock");
|
|
|
|
dtext(20, 180, C_BLACK, "item. It rotates your screen");
|
|
|
|
dtext(20, 195, C_BLACK, "horizontally and vertically");
|
|
|
|
}
|
|
|
|
|
2020-08-22 01:24:50 +02:00
|
|
|
draw_player(player_x, player_y, *type);
|
2020-07-26 01:44:42 +02:00
|
|
|
if(!mode) draw_timer(frame);
|
|
|
|
else draw_timer(framelevel);
|
2020-07-19 01:13:01 +02:00
|
|
|
|
2020-08-22 01:24:50 +02:00
|
|
|
if(!mode) dprint_opt(330, 0, C_RGB(255,190,0), C_BLACK, DTEXT_LEFT, DTEXT_TOP, "Coin : %d", coin);
|
2021-04-30 01:48:00 +02:00
|
|
|
if(check_nbswitch) draw_nbswitch(nbswitch);
|
2020-07-19 01:13:01 +02:00
|
|
|
dupdate();
|
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
|
|
|
|
|
2020-06-25 23:53:57 +02:00
|
|
|
pollevent();
|
2021-04-30 01:48:00 +02:00
|
|
|
|
|
|
|
if(keydown(KEY_OPTN))
|
|
|
|
{
|
|
|
|
level[((player_x+6)/16)+((player_y+6)/16)*25] = 'd';
|
2020-08-20 01:05:39 +02:00
|
|
|
death_count--;
|
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
//Right collision
|
|
|
|
if(keydown(KEY_RIGHT))
|
|
|
|
{
|
2020-08-17 20:36:46 +02:00
|
|
|
hspd *= 1 - FRICTION;
|
2021-04-30 01:48:00 +02:00
|
|
|
hspd += (keydown(KEY_RIGHT)-keydown(KEY_LEFT)) * HACCELERATION;
|
|
|
|
if(!collide_solid(player_x+round(hspd)+1, player_y, level)) player_x += round(hspd);
|
|
|
|
else if(!collide_solid(player_x+1, player_y, level)) player_x+=1;
|
|
|
|
if(player_x>=388) player_x=-4;
|
2020-06-25 23:53:57 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
//Left collision
|
|
|
|
else if(keydown(KEY_LEFT))
|
|
|
|
{
|
2020-08-17 20:36:46 +02:00
|
|
|
hspd *= 1 - FRICTION;
|
2021-04-30 01:48:00 +02:00
|
|
|
hspd += (keydown(KEY_RIGHT)-keydown(KEY_LEFT)) * HACCELERATION;
|
|
|
|
if(!collide_solid(player_x+round(hspd)-1, player_y, level)) player_x += round(hspd);
|
|
|
|
else if(!collide_solid(player_x-1, player_y, level)) player_x-=1;
|
|
|
|
if(player_x<-9) player_x=384;
|
|
|
|
}
|
|
|
|
else hspd=0;
|
|
|
|
//Action key
|
|
|
|
if(keydown(KEY_SHIFT) && !check && (nbswitch > 0 || nbswitch == -1) &&
|
|
|
|
((collide_solid(player_x, player_y-1, level) && gravity) || (collide_solid(player_x, player_y+1, level) && !gravity)))
|
|
|
|
{
|
2020-08-16 23:12:04 +02:00
|
|
|
vspd = 1;
|
2021-04-30 01:48:00 +02:00
|
|
|
if(!gravity) gravity=1;
|
|
|
|
else gravity=0;
|
|
|
|
if(check_nbswitch && nbswitch != 0) {
|
|
|
|
nbswitch-=1;
|
|
|
|
}
|
|
|
|
check=1;
|
|
|
|
}
|
|
|
|
else if(!keydown(KEY_SHIFT) && check) check=0;
|
|
|
|
//Gravity
|
|
|
|
if(!gravity)
|
|
|
|
{
|
|
|
|
if(!collide_solid(player_x, player_y+(int)vspd+1, level))
|
|
|
|
{
|
|
|
|
if (vspd<MAX_VSPD) vspd+=VACCELERATION;
|
|
|
|
if(collide(player_x+1, player_y, level, 'i')) vspd+=0.15;
|
|
|
|
if(collide(player_x-1, player_y, level, 'i')) vspd+=0.15;
|
|
|
|
player_y+=(int)vspd;
|
|
|
|
}
|
|
|
|
else if(!collide_solid(player_x, player_y+(int)vspd, level))
|
|
|
|
{
|
|
|
|
vspd-=VACCELERATION;
|
|
|
|
player_y+=(int)vspd;
|
|
|
|
}
|
|
|
|
else if(!collide_solid(player_x, player_y+1, level))
|
|
|
|
{
|
2021-03-23 14:21:59 +01:00
|
|
|
vspd = 1;
|
2021-04-30 01:48:00 +02:00
|
|
|
player_y+=1;
|
|
|
|
}
|
|
|
|
else vspd = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if(!collide_solid(player_x, player_y-(int)vspd-1, level))
|
|
|
|
{
|
|
|
|
if (vspd<MAX_VSPD) vspd+=VACCELERATION;
|
|
|
|
if(collide(player_x+1, player_y, level, 'i')) vspd+=0.15;
|
|
|
|
if(collide(player_x-1, player_y, level, 'i')) vspd+=0.15;
|
|
|
|
player_y-=(int)vspd;
|
|
|
|
}
|
|
|
|
else if(!collide_solid(player_x, player_y-(int)vspd, level))
|
|
|
|
{
|
|
|
|
vspd-=VACCELERATION;
|
|
|
|
player_y-=(int)vspd;
|
|
|
|
}
|
|
|
|
else if(!collide_solid(player_x, player_y-1, level))
|
|
|
|
{
|
2020-07-02 20:09:23 +02:00
|
|
|
vspd = 1;
|
2021-04-30 01:48:00 +02:00
|
|
|
player_y-=1;
|
|
|
|
}
|
|
|
|
else vspd = 1;
|
2020-06-30 19:13:03 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
//Collide with red block
|
|
|
|
if(collide_dead(player_x, player_y, level))
|
|
|
|
{
|
2020-07-02 20:09:23 +02:00
|
|
|
vspd = 1;
|
2020-07-01 21:35:52 +02:00
|
|
|
player_x = start_x;
|
|
|
|
player_y = start_y;
|
2021-04-30 01:48:00 +02:00
|
|
|
if(check_coin) coin--;
|
2020-07-30 01:51:06 +02:00
|
|
|
check_coin = 0;
|
2021-04-30 01:48:00 +02:00
|
|
|
set_level(*id_level, level, &start_x, &start_y, &gravity, &appear, &disappear, &nbswitch);
|
2020-07-16 02:06:57 +02:00
|
|
|
blackout = 0;
|
2021-04-30 01:48:00 +02:00
|
|
|
check_nbswitch = 0;
|
2020-08-20 01:05:39 +02:00
|
|
|
death_count++;
|
|
|
|
double_check = 1;
|
2020-07-06 22:22:22 +02:00
|
|
|
framelevel = 0;
|
2021-04-30 01:48:00 +02:00
|
|
|
if(*id_level == 1 && !mode)
|
|
|
|
frame = 0;
|
2020-07-01 21:35:52 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
//Collide with the end
|
|
|
|
if(collide_end(player_x, player_y, level))
|
|
|
|
{
|
|
|
|
if(!mode && *id_level !=0) *id_level+=1;
|
|
|
|
else break;
|
2020-07-06 22:22:22 +02:00
|
|
|
check_coin = 0;
|
2021-04-30 01:48:00 +02:00
|
|
|
set_level(*id_level, level, &start_x, &start_y, &gravity, &appear, &disappear, &nbswitch);
|
2020-07-01 21:35:52 +02:00
|
|
|
player_x = start_x;
|
|
|
|
player_y = start_y;
|
2020-07-16 02:06:57 +02:00
|
|
|
blackout = 0;
|
2020-08-20 01:05:39 +02:00
|
|
|
double_check = 1;
|
2021-04-30 01:48:00 +02:00
|
|
|
framelevel=0;
|
|
|
|
if(*id_level==10 && *type==1) *type = 2;
|
|
|
|
else if(*type!=3) *type = 1;
|
|
|
|
if(*id_level==LEVEL_MAX+1)
|
|
|
|
{
|
2020-08-27 00:31:22 +02:00
|
|
|
timer_stop(timer);
|
|
|
|
end(frame);
|
|
|
|
}
|
2020-07-01 21:35:52 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
if(collide(player_x, player_y, level, 'k')) //Collide with key1 = disappearance of blocks
|
2020-07-03 00:17:20 +02:00
|
|
|
{
|
2021-04-30 01:48:00 +02:00
|
|
|
for (int i = 0; level[i]!='\0' ; i++)
|
|
|
|
{
|
|
|
|
if(level[i]=='3') level[i]='0';
|
|
|
|
if(level[i]=='k') level[i]='0';
|
2020-07-03 00:17:20 +02:00
|
|
|
}
|
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
if(collide(player_x, player_y, level, 'K')) //Collide with key2 = appearance of blocks
|
2020-07-03 00:17:20 +02:00
|
|
|
{
|
2021-04-30 01:48:00 +02:00
|
|
|
for (int i = 0; level[i]!='\0' ; i++)
|
|
|
|
{
|
|
|
|
if(level[i]=='a') level[i]='4';
|
|
|
|
if(level[i]=='K') level[i]='0';
|
2020-07-03 00:17:20 +02:00
|
|
|
}
|
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
if(collide(player_x, player_y, level, 't') && !check_coin) //Collide with coin
|
2020-07-06 22:22:22 +02:00
|
|
|
{
|
2021-04-30 01:48:00 +02:00
|
|
|
for (int i = 0; level[i]!='\0' ; i++)
|
|
|
|
{
|
|
|
|
if(level[i]=='t')
|
|
|
|
{
|
|
|
|
level[i]='0';
|
2020-07-06 22:22:22 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
check_coin=1;
|
2020-07-06 22:22:22 +02:00
|
|
|
coin++;
|
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
if(collide(player_x, player_y, level, 'b')) //Collide with blackout block
|
2020-07-16 02:06:57 +02:00
|
|
|
{
|
2021-04-30 01:48:00 +02:00
|
|
|
for (int i = 0; level[i]!='\0' ; i++)
|
|
|
|
{
|
|
|
|
if(level[i]=='b')
|
|
|
|
{
|
|
|
|
level[i]='0';
|
2020-07-16 02:06:57 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
blackout=1;
|
|
|
|
}
|
|
|
|
if(collide(player_x, player_y, level, 'z')) //Collide with nbswitch block
|
|
|
|
{
|
|
|
|
for (int i = 0; level[i]!='\0' ; i++)
|
|
|
|
{
|
|
|
|
if(level[i]=='z')
|
|
|
|
{
|
|
|
|
level[i]='0';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
check_nbswitch=1;
|
2020-07-16 02:06:57 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
if(level[((player_x+6)/16)+((player_y+6)/16)*25] == 'l') //Collide with change block
|
2020-07-16 02:06:57 +02:00
|
|
|
{
|
|
|
|
int x = 0;
|
|
|
|
int y = 0;
|
2021-04-30 01:48:00 +02:00
|
|
|
char level2[351] = { 0 };
|
2020-07-16 02:06:57 +02:00
|
|
|
int j = 0;
|
2021-04-30 01:48:00 +02:00
|
|
|
level[((player_x+6)/16)+((player_y+6)/16)*25] = 'P';
|
|
|
|
for (int i = 349; i!=-1 ; i--)
|
|
|
|
{
|
|
|
|
level2[j]=level[i];
|
2020-07-16 02:06:57 +02:00
|
|
|
j++;
|
|
|
|
}
|
|
|
|
del_level(level);
|
2021-04-30 01:48:00 +02:00
|
|
|
strncpy(level,level2,351);
|
2020-07-16 02:06:57 +02:00
|
|
|
del_level(level2);
|
|
|
|
int i = 0;
|
2021-04-30 01:48:00 +02:00
|
|
|
while (i!=350)
|
|
|
|
{
|
|
|
|
switch(level[i])
|
|
|
|
{
|
|
|
|
case 'P':
|
|
|
|
player_x = x;
|
|
|
|
player_y = y;
|
|
|
|
level[i]='0';
|
|
|
|
break;
|
2020-07-16 02:06:57 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
x+=16;
|
|
|
|
if(x==16*25)
|
|
|
|
{
|
|
|
|
x=0;
|
|
|
|
y+=16;
|
2020-07-16 02:06:57 +02:00
|
|
|
}
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if(!gravity) gravity=1;
|
|
|
|
else gravity=0;
|
2021-04-27 18:15:35 +02:00
|
|
|
chock++;
|
2020-07-16 02:06:57 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
|
|
|
|
if(collide(player_x, player_y+(int)vspd+2, level, 'B') && vspd>=5) //Damaged block
|
2020-07-30 01:51:06 +02:00
|
|
|
{
|
2021-04-30 01:48:00 +02:00
|
|
|
if(level[((player_x)/16)+((player_y+25)/16)*25]=='B') level[((player_x)/16)+((player_y+25)/16)*25]='0';
|
|
|
|
if(level[((player_x+12)/16)+((player_y+25)/16)*25]=='B' && collide_point(player_x+12, player_y+22, level, 'B')) level[((player_x+12)/16)+((player_y+25)/16)*25]='0';
|
|
|
|
vspd=1.0;
|
2020-07-30 01:51:06 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
if(collide(player_x, player_y-(int)vspd-2, level, 'B') && vspd>=5) //Damaged block
|
2020-07-30 01:51:06 +02:00
|
|
|
{
|
2021-04-30 01:48:00 +02:00
|
|
|
if(level[((player_x)/16)+((player_y-(int)vspd-2)/16)*25]=='B') level[((player_x)/16)+((player_y-(int)vspd-2)/16)*25]='0';
|
|
|
|
if(level[((player_x+12)/16)+((player_y-(int)vspd-2)/16)*25]=='B' && collide_point(player_x+12, player_y-12, level, 'B')) level[((player_x+12)/16)+((player_y-(int)vspd-2)/16)*25]='0';
|
|
|
|
vspd=1.0;
|
2020-07-30 01:51:06 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
|
|
|
|
collide_replace(player_x, player_y, level, 'h', 'y'); //Appear block
|
|
|
|
if(!collide(player_x, player_y, level, 'y') && double_check) //Appear block
|
2020-08-17 23:39:38 +02:00
|
|
|
{
|
2021-04-30 01:48:00 +02:00
|
|
|
for (int i = 0; level[i]!='\0' ; i++)
|
|
|
|
{
|
|
|
|
if(level[i]=='y')
|
|
|
|
{
|
2020-08-20 01:05:39 +02:00
|
|
|
double_check = 1;
|
|
|
|
break;
|
2021-04-30 01:48:00 +02:00
|
|
|
}
|
|
|
|
else if(level[i]=='h')
|
|
|
|
{
|
2020-08-20 01:05:39 +02:00
|
|
|
double_check = 1;
|
|
|
|
break;
|
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
else double_check = 0; //This loop is executed only when an h or y is on the level
|
2021-03-23 14:21:59 +01:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
for (int i = 0; level[i]!='\0'; ++i)
|
|
|
|
{
|
|
|
|
if(level[i]=='y')
|
|
|
|
{
|
|
|
|
level[i]='H';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-20 01:05:39 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
if(level[((player_x+6)/16)+((player_y+6)/16)*25] == 'S') //Switch block
|
2020-08-16 23:12:04 +02:00
|
|
|
{
|
2021-04-30 01:48:00 +02:00
|
|
|
level[((player_x+6)/16)+((player_y+6)/16)*25] = '0';
|
|
|
|
vspd=1.0;
|
|
|
|
if(!gravity) gravity=1;
|
|
|
|
else gravity=0;
|
2020-08-16 23:12:04 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
|
|
|
|
if((framelevel/FPS)>disappear) for (int i = 0; level[i]!='\0' ; i++) if(level[i]=='c') level[i]='0'; //after x seconds blocks disappear
|
|
|
|
if((framelevel/FPS)>appear) for (int i = 0; level[i]!='\0' ; i++) if(level[i]=='m') level[i]='C'; //after x seconds blocks appear
|
|
|
|
|
|
|
|
if(player_y>=212) player_y=-4;
|
|
|
|
if(player_y<-6) player_y=212;
|
|
|
|
|
|
|
|
//Menu
|
|
|
|
if(keydown_any(KEY_EXIT, KEY_MENU, 0))
|
|
|
|
{
|
2020-07-09 19:29:49 +02:00
|
|
|
char menu_loop = 1;
|
|
|
|
char selected = 0;
|
2020-07-27 01:32:44 +02:00
|
|
|
int Y_POS = 18;
|
2020-08-20 01:05:39 +02:00
|
|
|
char buffer = 1;
|
2021-04-30 01:48:00 +02:00
|
|
|
while(menu_loop)
|
|
|
|
{
|
2020-07-09 19:29:49 +02:00
|
|
|
clearevents();
|
|
|
|
dclear(C_WHITE);
|
2020-07-27 01:32:44 +02:00
|
|
|
draw_level(level);
|
2021-04-30 01:48:00 +02:00
|
|
|
draw_player(player_x,player_y, *type);
|
|
|
|
dimage(0,0,&img_speedrun);
|
2020-07-09 19:29:49 +02:00
|
|
|
selected += keydown(KEY_DOWN) - keydown(KEY_UP);
|
2021-04-30 01:48:00 +02:00
|
|
|
if (selected == 2) selected = 0;
|
|
|
|
else if (selected == -1) selected = 1;
|
2020-07-09 19:29:49 +02:00
|
|
|
dtext(32, Y_POS, C_BLACK, "CONTINUE");
|
2021-04-30 01:48:00 +02:00
|
|
|
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_RGB(83,255,0), "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);
|
2020-07-09 19:29:49 +02:00
|
|
|
dupdate();
|
2021-04-30 01:48:00 +02:00
|
|
|
if (keydown_any(KEY_SHIFT, KEY_EXE, 0))
|
|
|
|
{
|
|
|
|
switch (selected)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
menu_loop = 0;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
menu_loop = 0;
|
|
|
|
game_loop = 0;
|
|
|
|
break;
|
2020-07-09 19:29:49 +02:00
|
|
|
}
|
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
if(keydown_any(KEY_EXIT, KEY_MENU, 0))
|
|
|
|
{
|
|
|
|
if(!buffer)
|
|
|
|
{
|
2020-08-20 01:05:39 +02:00
|
|
|
menu_loop = 0;
|
|
|
|
game_loop = 0;
|
|
|
|
break;
|
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
}
|
|
|
|
else buffer = 0;
|
|
|
|
while (keydown_any(KEY_UP, KEY_DOWN, 0)) clearevents();
|
2020-07-09 19:29:49 +02:00
|
|
|
}
|
|
|
|
}
|
2020-06-25 23:53:57 +02:00
|
|
|
}
|
2020-07-02 20:09:23 +02:00
|
|
|
timer_stop(timer);
|
2020-08-13 20:34:26 +02:00
|
|
|
//when a level is quit
|
2020-07-26 01:44:42 +02:00
|
|
|
if(mode)
|
|
|
|
{
|
2021-04-27 18:15:35 +02:00
|
|
|
if(*id_level==0) {
|
|
|
|
game_loop = 0;
|
|
|
|
draw_end(framelevel, *id_level, 0);
|
|
|
|
sleep_ms(2500);
|
|
|
|
*id_level = 1;
|
|
|
|
}
|
2020-08-28 00:36:42 +02:00
|
|
|
if(game_loop) //end of a level with level selection
|
2020-07-27 01:32:44 +02:00
|
|
|
{
|
2020-08-14 20:48:32 +02:00
|
|
|
float framefloat = framelevel;
|
2020-08-28 00:36:42 +02:00
|
|
|
draw_end(framelevel, *id_level, 0);
|
2021-04-27 18:15:35 +02:00
|
|
|
savetime(framefloat, *id_level);
|
|
|
|
sleep_ms(2500);
|
2020-07-27 01:32:44 +02:00
|
|
|
}
|
2021-04-30 01:48:00 +02:00
|
|
|
if(!speed_menu(id_level))
|
|
|
|
{
|
2020-07-26 01:44:42 +02:00
|
|
|
mode = 1;
|
2020-08-20 01:05:39 +02:00
|
|
|
death_count = 0;
|
2020-08-22 01:24:50 +02:00
|
|
|
game(id_level, mode, type);
|
2021-04-30 01:48:00 +02:00
|
|
|
}
|
|
|
|
else main();
|
|
|
|
}
|
|
|
|
else main();
|
2020-08-27 00:31:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void end(unsigned int frame)
|
|
|
|
{
|
2020-08-28 00:36:42 +02:00
|
|
|
draw_end((int)frame, 15, 2);
|
|
|
|
sleep_ms(7000);
|
|
|
|
main();
|
2020-07-26 01:44:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
2021-04-27 18:15:35 +02:00
|
|
|
if(!run) {
|
2021-04-30 02:11:01 +02:00
|
|
|
gint_world_switch(GINT_CALL(restore));
|
2021-04-27 18:15:35 +02:00
|
|
|
run = 1;
|
|
|
|
}
|
2020-07-26 01:44:42 +02:00
|
|
|
char mode = 0;
|
2020-08-22 01:24:50 +02:00
|
|
|
char type = 1;
|
|
|
|
char valeur = start_menu(&type);
|
2021-04-30 01:48:00 +02:00
|
|
|
if(!valeur) //normal game (level selection)
|
2020-07-26 01:44:42 +02:00
|
|
|
{
|
|
|
|
int id_level = 1;
|
2021-04-30 01:48:00 +02:00
|
|
|
if(!speed_menu(&id_level))
|
|
|
|
{
|
2020-07-26 01:44:42 +02:00
|
|
|
mode = 1;
|
2020-08-22 01:24:50 +02:00
|
|
|
game(&id_level, mode, &type);
|
2020-07-26 01:44:42 +02:00
|
|
|
}
|
2020-07-27 01:32:44 +02:00
|
|
|
else main();
|
2020-07-26 01:44:42 +02:00
|
|
|
}
|
2021-04-27 18:15:35 +02:00
|
|
|
else if(valeur==1) //all mode
|
2020-07-30 01:51:06 +02:00
|
|
|
{
|
|
|
|
int id_level = 1;
|
|
|
|
mode = 0;
|
2020-08-22 01:24:50 +02:00
|
|
|
game(&id_level, mode, &type);
|
2020-07-30 01:51:06 +02:00
|
|
|
}
|
2021-04-27 18:15:35 +02:00
|
|
|
else if(valeur==2) // tutorial
|
2020-08-17 23:39:38 +02:00
|
|
|
{
|
2020-08-20 01:05:39 +02:00
|
|
|
int id_level = 0;
|
2021-04-27 18:15:35 +02:00
|
|
|
mode = 1;
|
2020-08-22 01:24:50 +02:00
|
|
|
game(&id_level, mode, &type);
|
2020-08-17 23:39:38 +02:00
|
|
|
}
|
2021-04-27 18:15:35 +02:00
|
|
|
else if(valeur == 3) //exit
|
2021-04-30 02:11:01 +02:00
|
|
|
gint_world_switch(GINT_CALL(savefile));
|
2020-06-26 01:46:28 +02:00
|
|
|
return 0;
|
2020-06-25 23:53:57 +02:00
|
|
|
}
|