Code
1295/// Make a master log so that we can evaluate and compare changes to the economic AI1296void CvEconomicAI::LogMonitor(void)1297{1298 if(!(GC.getLogging() && GC.getAILogging()))1299 {1300 return;1301 }13021303 // don't log minor civs for now1304 if(m_pPlayer->isMinorCiv())1305 {1306 return;1307 }13081309 static bool bFirstRun = true;1310 bool bBuildHeader = false;1311 CvString strHeader;1312 if(bFirstRun)1313 {1314 bFirstRun = false;1315 bBuildHeader = true;1316 }13171318 CvString strLog;13191320 // Find the name of this civ and city1321 CvString strPlayerName;1322 strPlayerName = m_pPlayer->getCivilizationShortDescription();1323 CvString strLogName;13241325 // Open the log file1326 if(GC.getPlayerAndCityAILogSplit())1327 {1328 strLogName = "EconomicMonitorLog_" + strPlayerName + ".csv";1329 }1330 else1331 {1332 strLogName = "EconomicMonitorLog.csv";1333 }13341335 FILogFile* pLog;1336 pLog = LOGFILEMGR.GetLog(strLogName, FILogFile::kDontTimeStamp);13371338 CvString str;13391340 // civ name1341 AppendToLog(strHeader, strLog, "Civ Name", strPlayerName);13421343 // turn1344 AppendToLog(strHeader, strLog, "Turn", GC.getGame().getGameTurn());13451346 // # cities1347 AppendToLog(strHeader, strLog, "# Cities", GetPlayer()->getNumCities());13481349 // total pop1350 int iPop = 0;1351 int iLoopCity = 0;1352 CvCity* pLoopCity = NULL;1353 for(pLoopCity = m_pPlayer->firstCity(&iLoopCity); pLoopCity != NULL; pLoopCity = GetPlayer()->nextCity(&iLoopCity))1354 {1355 iPop += pLoopCity->getPopulation();1356 }1357 AppendToLog(strHeader, strLog, "Pop", iPop);13581359 // total yields this turn1360 for(uint ui = 0; ui < NUM_YIELD_TYPES; ui++)1361 {1362 switch(ui)1363 {1364 case YIELD_FOOD:1365 AppendToLog(strHeader, strLog, "Food", m_pPlayer->calculateTotalYield((YieldTypes)ui));1366 break;1367 case YIELD_PRODUCTION:1368 AppendToLog(strHeader, strLog, "Production", m_pPlayer->calculateTotalYield((YieldTypes)ui));1369 break;1370 case YIELD_GOLD:1371 AppendToLog(strHeader, strLog, "City Gold", m_pPlayer->calculateTotalYield((YieldTypes)ui));1372 break;1373 case YIELD_SCIENCE:1374 AppendToLog(strHeader, strLog, "Science", m_pPlayer->calculateTotalYield((YieldTypes)ui));1375 break;1376 case YIELD_CULTURE:1377 AppendToLog(strHeader, strLog, "Culture", m_pPlayer->GetTotalJONSCulturePerTurn());1378 break;1379 case YIELD_FAITH:1380 AppendToLog(strHeader, strLog, "Faith", m_pPlayer->GetTotalFaithPerTurn());1381 break;1382#if defined(MOD_API_UNIFIED_YIELDS_TOURISM)1383 case YIELD_TOURISM:1384 AppendToLog(strHeader, strLog, "Tourism", m_pPlayer->calculateTotalYield((YieldTypes)ui));1385 break;1386#endif1387#if defined(MOD_API_UNIFIED_YIELDS_GOLDEN_AGE)1388 case YIELD_GOLDEN_AGE_POINTS:1389 AppendToLog(strHeader, strLog, "Golden Age", m_pPlayer->calculateTotalYield((YieldTypes)ui));1390 break;1391#endif1392 }1393 }13941395 // Num Techs1396 AppendToLog(strHeader, strLog, "Num Techs", GET_TEAM(GetPlayer()->getTeam()).GetTeamTechs()->GetNumTechsKnown());13971398 // Culture1399#if defined(MOD_BUGFIX_DUMMY_POLICIES)1400 AppendToLog(strHeader, strLog, "Policies", GetPlayer()->GetPlayerPolicies()->GetNumPoliciesOwned(false));1401#else1402 AppendToLog(strHeader, strLog, "Policies", GetPlayer()->GetPlayerPolicies()->GetNumPoliciesOwned());1403#endif1404 AppendToLog(strHeader, strLog, "Culture (lifetime)", GetPlayer()->GetJONSCultureEverGenerated());14051406 // Faith1407 AppendToLog(strHeader, strLog, "Faith", GetPlayer()->GetFaith());14081409 // workers1410 int iWorkerCount = 0;1411 CvUnit* pLoopUnit;1412 int iLoopUnit;1413 for(pLoopUnit = m_pPlayer->firstUnit(&iLoopUnit); pLoopUnit != NULL; pLoopUnit = m_pPlayer->nextUnit(&iLoopUnit))1414 {1415 if(pLoopUnit->AI_getUnitAIType() == UNITAI_WORKER)1416 {1417 iWorkerCount++;1418 }1419 }1420 AppendToLog(strHeader, strLog, "# Workers", iWorkerCount);1421 AppendToLog(strHeader, strLog, "Positive Happiness", m_pPlayer->GetHappiness());1422 AppendToLog(strHeader, strLog, "Negative Happiness", m_pPlayer->GetUnhappiness());1423 AppendToLog(strHeader, strLog, "Net Happiness", m_pPlayer->GetExcessHappiness());14241425 // # of each improvement constructed1426 FFastVector<int, true> m_aiNumImprovements;1427 m_aiNumImprovements.push_back_copy(-1, GC.getNumImprovementInfos());14281429 // go through all the plots the player has under their control1430 CvPlotsVector& aiPlots = m_pPlayer->GetPlots();14311432 // worked tiles1433 int iTiles = 0;1434 int iWorkedTiles = 0;1435 int iImprovedTiles = 0;1436 for(uint uiPlotIndex = 0; uiPlotIndex < aiPlots.size(); uiPlotIndex++)1437 {1438 // when we encounter the first plot that is invalid, the rest of the list will be invalid1439 if(aiPlots[uiPlotIndex] == -1)1440 {1441 break;1442 }14431444 CvPlot* pPlot = GC.getMap().plotByIndex(aiPlots[uiPlotIndex]);1445 if(!pPlot)1446 {1447 continue;1448 }14491450 iTiles++;14511452 // plot has city in it, don't count1453 if(pPlot->getPlotCity())1454 {1455 continue;1456 }14571458 if(pPlot->isBeingWorked())1459 {1460 iWorkedTiles++;1461 }14621463 if(pPlot->getImprovementType() != NO_IMPROVEMENT)1464 {1465 iImprovedTiles++;1466 }1467 }14681469 AppendToLog(strHeader, strLog, "Tiles", iTiles);1470 AppendToLog(strHeader, strLog, "Worked (non-city) tiles", iWorkedTiles);1471 AppendToLog(strHeader, strLog, "Improved tiles", iImprovedTiles);14721473 AppendToLog(strHeader, strLog, "Trade Routes established", m_pPlayer->GetTrade()->GetNumTradeRoutesUsed(false));1474 AppendToLog(strHeader, strLog, "Trade Routes available", (int)m_pPlayer->GetTrade()->GetNumTradeRoutesPossible());14751476 CvTreasury *pTreasury = m_pPlayer->GetTreasury();14771478 int iInternationalTradeGPT = pTreasury->GetGoldFromCitiesTimes100(false) - pTreasury->GetGoldFromCitiesTimes100(true);1479 AppendToLog(strHeader, strLog, "Gold From Cities", pTreasury->GetGoldFromCitiesTimes100(true) / 100);1480 AppendToLog(strHeader, strLog, "Gold From Trade Routes", (int)(iInternationalTradeGPT / 100));1481 AppendToLog(strHeader, strLog, "Treasury", pTreasury->GetGold());1482 AppendToLog(strHeader, strLog, "GPT - Connects", pTreasury->GetCityConnectionGold());1483 AppendToLog(strHeader, strLog, "GPT - Diplo", pTreasury->GetGoldPerTurnFromDiplomacy());1484 AppendToLog(strHeader, strLog, "GPT - Religion", pTreasury->GetGoldPerTurnFromReligion());1485 AppendToLog(strHeader, strLog, "GPT - Traits", pTreasury->GetGoldPerTurnFromTraits());14861487 int iGoldFromCitiesMinusTR = pTreasury->GetGoldFromCitiesTimes100(true) / 100;1488 int iGPTFromDiplomacy = pTreasury->GetGoldPerTurnFromDiplomacy();1489 int iGoldFromCityConnect = pTreasury->GetCityConnectionGoldTimes100() / 100;1490 int iGPTFromReligion = pTreasury->GetGoldPerTurnFromReligion();1491 int iGPTFromTraits = pTreasury->GetGoldPerTurnFromTraits();1492 int iTradeRouteGold = (int)(iInternationalTradeGPT / 100);1493 int iTotalIncome = iGoldFromCitiesMinusTR + iGPTFromDiplomacy + iGoldFromCityConnect + iGPTFromReligion + iGPTFromTraits + iTradeRouteGold;1494 AppendToLog(strHeader, strLog, "Total Income", iTotalIncome);14951496 // Gold breakdown1497 int iExpenses = pTreasury->GetExpensePerTurnUnitMaintenance() + pTreasury->GetBuildingGoldMaintenance() + pTreasury->GetImprovementGoldMaintenance();1498 AppendToLog(strHeader, strLog, "Unit Maint", pTreasury->GetExpensePerTurnUnitMaintenance());1499 AppendToLog(strHeader, strLog, "Build Maint", pTreasury->GetBuildingGoldMaintenance());1500 AppendToLog(strHeader, strLog, "Improve Maint", pTreasury->GetImprovementGoldMaintenance());1501 AppendToLog(strHeader, strLog, "Total Expenses", iExpenses);1502 AppendToLog(strHeader, strLog, "Net GPT", iTotalIncome - iExpenses);15031504 if(bBuildHeader)1505 {1506 pLog->Msg(strHeader);1507 }1508 pLog->Msg(strLog);1509}