Big initial commit: States, simulation, presentation, menus, some art.
This commit is contained in:
63
src/shared/grid.c
Normal file
63
src/shared/grid.c
Normal file
@@ -0,0 +1,63 @@
|
||||
#include "grid.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#define GRID_MIN_WIDTH 8
|
||||
#define GRID_MIN_HEIGHT 8
|
||||
|
||||
bool grid_initialize(Grid *grid, uint16_t width, uint16_t height) {
|
||||
assert(grid != NULL);
|
||||
|
||||
if(width < GRID_MIN_WIDTH || height < GRID_MIN_HEIGHT) {
|
||||
return false;
|
||||
}
|
||||
|
||||
grid->width = width;
|
||||
grid->height = height;
|
||||
grid->cells = calloc(width * height, sizeof(Grid_Cell));
|
||||
return true;
|
||||
}
|
||||
|
||||
void grid_dispose(Grid *grid) {
|
||||
assert(grid != NULL);
|
||||
|
||||
free(grid->cells);
|
||||
memset(grid, 0, sizeof(Grid));
|
||||
}
|
||||
|
||||
static bool to_grid_index(Grid *grid, uint16_t x, uint16_t y, uint16_t *out_grid_index) {
|
||||
assert(grid != NULL);
|
||||
assert(out_grid_index != NULL);
|
||||
|
||||
if (!grid || !out_grid_index) return false;
|
||||
if (x >= grid->width || y >= grid->height) return false;
|
||||
|
||||
*out_grid_index = y * grid->width + x;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool from_grid_index(Grid *grid, uint16_t grid_index, uint16_t *out_x, uint16_t *out_y) {
|
||||
assert(grid != NULL);
|
||||
assert(out_x != NULL);
|
||||
assert(out_y != NULL);
|
||||
|
||||
if (!grid || !out_x || !out_y) return false;
|
||||
if (grid_index >= grid->width * grid->height) return false;
|
||||
|
||||
*out_x = grid_index % grid->width;
|
||||
*out_y = grid_index / grid->width;
|
||||
return true;
|
||||
}
|
||||
|
||||
Grid_Cell *grid_get_cell(Grid *grid, uint16_t x, uint16_t y) {
|
||||
assert(grid != NULL);
|
||||
if(x >= grid->width || y >= grid->height) return NULL;
|
||||
|
||||
uint16_t grid_index = 0;
|
||||
if(!to_grid_index(grid, x, y, &grid_index)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &grid->cells[grid_index];
|
||||
}
|
||||
Reference in New Issue
Block a user