#include "stdafx.h" #include "objparse.h" #include "rmgen.h" #include "simpleconstraints.h" #include "simplepainters.h" #include "rectplacer.h" #include "layeredpainter.h" #include "clumpplacer.h" using namespace std; bool GetRaw(JSContext* cx, jsval val, JSObject** retObj, int* retType) { if(!JSVAL_IS_OBJECT(val)) return false; JSObject* obj = JSVAL_TO_OBJECT(val); jsval ret; if(!JS_CallFunctionName(cx, obj, "raw", 0, 0, &ret)) { return false; } if(!JSVAL_IS_OBJECT(ret)) return false; *retObj = JSVAL_TO_OBJECT(ret); if(!JS_IsArrayObject(cx, *retObj)) return false; jsuint len; JS_GetArrayLength(cx, *retObj, &len); if(len==0) return false; jsval rval; JS_GetElement(cx, *retObj, 0, &rval); if(!JSVAL_IS_INT(rval)) return 0; *retType = JSVAL_TO_INT(rval); return true; } bool ParseFields(JSContext* cx, JSObject* array, const char* format, ...) { int len = strlen(format); jsuint arLen; JS_GetArrayLength(cx, array, &arLen); if(arLen != len+1) return false; va_list ap; va_start(ap, format); // start at next arg after format for(int i=0; i& ret) { ret.clear(); if(!JSVAL_IS_OBJECT(val)) return false; JSObject* obj = JSVAL_TO_OBJECT(val); if(!JS_IsArrayObject(cx, obj)) return false; jsuint len; JS_GetArrayLength(cx, obj, &len); for(int i=0; i array; vector terrains; vector widths; switch(type) { case TYPE_TERRAINPAINTER: if(!ParseFields(cx, obj, "*", &jsv)) return 0; terrain = ParseTerrain(cx, jsv); if(terrain==0) return 0; return new TerrainPainter(terrain); case TYPE_LAYEREDPAINTER: if(!ParseFields(cx, obj, "**", &jsv, &jsv2)) return 0; if(!ParseArray(cx, jsv, array)) return 0; for(int i=0; i theMap->areas.size()) return 0; return new AvoidAreaConstraint(theMap->areas[areaId-1]); case TYPE_AVOIDTERRAINCONSTRAINT: if(!ParseFields(cx, obj, "s", &texture)) return 0; return new AvoidTerrainConstraint(theMap->getId(texture)); case TYPE_ANDCONSTRAINT: if(!ParseFields(cx, obj, "**", &jsv, &jsv2)) return 0; if(!(c1 = ParseConstraint(cx, jsv))) return 0; if(!(c2 = ParseConstraint(cx, jsv2))) return 0; return new AndConstraint(c1, c2); default: return 0; } } Terrain* ParseTerrain(JSContext* cx, jsval val) { if(JSVAL_IS_STRING(val)) { // simple terrains are just encoded as strings string str = JS_GetStringBytes(JS_ValueToString(cx, val)); return SimpleTerrain::parse(str); } else { // complex terrain type JSObject* obj; int type; if(!GetRaw(cx, val, &obj, &type)) return 0; jsval jsv; Terrain* terrain = 0; vector array; vector terrains; switch(type) { case TYPE_RANDOMTERRAIN: if(!ParseFields(cx, obj, "*", &jsv)) return 0; if(!ParseArray(cx, jsv, array)) return 0; for(int i=0; i