1
#include "./scriptedruleset.h"
3
#include <QScriptEngine>
5
#include <QScriptValueIterator>
7
#include "objectmanager.h"
9
#include "boardclass.h"
10
#include "itemclass.h"
11
#include "boardwrapper.h"
12
#include "itemwrapper.h"
18
Q_DECLARE_METATYPE(QScriptValue)
20
Q_DECLARE_METATYPE(QVector<QScriptValue>)
22
class ScriptedRulesetPrivate {
23
Q_DECLARE_PUBLIC(ScriptedRuleset)
25
ScriptedRulesetPrivate(ScriptedRuleset *ruleset);
27
void initItemArray(const QScriptValue &value);
33
ObjectManager objectManager;
34
BoardClass *logineBoardClass;
35
ItemClass *logineItemClass;
37
ScriptedRuleset *q_ptr;
40
ScriptedRulesetPrivate::ScriptedRulesetPrivate(ScriptedRuleset *ruleset) {
43
qScriptRegisterSequenceMetaType<QVector<QScriptValue> >(&engine);
45
logineBoardClass = new BoardClass(&engine);
46
logineItemClass = new ItemClass(&engine, &objectManager);
49
void ScriptedRulesetPrivate::initItemArray(const QScriptValue &array) {
51
QScriptValueIterator it(array);
54
QScriptValue value = it.value();
55
QScriptClass *cls = value.scriptClass();
60
} else if(cls == logineItemClass) {
61
ItemWrapper *item = ItemClass::valueToWrapper(value);
63
} else if(cls == logineBoardClass) {
64
BoardWrapper *board = BoardClass::valueToWrapper(value);
70
ScriptedRuleset::ScriptedRuleset() {
71
d_ptr = new ScriptedRulesetPrivate(this);
74
ScriptedRuleset::~ScriptedRuleset() {
78
void ScriptedRuleset::addItemType(const QString& name, ItemConstructor ctor) {
81
d->objectManager.addItemType(name, ctor);
84
QScriptValue debug(QScriptContext *context, QScriptEngine *engine) {
85
qDebug() << "debug" << context->argument(0).toString();
86
return QScriptValue();
89
bool ScriptedRuleset::load(const QString &program) {
92
d->logine = d->engine.newObject();
93
d->engine.globalObject().setProperty("logine", d->logine, QScriptValue::ReadOnly);
94
d->logine.setProperty("Board", d->logineBoardClass->constructor());
95
d->logine.setProperty("Item", d->logineItemClass->constructor());
97
d->engine.globalObject().setProperty("debug", d->engine.newFunction(debug, 1));
99
d->ruleset = d->engine.newObject();
100
d->engine.globalObject().setProperty("ruleset", d->ruleset, QScriptValue::ReadOnly);
101
d->items = d->engine.newArray();
102
d->ruleset.setProperty("items", d->items, QScriptValue::ReadOnly);
104
d->engine.evaluate(program, "program", 1);
105
if(d->engine.hasUncaughtException()) {
106
qDebug() << d->engine.uncaughtExceptionLineNumber() << d->engine.uncaughtException().toString()
107
<< d->engine.uncaughtExceptionBacktrace();
112
d->initItemArray(d->items);
117
Item* ScriptedRuleset::getItem(const QString& name) {
118
Q_D(ScriptedRuleset);
119
QStringList parts = name.split('/');
120
QScriptValue value = d->items;
121
foreach(const QString& part, parts) {
122
value = value.property(name);
124
if(!value.isValid()) return 0;
125
QScriptClass *cls = value.scriptClass();
126
if(cls == d->logineItemClass) {
127
ItemWrapper *wrapper = ItemClass::valueToWrapper(value);
128
if(!wrapper) return 0;
129
return wrapper->item();
130
} else if(cls == d->logineBoardClass) {
131
BoardWrapper *wrapper = BoardClass::valueToWrapper(value);
132
if(!wrapper) return 0;
133
return wrapper->board();
139
ItemBoard* ScriptedRuleset::getBoard(const QString& name) {
140
Q_D(ScriptedRuleset);
141
QStringList parts = name.split('/');
142
QScriptValue value = d->items;
143
foreach(const QString& part, parts) {
144
value = value.property(name);
146
if(value.scriptClass() == d->logineBoardClass) {
147
BoardWrapper *wrapper = BoardClass::valueToWrapper(value);
148
if(!wrapper) return 0;
149
return wrapper->board();