Nooncraft/src/world.cpp

72 lines
1.4 KiB
C++

#include "world.h"
#include <stdlib.h>
#include <string.h>
WorldCoord WorldCoord::Up(0, -1);
WorldCoord WorldCoord::Down(0, 1);
WorldCoord WorldCoord::Left(-1, 0);
WorldCoord WorldCoord::Right(1, 0);
namespace Nooncraft {
World *mkWorld(int width, int height)
{
WorldRect l, br;
World *w = (World *)malloc(sizeof *w);
if(!w) goto fail;
w->cells = (Block *)malloc(width * height * sizeof *w->cells);
if(!w->cells) goto fail;
l = WorldRect(
-width / 2, width - width / 2,
-height / 2, height - height / 2);
br = WorldRect(
l.xmin + 2, l.xmax - 2,
l.ymin + 2, l.ymax - 2);
w->limits = l;
w->worldBorder = br;
return w;
fail:
if(w)
free(w->cells);
free(w);
return nullptr;
}
void genWorld(World *w)
{
memset(w->cells, 0, w->cellDataSize());
int x1 = w->worldBorder.xmin + 1;
int x2 = w->worldBorder.xmax - 1;
int y1 = w->worldBorder.ymin + 1;
int y2 = w->worldBorder.ymax - 1;
for(int x = x1; x <= x2; x++) {
w->cellAt(x, y1) = 1; // TODO: Use cobblestone enum?
w->cellAt(x, y2) = 1;
}
for(int y = y1; y <= y2; y++) {
w->cellAt(x1, y) = 1;
w->cellAt(x2, y) = 1;
}
for(int x = -1; x <= +1; x++)
for(int y = -1; y <= +1; y++) {
if(x || y)
w->cellAt(x, y) = 1;
}
}
void freeWorld(World *w)
{
free(w->cells);
free(w);
}
} /* namespace Nooncraft */