// save a list of triggers static bool eventSaveTriggerList(ACTIVE_TRIGGER *psList, QString tname, WzConfig &ini) { int numTriggers = 0, context = 0; for (ACTIVE_TRIGGER *psCurr = psList; psCurr != NULL; psCurr = psCurr->psNext) { if (!eventGetContextIndex(psCurr->psContext, &context)) { debug(LOG_FATAL, "Could not find context"); return false; } ini.beginGroup(tname + "_" + QString::number(numTriggers)); ini.setValue("time", QVariant(psCurr->testTime)); ini.setValue("context", QVariant(context)); ini.setValue("type", QVariant(psCurr->type)); ini.setValue("trigger", QVariant(psCurr->trigger)); ini.setValue("event", QVariant(psCurr->event)); ini.setValue("offset", QVariant(psCurr->offset)); ini.endGroup(); numTriggers++; } ini.setValue("general/num" + tname, QVariant(numTriggers)); return true; }
void saveTemplateCommon(WzConfig &ini, DROID_TEMPLATE *psCurr) { ini.setValue("name", psCurr->name); switch (psCurr->droidType) { case DROID_ECM: ini.setValue("type", "ECM"); break; case DROID_SENSOR: ini.setValue("type", "SENSOR"); break; case DROID_CONSTRUCT: ini.setValue("type", "CONSTRUCT"); break; case DROID_WEAPON: ini.setValue("type", "WEAPON"); break; case DROID_PERSON: ini.setValue("type", "PERSON"); break; case DROID_CYBORG: ini.setValue("type", "CYBORG"); break; case DROID_CYBORG_SUPER: ini.setValue("type", "CYBORG_SUPER"); break; case DROID_CYBORG_CONSTRUCT: ini.setValue("type", "CYBORG_CONSTRUCT"); break; case DROID_CYBORG_REPAIR: ini.setValue("type", "CYBORG_REPAIR"); break; case DROID_TRANSPORTER: ini.setValue("type", "TRANSPORTER"); break; case DROID_SUPERTRANSPORTER: ini.setValue("type", "SUPERTRANSPORTER"); break; case DROID_COMMAND: ini.setValue("type", "DROID_COMMAND"); break; case DROID_REPAIR: ini.setValue("type", "REPAIR"); break; case DROID_DEFAULT: ini.setValue("type", "DROID"); break; default: ASSERT(false, "No such droid type \"%d\" for %s", psCurr->droidType, psCurr->name.toUtf8().constData()); } ini.setValue("body", (asBodyStats + psCurr->asParts[COMP_BODY])->id); ini.setValue("propulsion", (asPropulsionStats + psCurr->asParts[COMP_PROPULSION])->id); if (psCurr->asParts[COMP_BRAIN] != 0) { ini.setValue("brain", (asBrainStats + psCurr->asParts[COMP_BRAIN])->id); } if ((asRepairStats + psCurr->asParts[COMP_REPAIRUNIT])->location == LOC_TURRET) // avoid auto-repair... { ini.setValue("repair", (asRepairStats + psCurr->asParts[COMP_REPAIRUNIT])->id); } if ((asECMStats + psCurr->asParts[COMP_ECM])->location == LOC_TURRET) { ini.setValue("ecm", (asECMStats + psCurr->asParts[COMP_ECM])->id); } if ((asSensorStats + psCurr->asParts[COMP_SENSOR])->location == LOC_TURRET) { ini.setValue("sensor", (asSensorStats + psCurr->asParts[COMP_SENSOR])->id); } if (psCurr->asParts[COMP_CONSTRUCT] != 0) { ini.setValue("construct", (asConstructStats + psCurr->asParts[COMP_CONSTRUCT])->id); } QStringList weapons; for (int j = 0; j < psCurr->numWeaps; j++) { weapons += (asWeaponStats + psCurr->asWeaps[j])->id; } if (weapons.size()) { ini.setValue("weapons", weapons); } }
// default value save routine //TODO: use union bool scrValDefSave(INTERP_VAL *psVal, WzConfig &ini) { VIEWDATA *psIntMessage; const char *pName; RESEARCH *psResearch; DROID *psCDroid; switch ((unsigned)psVal->type) // Unsigned cast to suppress compiler warnings due to enum abuse. { case ST_INTMESSAGE: // save the name psIntMessage = (VIEWDATA *)psVal->v.oval; if (psIntMessage != NULL) { ini.setValue("data", QString(psIntMessage->pName)); } break; case ST_BASEOBJECT: case ST_DROID: case ST_STRUCTURE: case ST_FEATURE: // just save the id if (psVal->v.oval && ((BASE_OBJECT *)psVal->v.oval)->died <= NOT_CURRENT_LIST) { ini.setValue("data", QVariant(((BASE_OBJECT *)psVal->v.oval)->id)); } break; case ST_BASESTATS: case ST_COMPONENT: case ST_FEATURESTAT: case ST_STRUCTURESTAT: case ST_BODY: case ST_PROPULSION: case ST_ECM: case ST_SENSOR: case ST_CONSTRUCT: case ST_WEAPON: case ST_REPAIR: case ST_BRAIN: pName = scrGetStatName(psVal->type, psVal->v.ival); if (pName) { ini.setValue("data", QString(pName)); } break; case ST_TEMPLATE: if (psVal->v.oval) { ini.setValue("data", ((DROID_TEMPLATE *)psVal->v.oval)->multiPlayerID); } break; case ST_TEXTSTRING: { const char *const idStr = psVal->v.sval ? strresGetIDfromString(psStringRes, psVal->v.sval) : NULL; if (idStr) { ini.setValue("data", QString(idStr)); } break; } case ST_LEVEL: if (psVal->v.sval) { ini.setValue("data", QString(psVal->v.sval)); } break; case ST_RESEARCH: psResearch = (RESEARCH *)psVal->v.oval; if (psResearch && psResearch->pName && psResearch->pName[0] != '\0') { ini.setValue("data", QString(psResearch->pName)); ASSERT(psResearch == getResearch(psResearch->pName), "Research %s not found!", psResearch->pName); } break; case ST_GROUP: { DROID_GROUP *const psGroup = (DROID_GROUP *)psVal->v.oval; if (psGroup) { const int members = psGroup->getNumMembers(); QStringList droids; for (psCDroid = psGroup->psList; psCDroid; psCDroid = psCDroid->psGrpNext) { checkValidId(psCDroid->id); droids.push_back(QString::number(psCDroid->id)); } ini.setValue("members", QVariant(members)); if (droids.size() > 0) { ini.setValue("data", droids); } ini.setVector2i("runpos", psGroup->sRunData.sPos); ini.setValue("forceLevel", QVariant(psGroup->sRunData.forceLevel)); ini.setValue("leadership", QVariant(psGroup->sRunData.leadership)); ini.setValue("healthLevel", QVariant(psGroup->sRunData.healthLevel)); } break; } case ST_SOUND: if(psVal->v.ival) { // can also return NULL pName = sound_GetTrackName((UDWORD)psVal->v.ival); } else { pName = NULL; } if (!pName) { debug(LOG_WARNING, "Could not get sound track name"); } if (pName) { ini.setValue("data", QString(pName)); } break; case ST_STRUCTUREID: case ST_DROIDID: ini.setValue("data", QVariant(psVal->v.ival)); break; default: ASSERT(false, "Unknown script variable type for save"); break; } return true; }
// save the context information for the script system static bool eventSaveContext(WzConfig &ini) { int numVars, numContext = 0; UDWORD hashedName; // go through the context list for (SCRIPT_CONTEXT *psCCont = psContList; psCCont != NULL; psCCont = psCCont->psNext) { // save the context info if (!resGetHashfromData("SCRIPT", psCCont->psCode, &hashedName)) { debug(LOG_FATAL, "Could not find script resource id"); return false; } numVars = psCCont->psCode->numGlobals + psCCont->psCode->arraySize; ini.beginGroup("context_" + QString::number(numContext)); ini.setValue("context", hashedName); ini.setValue("numVars", numVars); ini.setValue("release", psCCont->release); ini.beginGroup("var"); // save the context variables int countVar = 0; for (VAL_CHUNK *psCVals = psCCont->psGlobals; psCVals != NULL; psCVals = psCVals->psNext) { for (int i = 0; i < CONTEXT_VALS; i++) { INTERP_VAL *psVal = psCVals->asVals + i; ASSERT(psVal->type < SWORD_MAX, "Variable type number %d too big", (int)psVal->type); ini.beginGroup(QString::number(countVar)); ini.setValue("type", QVariant(psVal->type)); ini.setValue("typename", QString(scriptTypeToString(psVal->type))); // for debugging // store the variable value if (psVal->type == VAL_STRING) { ini.setValue("data", QString(psVal->v.sval)); } else if (psVal->type == VAL_BOOL) { ini.setValue("data", QVariant((bool)psVal->v.bval)); } else if (psVal->type == VAL_FLOAT) { ini.setValue("data", QVariant((float)psVal->v.fval)); } else if (psVal->type == VAL_OBJ_GETSET || psVal->type == VAL_FUNC_EXTERN) { ini.setValue("data", QString("n/a")); } else if (psVal->type < VAL_USERTYPESTART) { ini.setValue("data", QVariant(psVal->v.ival)); } else { // user defined type SCR_VAL_SAVE saveFunc = asScrTypeTab[psVal->type - VAL_USERTYPESTART].saveFunc; ASSERT(saveFunc != NULL, "No save function for type %d", psVal->type); if (!saveFunc(psVal, ini)) { debug(LOG_FATAL, "Could not get user defined variable value"); return false; } } numVars -=1; countVar++; ini.endGroup(); if (numVars <= 0) { // done all the variables ASSERT(psCVals->psNext == NULL, "Number of context variables does not match the script code"); break; } } } ASSERT(numVars == 0, "Number of context variables does not match the script code (%d)", numVars); ini.endGroup(); ini.endGroup(); numContext++; } // actually store how many contexts have been saved ini.setValue("general/contexts", QVariant(numContext)); return true; }