diff options
Diffstat (limited to 'map.c')
-rw-r--r-- | map.c | 34 |
1 files changed, 34 insertions, 0 deletions
@@ -152,6 +152,7 @@ void generate_enemies(const Map* m, World* w) { (m->collision[x + y * map_w] == 1 && \ m->collision[x + (y - 1) * map_w] == 0) int x, y, ex = map_w - 1, ey = map_h - 1; + /* enemies on platforms */ for (y = 1; y < ey; y++) { for (x = 1; x < ex; x++) { int plat = -1; @@ -176,6 +177,39 @@ void generate_enemies(const Map* m, World* w) { for (; check && x < ex; x++); } } + /* flying enemies */ + for (y = 1; y < ey; y++) + for (x = 1; x < ex; x++) { + Rect rect = { 0 }; + int i, j; + rect.x = x; + rect.y = y; + for (j = y; j < ey; j++) { + if (m->collision[i + j * map_w]) + rect.h = 0; + for (i = x, rect.w = 0; i < ex && rect.h > 3; i++) { + if (!m->collision[i + j * map_w]) + rect.w++; + if (rect.w > 4) { + Enemy* e; + e = inst_enemy( + w, + enemy_fly, + ((x + (rect.w >> 1)) * map_tile_size) << fbits, + ((y + (rect.h >> 1)) * map_tile_size) << fbits + ); + e->face = get_r() & 1; + x = i; + y = j; + rect.w = 0; + rect.h = 0; + goto found; + } + } + rect.h++; + } + found:; + } } void generate_floor(Map* m, World* w) { |