CombatGroup* CombatGroup::LoadOrderOfBattle(const char* filename, int team, Combatant* combatant) { CombatGroup* force = 0; DataLoader* loader = DataLoader::GetLoader(); BYTE* block; loader->LoadBuffer(filename, block, true); Parser parser(new(__FILE__,__LINE__) BlockReader((const char*) block)); Term* term = parser.ParseTerm(); if (!term) { Print("ERROR: could not parse order of battle '%s'\n", filename); return 0; } else { TermText* file_type = term->isText(); if (!file_type || file_type->value() != "ORDER_OF_BATTLE") { Print("ERROR: invalid Order of Battle file '%s'\n", filename); term->print(10); return 0; } } do { delete term; term = 0; term = parser.ParseTerm(); if (term) { TermDef* def = term->isDef(); if (def) { if (def->name()->value() == "group") { if (!def->term() || !def->term()->isStruct()) { Print("WARNING: group struct missing in '%s'\n", filename); } else { TermStruct* val = def->term()->isStruct(); char name[256]; char type[64]; char intel[64]; char region[64]; char system[64]; char parent_type[64]; int parent_id = 0; int id = 0; int iff = -1; Vec3 loc = Vec3(1.0e9f,0.0f,0.0f); List<CombatUnit> unit_list; char unit_name[64]; char unit_regnum[16]; char unit_design[64]; char unit_skin[64]; int unit_class = 0; int unit_count = 1; int unit_dead = 0; int unit_damage = 0; int unit_heading= 0; int unit_index = 0; *name = 0; *type = 0; *intel = 0; *region = 0; *system = 0; *parent_type = 0; *unit_name = 0; *unit_regnum = 0; *unit_design = 0; *unit_skin = 0; strcpy_s(intel, "KNOWN"); // all groups in this OOB default to the IFF of the main force if (force) iff = force->GetIFF(); for (int i = 0; i < val->elements()->size(); i++) { TermDef* pdef = val->elements()->at(i)->isDef(); if (pdef && (iff < 0 || team < 0 || iff == team)) { GET_DEF_TEXT(name); else GET_DEF_TEXT(type); else GET_DEF_TEXT(intel); else GET_DEF_TEXT(region); else GET_DEF_TEXT(system); else GET_DEF_VEC(loc); else GET_DEF_TEXT(parent_type); else GET_DEF_NUM(parent_id);
void SystemDesign::Initialize(const char* filename) { Print("Loading System Designs '%s'\n", filename); // Load Design File: DataLoader* loader = DataLoader::GetLoader(); BYTE* block; int blocklen = loader->LoadBuffer(filename, block, true); Parser parser(new(__FILE__,__LINE__) BlockReader((const char*) block, blocklen)); Term* term = parser.ParseTerm(); if (!term) { Print("ERROR: could not parse '%s'\n", filename); exit(-3); } else { TermText* file_type = term->isText(); if (!file_type || file_type->value() != "SYSTEM") { Print("ERROR: invalid system design file '%s'\n", filename); exit(-4); } } int type = 1; do { delete term; term = parser.ParseTerm(); if (term) { TermDef* def = term->isDef(); if (def) { if (def->name()->value() == "system") { if (!def->term() || !def->term()->isStruct()) { Print("WARNING: system structure missing in '%s'\n", filename); } else { TermStruct* val = def->term()->isStruct(); SystemDesign* design = new(__FILE__,__LINE__) SystemDesign; for (int i = 0; i < val->elements()->size(); i++) { TermDef* pdef = val->elements()->at(i)->isDef(); if (pdef) { GET_DEF_TEXT(pdef, design, name); else if (pdef->name()->value()==("component")) { if (!pdef->term() || !pdef->term()->isStruct()) { Print("WARNING: component structure missing in system '%s' in '%s'\n", (const char*) design->name, filename); } else { TermStruct* val2 = pdef->term()->isStruct(); ComponentDesign* comp_design = new(__FILE__,__LINE__) ComponentDesign; for (int i = 0; i < val2->elements()->size(); i++) { TermDef* pdef2 = val2->elements()->at(i)->isDef(); if (pdef2) { GET_DEF_TEXT(pdef2, comp_design, name); else GET_DEF_TEXT(pdef2, comp_design, abrv); else GET_DEF_NUM (pdef2, comp_design, repair_time); else GET_DEF_NUM (pdef2, comp_design, replace_time); else GET_DEF_NUM (pdef2, comp_design, spares); else GET_DEF_NUM (pdef2, comp_design, affects); else { Print("WARNING: parameter '%s' ignored in '%s'\n", pdef2->name()->value().data(), filename); } } } design->components.append(comp_design); } } else { Print("WARNING: parameter '%s' ignored in '%s'\n", pdef->name()->value().data(), filename); } }