Пример #1
0
// 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;
}