Add neighbour solid counts

This is preparing for the tile sprites rework
scene_man
En Yi 2024-05-06 22:04:53 +08:00
parent 501a599336
commit d7113d42fe
3 changed files with 70 additions and 0 deletions

View File

@ -17,8 +17,11 @@ typedef enum TileRotation
TILE_180ROT
}TileRotation_t;
// Some of the fields are game-dependent, may have to think about doing OOP
// to separate out standard fields vs context-dependent fields
typedef struct Tile {
unsigned int tile_type;
uint8_t connectivity;
SolidType_t solid;
TileRotation_t rotation;
uint8_t def;

View File

@ -479,6 +479,11 @@ static void render_editor_game_scene(Scene_t* scene)
// Draw water tile
DrawText(buffer, x, y, 10, BLACK);
}
if (tilemap.tiles[i].solid == SOLID)
{
sprintf(buffer, "%u", tilemap.tiles[i].connectivity);
DrawText(buffer, x + tilemap.tile_size / 2, y + tilemap.tile_size / 2, 12, WHITE);
}
}
}

View File

@ -223,6 +223,7 @@ void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_ty
}
tilemap->tiles[tile_idx].rotation = TILE_NOROTATE;
if (new_type == SPIKES)
{
// Priority: Down, Up, Left, Right
@ -272,4 +273,65 @@ void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_ty
);
tilemap->tiles[tile_idx].def = (tilemap->tiles[tile_idx].tile_type == SOLID_TILE) ? 5: 2;
tilemap->tiles[tile_idx].connectivity = 0;
const uint8_t LEFT_BIT = 0;
const uint8_t UP_BIT = 1;
const uint8_t RIGHT_BIT = 2;
const uint8_t DOWN_BIT = 3;
{
// Priority: Left, Up, Right, Down
if (tile_idx % tilemap->width != 0)
{
tilemap->tiles[tile_idx].connectivity |= (tilemap->tiles[tile_idx - 1].tile_type == SOLID_TILE) ? (1 << LEFT_BIT) : 0;
if (new_type == SOLID_TILE)
{
tilemap->tiles[tile_idx - 1].connectivity |= (1 << RIGHT_BIT);
}
else
{
tilemap->tiles[tile_idx - 1].connectivity &= ~(1 << RIGHT_BIT);
}
}
if (tile_idx - tilemap->width >= 0)
{
tilemap->tiles[tile_idx].connectivity |= (tilemap->tiles[tile_idx - tilemap->width].tile_type == SOLID_TILE) ? (1 << UP_BIT) : 0;
if (new_type == SOLID_TILE)
{
tilemap->tiles[tile_idx - tilemap->width].connectivity |= (1 << DOWN_BIT);
}
else
{
tilemap->tiles[tile_idx - tilemap->width].connectivity &= ~(1 << DOWN_BIT);
}
}
if (tile_idx + tilemap->width < tilemap->n_tiles)
{
tilemap->tiles[tile_idx].connectivity |= (tilemap->tiles[tile_idx + tilemap->width].tile_type == SOLID_TILE) ? (1 << DOWN_BIT) : 0;
if (new_type == SOLID_TILE)
{
tilemap->tiles[tile_idx + tilemap->width].connectivity |= (1 << UP_BIT);
}
else
{
tilemap->tiles[tile_idx + tilemap->width].connectivity &= ~(1 << UP_BIT);
}
}
if ((tile_idx + 1) % tilemap->width != 0)
{
tilemap->tiles[tile_idx].connectivity |= (tilemap->tiles[tile_idx + 1].tile_type == SOLID_TILE) ? (1 << RIGHT_BIT) : 0;
if (new_type == SOLID_TILE)
{
tilemap->tiles[tile_idx + 1].connectivity |= (1 << LEFT_BIT);
}
else
{
tilemap->tiles[tile_idx + 1].connectivity &= ~(1 << LEFT_BIT);
}
}
}
}