diff --git a/engine/breeze/world/map.c b/engine/breeze/world/map.c index ac52cd5..5d03052 100644 --- a/engine/breeze/world/map.c +++ b/engine/breeze/world/map.c @@ -276,28 +276,10 @@ void bzTileMapDrawColliders(BzTileMap *map) { } } -bool bzTileMapCanPlace(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) { - for (i32 y = tileY; y < tileY + sizeY; y++) { - for (i32 x = tileX; x < tileX + sizeX; x++) { - - for (i32 i = 0; i < map->layerCount; i++) { - BzTileLayer *layer = map->layers + i; - if (layer->tilesetIdx == -1) continue; - - BzTileset *tileset = map->tilesets + layer->tilesetIdx; - - i16 tile = bzTileLayerGetTile(layer, x, y); - BzTileShape collider = bzTilesetGetTileCollider(tileset, tile); - if (collider.type != BZ_TILE_SHAPE_NONE) - return false; - } - } - } - - return true; -} BzTileCollider bzTileMapGetCollider(BzTileMap *map, i32 x, i32 y) { i32 idx = y * map->width + x; - BZ_ASSERT(idx < 0 && idx < map->collidersCount); + if (idx < 0 || idx >= map->collidersCount) { + return (BzTileCollider) {{BZ_TILE_SHAPE_NONE}}; + } return map->colliderMap[idx]; } diff --git a/engine/breeze/world/map.h b/engine/breeze/world/map.h index c22c631..8d76825 100644 --- a/engine/breeze/world/map.h +++ b/engine/breeze/world/map.h @@ -95,7 +95,6 @@ void bzTileMapDestroy(BzTileMap *tilemap); void bzTileMapDraw(BzTileMap *map); void bzTileMapDrawColliders(BzTileMap *map); -bool bzTileMapCanPlace(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY); BzTileCollider bzTileMapGetCollider(BzTileMap *map, i32 x, i32 y); diff --git a/game/main.c b/game/main.c index 5e95ac1..e56be02 100644 --- a/game/main.c +++ b/game/main.c @@ -27,6 +27,24 @@ bool handleGameObjects(BzTileObjectLayer *objectLayer) { return false; } +bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) { + // Need to check neighbour tiles + tileX -= 1; + tileY -= 1; + sizeX += 2; + sizeY += 2; + + + for (i32 y = tileY; y < tileY + sizeY; y++) { + for (i32 x = tileX; x < tileX + sizeX; x++) { + BzTileCollider collider = bzTileMapGetCollider(map, x, y); + if (collider.shapes[0].type != BZ_TILE_SHAPE_NONE) return false; + } + } + + return true; +} + bool init(Game *game) { int screenWidth = 1280; int screenHeight = 720; @@ -100,7 +118,7 @@ void render(float dt, Game *game) { if (tileX != 0 && tileY != 0) { - bool canPlace = bzTileMapCanPlace(&game->map, tileX, tileY, sizeX, sizeY); + bool canPlace = canBuildOn(&game->map, tileX, tileY, sizeX, sizeY); Color placeColor = canPlace ? (Color) {0, 255, 0, 200} : (Color) {255, 0, 0, 200};