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