Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}