qtscript: Save/load triggers. Fix scavenger loading.

master
Per Inge Mathisen 2011-03-29 23:16:33 +02:00
parent c7d206b6e9
commit 5be9250bf8
3 changed files with 63 additions and 17 deletions

View File

@ -2534,8 +2534,10 @@ BOOL loadGame(const char *pGameToLoad, BOOL keepObjects, BOOL freeMem, BOOL User
if (saveGameVersion >= VERSION_33) if (saveGameVersion >= VERSION_33)
{ {
PLAYERSTATS playerStats; PLAYERSTATS playerStats;
bool scav = game.scavengers;
game = saveGameData.sGame; game = saveGameData.sGame;
game.scavengers = scav; // ok, so this is butt ugly. but i'm just getting inspiration from the rest of the code around here. ok? - per
productionPlayer= selectedPlayer; productionPlayer= selectedPlayer;
bMultiPlayer = saveGameData.multiPlayer; bMultiPlayer = saveGameData.multiPlayer;
bMultiMessages = bMultiPlayer; bMultiMessages = bMultiPlayer;

View File

@ -48,6 +48,7 @@ struct timerNode
int frameTime; int frameTime;
int ms; int ms;
int player; int player;
timerNode() {}
timerNode(QScriptEngine *caller, QString val, int plr, int frame) : function(val) { player = plr; ms = frame; frameTime = frame + gameTime; engine = caller; } timerNode(QScriptEngine *caller, QString val, int plr, int frame) : function(val) { player = plr; ms = frame; frameTime = frame + gameTime; engine = caller; }
// implement operator less TODO // implement operator less TODO
}; };
@ -235,13 +236,14 @@ bool saveScriptStates(const char *filename)
QSettings ini(QString("wz::") + filename, QSettings::IniFormat); QSettings ini(QString("wz::") + filename, QSettings::IniFormat);
if (!ini.isWritable()) if (!ini.isWritable())
{ {
qWarning("Savegame file not writable"); debug(LOG_ERROR, "Savegame file not writable");
return false;
} }
for (int i = 0; i < scripts.size(); ++i) for (int i = 0; i < scripts.size(); ++i)
{ {
ini.beginGroup(QString("globals_") + QString::number(i));
QScriptEngine *engine = scripts.at(i); QScriptEngine *engine = scripts.at(i);
QScriptValueIterator it(engine->globalObject()); QScriptValueIterator it(engine->globalObject());
ini.beginGroup(QString("globals_") + QString::number(i));
while (it.hasNext()) while (it.hasNext())
{ {
it.next(); it.next();
@ -252,22 +254,72 @@ bool saveScriptStates(const char *filename)
} }
ini.endGroup(); ini.endGroup();
} }
for (int i = 0; i < timers.size(); ++i)
{
timerNode node = timers.at(i);
ini.beginGroup(QString("triggers_") + QString::number(i));
ini.setValue("player", node.player);
ini.setValue("function", node.function.toUtf8().constData());
if (!node.baseobj.isEmpty())
{
ini.setValue("object", node.baseobj.toUtf8().constData());
}
ini.setValue("frame", node.frameTime);
ini.setValue("ms", node.ms);
ini.endGroup();
}
return true; return true;
} }
static QScriptEngine *findEngineForPlayer(int match)
{
for (int i = 0; i < scripts.size(); ++i)
{
QScriptEngine *engine = scripts.at(i);
int player = engine->globalObject().property("me").toInt32();
if (match == player)
{
return engine;
}
}
ASSERT(false, "Script context for player %d not found", match);
return NULL;
}
bool loadScriptStates(const char *filename) bool loadScriptStates(const char *filename)
{ {
QSettings ini(QString("wz::") + filename, QSettings::IniFormat); QSettings ini(QString("wz::") + filename, QSettings::IniFormat);
for (int i = 0; i < scripts.size(); ++i) QStringList list = ini.childGroups();
debug(LOG_SAVE, "Loading script states for %d script contexts", scripts.size());
for (int i = 0; i < list.size(); ++i)
{ {
ini.beginGroup(QString("globals_") + QString::number(i)); if (list[i].startsWith("triggers_"))
QStringList keys = ini.childKeys();
QScriptEngine *engine = scripts.at(i);
for (int j = 0; j < keys.size(); ++j)
{ {
engine->globalObject().setProperty(keys.at(i), engine->toScriptValue(ini.value(keys.at(i)))); ini.beginGroup(list[i]);
timerNode node;
node.player = ini.value("player").toInt();
node.ms = ini.value("ms").toInt();
node.frameTime = ini.value("frame").toInt();
debug(LOG_SAVE, "Registering trigger %d for player %d", i, node.player);
node.engine = findEngineForPlayer(node.player);
node.function = ini.value("function").toString();
node.baseobj = ini.value("baseobj", QString()).toString();
timers.push_back(node);
ini.endGroup();
}
else if (list[i].startsWith("globals_"))
{
ini.beginGroup(list[i]);
int player = ini.value("me").toInt();
QScriptEngine *engine = findEngineForPlayer(player);
QStringList keys = ini.childKeys();
debug(LOG_SAVE, "Loading script globals for player %d -- found %d values", player, keys.size());
for (int j = 0; j < keys.size(); ++j)
{
engine->globalObject().setProperty(keys.at(j), engine->toScriptValue(ini.value(keys.at(j))));
}
ini.endGroup();
} }
ini.endGroup();
} }
return true; return true;
} }

View File

@ -84,10 +84,6 @@ static QScriptValue js_enumGroup(QScriptContext *context, QScriptEngine *engine)
{ {
matches.push_back(psCurr); matches.push_back(psCurr);
} }
if (matches.size() == 0)
{
return QScriptValue();
}
QScriptValue result = engine->newArray(matches.size()); QScriptValue result = engine->newArray(matches.size());
for (int i = 0; i < matches.size(); i++) for (int i = 0; i < matches.size(); i++)
{ {
@ -134,10 +130,6 @@ static QScriptValue js_enumStruct(QScriptContext *context, QScriptEngine *engine
matches.push_back(psStruct); matches.push_back(psStruct);
} }
} }
if (matches.size() == 0)
{
return QScriptValue();
}
QScriptValue result = engine->newArray(matches.size()); QScriptValue result = engine->newArray(matches.size());
for (int i = 0; i < matches.size(); i++) for (int i = 0; i < matches.size(); i++)
{ {