// 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; }
// default value save routine //TODO: use union bool scrValDefSave(INTERP_VAL *psVal, char *pBuffer, UDWORD *pSize) { VIEWDATA *psIntMessage; const char *pName; RESEARCH *psResearch; char *pPos; 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) { if (pBuffer) { strcpy(pBuffer, psIntMessage->pName); } *pSize = strlen(psIntMessage->pName)+1; } else { if (pBuffer) { *pBuffer = '\0'; } *pSize = 1; } break; case ST_BASEOBJECT: case ST_DROID: case ST_STRUCTURE: case ST_FEATURE: // just save the id if (pBuffer) { if (psVal->v.oval == NULL || ((BASE_OBJECT *)psVal->v.oval)->died > NOT_CURRENT_LIST) { *((UDWORD*)pBuffer) = UDWORD_MAX; } else { *((UDWORD*)pBuffer) = ((BASE_OBJECT *)psVal->v.oval)->id; } endian_udword((UDWORD*)pBuffer); } *pSize = sizeof(UDWORD); 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 != NULL) { if (pBuffer) { strcpy(pBuffer, pName); } *pSize = strlen(pName) + 1; } else { return false; } break; case ST_TEMPLATE: if (pBuffer) { if (psVal->v.oval == NULL) { *((UDWORD*)pBuffer) = UDWORD_MAX; } else { *((UDWORD*)pBuffer) = ((DROID_TEMPLATE *)psVal->v.oval)->multiPlayerID; } endian_udword((UDWORD*)pBuffer); } *pSize = sizeof(UDWORD); break; case ST_TEXTSTRING: { const char * const idStr = psVal->v.sval ? strresGetIDfromString(psStringRes, psVal->v.sval) : NULL; uint16_t len = idStr ? strlen(idStr) + 1 : 0; if (pBuffer) { *((uint16_t*)pBuffer) = len; endian_uword((uint16_t*)pBuffer); memcpy(pBuffer + sizeof(len), idStr, len); } *pSize = sizeof(len) + len; break; } case ST_LEVEL: if (psVal->v.sval != NULL) { if (pBuffer) { strcpy(pBuffer, psVal->v.sval); } *pSize = strlen(psVal->v.sval)+1; } else { if (pBuffer) { *pBuffer = '\0'; } *pSize = 1; } break; case ST_RESEARCH: psResearch = (RESEARCH *)psVal->v.oval; if (psResearch != NULL) { if (pBuffer) { strcpy(pBuffer, psResearch->pName); } *pSize = strlen(psResearch->pName)+1; } else { if (pBuffer) { *pBuffer = '\0'; } *pSize = 1; } break; case ST_GROUP: { DROID_GROUP* const psGroup = (DROID_GROUP *)psVal->v.oval; const int members = psGroup ? psGroup->getNumMembers() : UNALLOCATED_OBJECT; if (pBuffer) { pPos = pBuffer; *((SDWORD *)pPos) = members; endian_sdword((SDWORD*)pPos); pPos += sizeof(SDWORD); if (psGroup) { // store the run data *((SDWORD *)pPos) = psGroup->sRunData.sPos.x; endian_sdword((SDWORD*)pPos); pPos += sizeof(SDWORD); *((SDWORD *)pPos) = psGroup->sRunData.sPos.y; endian_sdword((SDWORD*)pPos); pPos += sizeof(SDWORD); *((SDWORD *)pPos) = psGroup->sRunData.forceLevel; endian_sdword((SDWORD*)pPos); pPos += sizeof(SDWORD); *((SDWORD *)pPos) = psGroup->sRunData.leadership; endian_sdword((SDWORD*)pPos); pPos += sizeof(SDWORD); *((SDWORD *)pPos) = psGroup->sRunData.healthLevel; endian_sdword((SDWORD*)pPos); pPos += sizeof(SDWORD); // now store the droids for (psCDroid = psGroup->psList; psCDroid; psCDroid = psCDroid->psGrpNext) { checkValidId(psCDroid->id); *((UDWORD *)pPos) = psCDroid->id; endian_udword((UDWORD*)pPos); pPos += sizeof(UDWORD); } } } if (!psGroup) { *pSize = sizeof(SDWORD); } else { *pSize = sizeof(SDWORD) + sizeof(UDWORD) * members + sizeof(SDWORD) * 5; // members + runData } break; } case ST_SOUND: if(psVal->v.ival) { // can also return NULL pName = sound_GetTrackName((UDWORD)psVal->v.ival); } else { pName = NULL; } if (pName == NULL) { debug(LOG_WARNING, "scrValDefSave: couldn't get sound track name"); // just save an empty string pName = ""; } if (pBuffer) { strcpy(pBuffer, pName); } *pSize = strlen(pName) + 1; break; case ST_STRUCTUREID: case ST_DROIDID: // just save the variable contents directly if (pBuffer) { *((UDWORD *)pBuffer) = psVal->v.ival; endian_udword((UDWORD*)pBuffer); } *pSize = sizeof(UDWORD); break; default: ASSERT( false, "scrValDefSave: unknown script variable type for save" ); break; } return true; }