A retro platform game
git clone git://soophie.de/freezo
diff --git a/src/enemy.c b/src/enemy.c
index 4dd7151..dbaeaf4 100644
--- a/src/enemy.c
+++ b/src/enemy.c
1
@@ -79,11 +79,25 @@ void enemy_update(enemy_t *enemy, game_t *game) {2
game->player->target_entity->enemy == enemy3
) {4
if (enemy->frozen) {5
- if (game->player->dir > 0) {6
- enemy->pos.x += 2.0;7
+ bool is_colliding = false;8
+ rect_t enemy_rect = { enemy->pos.x, enemy->pos.y, ENEMY_WIDTH, ENEMY_HEIGHT };9
+ for (int i = 0; i < game->tiles_len; i++) {10
+ tile_t *tile = game->tiles[i];11
+ if (tile_wall(tile)) {12
+ rect_t tile_rect = { tile->pos.x, tile->pos.y, TILE_WIDTH, TILE_HEIGHT };13
+ if (rect_collide(enemy_rect, tile_rect)) {14
+ is_colliding = true;15
+ break;16
+ }17
+ }18
}19
- else {20
- enemy->pos.x -= 2.0;21
+ if (!is_colliding) {22
+ if (game->player->dir > 0) {23
+ enemy->pos.x += 2.0;24
+ }25
+ else {26
+ enemy->pos.x -= 2.0;27
+ }28
}29
}30
else {31
@@ -127,23 +141,25 @@ void enemy_update(enemy_t *enemy, game_t *game) {32
enemy->pos.x += enemy->dir * 0.5;33
}34
}35
- // detect wall36
- for (int i = 0; i < game->tiles_len; i++) {37
- tile_t *tile = game->tiles[i];38
- if (tile_wall(tile)) {39
- if (40
- enemy->pos.y + ENEMY_HEIGHT > tile->pos.y &&41
- enemy->pos.y < tile->pos.y + TILE_HEIGHT42
- ) {43
- float tolerance = 4.0;44
- if (enemy->dir > 0) {45
- if (fabs((enemy->pos.x + ENEMY_WIDTH - 0.4 * TILE_WIDTH) - tile->pos.x) < tolerance) {46
- enemy->dir = -enemy->dir;47
+ // detect wall and direction change48
+ if (!enemy->frozen) {49
+ for (int i = 0; i < game->tiles_len; i++) {50
+ tile_t *tile = game->tiles[i];51
+ if (tile_wall(tile)) {52
+ if (53
+ enemy->pos.y + ENEMY_HEIGHT > tile->pos.y &&54
+ enemy->pos.y < tile->pos.y + TILE_HEIGHT55
+ ) {56
+ float tolerance = 4.0;57
+ if (enemy->dir > 0) {58
+ if (fabs((enemy->pos.x + ENEMY_WIDTH - 0.4 * TILE_WIDTH) - tile->pos.x) < tolerance) {59
+ enemy->dir = -enemy->dir;60
+ }61
}62
- }63
- else {64
- if (fabs((enemy->pos.x + 0.4 * TILE_WIDTH) - (tile->pos.x + TILE_WIDTH)) < tolerance) {65
- enemy->dir = -enemy->dir;66
+ else {67
+ if (fabs((enemy->pos.x + 0.4 * TILE_WIDTH) - (tile->pos.x + TILE_WIDTH)) < tolerance) {68
+ enemy->dir = -enemy->dir;69
+ }70
}71
}72
}
diff --git a/src/player.c b/src/player.c
index 224571e..93af778 100644
--- a/src/player.c
+++ b/src/player.c
1
@@ -285,22 +285,28 @@ void player_update(player_t *player, game_t *game) {2
rect_t tile_rect = { tile->pos.x, tile->pos.y, TILE_WIDTH, TILE_HEIGHT };3
if (rect_collide(shooting_rect, tile_rect)) {4
if (player->dir > 0) {5
- player->shooting_distance = tile->pos.x - (player->pos.x + PLAYER_WIDTH);6
// clear target if it stands behind a wall7
- if (player->target_entity != NULL) {8
+ if (player->target_entity == NULL) {9
+ player->shooting_distance = tile->pos.x - (player->pos.x + PLAYER_WIDTH);10
+ }11
+ else {12
rect_t rect = entity_get_rect(player->target_entity);13
if (rect.x > tile->pos.x) {14
player->target_entity = NULL;15
+ player->shooting_distance = tile->pos.x - (player->pos.x + PLAYER_WIDTH);16
}17
}18
}19
else {20
- player->shooting_distance = player->pos.x - (tile->pos.x + TILE_WIDTH);21
// clear target if it stands behind a wall22
- if (player->target_entity != NULL) {23
+ if (player->target_entity == NULL) {24
+ player->shooting_distance = player->pos.x - (tile->pos.x + TILE_WIDTH);25
+ }26
+ else {27
rect_t rect = entity_get_rect(player->target_entity);28
if (rect.x + rect.width < tile->pos.x + TILE_WIDTH) {29
player->target_entity = NULL;30
+ player->shooting_distance = player->pos.x - (tile->pos.x + TILE_WIDTH);31
}32
}33
}