so://phie

freezo

A retro platform game
git clone git://soophie.de/freezo

fix: Fixed frozen enemy collision & shooting range detection


commit: 732cca38e6985660d53a7520e0cf5636a53346d8
parent: c828b946ebb446d3a90149f694b10163d247f68f
author: Sophie <info@soophie.de>
time: 2024-12-17 15:06

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 == enemy

3 ) {

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 wall

36- 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_HEIGHT

42- ) {

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 change

48+ 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_HEIGHT

55+ ) {

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 }

73

74

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 wall

7- 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 wall

22- 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 }

34

35