Files
PixelDefense/engine/breeze/map/map.h

137 lines
3.5 KiB
C

#ifndef BREEZE_MAP_H
#define BREEZE_MAP_H
#include "tileset.h"
#include "../utils/string.h"
#define BZ_MAP_MAX_LAYERS 8
#define BZ_MAP_MAX_TILESETS 8
#define BZ_MAP_COLLIDER_DEPTH 2
typedef struct BzTileLayer BzTileLayer;
typedef struct BzTileObject BzTileObject;
typedef struct BzTileObjectGroup BzTileObjectGroup;
typedef struct BzTileMap BzTileMap;
typedef void (*BzTileLayerRenderFunc)(BzTileMap *map, BzTileLayer *layer);
typedef void (*BzTileObjectGroupRenderFunc)(BzTileMap *map, BzTileObjectGroup *objectGroup);
extern BzTileLayerRenderFunc BZ_TILE_LAYER_SKIP_RENDER;
extern BzTileObjectGroupRenderFunc BZ_TILE_OBJECTS_SKIP_RENDER;
typedef struct BzTileLayerDesc {
const char *name; // Matches map layer names
BzTileLayerRenderFunc renderer;
} BzTileLayerDesc;
typedef struct BzTileObjectsDesc {
const char *name; // Matches map layer names
BzTileObjectGroupRenderFunc renderer;
BzStringHashFunc hashFunc;
} BzTileObjectsDesc;
typedef struct BzTileMapDesc {
const char *path;
BzTileset tilesets[BZ_MAP_MAX_TILESETS];
BzTileLayerDesc layers[BZ_MAP_MAX_LAYERS];
BzTileObjectsDesc objectGroups[BZ_MAP_MAX_LAYERS];
} BzTileMapDesc;
typedef struct BzTileLayer {
i32 id;
BzTile *data;
i32 dataCount;
BzTile minData;
BzTile maxData;
i32 width;
i32 height;
f32 offsetX;
f32 offsetY;
f32 opacity;
i32 tilesetIdx;
BzTileLayerDesc desc;
bool hasOwnership;
} BzTileLayer;
typedef struct BzTileObject {
u32 id;
BzTile gid;
BzTileShape shape;
} BzTileObject;
typedef struct BzTileObjectGroup {
BzTileObject *objects;
i32 objectCount;
BzTile minGID;
BzTile maxGID;
i32 tilesetIdx;
BzTileObjectsDesc desc;
bool hasOwnership;
} BzTileObjectGroup;
typedef struct BzTileCollider {
BzTileShape shapes[BZ_MAP_COLLIDER_DEPTH];
} BzTileCollider;
typedef struct BzTileMap {
Color backgroundColor;
i32 width;
i32 height;
i32 tileWidth;
i32 tileHeight;
BzTileCollider *colliderMap;
i32 collidersCount;
BzTileLayer layers[BZ_MAP_MAX_LAYERS];
i32 layerCount;
BzTileObjectGroup objectGroups[BZ_MAP_MAX_LAYERS];
i32 objectGroupCount;
BzTileset tilesets[BZ_MAP_MAX_TILESETS];
i32 tilesetCount;
bool isValid;
} BzTileMap;
extern BzTileMap BZ_TILEMAP_INVALID;
// Return true, if you want to override data pointer (you are responsible for cleanup, if you override)
typedef bool (*BzTileLayerFunc)(BzTileMap *map, BzTileLayer *layer);
typedef bool (*BzTileObjectsFunc)(BzTileMap *map, BzTileObjectGroup *objectGroup);
extern BzTileLayerFunc BZ_TILE_LAYER_CLEAR;
extern BzTileObjectsFunc BZ_TILE_OBJECTS_CLEAR;
BzTile bzTileLayerGetTile(BzTileLayer *layer, i32 x, i32 y);
void bzTileLayerSetTile(BzTileLayer *layer, BzTile tile, i32 x, i32 y, i32 w, i32 h);
BzTileset *bzTileLayerGetTileset(BzTileMap *map, BzTileLayer *layer);
BzTileset *bzTileObjectGroupGetTileset(BzTileMap *map, BzTileObjectGroup *objectGroup);
BzTileMap bzTileMapCreate(const BzTileMapDesc *desc);
void bzTileMapDestroy(BzTileMap *map);
void bzTileMapOverrideLayer(BzTileMap *map, i32 slotID, BzTileLayerFunc func);
void bzTileMapOverrideObjectGroup(BzTileMap *map, i32 slotID, BzTileObjectsFunc func);
BzTileLayer *bzTileMapGetLayer(BzTileMap *map, i32 slotID);
BzTileObjectGroup *bzTileMapGetObjects(BzTileMap *map, i32 slotID);
void bzTileMapDraw(BzTileMap *map);
void bzTileMapDrawColliders(BzTileMap *map);
BzTileCollider bzTileMapGetCollider(BzTileMap *map, i32 x, i32 y);
void bzTileMapUpdateCollider(BzTileMap *map, i32 x, i32 y);
#endif //BREEZE_MAP_H