bool initTemplates() { WzConfig ini("templates.ini"); if (ini.status() != QSettings::NoError) { debug(LOG_FATAL, "Could not open templates.ini"); return false; } QStringList list = ini.childGroups(); for (int i = 0; i < list.size(); ++i) { ini.beginGroup(list[i]); DROID_TEMPLATE design; design.pName = NULL; design.droidType = (DROID_TYPE)ini.value("droidType").toInt(); design.multiPlayerID = generateNewObjectId(); design.asParts[COMP_BODY] = getCompFromName(COMP_BODY, ini.value("body", QString("ZNULLBODY")).toString().toUtf8().constData()); design.asParts[COMP_BRAIN] = getCompFromName(COMP_BRAIN, ini.value("brain", QString("ZNULLBRAIN")).toString().toUtf8().constData()); design.asParts[COMP_PROPULSION] = getCompFromName(COMP_PROPULSION, ini.value("propulsion", QString("ZNULLPROP")).toString().toUtf8().constData()); design.asParts[COMP_REPAIRUNIT] = getCompFromName(COMP_REPAIRUNIT, ini.value("repair", QString("ZNULLREPAIR")).toString().toUtf8().constData()); design.asParts[COMP_ECM] = getCompFromName(COMP_ECM, ini.value("ecm", QString("ZNULLECM")).toString().toUtf8().constData()); design.asParts[COMP_SENSOR] = getCompFromName(COMP_SENSOR, ini.value("sensor", QString("ZNULLSENSOR")).toString().toUtf8().constData()); design.asParts[COMP_CONSTRUCT] = getCompFromName(COMP_CONSTRUCT, ini.value("construct", QString("ZNULLCONSTRUCT")).toString().toUtf8().constData()); design.asWeaps[0] = getCompFromName(COMP_WEAPON, ini.value("weapon/1", QString("ZNULLWEAPON")).toString().toUtf8().constData()); design.asWeaps[1] = getCompFromName(COMP_WEAPON, ini.value("weapon/2", QString("ZNULLWEAPON")).toString().toUtf8().constData()); design.asWeaps[2] = getCompFromName(COMP_WEAPON, ini.value("weapon/3", QString("ZNULLWEAPON")).toString().toUtf8().constData()); design.numWeaps = ini.value("weapons").toInt(); design.prefab = false; // not AI template design.stored = true; bool valid = intValidTemplate(&design, ini.value("name").toString().toUtf8().constData()); if (!valid) { debug(LOG_ERROR, "Invalid template %d / %s from stored templates", i, list[i].toUtf8().constData()); continue; } addTemplateToList(&design, &apsDroidTemplates[selectedPlayer]); localTemplates.push_back(design); ini.endGroup(); } return true; }
static void setComponent(QString name, int player, int value) { int type = -1; int compInc = -1; for (int j = COMP_BODY; j < COMP_NUMCOMPONENTS && compInc == -1; j++) { // this is very inefficient, but I am so not giving in to the deranged nature of the components code // and convoluting the new script system for its sake compInc = getCompFromName(j, name.toUtf8().constData()); type = j; } ASSERT_OR_RETURN(, compInc != -1 && type != -1, "Bad component value"); apCompLists[player][type][compInc] = value; }
bool initTemplates() { WzConfig ini("userdata/" + QString(rulesettag) + "/templates.ini"); if (ini.status() != QSettings::NoError) { debug(LOG_FATAL, "Could not open templates.ini"); return false; } QStringList list = ini.childGroups(); for (int i = 0; i < list.size(); ++i) { ini.beginGroup(list[i]); DROID_TEMPLATE design; design.droidType = (DROID_TYPE)ini.value("droidType").toInt(); design.multiPlayerID = generateNewObjectId(); design.asParts[COMP_BODY] = getCompFromName(COMP_BODY, ini.value("body", QString("ZNULLBODY")).toString()); design.asParts[COMP_BRAIN] = getCompFromName(COMP_BRAIN, ini.value("brain", QString("ZNULLBRAIN")).toString()); design.asParts[COMP_PROPULSION] = getCompFromName(COMP_PROPULSION, ini.value("propulsion", QString("ZNULLPROP")).toString()); design.asParts[COMP_REPAIRUNIT] = getCompFromName(COMP_REPAIRUNIT, ini.value("repair", QString("ZNULLREPAIR")).toString()); design.asParts[COMP_ECM] = getCompFromName(COMP_ECM, ini.value("ecm", QString("ZNULLECM")).toString()); design.asParts[COMP_SENSOR] = getCompFromName(COMP_SENSOR, ini.value("sensor", QString("ZNULLSENSOR")).toString()); design.asParts[COMP_CONSTRUCT] = getCompFromName(COMP_CONSTRUCT, ini.value("construct", QString("ZNULLCONSTRUCT")).toString()); design.asWeaps[0] = getCompFromName(COMP_WEAPON, ini.value("weapon/1", QString("ZNULLWEAPON")).toString()); design.asWeaps[1] = getCompFromName(COMP_WEAPON, ini.value("weapon/2", QString("ZNULLWEAPON")).toString()); design.asWeaps[2] = getCompFromName(COMP_WEAPON, ini.value("weapon/3", QString("ZNULLWEAPON")).toString()); design.numWeaps = ini.value("weapons").toInt(); design.prefab = false; // not AI template design.stored = true; if (!(asBodyStats + design.asParts[COMP_BODY])->designable || !(asPropulsionStats + design.asParts[COMP_PROPULSION])->designable || (design.asParts[COMP_BRAIN] > 0 && !(asBrainStats + design.asParts[COMP_BRAIN])->designable) || (design.asParts[COMP_REPAIRUNIT] > 0 && !(asRepairStats + design.asParts[COMP_REPAIRUNIT])->designable) || (design.asParts[COMP_ECM] > 0 && !(asECMStats + design.asParts[COMP_ECM])->designable) || (design.asParts[COMP_SENSOR] > 0 && !(asSensorStats + design.asParts[COMP_SENSOR])->designable) || (design.asParts[COMP_CONSTRUCT] > 0 && !(asConstructStats + design.asParts[COMP_CONSTRUCT])->designable) || (design.numWeaps > 0 && !(asWeaponStats + design.asWeaps[0])->designable) || (design.numWeaps > 1 && !(asWeaponStats + design.asWeaps[1])->designable) || (design.numWeaps > 2 && !(asWeaponStats + design.asWeaps[2])->designable)) { debug(LOG_ERROR, "Template %d / %s from stored templates cannot be designed", i, list[i].toUtf8().constData()); continue; } bool valid = intValidTemplate(&design, ini.value("name").toString().toUtf8().constData(), false, selectedPlayer); if (!valid) { debug(LOG_ERROR, "Invalid template %d / %s from stored templates", i, list[i].toUtf8().constData()); continue; } DROID_TEMPLATE *psDestTemplate = apsDroidTemplates[selectedPlayer]; while (psDestTemplate != NULL) { // Check if template is identical to a loaded template if (psDestTemplate->droidType == design.droidType && psDestTemplate->name.compare(design.name) == 0 && psDestTemplate->numWeaps == design.numWeaps && psDestTemplate->asWeaps[0] == design.asWeaps[0] && psDestTemplate->asWeaps[1] == design.asWeaps[1] && psDestTemplate->asWeaps[2] == design.asWeaps[2] && psDestTemplate->asParts[COMP_BODY] == design.asParts[COMP_BODY] && psDestTemplate->asParts[COMP_PROPULSION] == design.asParts[COMP_PROPULSION] && psDestTemplate->asParts[COMP_REPAIRUNIT] == design.asParts[COMP_REPAIRUNIT] && psDestTemplate->asParts[COMP_ECM] == design.asParts[COMP_ECM] && psDestTemplate->asParts[COMP_SENSOR] == design.asParts[COMP_SENSOR] && psDestTemplate->asParts[COMP_CONSTRUCT] == design.asParts[COMP_CONSTRUCT] && psDestTemplate->asParts[COMP_BRAIN] == design.asParts[COMP_BRAIN]) { break; } psDestTemplate = psDestTemplate->psNext; } if (psDestTemplate) { psDestTemplate->stored = true; // assimilate it ini.endGroup(); continue; // next! } design.enabled = allowDesign; addTemplateToList(&design, &apsDroidTemplates[selectedPlayer]); sendTemplate(selectedPlayer, &design); localTemplates.push_back(design); ini.endGroup(); } return true; }
/* load the Droid stats for the components from the Access database */ bool loadDroidTemplates(const char *filename) { WzConfig ini(filename, WzConfig::ReadOnlyAndRequired); QStringList list = ini.childGroups(); for (int i = 0; i < list.size(); ++i) { ini.beginGroup(list[i]); DROID_TEMPLATE design; QString droidType = ini.value("type").toString(); design.id = list[i]; design.name = ini.value("name").toString(); if (droidType == "PERSON") design.droidType = DROID_PERSON; else if (droidType == "CYBORG") design.droidType = DROID_CYBORG; else if (droidType == "CYBORG_SUPER") design.droidType = DROID_CYBORG_SUPER; else if (droidType == "CYBORG_CONSTRUCT") design.droidType = DROID_CYBORG_CONSTRUCT; else if (droidType == "CYBORG_REPAIR") design.droidType = DROID_CYBORG_REPAIR; else if (droidType == "TRANSPORTER") design.droidType = DROID_TRANSPORTER; else if (droidType == "SUPERTRANSPORTER") design.droidType = DROID_SUPERTRANSPORTER; else if (droidType == "DROID") design.droidType = DROID_DEFAULT; else ASSERT(false, "No such droid type \"%s\" for %s", droidType.toUtf8().constData(), getID(&design)); design.multiPlayerID = generateNewObjectId(); design.asParts[COMP_BODY] = getCompFromName(COMP_BODY, ini.value("compBody", "ZNULLBODY").toString()); design.asParts[COMP_BRAIN] = getCompFromName(COMP_BRAIN, ini.value("compBrain", "ZNULLBRAIN").toString()); design.asParts[COMP_REPAIRUNIT] = getCompFromName(COMP_REPAIRUNIT, ini.value("compRepair", "ZNULLREPAIR").toString()); design.asParts[COMP_CONSTRUCT] = getCompFromName(COMP_CONSTRUCT, ini.value("compConstruct", "ZNULLCONSTRUCT").toString()); design.asParts[COMP_ECM] = getCompFromName(COMP_ECM, ini.value("compECM", "ZNULLECM").toString()); design.asParts[COMP_SENSOR] = getCompFromName(COMP_SENSOR, ini.value("compSensor", "ZNULLSENSOR").toString()); design.asParts[COMP_PROPULSION] = getCompFromName(COMP_PROPULSION, ini.value("compPropulsion", "ZNULLPROP").toString()); QStringList weapons = ini.value("weapons").toStringList(); for (int j = 0; j < weapons.size(); j++) { design.asWeaps[j] = getCompFromName(COMP_WEAPON, weapons[j]); } design.numWeaps = weapons.size(); design.prefab = true; design.stored = false; design.enabled = true; bool available = ini.value("available", false).toBool(); char const *droidResourceName = getDroidResourceName(list[i].toUtf8().constData()); design.name = droidResourceName != NULL? droidResourceName : GetDefaultTemplateName(&design); ini.endGroup(); for (int i = 0; i < MAX_PLAYERS; ++i) { // Give those meant for humans to all human players. if (NetPlay.players[i].allocated && available) { design.prefab = false; addTemplateToList(&design, &apsDroidTemplates[i]); // This sets up the UI templates for display purposes ONLY--we still only use apsDroidTemplates for making them. // FIXME: Why are we doing this here, and not on demand ? // Only add unique designs to the UI list (Note, perhaps better to use std::map instead?) std::list<DROID_TEMPLATE>::iterator it; for (it = localTemplates.begin(); it != localTemplates.end(); ++it) { DROID_TEMPLATE *psCurr = &*it; if (psCurr->multiPlayerID == design.multiPlayerID) { debug(LOG_ERROR, "Design id:%d (%s) *NOT* added to UI list (duplicate), player= %d", design.multiPlayerID, getName(&design), i); break; } } if (it == localTemplates.end()) { debug(LOG_NEVER, "Design id:%d (%s) added to UI list, player =%d", design.multiPlayerID, getName(&design), i); localTemplates.push_front(design); } } else if (!NetPlay.players[i].allocated) // AI template { design.prefab = true; // prefabricated templates referenced from VLOs addTemplateToList(&design, &apsDroidTemplates[i]); } } debug(LOG_NEVER, "Droid template found, Name: %s, MP ID: %d, ref: %u, ID: %s, prefab: %s, type:%d (loading)", getName(&design), design.multiPlayerID, design.ref, getID(&design), design.prefab ? "yes":"no", design.droidType); } return true; }
DROID_TEMPLATE loadTemplateCommon(WzConfig &ini) { DROID_TEMPLATE design; QString droidType = ini.value("type").toString(); if (droidType == "ECM") { design.droidType = DROID_ECM; } else if (droidType == "SENSOR") { design.droidType = DROID_SENSOR; } else if (droidType == "CONSTRUCT") { design.droidType = DROID_CONSTRUCT; } else if (droidType == "WEAPON") { design.droidType = DROID_WEAPON; } else if (droidType == "PERSON") { design.droidType = DROID_PERSON; } else if (droidType == "CYBORG") { design.droidType = DROID_CYBORG; } else if (droidType == "CYBORG_SUPER") { design.droidType = DROID_CYBORG_SUPER; } else if (droidType == "CYBORG_CONSTRUCT") { design.droidType = DROID_CYBORG_CONSTRUCT; } else if (droidType == "CYBORG_REPAIR") { design.droidType = DROID_CYBORG_REPAIR; } else if (droidType == "TRANSPORTER") { design.droidType = DROID_TRANSPORTER; } else if (droidType == "SUPERTRANSPORTER") { design.droidType = DROID_SUPERTRANSPORTER; } else if (droidType == "DROID") { design.droidType = DROID_DEFAULT; } else if (droidType == "DROID_COMMAND") { design.droidType = DROID_COMMAND; } else if (droidType == "REPAIR") { design.droidType = DROID_REPAIR; } else { ASSERT(false, "No such droid type \"%s\" for %s", droidType.toUtf8().constData(), getID(&design)); } design.asParts[COMP_BODY] = getCompFromName(COMP_BODY, ini.value("body").toString()); design.asParts[COMP_BRAIN] = getCompFromName(COMP_BRAIN, ini.value("brain", QString("ZNULLBRAIN")).toString()); design.asParts[COMP_PROPULSION] = getCompFromName(COMP_PROPULSION, ini.value("propulsion", QString("ZNULLPROP")).toString()); design.asParts[COMP_REPAIRUNIT] = getCompFromName(COMP_REPAIRUNIT, ini.value("repair", QString("ZNULLREPAIR")).toString()); design.asParts[COMP_ECM] = getCompFromName(COMP_ECM, ini.value("ecm", QString("ZNULLECM")).toString()); design.asParts[COMP_SENSOR] = getCompFromName(COMP_SENSOR, ini.value("sensor", QString("ZNULLSENSOR")).toString()); design.asParts[COMP_CONSTRUCT] = getCompFromName(COMP_CONSTRUCT, ini.value("construct", QString("ZNULLCONSTRUCT")).toString()); QStringList weapons = ini.value("weapons").toStringList(); design.numWeaps = weapons.size(); design.asWeaps[0] = getCompFromName(COMP_WEAPON, weapons.value(0, QString("ZNULLWEAPON"))); design.asWeaps[1] = getCompFromName(COMP_WEAPON, weapons.value(1, QString("ZNULLWEAPON"))); design.asWeaps[2] = getCompFromName(COMP_WEAPON, weapons.value(2, QString("ZNULLWEAPON"))); return design; }
/// default value load routine bool scrValDefLoad(INTERP_VAL *psVal, WzConfig &ini) { DROID *psCDroid; SDWORD index, members; UDWORD id; LEVEL_DATASET *psLevel; DROID_GROUP *psGroup = NULL; switch ((unsigned)psVal->type) // Unsigned cast to suppress compiler warnings due to enum abuse. { case ST_INTMESSAGE: if (ini.contains("data")) { psVal->v.oval = (void*)getViewData(ini.value("data").toString().toUtf8().constData()); } else { psVal->v.oval = NULL; } break; case ST_BASEOBJECT: case ST_DROID: case ST_STRUCTURE: case ST_FEATURE: if (ini.contains("data")) { psVal->v.oval = (void*)getBaseObjFromId(ini.value("data").toInt()); } else { psVal->v.oval = NULL; } break; case ST_BASESTATS: case ST_COMPONENT: break; case ST_STRUCTURESTAT: index = 0; if (ini.contains("data")) { index = getStructStatFromName(ini.value("data").toString().toUtf8().constData()); if (index == -1) { debug( LOG_FATAL, "Could not find stat"); index = 0; } } psVal->v.ival = index; break; case ST_FEATURESTAT: index = 0; if (ini.contains("data")) { index = getFeatureStatFromName(ini.value("data").toString().toUtf8().constData()); if (index == -1) { debug( LOG_FATAL, "Could not find stat"); index = 0; } } psVal->v.ival = index; break; case ST_BODY: index = getCompFromName(COMP_BODY, ini.value("data").toString()); if (index == -1) { debug(LOG_FATAL, "Could not find body component"); index = 0; } psVal->v.ival = index; break; case ST_PROPULSION: index = getCompFromName(COMP_PROPULSION, ini.value("data").toString()); if (index == -1) { debug(LOG_FATAL, "Could not find propulsion component"); index = 0; } psVal->v.ival = index; break; case ST_ECM: index = getCompFromName(COMP_ECM, ini.value("data").toString()); if (index == -1) { debug(LOG_FATAL, "Could not find ECM component"); index = 0; } psVal->v.ival = index; break; case ST_SENSOR: index = getCompFromName(COMP_SENSOR, ini.value("data").toString()); if (index == -1) { debug(LOG_FATAL, "Could not find sensor component"); index = 0; } psVal->v.ival = index; break; case ST_CONSTRUCT: index = getCompFromName(COMP_CONSTRUCT, ini.value("data").toString()); if (index == -1) { debug(LOG_FATAL, "Could not find constructor component"); index = 0; } psVal->v.ival = index; break; case ST_WEAPON: index = getCompFromName(COMP_WEAPON, ini.value("data").toString()); if (index == -1) { debug(LOG_FATAL, "Could not find weapon"); index = 0; } psVal->v.ival = index; break; case ST_REPAIR: index = getCompFromName(COMP_REPAIRUNIT, ini.value("data").toString()); if (index == -1) { debug(LOG_FATAL, "Could not find repair component"); index = 0; } psVal->v.ival = index; break; case ST_BRAIN: index = getCompFromName(COMP_BRAIN, ini.value("data").toString()); if (index == -1) { debug(LOG_FATAL, "Could not find repair brain"); index = 0; } psVal->v.ival = index; break; case ST_TEMPLATE: psVal->v.oval = NULL; if (ini.contains("data")) { // FIXME: Ugh. Find a better way to show full template info psVal->v.oval = (void*)IdToTemplate(ini.value("data").toInt(), ANYPLAYER); if ((DROID_TEMPLATE*)(psVal->v.oval) == NULL) { debug(LOG_FATAL, "Could not find template %d", ini.value("data").toInt()); } } break; case ST_TEXTSTRING: psVal->v.sval = NULL; if (ini.contains("data")) { psVal->v.sval = strdup(ini.value("data").toString().toUtf8().constData()); } break; case ST_LEVEL: psVal->v.sval = NULL; if (ini.contains("data")) { psLevel = levFindDataSet(ini.value("data").toString().toUtf8().constData()); if (psLevel == NULL) { debug(LOG_FATAL, "Could not find level dataset"); } psVal->v.sval = psLevel->pName; } break; case ST_RESEARCH: psVal->v.oval = NULL; if (ini.contains("data")) { QString research = ini.value("data").toString(); if (!research.isEmpty()) { psVal->v.oval = (void*)getResearch(research.toUtf8().constData()); ASSERT_OR_RETURN(false, psVal->v.oval, "Could not find research %s", research.toUtf8().constData()); } } break; case ST_GROUP: if (psVal->v.oval == NULL) { DROID_GROUP *tmp = grpCreate(); tmp->add(NULL); psVal->v.oval = tmp; } psGroup = (DROID_GROUP *)(psVal->v.oval); members = ini.value("members", 0).toInt(); if (psGroup && members > 0) { QStringList droids = ini.value("data").toStringList(); // load the retreat data psGroup->sRunData.sPos = ini.vector2i("runpos"); psGroup->sRunData.forceLevel = ini.value("forceLevel").toInt(); psGroup->sRunData.leadership = ini.value("leadership").toInt(); psGroup->sRunData.healthLevel = ini.value("healthLevel").toInt(); // load the droids while (members > 0) { id = droids.takeLast().toInt(); psCDroid = (DROID *)getBaseObjFromId(id); if (!psCDroid) { debug(LOG_ERROR, "Could not find object id %d", id); } else { ((DROID_GROUP*)(psVal->v.oval))->add(psCDroid); } members--; } } break; case ST_SOUND: // find audio id // don't use sound if it's disabled if (audio_Disabled()) { psVal->v.ival = NO_SOUND; break; } index = audio_GetTrackID(ini.value("data").toString().toUtf8().constData()); if (index == SAMPLE_NOT_FOUND) { // find empty id and set track vals QString soundname = ini.value("data").toString(); index = audio_SetTrackVals(soundname.toUtf8().constData(), false, 100, 1800); if (!index) // this is a NON fatal error. { // We can't find filename of the sound for some reason. debug(LOG_ERROR, "Sound ID not available %s not found", soundname.toUtf8().constData()); break; } } psVal->v.ival = index; break; case ST_STRUCTUREID: case ST_DROIDID: default: // just set the contents directly psVal->v.ival = ini.value("data").toInt(); break; } return true; }