72 lines
1.4 KiB
C++
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 */
|