2021-04-30 01:48:00 +02:00
|
|
|
#include "collide.h"
|
2021-04-30 02:12:24 +02:00
|
|
|
#include "define.h"
|
|
|
|
#include "drawlevel.h"
|
2020-07-26 01:44:42 +02:00
|
|
|
#include "menu.h"
|
2021-05-02 20:21:41 +02:00
|
|
|
#include "replace.h"
|
2021-04-30 01:48:00 +02:00
|
|
|
#include "save.h"
|
2021-04-30 02:12:24 +02:00
|
|
|
#include "setlevel.h"
|
|
|
|
#include "times.h"
|
2021-05-02 20:21:41 +02:00
|
|
|
#include "util.h"
|
2021-05-04 01:46:11 +02:00
|
|
|
#include "friction.h"
|
2021-05-02 20:21:41 +02:00
|
|
|
#include <gint/clock.h>
|
|
|
|
#include <gint/display.h>
|
|
|
|
#include <gint/gint.h>
|
|
|
|
#include <gint/keyboard.h>
|
|
|
|
#include <gint/std/string.h>
|
|
|
|
#include <gint/timer.h>
|
2020-06-25 23:53:57 +02:00
|
|
|
|
2021-05-05 01:03:02 +02:00
|
|
|
#include <gint/std/stdlib.h>
|
|
|
|
#include <gint/rtc.h>
|
|
|
|
|
2020-08-16 23:12:04 +02:00
|
|
|
#define VACCELERATION 0.2
|
2020-07-02 20:09:23 +02:00
|
|
|
#define MAX_VSPD 9.0
|
|
|
|
|
2021-05-05 01:03:02 +02:00
|
|
|
static void startmenu_launcher();
|
2021-05-02 20:21:41 +02:00
|
|
|
static int callback(volatile int *frame_elapsed);
|
|
|
|
static void game(int *id_level, char mode, char *type);
|
|
|
|
|
2021-05-05 01:03:02 +02:00
|
|
|
int main(void) {
|
2021-05-02 20:21:41 +02:00
|
|
|
static int run = 0;
|
|
|
|
if (!run) {
|
|
|
|
gint_world_switch(GINT_CALL(restore));
|
2021-05-05 01:03:02 +02:00
|
|
|
srand(rtc_ticks());
|
2021-05-02 20:21:41 +02:00
|
|
|
run = 1;
|
|
|
|
}
|
2020-07-27 01:32:44 +02:00
|
|
|
|
2021-05-05 01:03:02 +02:00
|
|
|
startmenu_launcher();
|
|
|
|
gint_world_switch(GINT_CALL(savefile));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void startmenu_launcher() {
|
2021-05-02 20:21:41 +02:00
|
|
|
char type = 1;
|
2021-05-05 01:03:02 +02:00
|
|
|
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: {
|
2021-05-05 13:28:21 +02:00
|
|
|
id_level = 1;
|
2021-05-05 01:03:02 +02:00
|
|
|
game(&id_level, 0, &type);
|
|
|
|
} break;
|
|
|
|
case MenuTutorial: {
|
|
|
|
id_level = 0;
|
|
|
|
game(&id_level, 1, &type);
|
|
|
|
} break;
|
|
|
|
case MenuExit: {
|
|
|
|
menu_run = 0;
|
|
|
|
} break;
|
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static int callback(volatile int *frame_elapsed)
|
2020-07-02 20:09:23 +02:00
|
|
|
{
|
2021-04-30 02:12:24 +02:00
|
|
|
*frame_elapsed = 1;
|
|
|
|
return TIMER_CONTINUE;
|
2020-07-02 20:09:23 +02:00
|
|
|
}
|
|
|
|
|
2021-05-02 20:21:41 +02:00
|
|
|
static 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:12:24 +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 02:12:24 +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-05-02 20:21:41 +02:00
|
|
|
char gravity = -1; // 1 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 02:12:24 +02:00
|
|
|
|
2021-05-05 01:03:02 +02:00
|
|
|
char hasReachedEnd = 0;
|
|
|
|
|
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;
|
2021-04-30 02:12:24 +02:00
|
|
|
|
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-05-05 01:56:02 +02:00
|
|
|
float hrem = 0.0;
|
|
|
|
float friction;
|
|
|
|
float acceleration;
|
2021-05-02 20:21:41 +02:00
|
|
|
|
2021-04-30 02:12:24 +02:00
|
|
|
if (*id_level == 10 && *type != 3)
|
|
|
|
*type = 2;
|
|
|
|
else if (*type != 3)
|
|
|
|
*type = 1;
|
|
|
|
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;
|
2021-05-02 20:21:41 +02:00
|
|
|
|
2021-04-30 02:12:24 +02:00
|
|
|
while (game_loop) {
|
|
|
|
while (!frame_elapsed)
|
|
|
|
sleep();
|
2020-07-02 20:09:23 +02:00
|
|
|
frame_elapsed = 0;
|
2021-04-30 02:12:24 +02:00
|
|
|
|
2020-07-02 20:09:23 +02:00
|
|
|
frame++;
|
2020-07-04 16:05:52 +02:00
|
|
|
framelevel++;
|
2021-04-30 02:12:24 +02:00
|
|
|
if (!(frame % 2)) {
|
2020-07-19 01:13:01 +02:00
|
|
|
draw_level(level);
|
2021-04-30 02:12:24 +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);
|
2021-04-30 02:12:24 +02:00
|
|
|
if (!mode)
|
|
|
|
draw_timer(frame);
|
|
|
|
else
|
|
|
|
draw_timer(framelevel);
|
|
|
|
|
|
|
|
if (!mode)
|
|
|
|
dprint_opt(330, 0, C_RGB(255, 190, 0), C_BLACK,
|
|
|
|
DTEXT_LEFT, DTEXT_TOP, "Coin : %d",
|
|
|
|
coin);
|
|
|
|
if (check_nbswitch)
|
|
|
|
draw_nbswitch(nbswitch);
|
2021-05-04 01:46:11 +02:00
|
|
|
dprint(330, 0, C_RED, "%d", (int)(hspd*100));
|
2020-07-19 01:13:01 +02:00
|
|
|
dupdate();
|
|
|
|
}
|
2020-06-25 23:53:57 +02:00
|
|
|
pollevent();
|
2021-04-30 02:12:24 +02:00
|
|
|
|
|
|
|
if (keydown(KEY_OPTN)) {
|
2021-05-02 20:21:41 +02:00
|
|
|
replace_xy_block(player_x + 6, player_y + 6, 'd',
|
|
|
|
level);
|
2020-08-20 01:05:39 +02:00
|
|
|
death_count--;
|
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
|
2021-05-05 01:56:02 +02:00
|
|
|
// right and left movement + collision
|
|
|
|
const int signe = (keydown(KEY_RIGHT) - keydown(KEY_LEFT));
|
|
|
|
mod_accel_and_fric(&acceleration, &friction, player_x, player_y, level);
|
|
|
|
hspd *= 1 - friction;
|
|
|
|
hspd += signe * acceleration;
|
|
|
|
|
|
|
|
/* speed reminder */
|
|
|
|
/* TODO
|
|
|
|
* Please note than `hrem` should be reset after horizontal collision
|
|
|
|
* with a wall, death or level change. This is necessary to avoid
|
|
|
|
* cross-level jank/garbage data to be carreid that would ultimatly
|
|
|
|
* introduce inconsistancies. I didn't do it myself 'cause I couldn't
|
|
|
|
* find were to do this.
|
|
|
|
* -- KikooDX */
|
|
|
|
const float spd_n_rem_x = hspd + hrem;
|
|
|
|
const int spd_x = (int)spd_n_rem_x;
|
|
|
|
hrem = spd_n_rem_x - (float)spd_x;
|
|
|
|
|
|
|
|
if (!collide_solid(player_x + round(hspd) + signe * 1,
|
|
|
|
player_y, level))
|
|
|
|
player_x += round(hspd);
|
|
|
|
else if (!collide_solid(player_x + signe * 1, player_y,
|
|
|
|
level))
|
|
|
|
player_x += signe;
|
|
|
|
if (player_x >= 388)
|
|
|
|
player_x = -4;
|
|
|
|
if (player_x < -9)
|
|
|
|
player_x = 384;
|
2021-05-02 20:21:41 +02:00
|
|
|
|
2021-04-30 02:12:24 +02:00
|
|
|
// Action key
|
2021-05-02 20:21:41 +02:00
|
|
|
if (keydown(KEY_SHIFT) && !check && nbswitch > 0 &&
|
2021-04-30 02:12:24 +02:00
|
|
|
((collide_solid(player_x, player_y - 1, level) &&
|
2021-05-02 20:21:41 +02:00
|
|
|
gravity == -1) ||
|
2021-04-30 02:12:24 +02:00
|
|
|
(collide_solid(player_x, player_y + 1, level) &&
|
2021-05-02 20:21:41 +02:00
|
|
|
gravity))) {
|
2020-08-16 23:12:04 +02:00
|
|
|
vspd = 1;
|
2021-05-02 20:21:41 +02:00
|
|
|
if (gravity == -1)
|
2021-04-30 02:12:24 +02:00
|
|
|
gravity = 1;
|
|
|
|
else
|
2021-05-02 20:21:41 +02:00
|
|
|
gravity = -1;
|
|
|
|
if (check_nbswitch && nbswitch > 0) {
|
2021-04-30 02:12:24 +02:00
|
|
|
nbswitch -= 1;
|
2021-04-30 01:48:00 +02:00
|
|
|
}
|
2021-04-30 02:12:24 +02:00
|
|
|
check = 1;
|
|
|
|
} else if (!keydown(KEY_SHIFT) && check)
|
|
|
|
check = 0;
|
2021-05-02 20:21:41 +02:00
|
|
|
|
|
|
|
// gravity
|
|
|
|
if (!collide_solid(player_x,
|
|
|
|
player_y + ((int)vspd) * gravity + gravity,
|
|
|
|
level)) {
|
|
|
|
if (vspd < MAX_VSPD)
|
|
|
|
vspd += VACCELERATION;
|
|
|
|
if (collide(player_x + 1, player_y, level, 'i') ||
|
|
|
|
collide(player_x - 1, player_y, level, 'i'))
|
|
|
|
vspd += 0.15;
|
|
|
|
player_y += ((int)vspd) * gravity;
|
|
|
|
} else if (!collide_solid(player_x,
|
|
|
|
player_y + ((int)vspd) * gravity,
|
|
|
|
level)) {
|
|
|
|
vspd -= VACCELERATION;
|
|
|
|
player_y += ((int)vspd) * gravity;
|
|
|
|
} else if (!collide_solid(player_x, player_y + gravity,
|
|
|
|
level)) {
|
|
|
|
vspd = 1;
|
|
|
|
player_y += 1 * gravity;
|
|
|
|
} else
|
|
|
|
vspd = 1;
|
|
|
|
|
|
|
|
// Collide with dead block
|
2021-04-30 02:12:24 +02:00
|
|
|
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 02:12:24 +02:00
|
|
|
if (check_coin)
|
|
|
|
coin--;
|
2020-07-30 01:51:06 +02:00
|
|
|
check_coin = 0;
|
2021-04-30 02:12:24 +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 02:12:24 +02:00
|
|
|
if (*id_level == 1 && !mode)
|
|
|
|
frame = 0;
|
2020-07-01 21:35:52 +02:00
|
|
|
}
|
2021-04-30 02:12:24 +02:00
|
|
|
// Collide with the end
|
|
|
|
if (collide_end(player_x, player_y, level)) {
|
2021-05-05 01:03:02 +02:00
|
|
|
//if all mode
|
|
|
|
if (!mode) {
|
2021-04-30 02:12:24 +02:00
|
|
|
*id_level += 1;
|
2021-05-05 01:03:02 +02:00
|
|
|
check_coin = 0;
|
|
|
|
check_nbswitch = 0;
|
|
|
|
blackout = 0;
|
|
|
|
double_check = 1;
|
|
|
|
framelevel = 0;
|
|
|
|
|
|
|
|
set_level(*id_level, level, &start_x, &start_y,
|
2021-04-30 02:12:24 +02:00
|
|
|
&gravity, &appear, &disappear, &nbswitch);
|
2021-05-05 01:03:02 +02:00
|
|
|
player_x = start_x;
|
|
|
|
player_y = start_y;
|
|
|
|
|
|
|
|
if (*id_level == 10 && *type == 1)
|
2021-04-30 02:12:24 +02:00
|
|
|
*type = 2;
|
2021-05-05 01:03:02 +02:00
|
|
|
else if (*type != 3)
|
|
|
|
*type = 1;
|
|
|
|
//End of all mode
|
|
|
|
if (*id_level == LEVEL_MAX + 1) {
|
|
|
|
timer_stop(timer);
|
|
|
|
game_loop = 0;
|
|
|
|
}
|
2020-08-27 00:31:22 +02:00
|
|
|
}
|
2021-05-05 01:03:02 +02:00
|
|
|
else {
|
|
|
|
game_loop = 0;
|
|
|
|
}
|
|
|
|
hasReachedEnd = 1;
|
2020-07-01 21:35:52 +02:00
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
// Collide with key1 = disappearance of blocks
|
|
|
|
if (collide(player_x, player_y, level, 'k')) {
|
|
|
|
replace_all_block('3', '0', level);
|
|
|
|
replace_all_block('k', '0', level);
|
2020-07-03 00:17:20 +02:00
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
// Collide with key2 = appearance of blocks
|
|
|
|
if (collide(player_x, player_y, level, 'K')) {
|
|
|
|
replace_all_block('a', '4', level);
|
|
|
|
replace_all_block('K', '0', level);
|
2020-07-03 00:17:20 +02:00
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
// Collide with coin
|
|
|
|
if (collide(player_x, player_y, level, 't') && !check_coin) {
|
|
|
|
replace_all_block('t', '0', level);
|
2021-04-30 02:12:24 +02:00
|
|
|
check_coin = 1;
|
2020-07-06 22:22:22 +02:00
|
|
|
coin++;
|
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
// Collide with blackout block
|
|
|
|
if (collide(player_x, player_y, level, 'b')) {
|
|
|
|
replace_all_block('b', '0', level);
|
2021-04-30 02:12:24 +02:00
|
|
|
blackout = 1;
|
2021-04-30 01:48:00 +02:00
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
// Collide with nbswitch block
|
|
|
|
if (collide(player_x, player_y, level, 'z')) {
|
|
|
|
replace_all_block('z', '0', level);
|
2021-04-30 02:12:24 +02:00
|
|
|
check_nbswitch = 1;
|
2020-07-16 02:06:57 +02:00
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
// Collide with change block
|
|
|
|
if (collide_center(player_x, player_y, level, 'l')) {
|
2020-07-16 02:06:57 +02:00
|
|
|
int x = 0;
|
|
|
|
int y = 0;
|
2021-04-30 02:12:24 +02:00
|
|
|
char level2[351] = {0};
|
2020-07-16 02:06:57 +02:00
|
|
|
int j = 0;
|
2021-05-02 20:21:41 +02:00
|
|
|
replace_xy_block(player_x + 6, player_y + 6, 'P',
|
|
|
|
level);
|
2021-04-30 02:12:24 +02:00
|
|
|
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 02:12:24 +02:00
|
|
|
strncpy(level, level2, 351);
|
2020-07-16 02:06:57 +02:00
|
|
|
del_level(level2);
|
|
|
|
int i = 0;
|
2021-04-30 02:12:24 +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-05-02 20:21:41 +02:00
|
|
|
x += TILE_HEIGHT;
|
|
|
|
if (x == TILE_HEIGHT * LEVEL_WIDTH) {
|
2021-04-30 02:12:24 +02:00
|
|
|
x = 0;
|
2021-05-02 20:21:41 +02:00
|
|
|
y += TILE_HEIGHT;
|
2020-07-16 02:06:57 +02:00
|
|
|
}
|
|
|
|
i++;
|
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
if (gravity == -1)
|
2021-04-30 02:12:24 +02:00
|
|
|
gravity = 1;
|
|
|
|
else
|
2021-05-02 20:21:41 +02:00
|
|
|
gravity = -1;
|
2021-04-30 02:12:24 +02:00
|
|
|
chock++;
|
2020-07-16 02:06:57 +02:00
|
|
|
}
|
2021-04-30 02:12:24 +02:00
|
|
|
|
2021-05-02 20:21:41 +02:00
|
|
|
// Damaged block
|
2021-04-30 02:12:24 +02:00
|
|
|
if (collide(player_x, player_y + (int)vspd + 2, level, 'B') &&
|
2021-05-02 20:21:41 +02:00
|
|
|
vspd >= 5) {
|
2021-04-30 02:12:24 +02:00
|
|
|
if (level[((player_x) / 16) +
|
|
|
|
((player_y + 25) / 16) * 25] == 'B')
|
2021-05-02 20:21:41 +02:00
|
|
|
replace_xy_block(player_x, player_y + 25, '0',
|
|
|
|
level);
|
|
|
|
|
2021-04-30 02:12:24 +02:00
|
|
|
if (level[((player_x + 12) / 16) +
|
|
|
|
((player_y + 25) / 16) * 25] == 'B' &&
|
|
|
|
collide_point(player_x + 12, player_y + 22, level,
|
|
|
|
'B'))
|
2021-05-02 20:21:41 +02:00
|
|
|
replace_xy_block(player_x + 12, player_y + 25,
|
|
|
|
'0', level);
|
2021-04-30 02:12:24 +02:00
|
|
|
vspd = 1.0;
|
2020-07-30 01:51:06 +02:00
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
// Damaged block
|
2021-04-30 02:12:24 +02:00
|
|
|
if (collide(player_x, player_y - (int)vspd - 2, level, 'B') &&
|
2021-05-02 20:21:41 +02:00
|
|
|
vspd >= 5) {
|
2021-04-30 02:12:24 +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 02:12:24 +02:00
|
|
|
|
2021-05-02 20:21:41 +02:00
|
|
|
// Appear block
|
|
|
|
collide_replace(player_x, player_y, level, 'h', 'y');
|
|
|
|
// Appear block
|
|
|
|
if (!collide(player_x, player_y, level, 'y') && double_check) {
|
2021-04-30 02:12:24 +02:00
|
|
|
for (int i = 0; level[i] != '\0'; i++) {
|
2021-05-02 20:21:41 +02:00
|
|
|
if (level[i] == 'y' || level[i] == 'h') {
|
2020-08-20 01:05:39 +02:00
|
|
|
double_check = 1;
|
|
|
|
break;
|
2021-04-30 02:12:24 +02:00
|
|
|
} else
|
2021-05-02 20:21:41 +02:00
|
|
|
double_check = 0;
|
2021-04-30 02:12:24 +02:00
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
replace_all_block('y', 'H', level);
|
2021-04-30 01:48:00 +02:00
|
|
|
}
|
2021-05-02 20:21:41 +02:00
|
|
|
|
|
|
|
// Switch block
|
|
|
|
if (collide_center(player_x, player_y, level, 'S')) {
|
|
|
|
replace_xy_block(player_x + 6, player_y + 6, '0',
|
|
|
|
level);
|
2021-04-30 02:12:24 +02:00
|
|
|
vspd = 1.0;
|
2021-05-02 20:21:41 +02:00
|
|
|
if (gravity == -1)
|
2021-04-30 02:12:24 +02:00
|
|
|
gravity = 1;
|
|
|
|
else
|
2021-05-02 20:21:41 +02:00
|
|
|
gravity = -1;
|
2020-08-16 23:12:04 +02:00
|
|
|
}
|
2021-04-30 02:12:24 +02:00
|
|
|
|
2021-05-02 20:21:41 +02:00
|
|
|
if ((framelevel / FPS) > disappear - 1) {
|
|
|
|
replace_all_block('c', '0', level);
|
|
|
|
}
|
|
|
|
if ((framelevel / FPS) > appear - 1) {
|
|
|
|
replace_all_block('m', 'C', level);
|
|
|
|
}
|
2021-04-30 02:12:24 +02:00
|
|
|
|
2021-05-02 20:21:41 +02:00
|
|
|
// warp
|
2021-05-04 01:46:11 +02:00
|
|
|
if (player_y >= 210)
|
2021-04-30 02:12:24 +02:00
|
|
|
player_y = -4;
|
|
|
|
if (player_y < -6)
|
2021-05-04 01:46:11 +02:00
|
|
|
player_y = 209;
|
2021-04-30 02:12:24 +02:00
|
|
|
|
2021-05-05 01:03:02 +02:00
|
|
|
// Pause menu
|
2021-04-30 02:12:24 +02:00
|
|
|
if (keydown_any(KEY_EXIT, KEY_MENU, 0)) {
|
2021-05-04 01:46:11 +02:00
|
|
|
timer_pause(timer);
|
2021-05-05 01:03:02 +02:00
|
|
|
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;
|
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);
|
2021-04-30 02:12:24 +02:00
|
|
|
// when a level is quit
|
2021-05-05 01:03:02 +02:00
|
|
|
|
|
|
|
//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);
|
|
|
|
}
|
2021-05-05 01:56:02 +02:00
|
|
|
}
|