46 lines
1.0 KiB
C
46 lines
1.0 KiB
C
#ifndef _map_h_
|
|
#define _map_h_
|
|
|
|
#define EMPTY_ENTRY(entry) ((entry)->value == 0)
|
|
|
|
#define MAP_FOR_EACH(map, ex, ey, ez, ew) \
|
|
for (unsigned int i = 0; i <= map->mask; i++) { \
|
|
MapEntry *entry = map->data + i; \
|
|
if (EMPTY_ENTRY(entry)) { \
|
|
continue; \
|
|
} \
|
|
int ex = entry->e.x + map->dx; \
|
|
int ey = entry->e.y + map->dy; \
|
|
int ez = entry->e.z + map->dz; \
|
|
int ew = entry->e.w;
|
|
|
|
#define END_MAP_FOR_EACH }
|
|
|
|
typedef union {
|
|
unsigned int value;
|
|
struct {
|
|
unsigned char x;
|
|
unsigned char y;
|
|
unsigned char z;
|
|
char w;
|
|
} e;
|
|
} MapEntry;
|
|
|
|
typedef struct {
|
|
short dx;
|
|
short dy;
|
|
short dz;
|
|
unsigned int mask;
|
|
unsigned int size;
|
|
MapEntry *data;
|
|
} Map;
|
|
|
|
void map_alloc(Map *map, int dx, int dy, int dz, int mask);
|
|
void map_free(Map *map);
|
|
void map_copy(Map *dst, Map *src);
|
|
void map_grow(Map *map);
|
|
int map_set(Map *map, int x, int y, int z, int w);
|
|
int map_get(Map *map, int x, int y, int z);
|
|
|
|
#endif
|