bool Level::LoadLevelInfo(const char *pszLevelName, IniReader *piniLoaded) { IniReader *pini; if (piniLoaded == NULL) { pini = LoadIniFile(gpakr, pszLevelName); if (pini == NULL) { Assert(false); return false; } } else { pini = piniLoaded; } // Get level version if (pini->GetPropertyValue("General", "Version", "%d", &m_nVersion) == 0) m_nVersion = 0; // Get revision # if (pini->GetPropertyValue("General", "Revision", "%d", &m_dwRevision) == 0) m_dwRevision = 0; // Can't run if the level version is newer than what the game supports bool fSuccess = true; if (m_nVersion > knVersionLevelSupported) { fSuccess = false; HtMessageBox(kfMbWhiteBorder, "Error", "Newer version of Hostile Takeover required to run this mission."); } else { // Load General level data if (!pini->GetPropertyValue("General", "Title", m_szTitle, sizeof(m_szTitle))) strcpy(m_szTitle, "<untitled>"); m_nPlayersMin = m_nPlayersMax = 0; pini->GetPropertyValue("General", "MinPlayers", "%d", &m_nPlayersMin); pini->GetPropertyValue("General", "MaxPlayers", "%d", &m_nPlayersMax); // Normalize if (pszLevelName[0] == 'm' && pszLevelName[1] == '_') { if (m_nPlayersMin < 2) { m_nPlayersMin = 2; } if (m_nPlayersMax > 4) { m_nPlayersMax = 4; } if (m_nPlayersMax < m_nPlayersMin) { m_nPlayersMax = m_nPlayersMin; } } else { m_nPlayersMin = 1; m_nPlayersMax = 1; } // Read in the side info for each side Side side; for (side = ksideNeutral; side < kcSides; side++) { if (side == ksideNeutral) { LoadSideInfo(pini, "sideNeutral", &m_asidi[side]); } else { char szSideName[] = "side1"; szSideName[4] = '0' + side; LoadSideInfo(pini, szSideName, &m_asidi[side]); } } // If there is no human side, assume it is side 1 // because gpplrLocal has to be set to something (because our code is intolerant) bool fHumanFound = false; for (side = ksideNeutral; side < kcSides; side++) { if (m_asidi[side].nIntelligence == knIntelligenceHuman) fHumanFound = true; } if (!fHumanFound) m_asidi[kside1].nIntelligence = knIntelligenceHuman; } if (piniLoaded == NULL) delete pini; return fSuccess; }
bool MissionList::GetMissionDescription(int i, MissionDescription *pmd) { PdbItem *ppdbi; LvlItem *plvli = FindLevelItem(i, &ppdbi); if (plvli == NULL) { return false; } if (!gppackm->Mount(gpakr, &ppdbi->packid)) { return false; } const char *pszName; switch (plvli->mt) { case kmtStory: pszName = "Story Missions"; break; case kmtMultiplayerChallenge: case kmtChallenge: pszName = "Challenge Missions"; break; case kmtDemo: pszName = "Demo Missions"; break; case kmtMultiplayerAddOn: case kmtAddOn: pszName = ppdbi->pszTitle; if (strlen(pszName) == 0) { pszName = ExtractPackTitle(&ppdbi->packid); if (pszName == NULL) { pszName = "Add-On Mission Pack"; } } break; default: pszName = "<untitled>"; break; } strncpyz(pmd->szPackName, pszName, sizeof(pmd->szPackName)); pmd->mt = plvli->mt; IniReader *pini = LoadIniFile(gpakr, plvli->pszFilename); if (pini == NULL) { gppackm->Unmount(gpakr, &ppdbi->packid); return false; } strncpyz(pmd->szLvlTitle, "<untitled>", sizeof(pmd->szLvlTitle)); pini->GetPropertyValue("General", "Title", pmd->szLvlTitle, sizeof(pmd->szLvlTitle)); if (IsMultiplayerMissionType(plvli->mt)) { pmd->cPlayersMin = 2; pini->GetPropertyValue("General", "MinPlayers", "%d", &pmd->cPlayersMin); if (pmd->cPlayersMin < 2) { pmd->cPlayersMin = 2; } pmd->cPlayersMax = 2; pini->GetPropertyValue("General", "MaxPlayers", "%d", &pmd->cPlayersMax); if (pmd->cPlayersMax > 4) { pmd->cPlayersMax = 4; } } else { pmd->cPlayersMin = 1; pmd->cPlayersMax = 1; } delete pini; gppackm->Unmount(gpakr, &ppdbi->packid); return true; }