Hey all,
I've asked a lot of questions over the years, and I felt it was finally time for me to give something back to the community. I've been working on a new function for the AI to use so that it can actually purchase buildings and units with gold, logically, like human players. I replaced the DoHurry section of the CvEconomicAI.cpp file, which is where you need to insert the following section. Replace all of the DoHurry content, and make sure to add the 'AI_GOLD_TREASURY_BUFFER' to the appropriate spots in the global defines part of the dll.
I'm sure the design could be more elegant, but I'm very happy with how it works. The section reports to the HomelandAI log - search for 'CSD' to see what the AI is doing.
Feel free to take, use or edit this as you see fit. If you have any problems, questions or suggestions, let me know.
G
I've asked a lot of questions over the years, and I felt it was finally time for me to give something back to the community. I've been working on a new function for the AI to use so that it can actually purchase buildings and units with gold, logically, like human players. I replaced the DoHurry section of the CvEconomicAI.cpp file, which is where you need to insert the following section. Replace all of the DoHurry content, and make sure to add the 'AI_GOLD_TREASURY_BUFFER' to the appropriate spots in the global defines part of the dll.
I'm sure the design could be more elegant, but I'm very happy with how it works. The section reports to the HomelandAI log - search for 'CSD' to see what the AI is doing.
Feel free to take, use or edit this as you see fit. If you have any problems, questions or suggestions, let me know.
G
Spoiler :
Code:
/// See if we want to purchase anything with gold - created by Gazebo (START)
void CvEconomicAI::DoHurry()
{
int iLoop = 0;
CvCity* pLoopCity = 0;
int iGoldCost = 0;
int iBalance = m_pPlayer->GetTreasury()->GetGold();
//Let's give the AI a treasury cushion of 600 gold - should work on most gamespeeds.
int iTreasuryBuffer = /*600*/ GC.getAI_GOLD_TREASURY_BUFFER();
//Let's check our average income over five-turn periods
int iInterval = 5;
if(iBalance > iTreasuryBuffer && m_pPlayer->GetTreasury()->AverageIncome(iInterval) >= 1)
{
// Look at each of our cities
for(pLoopCity = m_pPlayer->firstCity(&iLoop); pLoopCity != NULL; pLoopCity = m_pPlayer->nextCity(&iLoop))
{
//Is the city threatened? Always be able to hurry things in the capital.//
if(pLoopCity != m_pPlayer->GetMilitaryAI()->GetMostThreatenedCity() || pLoopCity->isCapital())
{
//BUILDINGS
//How about an economic building first?
for(int iBuildingLoop = 0; iBuildingLoop < GC.GetGameBuildings()->GetNumBuildings(); iBuildingLoop++)
{
BuildingTypes eBuilding = (BuildingTypes)iBuildingLoop;
AdvisorTypes eAdvisor = ADVISOR_ECONOMIC;
if(GC.getGame().GetAdvisorRecommender()->IsBuildingRecommended(eBuilding, eAdvisor))
{
if(pLoopCity->IsCanPurchase(/*bTestPurchaseCost*/ true, /*bTestTrainable*/ true, NO_UNIT, eBuilding, NO_PROJECT, YIELD_GOLD))
{
if(pLoopCity->isProductionBuilding())
{
CvBuildingEntry* pkBuildingEntry = GC.getBuildingInfo(pLoopCity->getProductionBuilding());
CvBuildingEntry* pkBuildingInfo = GC.GetGameBuildings()->GetEntry(eBuilding);
if(pkBuildingEntry->GetBuildingClassType() != pkBuildingInfo->GetBuildingClassType())
{
iGoldCost = pLoopCity->GetPurchaseCost(eBuilding);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_BUILDING, iGoldCost))
{
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying economic building: %s, Cost: %d, Balance (before buy): %d",
pkBuildingInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and build it!
int iResult = pLoopCity->CreateBuilding(eBuilding);
pLoopCity->CleanUpQueue();
return;
}
}
}
else if(pLoopCity->isProductionUnit())
{
iGoldCost = pLoopCity->GetPurchaseCost(eBuilding);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_BUILDING, iGoldCost))
{
CvBuildingEntry* pkBuildingInfo = GC.GetGameBuildings()->GetEntry(eBuilding);
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying economic building: %s, Cost: %d, Balance (before buy): %d",
pkBuildingInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and build it!
int iResult = pLoopCity->CreateBuilding(eBuilding);
pLoopCity->CleanUpQueue();
return;
}
}
}
}
}
//How about a science building second?
for(int iBuildingLoop = 0; iBuildingLoop < GC.GetGameBuildings()->GetNumBuildings(); iBuildingLoop++)
{
BuildingTypes eBuilding = (BuildingTypes)iBuildingLoop;
AdvisorTypes eAdvisor = ADVISOR_SCIENCE;
if(GC.getGame().GetAdvisorRecommender()->IsBuildingRecommended(eBuilding, eAdvisor))
{
if(pLoopCity->IsCanPurchase(/*bTestPurchaseCost*/ true, /*bTestTrainable*/ true, NO_UNIT, eBuilding, NO_PROJECT, YIELD_GOLD))
{
if(pLoopCity->isProductionBuilding())
{
CvBuildingEntry* pkBuildingEntry = GC.getBuildingInfo(pLoopCity->getProductionBuilding());
CvBuildingEntry* pkBuildingInfo = GC.GetGameBuildings()->GetEntry(eBuilding);
if(pkBuildingEntry->GetBuildingClassType() != pkBuildingInfo->GetBuildingClassType())
{
iGoldCost = pLoopCity->GetPurchaseCost(eBuilding);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_BUILDING, iGoldCost))
{
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying science building: %s, Cost: %d, Balance (before buy): %d",
pkBuildingInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and build it!
int iResult = pLoopCity->CreateBuilding(eBuilding);
pLoopCity->CleanUpQueue();
return;
}
}
}
else if(pLoopCity->isProductionUnit())
{
iGoldCost = pLoopCity->GetPurchaseCost(eBuilding);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_BUILDING, iGoldCost))
{
CvBuildingEntry* pkBuildingInfo = GC.GetGameBuildings()->GetEntry(eBuilding);
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying science building: %s, Cost: %d, Balance (before buy): %d",
pkBuildingInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and build it!
int iResult = pLoopCity->CreateBuilding(eBuilding);
pLoopCity->CleanUpQueue();
return;
}
}
}
}
}
//How about a foreign building third?
for(int iBuildingLoop = 0; iBuildingLoop < GC.GetGameBuildings()->GetNumBuildings(); iBuildingLoop++)
{
BuildingTypes eBuilding = (BuildingTypes)iBuildingLoop;
AdvisorTypes eAdvisor = ADVISOR_FOREIGN;
if(GC.getGame().GetAdvisorRecommender()->IsBuildingRecommended(eBuilding, eAdvisor))
{
if(pLoopCity->IsCanPurchase(/*bTestPurchaseCost*/ true, /*bTestTrainable*/ true, NO_UNIT, eBuilding, NO_PROJECT, YIELD_GOLD))
{
if(pLoopCity->isProductionBuilding())
{
CvBuildingEntry* pkBuildingEntry = GC.getBuildingInfo(pLoopCity->getProductionBuilding());
CvBuildingEntry* pkBuildingInfo = GC.GetGameBuildings()->GetEntry(eBuilding);
if(pkBuildingEntry->GetBuildingClassType() != pkBuildingInfo->GetBuildingClassType())
{
iGoldCost = pLoopCity->GetPurchaseCost(eBuilding);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_BUILDING, iGoldCost))
{
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying foreign building: %s, Cost: %d, Balance (before buy): %d",
pkBuildingInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and build it!
int iResult = pLoopCity->CreateBuilding(eBuilding);
pLoopCity->CleanUpQueue();
return;
}
}
}
else if(pLoopCity->isProductionUnit())
{
iGoldCost = pLoopCity->GetPurchaseCost(eBuilding);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_BUILDING, iGoldCost))
{
CvBuildingEntry* pkBuildingInfo = GC.GetGameBuildings()->GetEntry(eBuilding);
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying foreign building: %s, Cost: %d, Balance (before buy): %d",
pkBuildingInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and build it!
int iResult = pLoopCity->CreateBuilding(eBuilding);
pLoopCity->CleanUpQueue();
return;
}
}
}
}
}
//How about a military building last?
for(int iBuildingLoop = 0; iBuildingLoop < GC.GetGameBuildings()->GetNumBuildings(); iBuildingLoop++)
{
BuildingTypes eBuilding = (BuildingTypes)iBuildingLoop;
AdvisorTypes eAdvisor = ADVISOR_MILITARY;
if(GC.getGame().GetAdvisorRecommender()->IsBuildingRecommended(eBuilding, eAdvisor))
{
if(pLoopCity->IsCanPurchase(/*bTestPurchaseCost*/ true, /*bTestTrainable*/ true, NO_UNIT, eBuilding, NO_PROJECT, YIELD_GOLD))
{
if(pLoopCity->isProductionBuilding())
{
CvBuildingEntry* pkBuildingEntry = GC.getBuildingInfo(pLoopCity->getProductionBuilding());
CvBuildingEntry* pkBuildingInfo = GC.GetGameBuildings()->GetEntry(eBuilding);
if(pkBuildingEntry->GetBuildingClassType() != pkBuildingInfo->GetBuildingClassType())
{
iGoldCost = pLoopCity->GetPurchaseCost(eBuilding);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_BUILDING, iGoldCost))
{
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying military building: %s, Cost: %d, Balance (before buy): %d",
pkBuildingInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and build it!
int iResult = pLoopCity->CreateBuilding(eBuilding);
pLoopCity->CleanUpQueue();
return;
}
}
}
else if(pLoopCity->isProductionUnit())
{
iGoldCost = pLoopCity->GetPurchaseCost(eBuilding);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_BUILDING, iGoldCost))
{
CvBuildingEntry* pkBuildingInfo = GC.GetGameBuildings()->GetEntry(eBuilding);
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying military building: %s, Cost: %d, Balance (before buy): %d",
pkBuildingInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and build it!
int iResult = pLoopCity->CreateBuilding(eBuilding);
pLoopCity->CleanUpQueue();
return;
}
}
}
}
}
//UNITS
{
//Are we over our supply cap? If so, don't buy any units! - Gazebo
int iPaidUnits = m_pPlayer->GetNumUnitsOutOfSupply();
int iMaintenanceMod = min(/*70*/ GC.getMAX_UNIT_SUPPLY_PRODMOD(), iPaidUnits * 10);
iMaintenanceMod = -iMaintenanceMod;
if(iMaintenanceMod >= 0)
{
// Build a military unit?
for(int iUnitLoop = 0; iUnitLoop < GC.GetGameUnits()->GetNumUnits(); iUnitLoop++)
{
UnitTypes eUnit = (UnitTypes)iUnitLoop;
AdvisorTypes eAdvisor = ADVISOR_MILITARY;
if(GC.getGame().GetAdvisorRecommender()->IsUnitRecommended(eUnit, eAdvisor))
{
if(pLoopCity->IsCanPurchase(/*bTestPurchaseCost*/ true, /*bTestTrainable*/ true, eUnit, NO_BUILDING, NO_PROJECT, YIELD_GOLD))
{
if(pLoopCity->isProductionUnit())
{
CvUnitEntry* pkUnitEntry = GC.getUnitInfo(pLoopCity->getProductionUnit());
CvUnitEntry* pkUnitInfo = GC.GetGameUnits()->GetEntry(eUnit);
if(pkUnitEntry->GetUnitClassType() != pkUnitInfo->GetUnitClassType())
{
iGoldCost = pLoopCity->GetPurchaseCost(eUnit);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_UNIT, iGoldCost))
{
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying military unit: %s, Cost: %d, Balance (before buy): %d",
pkUnitInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and train it!
int iResult = pLoopCity->CreateUnit(eUnit);
pLoopCity->CleanUpQueue();
return;
}
}
}
else if(pLoopCity->isProductionBuilding())
{
iGoldCost = pLoopCity->GetPurchaseCost(eUnit);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_UNIT, iGoldCost))
{
//Log it
CvUnitEntry* pkUnitInfo = GC.GetGameUnits()->GetEntry(eUnit);
CvString strLogString;
strLogString.Format("CSD - Buying military unit: %s, Cost: %d, Balance (before buy): %d",
pkUnitInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and train it!
int iResult = pLoopCity->CreateUnit(eUnit);
pLoopCity->CleanUpQueue();
return;
}
}
}
}
}
// Or maybe an economic unit?
for(int iUnitLoop = 0; iUnitLoop < GC.GetGameUnits()->GetNumUnits(); iUnitLoop++)
{
UnitTypes eUnit = (UnitTypes)iUnitLoop;
AdvisorTypes eAdvisor = ADVISOR_ECONOMIC;
if(GC.getGame().GetAdvisorRecommender()->IsUnitRecommended(eUnit, eAdvisor))
{
if(pLoopCity->IsCanPurchase(/*bTestPurchaseCost*/ true, /*bTestTrainable*/ true, eUnit, NO_BUILDING, NO_PROJECT, YIELD_GOLD))
{
if(pLoopCity->isProductionUnit())
{
CvUnitEntry* pkUnitEntry = GC.getUnitInfo(pLoopCity->getProductionUnit());
CvUnitEntry* pkUnitInfo = GC.GetGameUnits()->GetEntry(eUnit);
if(pkUnitEntry->GetUnitClassType() != pkUnitInfo->GetUnitClassType())
{
iGoldCost = pLoopCity->GetPurchaseCost(eUnit);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_UNIT, iGoldCost))
{
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying economic unit: %s, Cost: %d, Balance (before buy): %d",
pkUnitInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and train it!
int iResult = pLoopCity->CreateUnit(eUnit);
pLoopCity->CleanUpQueue();
return;
}
}
}
else if(pLoopCity->isProductionBuilding())
{
iGoldCost = pLoopCity->GetPurchaseCost(eUnit);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_UNIT, iGoldCost))
{
//Log it
CvUnitEntry* pkUnitInfo = GC.GetGameUnits()->GetEntry(eUnit);
CvString strLogString;
strLogString.Format("CSD - Buying economic unit: %s, Cost: %d, Balance (before buy): %d",
pkUnitInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and train it!
int iResult = pLoopCity->CreateUnit(eUnit);
pLoopCity->CleanUpQueue();
return;
}
}
}
}
}
// Or maybe a science unit?
for(int iUnitLoop = 0; iUnitLoop < GC.GetGameUnits()->GetNumUnits(); iUnitLoop++)
{
UnitTypes eUnit = (UnitTypes)iUnitLoop;
AdvisorTypes eAdvisor = ADVISOR_SCIENCE;
if(GC.getGame().GetAdvisorRecommender()->IsUnitRecommended(eUnit, eAdvisor))
{
if(pLoopCity->IsCanPurchase(/*bTestPurchaseCost*/ true, /*bTestTrainable*/ true, eUnit, NO_BUILDING, NO_PROJECT, YIELD_GOLD))
{
if(pLoopCity->isProductionUnit())
{
CvUnitEntry* pkUnitEntry = GC.getUnitInfo(pLoopCity->getProductionUnit());
CvUnitEntry* pkUnitInfo = GC.GetGameUnits()->GetEntry(eUnit);
if(pkUnitEntry->GetUnitClassType() != pkUnitInfo->GetUnitClassType())
{
iGoldCost = pLoopCity->GetPurchaseCost(eUnit);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_UNIT, iGoldCost))
{
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying science unit: %s, Cost: %d, Balance (before buy): %d",
pkUnitInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and train it!
int iResult = pLoopCity->CreateUnit(eUnit);
pLoopCity->CleanUpQueue();
return;
}
}
}
else if(pLoopCity->isProductionBuilding())
{
iGoldCost = pLoopCity->GetPurchaseCost(eUnit);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_UNIT, iGoldCost))
{
//Log it
CvUnitEntry* pkUnitInfo = GC.GetGameUnits()->GetEntry(eUnit);
CvString strLogString;
strLogString.Format("CSD - Buying science unit: %s, Cost: %d, Balance (before buy): %d",
pkUnitInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and train it!
int iResult = pLoopCity->CreateUnit(eUnit);
pLoopCity->CleanUpQueue();
return;
}
}
}
}
}
// Or maybe a foreign unit?
for(int iUnitLoop = 0; iUnitLoop < GC.GetGameUnits()->GetNumUnits(); iUnitLoop++)
{
UnitTypes eUnit = (UnitTypes)iUnitLoop;
AdvisorTypes eAdvisor = ADVISOR_FOREIGN;
if(GC.getGame().GetAdvisorRecommender()->IsUnitRecommended(eUnit, eAdvisor))
{
if(pLoopCity->IsCanPurchase(/*bTestPurchaseCost*/ true, /*bTestTrainable*/ true, eUnit, NO_BUILDING, NO_PROJECT, YIELD_GOLD))
{
if(pLoopCity->isProductionUnit())
{
CvUnitEntry* pkUnitEntry = GC.getUnitInfo(pLoopCity->getProductionUnit());
CvUnitEntry* pkUnitInfo = GC.GetGameUnits()->GetEntry(eUnit);
if(pkUnitEntry->GetUnitClassType() != pkUnitInfo->GetUnitClassType())
{
iGoldCost = pLoopCity->GetPurchaseCost(eUnit);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_UNIT, iGoldCost))
{
//Log it
CvString strLogString;
strLogString.Format("CSD - Buying foreign unit: %s, Cost: %d, Balance (before buy): %d",
pkUnitInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and train it!
int iResult = pLoopCity->CreateUnit(eUnit);
pLoopCity->CleanUpQueue();
return;
}
}
}
else if(pLoopCity->isProductionBuilding())
{
iGoldCost = pLoopCity->GetPurchaseCost(eUnit);
if(m_pPlayer->GetEconomicAI()->CanWithdrawMoneyForPurchase(PURCHASE_TYPE_UNIT, iGoldCost))
{
//Log it
CvUnitEntry* pkUnitInfo = GC.GetGameUnits()->GetEntry(eUnit);
CvString strLogString;
strLogString.Format("CSD - Buying foreign unit: %s, Cost: %d, Balance (before buy): %d",
pkUnitInfo->GetDescription(), iGoldCost, m_pPlayer->GetTreasury()->GetGold());
m_pPlayer->GetHomelandAI()->LogHomelandMessage(strLogString);
//take the money...
m_pPlayer->GetTreasury()->ChangeGold(-iGoldCost);
//and train it!
int iResult = pLoopCity->CreateUnit(eUnit);
pLoopCity->CleanUpQueue();
return;
}
}
}
}
}
}
}
}
}
}
}
// End new content from Gazebo