int CvMapGenerator::getRiverValueAtPlot(CvPlot* pPlot) { CvPlot* pAdjacentPlot; CvRandom riverRand; int iSum; int iI; FAssert(pPlot != NULL); long result = 0; CyPlot kPlot = CyPlot(pPlot); CyArgsList argsList; argsList.add(gDLL->getPythonIFace()->makePythonObject(&kPlot)); if (gDLL->getPythonIFace()->callFunction(gDLL->getPythonIFace()->getMapScriptModule(), "getRiverAltitude", argsList.makeFunctionArgs(), &result)) { if (!gDLL->getPythonIFace()->pythonUsingDefaultImpl()) // Python override { if (result >= 0) { return result; } else { FAssertMsg(false, "python getRiverAltitude() must return >= 0"); } } } iSum = result; iSum += ((NUM_PLOT_TYPES - pPlot->getPlotType()) * 20); for (iI = 0; iI < NUM_DIRECTION_TYPES; iI++) { pAdjacentPlot = plotDirection(pPlot->getX_INLINE(), pPlot->getY_INLINE(), ((DirectionTypes)iI)); if (pAdjacentPlot != NULL) { iSum += (NUM_PLOT_TYPES - pAdjacentPlot->getPlotType()); } else { iSum += (NUM_PLOT_TYPES * 10); } } riverRand.init((pPlot->getX_INLINE() * 43251267) + (pPlot->getY_INLINE() * 8273903)); iSum += (riverRand.get(10, "River Rand")); return iSum; }
void CvReplayInfo::createInfo() { CvGame& game = GC.getGame(); const PlayerTypes eActivePlayer = game.getActivePlayer(); m_strMapScriptName = CvPreGame::mapScriptName(); m_eWorldSize = CvPreGame::worldSize(); m_eClimate = CvPreGame::climate(); m_eSeaLevel = CvPreGame::seaLevel(); m_eEra = CvPreGame::era(); m_eGameSpeed = game.getGameSpeedType(); m_listGameOptions.clear(); for(int i = 0; i < NUM_GAMEOPTION_TYPES; i++) { GameOptionTypes eOption = (GameOptionTypes)i; if(game.isOption(eOption)) { m_listGameOptions.push_back(eOption); } } m_listVictoryTypes.clear(); for(int i = 0; i < GC.getNumVictoryInfos(); i++) { VictoryTypes eVictory = (VictoryTypes)i; if(game.isVictoryValid(eVictory)) { m_listVictoryTypes.push_back(eVictory); } } m_eVictoryType = NO_VICTORY; m_iNormalizedScore = 0; if(NO_PLAYER != eActivePlayer) { CvPlayer& player = GET_PLAYER(eActivePlayer); if(game.getWinner() == player.getTeam()) { m_eVictoryType = game.getVictory(); } m_iNormalizedScore = player.GetScore(true, player.getTeam() == game.getWinner()); } //m_eGameType = CvPreGame::getGameType(); m_iInitialTurn = game.getStartTurn(); m_iStartYear = game.getStartYear(); m_iFinalTurn = game.getGameTurn(); CvGameTextMgr::setYearStr(m_strFinalDate, m_iFinalTurn, false, game.getCalendar(), game.getStartYear(), game.getGameSpeedType()); m_eCalendar = game.getCalendar(); m_dataSetMap.clear(); m_listPlayerDataSets.clear(); m_listPlayerInfo.clear(); m_listPlots.clear(); std::map<int, int> mapPlayers; mapPlayers[-1] = -1; //account for NO_PLAYER. m_iActivePlayer = -1; int iPlayerIndex = 0; for(int iPlayer = 0; iPlayer < MAX_CIV_PLAYERS; iPlayer++) { CvPlayer& player = GET_PLAYER((PlayerTypes)iPlayer); if(player.isEverAlive()) { //Ensure that final turn is stored. player.GatherPerTurnReplayStats(m_iFinalTurn); mapPlayers[iPlayer] = iPlayerIndex; if(iPlayer == game.getActivePlayer()) { m_iActivePlayer = iPlayerIndex; } ++iPlayerIndex; PlayerInfo playerInfo; playerInfo.m_eLeader = player.getLeaderType(); playerInfo.m_eCivilization = player.getCivilizationType(); playerInfo.m_eDifficulty = player.getHandicapType(); playerInfo.m_strCustomLeaderName = player.getName(); playerInfo.m_strCustomCivilizationName = player.getCivilizationDescription(); playerInfo.m_strCustomCivilizationShortName = player.getCivilizationShortDescription(); playerInfo.m_strCustomCivilizationAdjective = player.getCivilizationAdjective(); playerInfo.m_ePlayerColor = player.getPlayerColor(); TurnDataSets dataSet(m_dataSetMap.size()); unsigned int uiNumDataSets = player.getNumReplayDataSets(); for(unsigned int uiPlayerDataSet = 0; uiPlayerDataSet < uiNumDataSets; ++uiPlayerDataSet) { // First, Locate the index of the dataset std::string playerDataSetName = player.getReplayDataSetName(uiPlayerDataSet); unsigned int uiDataSet = 0; bool bFound = false; for(uiDataSet = 0; uiDataSet < m_dataSetMap.size(); ++uiDataSet) { const std::string& dataSetName = m_dataSetMap[uiDataSet]; if(dataSetName == playerDataSetName) { bFound = true; break; } } // Add a new index if one doesn't exist. if(!bFound) { m_dataSetMap.push_back(playerDataSetName); dataSet.push_back(TurnData()); uiDataSet = m_dataSetMap.size() - 1; } CvPlayer::TurnData playerData = player.getReplayDataHistory(uiPlayerDataSet); TurnData turnData; for(CvPlayer::TurnData::iterator it = playerData.begin(); it != playerData.end(); ++it) { turnData[(*it).first - m_iInitialTurn] = (*it).second; } dataSet[uiDataSet] = turnData; } m_listPlayerDataSets.push_back(dataSet); m_listPlayerInfo.push_back(playerInfo); } } m_listReplayMessages.clear(); const uint nMessages = game.getNumReplayMessages(); m_listReplayMessages.reserve(nMessages); for(uint i = 0; i < nMessages; ++i) { const CvReplayMessage* pMessage = game.getReplayMessage(i); if(pMessage) { CvReplayMessage modifiedMessage = (*pMessage); modifiedMessage.setPlayer((PlayerTypes)mapPlayers[modifiedMessage.getPlayer()]); m_listReplayMessages.push_back(modifiedMessage); } } CvMap& kMap = GC.getMap(); m_iMapWidth = kMap.getGridWidth(); m_iMapHeight = kMap.getGridHeight(); int numPlots = kMap.numPlots(); m_listPlots.clear(); m_listPlots.reserve(numPlots); for(int i = 0; i < numPlots; i++) { PlotState plotState; CvPlot* pkPlot = kMap.plotByIndexUnchecked(i); plotState.m_ePlotType = pkPlot->getPlotType(); plotState.m_eTerrain = pkPlot->getTerrainType(); plotState.m_eFeature = pkPlot->getFeatureType(); plotState.m_bNEOfRiver = pkPlot->isNEOfRiver(); plotState.m_bWOfRiver = pkPlot->isWOfRiver(); plotState.m_bNWOfRiver = pkPlot->isNWOfRiver(); PlotStatePerTurn plotStatePerTurn; plotStatePerTurn[m_iFinalTurn] = plotState; m_listPlots.push_back(plotStatePerTurn); } }