Added simple elevation painter as well as array syntax for AndConstraint, RandomTerrain and the new MultiPainter.
This was SVN commit r2407.
This commit is contained in:
parent
2bfad45723
commit
470d87c489
@ -1,10 +1,11 @@
|
|||||||
const SIZE = 64;
|
const SIZE = 64;
|
||||||
|
|
||||||
init(SIZE, new RandomTerrain("snow", "snow forest"), 0);
|
init(SIZE, ["snow", "snow forest"], 0);
|
||||||
|
|
||||||
createMulti(
|
createMulti(
|
||||||
new ClumpPlacer(20.0, 0.01, 0.01),
|
new ClumpPlacer(20.0, 0.01, 0.01),
|
||||||
new LayeredPainter([1], ["snow grass 2", "snow grass 2|wrld_flora_pine"]),
|
[new LayeredPainter([1], ["snow grass 2", "snow grass 2|wrld_flora_pine"]),
|
||||||
|
new ElevationPainter(3.0)],
|
||||||
new AvoidTextureConstraint("snow grass 2"),
|
new AvoidTextureConstraint("snow grass 2"),
|
||||||
150,
|
150,
|
||||||
500
|
500
|
||||||
|
@ -4,12 +4,11 @@ const
|
|||||||
TYPE_RECTPLACER = 1,
|
TYPE_RECTPLACER = 1,
|
||||||
TYPE_TERRAINPAINTER = 2,
|
TYPE_TERRAINPAINTER = 2,
|
||||||
TYPE_NULLCONSTRAINT = 3,
|
TYPE_NULLCONSTRAINT = 3,
|
||||||
TYPE_RANDOMTERRAIN = 4,
|
TYPE_LAYEREDPAINTER = 4,
|
||||||
TYPE_LAYEREDPAINTER = 5,
|
TYPE_AVOIDAREACONSTRAINT = 5,
|
||||||
TYPE_AVOIDAREACONSTRAINT = 6,
|
TYPE_CLUMPPLACER = 6,
|
||||||
TYPE_CLUMPPLACER = 7,
|
TYPE_AVOIDTEXTURECONSTRAINT = 7,
|
||||||
TYPE_AVOIDTEXTURECONSTRAINT = 8,
|
TYPE_ELEVATIONPAINTER = 8;
|
||||||
TYPE_ANDCONSTRAINT = 9;
|
|
||||||
|
|
||||||
// Utility functions
|
// Utility functions
|
||||||
|
|
||||||
@ -58,11 +57,6 @@ function NullConstraint() {
|
|||||||
this.TYPE = TYPE_NULLCONSTRAINT;
|
this.TYPE = TYPE_NULLCONSTRAINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
function RandomTerrain() {
|
|
||||||
this.TYPE = TYPE_RANDOMTERRAIN;
|
|
||||||
this.terrains = argsToArray(arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
function LayeredPainter(widths, terrains) {
|
function LayeredPainter(widths, terrains) {
|
||||||
this.TYPE = TYPE_LAYEREDPAINTER;
|
this.TYPE = TYPE_LAYEREDPAINTER;
|
||||||
this.widths = widths;
|
this.widths = widths;
|
||||||
@ -88,10 +82,9 @@ function AvoidTextureConstraint(texture) {
|
|||||||
this.texture = texture;
|
this.texture = texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
function AndConstraint(a, b) {
|
function ElevationPainter(elevation) {
|
||||||
this.TYPE = TYPE_ANDCONSTRAINT;
|
this.TYPE = TYPE_ELEVATIONPAINTER;
|
||||||
this.a = a;
|
this.elevation = elevation;
|
||||||
this.b = b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function createMulti(centeredPlacer, painter, constraint, num, maxFail) {
|
function createMulti(centeredPlacer, painter, constraint, num, maxFail) {
|
||||||
|
@ -79,12 +79,23 @@ bool ParseArray(JSContext* cx, jsval val, vector<jsval>& ret) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
AreaPainter* ParsePainter(JSContext* cx, jsval val) {
|
AreaPainter* ParsePainter(JSContext* cx, jsval val) {
|
||||||
|
vector<jsval> array;
|
||||||
jsval jsv, jsv2;
|
jsval jsv, jsv2;
|
||||||
Terrain* terrain = 0;
|
Terrain* terrain = 0;
|
||||||
vector<jsval> array;
|
float elevation;
|
||||||
vector<Terrain*> terrains;
|
vector<Terrain*> terrains;
|
||||||
vector<int> widths;
|
vector<int> widths;
|
||||||
|
|
||||||
|
if(ParseArray(cx, val, array)) {
|
||||||
|
// MultiPainter is encoded as an array of painters
|
||||||
|
vector<AreaPainter*> painters(array.size());
|
||||||
|
for(int i=0; i<array.size(); i++) {
|
||||||
|
painters[i] = ParsePainter(cx, array[i]);
|
||||||
|
if(painters[i]==0) return 0;
|
||||||
|
}
|
||||||
|
return new MultiPainter(painters);
|
||||||
|
}
|
||||||
|
|
||||||
switch(GetType(cx, val)) {
|
switch(GetType(cx, val)) {
|
||||||
case TYPE_TERRAINPAINTER:
|
case TYPE_TERRAINPAINTER:
|
||||||
if(!GetJsvalField(cx, val, "terrain", jsv)) return 0;
|
if(!GetJsvalField(cx, val, "terrain", jsv)) return 0;
|
||||||
@ -92,6 +103,10 @@ AreaPainter* ParsePainter(JSContext* cx, jsval val) {
|
|||||||
if(terrain==0) return 0;
|
if(terrain==0) return 0;
|
||||||
return new TerrainPainter(terrain);
|
return new TerrainPainter(terrain);
|
||||||
|
|
||||||
|
case TYPE_ELEVATIONPAINTER:
|
||||||
|
if(!GetFloatField(cx, val, "elevation", elevation)) return 0;
|
||||||
|
return new ElevationPainter(elevation);
|
||||||
|
|
||||||
case TYPE_LAYEREDPAINTER:
|
case TYPE_LAYEREDPAINTER:
|
||||||
if(!GetJsvalField(cx, val, "widths", jsv)) return 0;
|
if(!GetJsvalField(cx, val, "widths", jsv)) return 0;
|
||||||
if(!GetJsvalField(cx, val, "terrains", jsv2)) return 0;
|
if(!GetJsvalField(cx, val, "terrains", jsv2)) return 0;
|
||||||
@ -141,12 +156,25 @@ AreaPlacer* ParsePlacer(JSContext* cx, jsval val) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Constraint* ParseConstraint(JSContext* cx, jsval val) {
|
Constraint* ParseConstraint(JSContext* cx, jsval val) {
|
||||||
if(JSVAL_IS_NULL(val)) return new NullConstraint();
|
vector<jsval> array;
|
||||||
|
|
||||||
int areaId;
|
int areaId;
|
||||||
string texture;
|
string texture;
|
||||||
jsval jsv, jsv2;
|
jsval jsv, jsv2;
|
||||||
Constraint* c1, *c2;
|
|
||||||
|
if(JSVAL_IS_NULL(val)) {
|
||||||
|
// convenience way of specifying a NullConstraint
|
||||||
|
return new NullConstraint();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ParseArray(cx, val, array)) {
|
||||||
|
// AndConstraint is encoded as an array of constraints
|
||||||
|
vector<Constraint*> constraints(array.size());
|
||||||
|
for(int i=0; i<array.size(); i++) {
|
||||||
|
constraints[i] = ParseConstraint(cx, array[i]);
|
||||||
|
if(constraints[i]==0) return 0;
|
||||||
|
}
|
||||||
|
return new AndConstraint(constraints);
|
||||||
|
}
|
||||||
|
|
||||||
switch(GetType(cx, val)) {
|
switch(GetType(cx, val)) {
|
||||||
case TYPE_NULLCONSTRAINT:
|
case TYPE_NULLCONSTRAINT:
|
||||||
@ -161,43 +189,30 @@ Constraint* ParseConstraint(JSContext* cx, jsval val) {
|
|||||||
if(!GetStringField(cx, val, "texture", texture)) return 0;
|
if(!GetStringField(cx, val, "texture", texture)) return 0;
|
||||||
return new AvoidTextureConstraint(theMap->getId(texture));
|
return new AvoidTextureConstraint(theMap->getId(texture));
|
||||||
|
|
||||||
case TYPE_ANDCONSTRAINT:
|
|
||||||
if(!GetJsvalField(cx, val, "a", jsv)) return 0;
|
|
||||||
if(!GetJsvalField(cx, val, "b", jsv2)) return 0;
|
|
||||||
if(!(c1 = ParseConstraint(cx, jsv))) return 0;
|
|
||||||
if(!(c2 = ParseConstraint(cx, jsv2))) return 0;
|
|
||||||
return new AndConstraint(c1, c2);
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Terrain* ParseTerrain(JSContext* cx, jsval val) {
|
Terrain* ParseTerrain(JSContext* cx, jsval val) {
|
||||||
|
vector<jsval> array;
|
||||||
|
|
||||||
if(JSVAL_IS_STRING(val)) {
|
if(JSVAL_IS_STRING(val)) {
|
||||||
// simple terrains are just encoded as strings
|
// simple terrains are just encoded as strings
|
||||||
string str = JS_GetStringBytes(JS_ValueToString(cx, val));
|
string str = JS_GetStringBytes(JS_ValueToString(cx, val));
|
||||||
return SimpleTerrain::parse(str);
|
return SimpleTerrain::parse(str);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
// complex terrain type
|
|
||||||
Terrain* terrain = 0;
|
|
||||||
vector<jsval> array;
|
|
||||||
vector<Terrain*> terrains;
|
|
||||||
|
|
||||||
switch(GetType(cx, val)) {
|
if(ParseArray(cx, val, array)) {
|
||||||
case TYPE_RANDOMTERRAIN:
|
// RandomTerrain is encoded as an array of terrains
|
||||||
if(!GetArrayField(cx, val, "terrains", array)) return 0;
|
vector<Terrain*> terrains(array.size());
|
||||||
for(int i=0; i<array.size(); i++) {
|
for(int i=0; i<array.size(); i++) {
|
||||||
terrain = ParseTerrain(cx, array[i]);
|
terrains[i] = ParseTerrain(cx, array[i]);
|
||||||
if(terrain==0) return 0;
|
if(terrains[i]==0) return 0;
|
||||||
terrains.push_back(terrain);
|
|
||||||
}
|
|
||||||
return new RandomTerrain(terrains);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return new RandomTerrain(terrains);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// so far these are the only ways of specifying a terrain
|
||||||
|
return 0;
|
||||||
}
|
}
|
@ -14,12 +14,11 @@ const int
|
|||||||
TYPE_RECTPLACER = 1,
|
TYPE_RECTPLACER = 1,
|
||||||
TYPE_TERRAINPAINTER = 2,
|
TYPE_TERRAINPAINTER = 2,
|
||||||
TYPE_NULLCONSTRAINT = 3,
|
TYPE_NULLCONSTRAINT = 3,
|
||||||
TYPE_RANDOMTERRAIN = 4,
|
TYPE_LAYEREDPAINTER = 4,
|
||||||
TYPE_LAYEREDPAINTER = 5,
|
TYPE_AVOIDAREACONSTRAINT = 5,
|
||||||
TYPE_AVOIDAREACONSTRAINT = 6,
|
TYPE_CLUMPPLACER = 6,
|
||||||
TYPE_CLUMPPLACER = 7,
|
TYPE_AVOIDTEXTURECONSTRAINT = 7,
|
||||||
TYPE_AVOIDTEXTURECONSTRAINT = 8,
|
TYPE_ELEVATIONPAINTER = 8;
|
||||||
TYPE_ANDCONSTRAINT = 9;
|
|
||||||
|
|
||||||
// Helper functions to parse objects from JS versions
|
// Helper functions to parse objects from JS versions
|
||||||
|
|
||||||
|
@ -34,12 +34,22 @@ bool AvoidTextureConstraint::allows(Map* m, int x, int y)
|
|||||||
|
|
||||||
// AndConstraint
|
// AndConstraint
|
||||||
|
|
||||||
AndConstraint::AndConstraint(Constraint* a, Constraint*b) {
|
AndConstraint::AndConstraint(const vector<Constraint*>& constraints) {
|
||||||
this->a = a;
|
this->constraints = constraints;
|
||||||
this->b = b;
|
}
|
||||||
|
|
||||||
|
AndConstraint::~AndConstraint() {
|
||||||
|
for(int i=0; i<constraints.size(); i++) {
|
||||||
|
delete constraints[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AndConstraint::allows(Map* m, int x, int y)
|
bool AndConstraint::allows(Map* m, int x, int y)
|
||||||
{
|
{
|
||||||
return a->allows(m,x,y) && b->allows(m,x,y);
|
for(int i=0; i<constraints.size(); i++) {
|
||||||
|
if(!constraints[i]->allows(m, x, y)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
@ -28,10 +28,10 @@ public:
|
|||||||
|
|
||||||
class AndConstraint : public Constraint {
|
class AndConstraint : public Constraint {
|
||||||
private:
|
private:
|
||||||
Constraint* a;
|
std::vector<Constraint*> constraints;
|
||||||
Constraint* b;
|
|
||||||
public:
|
public:
|
||||||
AndConstraint(Constraint* a, Constraint* b);
|
AndConstraint(const std::vector<Constraint*>& constraints);
|
||||||
|
~AndConstraint();
|
||||||
virtual bool allows(Map* m, int x, int y);
|
virtual bool allows(Map* m, int x, int y);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -19,3 +19,36 @@ void TerrainPainter::paint(Map* m, Area* a)
|
|||||||
terrain->place(m, p.x, p.y);
|
terrain->place(m, p.x, p.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ElevationPainter
|
||||||
|
|
||||||
|
ElevationPainter::ElevationPainter(float elevation)
|
||||||
|
{
|
||||||
|
this->elevation = elevation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ElevationPainter::paint(Map* m, Area* a)
|
||||||
|
{
|
||||||
|
for (int i=0; i<a->points.size(); i++) {
|
||||||
|
Point p = a->points[i];
|
||||||
|
static const int DX[4] = {0,1,1,0};
|
||||||
|
static const int DY[4] = {0,0,1,1};
|
||||||
|
for(int j=0; j<4; j++) {
|
||||||
|
m->height[p.x+DX[j]][p.y+DY[j]] = elevation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MultiPainter
|
||||||
|
|
||||||
|
MultiPainter::MultiPainter(const std::vector<AreaPainter*>& painters)
|
||||||
|
{
|
||||||
|
this->painters = painters;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultiPainter::paint(Map* m, Area* a)
|
||||||
|
{
|
||||||
|
for (int i=0; i<painters.size(); i++) {
|
||||||
|
painters[i]->paint(m, a);
|
||||||
|
}
|
||||||
|
}
|
@ -7,11 +7,24 @@
|
|||||||
#include "terrain.h"
|
#include "terrain.h"
|
||||||
|
|
||||||
class TerrainPainter : public AreaPainter {
|
class TerrainPainter : public AreaPainter {
|
||||||
public:
|
|
||||||
Terrain* terrain;
|
Terrain* terrain;
|
||||||
|
public:
|
||||||
TerrainPainter(Terrain* terrain);
|
TerrainPainter(Terrain* terrain);
|
||||||
void paint(Map* m, Area* a);
|
virtual void paint(Map* m, Area* a);
|
||||||
|
};
|
||||||
|
|
||||||
|
class ElevationPainter : public AreaPainter {
|
||||||
|
float elevation;
|
||||||
|
public:
|
||||||
|
ElevationPainter(float elevation);
|
||||||
|
virtual void paint(Map* m, Area* a);
|
||||||
|
};
|
||||||
|
|
||||||
|
class MultiPainter : public AreaPainter {
|
||||||
|
std::vector<AreaPainter*> painters;
|
||||||
|
public:
|
||||||
|
MultiPainter(const std::vector<AreaPainter*>& painters);
|
||||||
|
virtual void paint(Map* m, Area* a);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in New Issue
Block a user