#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; int GetType(JSContext* cx, jsval val) { int ret; if(!GetIntField(cx, val, "TYPE", ret)) return 0; return ret; } bool GetIntField(JSContext* cx, jsval obj, const char* name, int& ret) { jsval val; if(!GetJsvalField(cx, obj, name, val)) return false; if(!JSVAL_IS_INT(val)) return false; ret = JSVAL_TO_INT(val); return true; } bool GetBoolField(JSContext* cx, jsval obj, const char* name, int& ret) { jsval val; if(!GetJsvalField(cx, obj, name, val)) return false; if(!JSVAL_IS_BOOLEAN(val)) return false; ret = JSVAL_TO_BOOLEAN(val); return true; } bool GetFloatField(JSContext* cx, jsval obj, const char* name, float& ret) { jsval val; if(!GetJsvalField(cx, obj, name, val)) return false; if(!JSVAL_IS_NUMBER(val)) return false; jsdouble jsdbl; JS_ValueToNumber(cx, val, &jsdbl); ret = jsdbl; return true; } bool GetStringField(JSContext* cx, jsval obj, const char* name, std::string& ret) { jsval val; if(!GetJsvalField(cx, obj, name, val)) return false; if(!JSVAL_IS_STRING(val)) return false; ret = JS_GetStringBytes(JSVAL_TO_STRING(val)); return true; } bool GetArrayField(JSContext* cx, jsval obj, const char* name, std::vector& ret) { ret.clear(); jsval val; if(!GetJsvalField(cx, obj, name, val)) return false; if(!ParseArray(cx, val, ret)) return false; return true; } bool GetJsvalField(JSContext* cx, jsval obj, const char* name, jsval& ret) { if(!JSVAL_IS_OBJECT(obj)) return false; JSObject* fieldObj = JSVAL_TO_OBJECT(obj); return JS_GetProperty(cx, fieldObj, name, &ret); } bool ParseArray(JSContext* cx, jsval val, vector& 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; jsval jsv, jsv2; Terrain* terrain = 0; float elevation; vector terrains; vector widths; if(ParseArray(cx, val, array)) { // MultiPainter is encoded as an array of painters vector painters(array.size()); for(int i=0; i array; int areaId; string texture; jsval jsv, jsv2; 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 constraints(array.size()); for(int i=0; i theMap->areas.size()) return 0; return new AvoidAreaConstraint(theMap->areas[areaId-1]); case TYPE_AVOIDTEXTURECONSTRAINT: if(!GetStringField(cx, val, "texture", texture)) return 0; return new AvoidTextureConstraint(theMap->getId(texture)); default: return 0; } } Terrain* ParseTerrain(JSContext* cx, jsval val) { vector array; if(JSVAL_IS_STRING(val)) { // simple terrains are just encoded as strings string str = JS_GetStringBytes(JS_ValueToString(cx, val)); return SimpleTerrain::parse(str); } if(ParseArray(cx, val, array)) { // RandomTerrain is encoded as an array of terrains vector terrains(array.size()); for(int i=0; i