190 lines
5.3 KiB
C
190 lines
5.3 KiB
C
/****** map.c
|
|
All functions pertaining to creating, modifying, and freeing maps. Also contains map-drawing functions and functions that place Tiles on a Map.
|
|
******/
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "wall.h"
|
|
#include "map.h"
|
|
#include "tile.h"
|
|
#include "common.h"
|
|
|
|
int allocateMapTiles(struct Tile*** memory, unsigned int rows, unsigned int cols) {
|
|
int i;
|
|
//*memory = calloc(rows, sizeof(struct Tile));
|
|
*memory = calloc(rows, sizeof *memory);
|
|
for(i=0;i<rows;i++)
|
|
(*memory)[i] = calloc(cols, sizeof(struct Tile));
|
|
return SUCCESS;
|
|
}
|
|
|
|
|
|
void freeMapTiles(struct Tile*** memory, unsigned int rows, unsigned int cols) {
|
|
int i;
|
|
for (i=0;i<rows;i++) {
|
|
free((*memory)[i]);
|
|
}
|
|
free(*memory);
|
|
}
|
|
|
|
void freeMap(struct Map **map) {
|
|
int x, y;
|
|
//for(x=0;x<(*map)->width;x++) {
|
|
for(x=0;x<(*map)->width;x++) {
|
|
for(y=0;y<(*map)->height;y++) {
|
|
struct Tile* tile;
|
|
struct Tile* next_tile;
|
|
if ((*map)->matrix[x][y].next);
|
|
next_tile = (*map)->matrix[x][y].next;
|
|
tile = (*map)->matrix[x][y].next;
|
|
while(next_tile) {
|
|
// TODO: test, does this actually free properly?
|
|
//freeTile(&*tile);
|
|
tile = next_tile->next;
|
|
next_tile = next_tile->next;
|
|
freeTile(tile);
|
|
//free(tile);
|
|
//tile = tile->next;
|
|
}
|
|
}
|
|
}
|
|
freeMapTiles(&(*map)->matrix, (*map)->width, (*map)->height);
|
|
//free(map);
|
|
//map = NULL;
|
|
}
|
|
|
|
int allocateMap(struct Map** map, unsigned int width, unsigned int height) {
|
|
*map = malloc(sizeof(struct Map));
|
|
if (map == NULL) {
|
|
printf("ERROR: could not malloc Map");
|
|
return ERROR;
|
|
}
|
|
(*map)->width = width;
|
|
(*map)->height = height;
|
|
|
|
allocateMapTiles(&(*map)->matrix, width, height);
|
|
int x, y;
|
|
for (x=0;x<width;x++) {
|
|
for (y=0;y<height;y++) {
|
|
(*map)->matrix[x][y].next = NULL;
|
|
(*map)->matrix[x][y].prev = NULL;
|
|
(*map)->matrix[x][y].x = x;
|
|
(*map)->matrix[x][y].y = y;
|
|
}
|
|
}
|
|
return SUCCESS;
|
|
}
|
|
|
|
void replaceTile(struct Tile *tile, unsigned int tid, short id) {
|
|
tile->tid = tid;
|
|
tile->id = id;
|
|
// @@ CHECK IT OUT
|
|
free(tile->data); // free old data, just in case
|
|
tile->data = NULL;
|
|
if (tid == FLOOR) {
|
|
tile->data = malloc(sizeof(FloorTile));
|
|
memcpy(tile->data, &floors[id], sizeof(FloorTile)); // copy default properties in
|
|
} else if (tid == WALL) {
|
|
tile->data = malloc(sizeof(WallTile));
|
|
memcpy(tile->data, &walls[id], sizeof(WallTile));
|
|
} else if (tid == DOOR) {
|
|
tile->data = malloc(sizeof(struct DoorTile));
|
|
memcpy(tile->data, &doors[id], sizeof(struct DoorTile));
|
|
}
|
|
}
|
|
|
|
void appendTile(struct Tile *tile, unsigned int tid, short id) {
|
|
struct Tile *new_tile = newTile(tid, id, tile->x, tile->y);
|
|
new_tile->prev = tile;
|
|
tile->next = new_tile;
|
|
}
|
|
|
|
void floodMap(struct Map** map, unsigned int operation, unsigned int tid, short id) {
|
|
int x, y;
|
|
for(x=0;x < (*map)->width;x++) {
|
|
for(y=0;y < (*map)->height;y++) {
|
|
if (operation == TILE_REPLACE) {
|
|
replaceTile(&((*map)->matrix[x][y]), tid, id);
|
|
(*map)->matrix[x][y].x = x;
|
|
(*map)->matrix[x][y].y = y;
|
|
} else if (operation == TILE_APPEND) {
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void drawPath(struct Map** map, unsigned int operation, unsigned int tid, short id, unsigned int from_x, unsigned int from_y, unsigned int to_x, unsigned int to_y) {
|
|
int diff_x = from_x-to_x;
|
|
int diff_y = from_y-to_y;
|
|
int x_inc = (diff_x < 0 ? 1 : -1);
|
|
int y_inc = (diff_y < 0 ? 1 : -1);
|
|
int total = abs(diff_x)+abs(diff_y)*2; // FIXME: this is stupid
|
|
int toggle = 0, step = 0;
|
|
int x_mod, y_mod;
|
|
for(step=0;step < total;step++) {
|
|
if (operation == TILE_REPLACE) {
|
|
replaceTile(&(*map)->matrix[from_x][from_y], tid, id);
|
|
} else if (operation == TILE_APPEND) {
|
|
appendTile(&(*map)->matrix[from_x][from_y], tid, id);
|
|
}
|
|
if (toggle == 1) {
|
|
y_mod = 0;
|
|
x_mod = x_inc;
|
|
toggle = 0;
|
|
} else {
|
|
y_mod = y_inc;
|
|
x_mod = 0;
|
|
toggle = 1;
|
|
}
|
|
if (from_y != to_y)
|
|
from_y += y_mod;
|
|
if (from_x != to_x)
|
|
from_x += x_mod;
|
|
}
|
|
}
|
|
|
|
void drawLine(struct Map** map, unsigned int operation, unsigned int tid, short id, unsigned int from_x, unsigned int from_y, unsigned int to_x, unsigned int to_y) {
|
|
int x_inc = (from_x-to_x < 0 ? -1 : 1);
|
|
int y_inc = (from_y-to_y < 0 ? -1 : 1);
|
|
while(1) {
|
|
if (operation == TILE_REPLACE) {
|
|
replaceTile(&(*map)->matrix[from_x][from_y], tid, id);
|
|
} else if (operation == TILE_APPEND) {
|
|
appendTile(&(*map)->matrix[from_x][from_y], tid, id);
|
|
}
|
|
if (from_x == to_x && from_y == to_y)
|
|
break;
|
|
if (from_x != to_x)
|
|
from_x += x_inc;
|
|
if (from_y != to_y)
|
|
from_y += y_inc;
|
|
}
|
|
}
|
|
|
|
struct Tile *findTile(int start_x, int start_y, int width, int height, int tid) {
|
|
return NULL;
|
|
}
|
|
|
|
struct Tile *getTopTile(struct Map *target_map, int x, int y) {
|
|
struct Tile* target_tile;
|
|
target_tile = getTile(target_map, x, y);
|
|
if (target_tile != NULL) {
|
|
while(target_tile->next != NULL) {
|
|
target_tile = target_tile->next;
|
|
}
|
|
}
|
|
return target_tile;
|
|
}
|
|
|
|
struct Tile *getTile(struct Map *target_map, int x, int y) {
|
|
struct Tile* target_tile;
|
|
target_tile = NULL;
|
|
if ((x < target_map->width && x >= 0) && (y < target_map->height && y >= 0)) {
|
|
if (target_map->matrix[x][y].tid) {
|
|
target_tile = &target_map->matrix[x][y];
|
|
}
|
|
}
|
|
return target_tile;
|
|
}
|