diff --git a/include/main.h b/include/main.h index 708ad03..c2d5d8d 100644 --- a/include/main.h +++ b/include/main.h @@ -3,6 +3,7 @@ #include "camera.h" #include "input.h" +/* returns true if player died */ int play_level(uint level_id); /* callback used for UPS control */ int callback(volatile void *arg); diff --git a/include/player.h b/include/player.h index a5a30b3..4cd5af2 100644 --- a/include/player.h +++ b/include/player.h @@ -13,6 +13,7 @@ typedef struct Player { Vec origin; /* the origin of the sprite (offset) */ uint grace; /* coyot jump */ bool jump_held; /* used to control jump height */ + bool dead; /* set to true the player will die */ } Player; #include "level.h" diff --git a/include/tiles.h b/include/tiles.h index 4c09b2e..e0b8a74 100644 --- a/include/tiles.h +++ b/include/tiles.h @@ -9,10 +9,12 @@ typedef unsigned char Tile_flags; /* the tile properties (bitmask) */ /* define flags */ #define F_SOLID 0b1 #define F_SLIPPERY 0b10 +#define F_SPIKY 0b100 /* define properties */ #define P_AIR (0) #define P_BASE (F_SOLID) +#define P_SPIKE (F_SPIKY) #define P_UNKNOWN (0) enum { diff --git a/src/main.c b/src/main.c index 8c4ecab..9d50a8a 100644 --- a/src/main.c +++ b/src/main.c @@ -20,7 +20,7 @@ int main(void) { init(); /* initialize gint */ /* main game loop */ - play_level(1); + while (play_level(1)) {}; /* return to menu */ return 1; @@ -35,7 +35,8 @@ int play_level(uint level_id) { .vbox = {7, 7}, .origin = {0 * VEC_PRECISION, 0 * VEC_PRECISION}, .grace = 0, - .jump_held = false + .jump_held = false, + .dead = false }; /* set level */ @@ -56,7 +57,8 @@ int play_level(uint level_id) { /* UPS control */ volatile int has_ticked = 1; - timer_start(timer_setup(TIMER_ANY, 1000000/UPS, callback, &has_ticked)); + int timer = timer_setup(TIMER_ANY, 1000000/UPS, callback, &has_ticked); + timer_start(timer); uint step = 0; @@ -69,11 +71,17 @@ int play_level(uint level_id) { /* step event is where all the logic happens */ step += 1; step_event(&player, level, &camera, &input, step); + /* player death check */ + if(player.dead) { + timer_stop(timer); + return 1; + } } /* draw event just draws stuff */ draw_event(&player, level, &camera, &input, step); } - return 1; + timer_stop(timer); + return 0; } int callback(volatile void *arg) { diff --git a/src/player.c b/src/player.c index cd448be..6f0c16d 100644 --- a/src/player.c +++ b/src/player.c @@ -109,6 +109,10 @@ void player_step(Player *player, Input *input, const Level *level, uint step) { player->jump_held = false; } player_move(player, level); /* move the player according to their speed */ + /* player death */ + if (player_collide_or(player, player->pos, level) & F_SPIKY) { + player->dead = true; + } } void player_draw(Player *player, Camera *camera) { diff --git a/src/tiles.c b/src/tiles.c index f000079..c8dae90 100644 --- a/src/tiles.c +++ b/src/tiles.c @@ -3,9 +3,11 @@ Tile_flags tile_get_flags(Tile tile) { switch (tile) { case ID_AIR: - case ID_CHAIN: return P_AIR; break; + case ID_CHAIN: + return P_SPIKE; + break; case ID_BASE_0: case ID_BASE_1: case ID_BASE_2: