l3tde/src/map.c

84 lines
2.0 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <l3tde/map.h>
#include <l3tde/map/header.h>
#include <l3tde/map/node.h>
#include <l3tde/map/warp.h>
static void
destroy_nodes (L3TDEMapNodePtr ***nodes, size_t x_len, size_t y_len);
static void
destroy_header (L3TDEMapHeaderPtr *header);
static void
destroy_warps (L3TDEMapWarpPtr **warps, size_t warps_len);
L3TDEMapPtr
l3tde_map_create (L3TDEMapHeaderPtr header,
L3TDEMapNodePtr **nodes, size_t nodes_x_len, size_t nodes_y_len,
L3TDEMapWarpPtr *warps, size_t warps_len) {
L3TDEMapPtr self = malloc (sizeof *self);
self->nodes_x_len = nodes_x_len;
self->nodes_y_len = nodes_y_len;
self->warps_len = warps_len;
self->header = header;
self->nodes = nodes;
self->warps = warps;
return self;
}
void
l3tde_map_destroy (L3TDEMapPtr self) {
destroy_nodes (&self->nodes,
self->nodes_x_len, self->nodes_y_len);
destroy_header (&self->header);
destroy_warps (&self->warps, self->warps_len);
free (self);
}
static void
destroy_warps (L3TDEMapWarpPtr **warps, size_t warps_len) {
if (*warps) {
for (size_t i = 0; i < warps_len; i++) {
if ((*warps)[i]) {
l3tde_map_warp_destroy ((*warps)[i]);
(*warps)[i] = NULL;
}
}
free (*warps);
warps = NULL;
}
}
static void
destroy_header (L3TDEMapHeaderPtr *header) {
if (*header) {
l3tde_map_header_destroy (*header);
}
header = NULL;
}
static void
destroy_nodes (L3TDEMapNodePtr ***nodes,
size_t x_len, size_t y_len) {
if (*nodes) {
for (size_t i = 0; i < x_len; i++) {
if ((*nodes)[i]) {
for (size_t j = 0; j < y_len; j++) {
if ((*nodes)[i][j]) {
l3tde_map_node_destroy ((*nodes)[i][j]);
(*nodes)[i][j] = NULL;
}
}
free ((*nodes)[i]);
(*nodes)[i] = NULL;
}
}
free ((*nodes));
nodes = NULL;
}
}