// 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; }