From 6bd8858e78dd1b70189a70a90a9ec2e683cbfbc9 Mon Sep 17 00:00:00 2001 From: KikooDX Date: Sun, 4 Apr 2021 17:33:17 +0200 Subject: [PATCH] Gold and exit lock --- assets/graphics/tileset.png | Bin 901 -> 698 bytes include/conf.h | 2 +- include/level.h | 2 ++ include/player.h | 1 + include/tiles.h | 2 ++ sle-mtem | 3 ++- src/level/load.c | 14 ++++++++++++++ src/player/collide.c | 26 ++++++++++++++++++++++++++ src/player/draw.c | 4 ++++ src/player/update.c | 16 +++++++++++++++- 10 files changed, 67 insertions(+), 3 deletions(-) diff --git a/assets/graphics/tileset.png b/assets/graphics/tileset.png index 42d7f6410005fbfe4f8824e1d4fe37a8187410b4..86f3f03221781592e379fa6038eeed57b7fd9f25 100644 GIT binary patch literal 698 zcmV;r0!96aP)AHIP0004SX+uL$X=7sm z04R}lk-ba9Kp4iKen|bObkIShLxw62EffWD)H-x2QfdXOF3B}%g(MA^6e+HPi$lRd zbn$EOKhRZhRS*P45OMJz@N1D0-)jmj(%x}-e>}P8%>Z9N@hr2rLp)EM*>Wtwd&Hxx zEEkDSh~u0NNPH`F#p5@@C6B)Z^L%a*@Qa>Ose_dcW@T;=PZ7rqy~$RUjsBq*q26FM9usG5{ncVDvUTSA3AjJ_6X;N&QwOx`%DRqCoz)ks%q>Zpm_ z|L19IGt*x8a0=*qb=}ViAhZuO>aP2H>bi|HAn*cQn{9uEa+>=lz24Sh$3SEUxV&j= z$^me-3yeKmGMAfDfR>Ze0woN? zCXB!)3`0sr$O<%ROuqOp$jf=ZLHLDFvQ8-+z3yaNHi8ysB31qk5q^j#=-$7db z8perO-okVtmh-?EJz#O9a&vE8YFwZ&uFK-lJ1mZ~Tb*!GA+5 z+DkKNQg8i%>u#67%9UrSoO^rc`}N{;pUch_ACSMkb=@``U$ zWO7|t*7h@UIYK^y%09D%v|m{8c$unf-e2o{e_v+U(Zwh4FX>V3vtj+{=Bn#?ea)3Q zFCu@IoYMM!zw*}3iHYm04cL17*Zsc5?t436?T&ZP7rqYbSNOp2-0kjuEz91$-Ek|k zC)RT09(d^*>;3+~O|_D{vo*E9>awQ%Dz>b!Y}}?&661V&()7^WxsR=9L{C@W)pXbP z#q_@mpXy&Zp8oAAPnJ0_0yqmiB8wRqxP?HN@zUM8KfvhN>*?YcQgQ3;?Tfrk1|qBh zuVi{2Ea!Wy*7rb-Z}I%T2XdxIQSB0|&)K(MV6@+u z`L1i-_Zf4F-yNSZ$6+z6K}*f`_9t_=>+88ra+*XiSU&Wh>frZdDg%(M`f$Eh #include #include @@ -69,10 +70,23 @@ void level_load(void) "file size doesn't make sense"); /* read file content */ + level.gold = 0; + level.exit_locked = 0; for (i = 0; i < level_size; i += 1) { tile = read_merge_bytes(file, tile_size); assert(tile != (Tile)-1, "can't read tile"); level.data[i] = tile; + /* special tiles */ + switch (tile) { + case TILE_GOLD: + level.gold += 1; + break; + case TILE_SWITCH: + level.exit_locked = 1; + break; + default: + break; + } } /* close file */ diff --git a/src/player/collide.c b/src/player/collide.c index 42e6838..b618e5f 100644 --- a/src/player/collide.c +++ b/src/player/collide.c @@ -9,6 +9,7 @@ extern struct Level level; static Tile collide_single(int x, int y); +static int collide_sub_single(int x, int y, Tile sub, Tile rep); void player_collide(Tile collisions[COLLIDE_POINTS], int x, int y) { @@ -32,6 +33,17 @@ int player_collide_tile(Tile collisions[COLLIDE_POINTS], int x, int y, return 0; } +/* collide and replace tiles, return the number of tiles affecter */ +int player_collide_sub(int x, int y, Tile sub, Tile rep) +{ + const int rx = x + PLAYER_WIDTH - 1; + const int dy = y + PLAYER_HEIGHT - 1; + return collide_sub_single(x, y, sub, rep) + + collide_sub_single(rx, y, sub, rep) + + collide_sub_single(x, dy, sub, rep) + + collide_sub_single(rx, dy, sub, rep); +} + int player_collide_solid(int x, int y) { Tile collisions[COLLIDE_POINTS]; @@ -47,3 +59,17 @@ static Tile collide_single(int x, int y) return TILE_OOB; return level.data[tx + ty * level.width]; } + +/* try collide and replace tile at pixel position, return 1 if tile + * replaced */ +static int collide_sub_single(int x, int y, Tile sub, Tile rep) +{ + if (collide_single(x, y) == sub) { + const int tile_index = + (int)(x / TILE_WIDTH) + + (int)(y / TILE_WIDTH) * level.width; + level.data[tile_index] = rep; + return 1; + } + return 0; +} diff --git a/src/player/draw.c b/src/player/draw.c index adfb7d1..1f665a4 100644 --- a/src/player/draw.c +++ b/src/player/draw.c @@ -2,9 +2,12 @@ /* Copyright (C) 2021 KikooDX */ #include "conf.h" +#include "level.h" #include "player.h" #include +extern struct Level level; + extern bopti_image_t bimg_player; extern bopti_image_t bimg_burst; @@ -14,4 +17,5 @@ void player_draw(struct Player player) if (player.air_state == AirRising && player.jumps_left < AIR_JUMPS) dimage(player.x, player.y + PLAYER_HEIGHT, &bimg_burst); + dprint(2, 2, C_WHITE, "%d", level.gold); } diff --git a/src/player/update.c b/src/player/update.c index 99fed65..d4096da 100644 --- a/src/player/update.c +++ b/src/player/update.c @@ -2,12 +2,15 @@ /* Copyright (C) 2021 KikooDX */ #include "conf.h" +#include "level.h" #include "player.h" #include "tiles.h" #include static void player_move(struct Player *player, int x, int y); +extern struct Level level; + /* return 1 if exit reached, -1 on death/reset and 0 otherwise */ int player_update(struct Player *player) { @@ -101,8 +104,19 @@ int player_update(struct Player *player) player_move(player, 0, spd_y); player_move(player, spd_x, 0); + /* get gold ($$$) */ + level.gold -= player_collide_sub(player->x, player->y, + TILE_GOLD, TILE_VOID); + + /* unlock exit */ + if (level.exit_locked && + player_collide_sub(player->x, player->y, TILE_SWITCH, + TILE_VOID)) + level.exit_locked = 0; + /* check for death and exit */ - if (player_collide_tile(collisions, player->x, player->y, + if (!level.exit_locked && + player_collide_tile(collisions, player->x, player->y, TILE_EXIT, 1)) return 1; if (player_collide_tile(collisions, player->x, player->y,