diff --git a/CMakeLists.txt b/CMakeLists.txt index eabb342..1faeda8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,10 @@ set(ASSETS_cg assets-cg/img/end.png assets-cg/img/door.png assets-cg/img/key.png + assets-cg/img/conveyor_u.png + assets-cg/img/conveyor_r.png + assets-cg/img/conveyor_d.png + assets-cg/img/conveyor_l.png # ... ) diff --git a/assets-cg/img/conveyor_d.png b/assets-cg/img/conveyor_d.png new file mode 100644 index 0000000..3b85b89 Binary files /dev/null and b/assets-cg/img/conveyor_d.png differ diff --git a/assets-cg/img/conveyor_l.png b/assets-cg/img/conveyor_l.png new file mode 100644 index 0000000..a20cd6c Binary files /dev/null and b/assets-cg/img/conveyor_l.png differ diff --git a/assets-cg/img/conveyor_r.png b/assets-cg/img/conveyor_r.png new file mode 100644 index 0000000..9bda325 Binary files /dev/null and b/assets-cg/img/conveyor_r.png differ diff --git a/assets-cg/img/conveyor_u.png b/assets-cg/img/conveyor_u.png new file mode 100644 index 0000000..ea647eb Binary files /dev/null and b/assets-cg/img/conveyor_u.png differ diff --git a/assets-cg/img/fxconv-metadata.txt b/assets-cg/img/fxconv-metadata.txt index e66bf67..2a63c86 100644 --- a/assets-cg/img/fxconv-metadata.txt +++ b/assets-cg/img/fxconv-metadata.txt @@ -20,4 +20,20 @@ door.png: key.png: type: bopti-image - name: img_key \ No newline at end of file + name: img_key + +conveyor_u.png: + type: bopti-image + name: img_conveyor_u + +conveyor_r.png: + type: bopti-image + name: img_conveyor_r + +conveyor_d.png: + type: bopti-image + name: img_conveyor_d + +conveyor_l.png: + type: bopti-image + name: img_conveyor_l \ No newline at end of file diff --git a/include/main.h b/include/main.h index 1b552bd..94759ef 100644 --- a/include/main.h +++ b/include/main.h @@ -1,19 +1,25 @@ #pragma once -#define LEVEL_NB 2 +#define LEVEL_NB 3 #define LEVEL_SIZE 16 #define TILE_SIZE 12 #define PLAYER_SIZE 10 -/* struct for a pair of values */ +/* struct for a pair of int values */ typedef struct Vec2 { int x, y; } Vec2; +/* struct for a pair of float values */ +typedef struct FVec2 { + float x, y; +} FVec2; + /* struct for player's data */ typedef struct Player { Vec2 pos; Vec2 spawn; + FVec2 frac; } Player; /* used for tiles */ diff --git a/levels/level3.kble b/levels/level3.kble index 924eff0..130e951 100644 Binary files a/levels/level3.kble and b/levels/level3.kble differ diff --git a/levels/tileset.png b/levels/tileset.png index afdba74..cda6069 100644 Binary files a/levels/tileset.png and b/levels/tileset.png differ diff --git a/src/levels.c b/src/levels.c index 1001129..8ed49a6 100644 --- a/src/levels.c +++ b/src/levels.c @@ -37,5 +37,24 @@ const tile_t level[LEVEL_NB][LEVEL_SIZE][LEVEL_SIZE] = { 2, 0, 6, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 6, 0, 2, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 - } + }, + + { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 8, 8, 8, 8, 4, 6, 8, 8, 8, 8, 8, 8, 2, 2, + 2, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 2, + 2, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 2, + 2, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 8, 9, 9, 9, 2, + 2, 4, 7, 4, 2, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 2, + 2, 6, 7, 6, 2, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 2, + 2, 7, 7, 7, 0, 0, 1, 2, 2, 2, 2, 2, 9, 9, 9, 2, + 2, 7, 7, 7, 2, 2, 2, 2, 2, 3, 0, 5, 9, 9, 9, 2, + 2, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 6, 9, 6, 2, + 2, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 4, 9, 4, 2, + 2, 7, 7, 7, 10, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, 2, + 2, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 2, + 2, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 2, + 2, 2, 10, 10, 10, 10, 10, 10, 6, 4, 10, 10, 10, 10, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 + } }; \ No newline at end of file diff --git a/src/main.c b/src/main.c index 61dda78..c491fc9 100644 --- a/src/main.c +++ b/src/main.c @@ -85,6 +85,10 @@ int main(void) { extern bopti_image_t img_end; extern bopti_image_t img_door; extern bopti_image_t img_key; + extern bopti_image_t img_conveyor_u; + extern bopti_image_t img_conveyor_r; + extern bopti_image_t img_conveyor_d; + extern bopti_image_t img_conveyor_l; extern tile_t level[LEVEL_NB][LEVEL_SIZE][LEVEL_SIZE]; @@ -96,7 +100,8 @@ int main(void) { /* player */ Player player = { .pos = {0, 0}, - .spawn = {0, 0} + .spawn = {0, 0}, + .frac = {0, 0} }; memcpy(curr_level, level[lvl], sizeof(level[lvl])); @@ -133,12 +138,32 @@ int main(void) { dsubimage(m * TILE_SIZE, n * TILE_SIZE, &img_key, ((timer / 30) % 4) * 12, 0, 12, 12, 0); break; + + case 7: + /* key ring */ + dsubimage(m * TILE_SIZE, n * TILE_SIZE, &img_conveyor_u, + ((timer / 15) % 6) * 12, 0, 12, 12, 0); + break; + case 8: + /* key ring */ + dsubimage(m * TILE_SIZE, n * TILE_SIZE, &img_conveyor_r, + ((timer / 15) % 6) * 12, 0, 12, 12, 0); + break; + case 9: + /* key ring */ + dsubimage(m * TILE_SIZE, n * TILE_SIZE, &img_conveyor_d, + ((timer / 15) % 6) * 12, 0, 12, 12, 0); + break; + case 10: + /* key ring */ + dsubimage(m * TILE_SIZE, n * TILE_SIZE, &img_conveyor_l, + ((timer / 15) % 6) * 12, 0, 12, 12, 0); + break; } } } dprint(0, 0, C_BLACK, "%d", lvl); - /* drawing the player */ dimage(player.pos.x, player.pos.y, &img_player); @@ -150,16 +175,37 @@ int main(void) { }; clearevents(); + /* conveyors */ + if(collide(player.pos, 0, 7, curr_level)) { player.frac.y -= 0.5; } + if(collide(player.pos, 0, 8, curr_level)) { player.frac.x += 0.5; } + if(collide(player.pos, 0, 9, curr_level)) { player.frac.y += 0.5; } + if(collide(player.pos, 0, 10, curr_level)) { player.frac.x -= 0.5; } + + /* little accelerations (like conveyors) */ + const int ifrac_x = player.frac.x; + player.frac.x -= ifrac_x; + mov.x += ifrac_x; + + const int ifrac_y = player.frac.y; + player.frac.y -= ifrac_y; + mov.y += ifrac_y; + /* trying to move the player >w< */ if(!collide((Vec2){player.pos.x + mov.x, player.pos.y}, 0, 2, curr_level) && !collide((Vec2){player.pos.x + mov.x, player.pos.y}, 1, 5, curr_level)) { player.pos.x += mov.x; } + else { + player.frac = (FVec2){ 0, 0 }; + } if(!collide((Vec2){player.pos.x, player.pos.y + mov.y}, 0, 2, curr_level) && !collide((Vec2){player.pos.x, player.pos.y + mov.y}, 1, 5, curr_level)) { player.pos.y += mov.y; } + else { + player.frac = (FVec2){ 0, 0 }; + } /* d i e */ if(collide(player.pos, 2, 4, curr_level)) {