0ad/source/tools/rmgen/map.cpp

121 lines
2.9 KiB
C++

#include "stdafx.h"
#include "rmgen.h"
#include "map.h"
#include "entity.h"
using namespace std;
Map::Map(int size, const string& baseTerrain, float baseHeight) {
if(size<0 || size>1024) {
JS_ReportError(cx, "init: map size out of range");
}
else if(size%16 != 0) {
JS_ReportError(cx, "init: map size must be divisble by 16");
}
this->size = size;
int baseId = getId(baseTerrain);
terrain = new int*[size];
for(int i=0; i<size; i++) {
terrain[i] = new int[size];
for(int j=0; j<size; j++) {
terrain[i][j] = baseId;
}
}
area = new Area**[size];
for(int i=0; i<size; i++) {
area[i] = new Area*[size];
for(int j=0; j<size; j++) {
area[i][j] = 0;
}
}
height = new float*[size+1];
for(int i=0; i<size+1; i++) {
height[i] = new float[size+1];
for(int j=0; j<size+1; j++) {
height[i][j] = baseHeight;
}
}
}
Map::~Map() {
for(int i=0; i<size; i++) {
delete[] terrain[i];
}
delete[] terrain;
for(int i=0; i<size; i++) {
delete[] area[i];
}
delete[] area;
for(int i=0; i<size+1; i++) {
delete[] height[i];
}
delete[] height;
for(int i=0; i<entities.size(); i++) {
delete entities[i];
}
}
int Map::getId(string terrain) {
if(nameToId.find(terrain) != nameToId.end()) {
return nameToId[terrain];
}
else {
int newId = nameToId.size();
nameToId[terrain] = newId;
idToName[newId] = terrain;
return newId;
}
}
bool Map::validT(int x, int y) {
return x>=0 && y>=0 && x<size && y<size;
}
bool Map::validH(int x, int y) {
return x>=0 && y>=0 && x<size+1 && y<size+1;
}
string Map::getTerrain(int x, int y) {
if(!validT(x,y)) JS_ReportError(cx, "getTerrain: invalid tile position");
return idToName[terrain[x][y]];
}
void Map::setTerrain(int x, int y, const string& t) {
if(!validT(x,y)) JS_ReportError(cx, "setTerrain: invalid tile position");
terrain[x][y] = getId(t);
}
float Map::getHeight(int x, int y) {
if(!validH(x,y)) JS_ReportError(cx, "getHeight: invalid point position");
return height[x][y];
}
void Map::setHeight(int x, int y, float h) {
if(!validH(x,y)) JS_ReportError(cx, "setHeight: invalid point position");
height[x][y] = h;
}
void Map::addEntity(Entity* ent) {
entities.push_back(ent);
}
Area* Map::createArea(AreaPlacer* placer, AreaPainter* painter, Constraint* constr) {
vector<Point> points;
if(!placer->place(this, constr, points)) {
return 0;
}
Area* a = new Area(points);
for(int i=0; i<points.size(); i++) {
area[points[i].x][points[i].y] = a;
}
painter->paint(this, a);
return a;
}