CUnitDefHandler::CUnitDefHandler(void) : noCost(false) { const LuaTable rootTable = game->defsParser->GetRoot().SubTable("UnitDefs"); if (!rootTable.IsValid()) { throw content_error("Error loading UnitDefs"); } vector<string> unitDefNames; rootTable.GetKeys(unitDefNames); unitDefs.reserve(unitDefNames.size() + 1); UnitDef* nullDef = new UnitDef(); unitDefs.push_back(nullDef); for (unsigned int a = 0; a < unitDefNames.size(); ++a) { const string unitName = unitDefNames[a]; LuaTable udTable = rootTable.SubTable(unitName); // parse the unitdef data (but don't load buildpics, etc...) PushNewUnitDef(unitName, udTable); } CleanBuildOptions(); FindStartUnits(); ProcessDecoys(); AssignTechLevels(); }
CUnitDefHandler::CUnitDefHandler(void) : noCost(false) { weaponDefHandler = new CWeaponDefHandler(); PrintLoadMsg("Loading unit definitions"); const LuaTable rootTable = game->defsParser->GetRoot().SubTable("UnitDefs"); if (!rootTable.IsValid()) { throw content_error("Error loading UnitDefs"); } vector<string> unitDefNames; rootTable.GetKeys(unitDefNames); numUnitDefs = unitDefNames.size(); /* // ?? "restricted" does not automatically mean "cannot be built // at all, so we don't need the unitdef for this unit" -- Kloot numUnitDefs -= gameSetup->restrictedUnits.size(); */ // This could be wasteful if there is a lot of restricted units, but that is not that likely unitDefs = new UnitDef[numUnitDefs + 1]; // start at unitdef id 1 unsigned int id = 1; for (unsigned int a = 0; a < unitDefNames.size(); ++a) { const string unitName = unitDefNames[a]; /* // Restrictions may tell us not to use this unit at all // FIXME: causes mod errors when a unit is restricted to // 0, since GetUnitByName() will return NULL if its UnitDef // has not been loaded -- Kloot const std::map<std::string, int>& resUnits = gameSetup->restrictedUnits; if ((resUnits.find(unitName) != resUnits.end()) && (resUnits.find(unitName)->second == 0)) { continue; } */ // Seems ok, load it unitDefs[id].valid = false; unitDefs[id].name = unitName; unitDefs[id].id = id; unitDefs[id].buildangle = 0; unitDefs[id].buildPic = NULL; unitDefs[id].decoyDef = NULL; unitDefs[id].techLevel = -1; unitDefs[id].collisionVolume = NULL; unitID[unitName] = id; for (int ym = 0; ym < 4; ym++) { unitDefs[id].yardmaps[ym] = 0; } // parse the unitdef data (but don't load buildpics, etc...) LuaTable udTable = rootTable.SubTable(unitName); ParseUnitDef(udTable, unitName, id); // Increase index for next unit id++; } // set the real number of unitdefs numUnitDefs = (id - 1); CleanBuildOptions(); FindStartUnits(); ProcessDecoys(); AssignTechLevels(); }