Explorar o código

First part of reformatting the code, renaming variables, rewriting tricky part. Basically making the code more readable, maintainable and ready for further additions.

red1939 %!s(int64=16) %!d(string=hai) anos
pai
achega
ed9b75b447

+ 1 - 1
AI/GeniusAI/AIPriorities.cpp

@@ -3,7 +3,7 @@
 #define AI_PRIORITIES
 #include "AIPriorities.h"
 #include <sstream>
-using namespace GeniusAI;
+using namespace geniusai;
 Network::Network()
 {}
 Network::Network(vector<unsigned int> whichFeatures)// random network

+ 1 - 1
AI/GeniusAI/AIPriorities.h

@@ -5,7 +5,7 @@
 #include "CGeniusAI.h"
 #include "neuralNetwork.h"
 
-namespace GeniusAI {
+namespace geniusai {
 
 class Network
 {

+ 1 - 1
AI/GeniusAI/BattleHelper.cpp

@@ -7,7 +7,7 @@
 #include <boost/algorithm/string.hpp>
 #include <boost/lexical_cast.hpp>
 
-using namespace GeniusAI::BattleAI;
+using namespace geniusai::BattleAI;
 using namespace std;
 
 

+ 1 - 1
AI/GeniusAI/BattleHelper.h

@@ -3,7 +3,7 @@
 
 #include "Common.h"
 
-namespace GeniusAI { namespace BattleAI {
+namespace geniusai { namespace BattleAI {
 
 	class CBattleHelper
 {

+ 1 - 1
AI/GeniusAI/BattleLogic.cpp

@@ -12,7 +12,7 @@ HANDLE handleIn;
 HANDLE handleOut;
 #endif
 
-using namespace GeniusAI::BattleAI;
+using namespace geniusai::BattleAI;
 using namespace boost::lambda;
 using namespace std;
 

+ 1 - 1
AI/GeniusAI/BattleLogic.h

@@ -15,7 +15,7 @@
 
 using namespace std;
 
-namespace GeniusAI { namespace BattleAI {
+namespace geniusai { namespace BattleAI {
 
 /**
  * Class is responsible for making decision during the battle.

+ 380 - 231
AI/GeniusAI/CGeniusAI.cpp

@@ -1,14 +1,17 @@
 #include "CGeniusAI.h"
-#include "AIPriorities.h"
+
 #include <iostream>
+#include <boost/lexical_cast.hpp>
+
 #include "../../hch/CBuildingHandler.h"
 #include "../../hch/CHeroHandler.h"
 #include "../../lib/VCMI_Lib.h"
 #include "../../lib/NetPacks.h"
-#include <boost/lexical_cast.hpp>
+#include "AIPriorities.h"
 
-using namespace std;
-using namespace GeniusAI;
+using std::cout;
+using std::endl;
+using geniusai::CGeniusAI;
 
 #if defined (_MSC_VER) && (_MSC_VER >= 1020) || (__MINGW32__)
 #define WIN32_LEAN_AND_MEAN //excludes rarely used stuff from windows headers - delete this line if something is missing
@@ -32,77 +35,114 @@ void DbgBox(const char *msg, bool messageBox)
 }
 
 
-bool CGeniusAI::AIObjectContainer::operator<(const AIObjectContainer& b)const
+bool CGeniusAI::AIObjectContainer::operator<(
+    const AIObjectContainer& b) const
 {
-	if (o->pos!=b.o->pos)
-		return o->pos<b.o->pos;
-	return o->id<b.o->id;
+	if (o->pos != b.o->pos)
+		return o->pos < b.o->pos;
+  else
+	  return o->id < b.o->id;
 }
 
-CGeniusAI::HypotheticalGameState::HeroModel::HeroModel(const CGHeroInstance * h)
-:h(h),finished(false)
+
+CGeniusAI::HypotheticalGameState::HeroModel::HeroModel(
+    const CGHeroInstance* h)
+    : h(h), finished(false)
 {
-	pos = h->getPosition(false);remainingMovement = h->movement;
+	pos = h->getPosition(false);
+  remainingMovement = h->movement;
 }
 
-CGeniusAI::HypotheticalGameState::TownModel::TownModel(const CGTownInstance *t):t(t)
+
+CGeniusAI::HypotheticalGameState::TownModel::TownModel(
+    const CGTownInstance *t)
+    : t(t)
 {
 	hasBuilt = t->builded;
 	creaturesToRecruit = t->creatures;
 	creaturesInGarrison = t->army;
 }
 
-CGeniusAI::HypotheticalGameState::HypotheticalGameState(CGeniusAI & ai)
-	:knownVisitableObjects(ai.knownVisitableObjects)
+
+CGeniusAI::HypotheticalGameState::HypotheticalGameState(
+    CGeniusAI& ai)
+	  : knownVisitableObjects(ai.knownVisitableObjects)
 {
 	AI = &ai;
-	std::vector < const CGHeroInstance *> heroes = ai.m_cb->getHeroesInfo();	
-	for(std::vector < const CGHeroInstance *>::iterator i = heroes.begin(); i != heroes.end(); i++)
+	std::vector<const CGHeroInstance*> heroes = ai.m_cb->getHeroesInfo();	
+	for (std::vector<const CGHeroInstance *>::iterator i = heroes.begin();
+       i != heroes.end();
+       i++)
 		heroModels.push_back(HeroModel(*i));
 	
-	std::vector < const CGTownInstance *> towns = ai.m_cb->getTownsInfo();	
-	for(std::vector < const CGTownInstance *>::iterator i = towns.begin(); i != towns.end(); i++)
-		if((*i)->tempOwner==ai.m_cb->getMyColor())
-		townModels.push_back(TownModel(*i));
-
-	if(ai.m_cb->howManyTowns()!=0)
-		AvailableHeroesToBuy = ai.m_cb->getAvailableHeroes(ai.m_cb->getTownInfo(0,0));
-
-	for(int i = 0; i < 8;i++)resourceAmounts.push_back(ai.m_cb->getResourceAmount(i));
+	std::vector<const CGTownInstance*> towns = ai.m_cb->getTownsInfo();	
+	for (std::vector < const CGTownInstance *>::iterator i = towns.begin();
+       i != towns.end();
+       i++) {
+		if ( (*i)->tempOwner == ai.m_cb->getMyColor() )
+		  townModels.push_back(TownModel(*i));
+  }
+
+  if (ai.m_cb->howManyTowns() != 0) {
+    AvailableHeroesToBuy = 
+      ai.m_cb->getAvailableHeroes(ai.m_cb->getTownInfo(0,0));
+  }
+
+	for (int i = 0; i < 8; i++)
+    resourceAmounts.push_back(ai.m_cb->getResourceAmount(i));
 }
 
-void CGeniusAI::HypotheticalGameState::update(CGeniusAI & ai)
+
+void CGeniusAI::HypotheticalGameState::update(CGeniusAI& ai)
 {
 	AI = &ai;
 	knownVisitableObjects = ai.knownVisitableObjects;
 
 	std::vector<HeroModel> oldModels = heroModels;
 	heroModels.clear();
-	std::vector < const CGHeroInstance *> heroes = ai.m_cb->getHeroesInfo();	
-	for(std::vector < const CGHeroInstance *>::iterator i = heroes.begin(); i != heroes.end(); i++)
+
+	std::vector<const CGHeroInstance*> heroes = ai.m_cb->getHeroesInfo();
+	for (std::vector<const CGHeroInstance*>::iterator i = heroes.begin();
+       i != heroes.end();
+       i++)
 		heroModels.push_back(HeroModel(*i));
-	for(int i = 0; i < oldModels.size();i++)
-		for(int ii = 0; ii < heroModels.size();ii++)
-			if(oldModels[i].h->subID==heroModels[ii].h->subID)
-			{
-				heroModels[ii].finished = oldModels[i].finished;
-				heroModels[ii].previouslyVisited_pos=oldModels[i].previouslyVisited_pos;
+
+  for (int i = 0; i < oldModels.size(); i++) {
+    for (int j = 0; j < heroModels.size(); j++) {
+			if (oldModels[i].h->subID == heroModels[j].h->subID) {
+				heroModels[j].finished = oldModels[i].finished;
+				heroModels[j].previouslyVisited_pos = oldModels[i].previouslyVisited_pos;
 			}
+    }
+  }
 	
 	townModels.clear();
-	std::vector < const CGTownInstance *> towns = ai.m_cb->getTownsInfo();	
-	for(std::vector < const CGTownInstance *>::iterator i = towns.begin(); i != towns.end(); i++)
-		if((*i)->tempOwner==ai.m_cb->getMyColor())
+	std::vector<const CGTownInstance*> towns = ai.m_cb->getTownsInfo();	
+	for (std::vector<const CGTownInstance*>::iterator i = towns.begin();
+       i != towns.end();
+       i++) {
+		if ( (*i)->tempOwner == ai.m_cb->getMyColor() )
 			townModels.push_back(TownModel(*i));
+  }
 
-	if(ai.m_cb->howManyTowns()!=0)
-		AvailableHeroesToBuy = ai.m_cb->getAvailableHeroes(ai.m_cb->getTownInfo(0,0));
+  if (ai.m_cb->howManyTowns() != 0) {
+		AvailableHeroesToBuy =
+      ai.m_cb->getAvailableHeroes(ai.m_cb->getTownInfo(0,0));
+  }
 
 	resourceAmounts.clear();
-	for(int i = 0; i < 8;i++)resourceAmounts.push_back(ai.m_cb->getResourceAmount(i));
+	for (int i = 0; i < 8; i++)
+    resourceAmounts.push_back(ai.m_cb->getResourceAmount(i));
 }
 
-CGeniusAI::HeroObjective::HeroObjective(const HypotheticalGameState &hgs,Type t,const CGObjectInstance * object,HypotheticalGameState::HeroModel *h,CGeniusAI * ai):object(object),hgs(hgs)
+
+CGeniusAI::HeroObjective::HeroObjective(
+    const HypotheticalGameState &hgs,
+    Type t,
+    const CGObjectInstance* object,
+    HypotheticalGameState::HeroModel* h,
+    CGeniusAI* ai)
+    : object(object), hgs(hgs)
 {
 	AI = ai;
 	pos = object->pos;
@@ -111,228 +151,301 @@ CGeniusAI::HeroObjective::HeroObjective(const HypotheticalGameState &hgs,Type t,
 	_value = -1;
 }
 
+
 float CGeniusAI::HeroObjective::getValue() const
 {
-	if(_value>=0)
-		return _value-_cost;
+	if (_value >= 0)
+    return _value - _cost;
 
-	vector<int> resourceCosts;	//TODO: each object should have an associated cost to visit IE (tree of knowledge 1000 gold/10 gems)
-	for(int i = 0; i < 8;i++)
+  // TODO: each object should have an associated cost to visit IE 
+  // (tree of knowledge 1000 gold/10 gems)
+	vector<int> resourceCosts;
+	for (int i = 0; i < 8; i++)
 		resourceCosts.push_back(0);
-	if(object->ID==47)			//school of magic
-		resourceCosts[6]+=1000;
+
+	if (object->ID == 47) // School of magic
+		resourceCosts[6] += 1000;
 
 	float bestCost = 9e9;
-	HypotheticalGameState::HeroModel * bestHero = NULL;
-	if(type !=AIObjective::finishTurn)
+	HypotheticalGameState::HeroModel* bestHero = NULL;
+	if (type != AIObjective::finishTurn)
 	{
-		for(int i = 0; i < whoCanAchieve.size();i++)
+		for (int i = 0; i < whoCanAchieve.size(); i++)
 		{
 			int distOutOfTheWay = 0;
 			CPath path3;
 			//from hero to object
-			if(AI->m_cb->getPath(whoCanAchieve[i]->pos,pos,whoCanAchieve[i]->h,path3))
-				distOutOfTheWay+=path3.nodes[0].dist;
-			//from object to goal
-			if(AI->m_cb->getPath(pos,whoCanAchieve[i]->interestingPos,whoCanAchieve[i]->h,path3))
-			{
+			if (AI->m_cb->getPath(whoCanAchieve[i]->pos,
+                            pos,
+                            whoCanAchieve[i]->h,
+                            path3)) {
 				distOutOfTheWay+=path3.nodes[0].dist;
-				//from hero directly to goal
-				if(AI->m_cb->getPath(whoCanAchieve[i]->pos,whoCanAchieve[i]->interestingPos,whoCanAchieve[i]->h,path3))
+      }
+
+			// from object to goal
+			if (AI->m_cb->getPath(pos,
+                            whoCanAchieve[i]->interestingPos,
+                            whoCanAchieve[i]->h,
+                            path3)) {
+				distOutOfTheWay += path3.nodes[0].dist;
+				// from hero directly to goal
+				if (AI->m_cb->getPath(whoCanAchieve[i]->pos,
+                              whoCanAchieve[i]->interestingPos,
+                              whoCanAchieve[i]->h,
+                              path3))
 					distOutOfTheWay-=path3.nodes[0].dist;
 			}
 			
-			
-
-
-			float cost = AI->m_priorities->getCost(resourceCosts,whoCanAchieve[i]->h,distOutOfTheWay);
-			if(cost < bestCost)
-			{
+			float cost = AI->m_priorities->getCost(resourceCosts,
+                                             whoCanAchieve[i]->h,
+                                             distOutOfTheWay);
+			if (cost < bestCost) {
 				bestCost = cost;
 				bestHero = whoCanAchieve[i];
 			}
+    } // for (int i = 0; i < whoCanAchieve.size(); i++)
+  } else  // if (type != AIObjective::finishTurn)
+    bestCost = 0;
 
-		}
-	}
-	else bestCost = 0;
-	if(bestHero)
-	{
+	if (bestHero) {
 		whoCanAchieve.clear();
 		whoCanAchieve.push_back(bestHero);
 	}
 
 	_value = AI->m_priorities->getValue(*this);
-	_cost=bestCost;
-	return _value-_cost;
+	_cost = bestCost;
+	return _value - _cost;
 }
-bool CGeniusAI::HeroObjective::operator < (const HeroObjective &other)const
+
+
+bool CGeniusAI::HeroObjective::operator<(
+    const HeroObjective& other) const
 {
-	if(type != other.type)
-		return type<other.type;
-	if(pos!=other.pos)
+	if (type != other.type)
+		return type < other.type;
+  else if (pos != other.pos)
 		return pos < other.pos;
-	if(object->id!=other.object->id)
+	else if (object->id != other.object->id)
 		return object->id < other.object->id;
-	if(dynamic_cast<const CGVisitableOPH *> (object))
-		if(whoCanAchieve.front()->h->id!=other.whoCanAchieve.front()->h->id)
-			return whoCanAchieve.front()->h->id<other.whoCanAchieve.front()->h->id;
-	return false;
+  else if (dynamic_cast<const CGVisitableOPH*> (object)) {
+		if (whoCanAchieve.front()->h->id != other.whoCanAchieve.front()->h->id)
+			return whoCanAchieve.front()->h->id < other.whoCanAchieve.front()->h->id;
+  } else
+    return false;
 }
 
+
 void CGeniusAI::HeroObjective::print() const
 {
-	switch(type)
-	{
+	switch (type) {
 	case visit:
-		cout << "visit " << object->hoverName << " at (" <<object->pos.x << ","<<object->pos.y << ")" ;
+		cout << "visit " << object->hoverName
+         << " at (" <<object->pos.x << ","<< object->pos.y << ")" ;
 		break;
 	case attack:
 		cout << "attack " << object->hoverName;
 		break;
 	case finishTurn:
 		cout << "finish turn";
+    // TODO: Add a default, just in case.
 	}
-	if(whoCanAchieve.size()==1)
+	if (whoCanAchieve.size() == 1)
 		cout << " with " << whoCanAchieve.front()->h->hoverName;
 }
 
-CGeniusAI::TownObjective::TownObjective(const HypotheticalGameState &hgs,Type t,HypotheticalGameState::TownModel * tn,int Which,CGeniusAI * ai)
-:whichTown(tn),which(Which),hgs(hgs)
+
+CGeniusAI::TownObjective::TownObjective(
+    const HypotheticalGameState& hgs,
+    Type t,
+    HypotheticalGameState::TownModel* tn,
+    int Which,
+    CGeniusAI * ai)
+    : whichTown(tn), which(Which), hgs(hgs)
 {
-	AI=ai;
+	AI = ai;
 	type = t;
 	_value = -1;
 }
 
 float CGeniusAI::TownObjective::getValue() const
 {
-	if(_value>=0)
-		return _value-_cost;
-	float cost;
+	if (_value >= 0)
+		return _value - _cost;
 
+	float cost; // TODO: Initialize it!
+  // TODO: Include a constant stating the meaning of 8 (number of resources).
 	vector<int> resourceCosts(8,0);
-	CBuilding * b;
-	CCreature * creature;
-	int ID,newID, howMany;
-	switch(type)
-	{
+	CBuilding* b;
+	CCreature* creature;
+	int ID;
+  int newID;
+  int howMany;
+  ui32 creatures_max = 0;
+
+	switch (type) {
 		case recruitHero:
-			resourceCosts[6]=2500;
+			resourceCosts[6] = 2500;  // TODO: Define somehow the meaning of gold etc.
 			break;
+
 		case buildBuilding:
 			b = VLC->buildh->buildings[whichTown->t->subID][which];
-			for(int i = 0; b && i < b->resources.size();i++)
-				resourceCosts[i]=b->resources[i];
+			for (int i = 0;
+          b && ( i < b->resources.size() ); // TODO: b what??
+          i++)
+				resourceCosts[i] = b->resources[i];
 			break;
 
-	case recruitCreatures:
-		ID = whichTown->creaturesToRecruit[which].second.back();				//buy upgraded if possible
-		creature = &VLC->creh->creatures[ID];
-		howMany = whichTown->creaturesToRecruit[which].first;
-		for(int i = 0; i < creature->cost.size();i++)
-			amin(howMany,creature->cost[i]?hgs.resourceAmounts[i]/creature->cost[i]:INT_MAX);
-		for(int i = 0; creature && i < creature->cost.size();i++)
-			resourceCosts[i]=creature->cost[i]*howMany;
-		
-
-		break;
-	case upgradeCreatures:
-		UpgradeInfo ui = AI->m_cb->getUpgradeInfo(whichTown->t,which);
-		ID = whichTown->creaturesInGarrison.slots[which].first;
-		howMany = whichTown->creaturesInGarrison.slots[which].second;
-		newID = ui.newID.back();
-		int upgrade_serial = ui.newID.size()-1;
-		for (std::set<std::pair<int,int> >::iterator j=ui.cost[upgrade_serial].begin(); j!=ui.cost[upgrade_serial].end(); j++)
-			resourceCosts[j->first] = j->second*howMany;
-	
+	  case recruitCreatures:
+      // Buy upgraded if possible.
+		  ID = whichTown->creaturesToRecruit[which].second.back();
+		  creature = &VLC->creh->creatures[ID];
+		  howMany = whichTown->creaturesToRecruit[which].first;
+      creatures_max = 0; // Max creatures you can recruit of this type.
+      
+      for (int i = 0; i < creature->cost.size(); i++) {
+        if (creature->cost[i] != 0)
+          creatures_max = hgs.resourceAmounts[i]/creature->cost[i];
+        else
+          creatures_max = INT_MAX; // TODO: Will have to rewrite it.
+        // TODO: Buy the best units (the least I can buy)?
+			  amin(howMany, creatures_max);
+      }
+      // The cost of recruiting the stack of creatures.
+		  for (int i = 0;
+          creature && ( i < creature->cost.size() ); // TODO: Creature what??
+          i++)
+			  resourceCosts[i] = creature->cost[i]*howMany;
+		  break;
+
+	  case upgradeCreatures:
+		  UpgradeInfo ui = AI->m_cb->getUpgradeInfo(whichTown->t,which);
+		  ID = whichTown->creaturesInGarrison.slots[which].first;
+		  howMany = whichTown->creaturesInGarrison.slots[which].second;
+
+		  newID = ui.newID.back();
+		  int upgrade_serial = ui.newID.size() - 1;
+		  for (std::set< std::pair<int,int> >::iterator
+          j = ui.cost[upgrade_serial].begin();
+          j != ui.cost[upgrade_serial].end();
+          j++)
+		    resourceCosts[j->first] = j->second*howMany;
 		break;
-
 	}
 
-
-
-	_cost = AI->m_priorities->getCost(resourceCosts,NULL,0);
+	_cost = AI->m_priorities->getCost(resourceCosts, NULL, 0);
 	_value = AI->m_priorities->getValue(*this);
-	return _value-_cost;
+	return _value - _cost;
 }
 
 
-bool CGeniusAI::TownObjective::operator < (const TownObjective &other)const
+bool CGeniusAI::TownObjective::operator<(const TownObjective &other) const
 {
-	if(type != other.type)
-		return type<other.type;
-	if(which!=other.which)
-		return which<other.which;
-	if(whichTown->t->id!=other.whichTown->t->id)
+	if (type != other.type)
+		return type < other.type;
+	else if (which != other.which)
+		return which < other.which;
+	else if (whichTown->t->id != other.whichTown->t->id)
 		return whichTown->t->id < other.whichTown->t->id;
 	return false;
 }
 
+
 void CGeniusAI::TownObjective::print() const
 {
-	CBuilding * b;
-	const CCreature *creature;
+	CBuilding* b;
+	const CCreature* creature;
 	HypotheticalGameState::HeroModel hm;
-	int ID, howMany, newID, hSlot;
-	switch(type)
-	{
+	int ID;
+  int howMany;
+  int newID;
+  int hSlot;
+  ui32 creatures_max;
+
+	switch (type) {
 	case recruitHero:
-		cout << "recruit hero.";break;
+		cout << "recruit hero.";
+    break;
+
 	case buildBuilding:
 		b = VLC->buildh->buildings[whichTown->t->subID][which];
 		cout << "build " << b->Name() << " cost = ";
-		if(b->resources.size()!=0)
+		if (b->resources.size() != 0)
 		{
-			if(b->resources[0]!=0)cout << b->resources[0] << " wood. ";
-			if(b->resources[1]!=0)cout << b->resources[1] << " mercury. ";
-			if(b->resources[2]!=0)cout << b->resources[2] << " ore. ";
-			if(b->resources[3]!=0)cout << b->resources[3] << " sulfur. ";
-			if(b->resources[4]!=0)cout << b->resources[4] << " cristal. ";
-			if(b->resources[5]!=0)cout << b->resources[5] << " gems. ";
-			if(b->resources[6]!=0)cout << b->resources[6] << " gold. ";
+			if (b->resources[0] != 0)
+        cout << b->resources[0] << " wood. ";
+			if (b->resources[1] != 0)
+        cout << b->resources[1] << " mercury. ";
+			if (b->resources[2] != 0)
+        cout << b->resources[2] << " ore. ";
+			if (b->resources[3] != 0)
+        cout << b->resources[3] << " sulfur. ";
+			if (b->resources[4] != 0)
+        cout << b->resources[4] << " cristal. ";
+			if (b->resources[5] != 0)
+        cout << b->resources[5] << " gems. ";
+			if (b->resources[6] != 0)
+        cout << b->resources[6] << " gold. ";
 		}
 		break;
+
 	case recruitCreatures:
-		ID = whichTown->creaturesToRecruit[which].second.back();				//buy upgraded if possible
+    // Buy upgraded if possible.
+		ID = whichTown->creaturesToRecruit[which].second.back();
 		creature = &VLC->creh->creatures[ID];
 		howMany = whichTown->creaturesToRecruit[which].first;
-		for(int i = 0; i < creature->cost.size();i++)
-			amin(howMany,creature->cost[i]?AI->m_cb->getResourceAmount(i)/creature->cost[i]:INT_MAX);
-		cout << "recruit " << howMany  << " "<< creature->namePl << " (Total AI Strength " << creature->AIValue*howMany << "). cost = ";
+    creatures_max = 0;
+
+    for (int i = 0; i < creature->cost.size(); i++) {
+      if (creature->cost[i] != 0)
+        creatures_max = hgs.resourceAmounts[i]/creature->cost[i];
+      else
+        creatures_max = INT_MAX;
+      amin(howMany, creatures_max);
+    }
+		cout << "recruit " << howMany  << " " << creature->namePl
+         << " (Total AI Strength " << creature->AIValue*howMany << "). cost = ";
 		
-		if(creature->cost.size()!=0)
+		if (creature->cost.size() != 0)
 		{
-			if(creature->cost[0]!=0)cout << creature->cost[0]*howMany << " wood. ";
-			if(creature->cost[1]!=0)cout << creature->cost[1]*howMany << " mercury. ";
-			if(creature->cost[2]!=0)cout << creature->cost[2]*howMany << " ore. ";
-			if(creature->cost[3]!=0)cout << creature->cost[3]*howMany << " sulfur. ";
-			if(creature->cost[4]!=0)cout << creature->cost[4]*howMany << " cristal. ";
-			if(creature->cost[5]!=0)cout << creature->cost[5]*howMany << " gems. ";
-			if(creature->cost[6]!=0)cout << creature->cost[6]*howMany << " gold. ";
+			if (creature->cost[0] != 0)
+        cout << creature->cost[0]*howMany << " wood. ";
+			if (creature->cost[1] != 0)
+        cout << creature->cost[1]*howMany << " mercury. ";
+			if (creature->cost[2] != 0)
+        cout << creature->cost[2]*howMany << " ore. ";
+			if (creature->cost[3] != 0)
+        cout << creature->cost[3]*howMany << " sulfur. ";
+			if (creature->cost[4] != 0)
+        cout << creature->cost[4]*howMany << " cristal. ";
+			if (creature->cost[5] != 0)
+        cout << creature->cost[5]*howMany << " gems. ";
+			if (creature->cost[6] != 0)
+        cout << creature->cost[6]*howMany << " gold. ";
 		}
 		break;
+
 		case upgradeCreatures:
 			UpgradeInfo ui = AI->m_cb->getUpgradeInfo(whichTown->t,which);
 			ID = whichTown->creaturesInGarrison.slots[which].first;
 			cout << "upgrade " << VLC->creh->creatures[ID].namePl;
-			//ui.cost
-			
+			//ui.cost	
 		break;
-
-	}
+	} // case buildBuilding
 }
 
-CGeniusAI::CGeniusAI()
-	: m_generalAI(), m_state(NO_BATTLE)
+
+CGeniusAI::CGeniusAI() : m_generalAI(), m_state(NO_BATTLE)
 {
 	m_priorities = new Priorities("AI/GeniusAI.brain");
 }
 
+
 CGeniusAI::~CGeniusAI()
 {
 	delete m_priorities;
 }
 
+
 void CGeniusAI::init(ICallback *CB)
 {
 	m_cb = CB;
@@ -341,7 +454,8 @@ void CGeniusAI::init(ICallback *CB)
 	human = false;
 	playerID = m_cb->getMyColor();
 	serialID = m_cb->getMySerial();
-	std::string info = std::string("GeniusAI initialized for player ") + boost::lexical_cast<std::string>(playerID);
+	std::string info = std::string("GeniusAI initialized for player ") 
+                   + boost::lexical_cast<std::string>(playerID);
 	m_battleLogic = NULL;
 	DbgBox(info.c_str());
 }
@@ -350,8 +464,8 @@ void CGeniusAI::init(ICallback *CB)
 void CGeniusAI::reportResources()
 {
 	cout << "Day " << m_cb->getDate() << ": ";
-	cout << "AI Player " <<m_cb->getMySerial()<< " with " <<  m_cb->howManyHeroes(true) << " heroes. " << endl;
-	
+	cout << "AI Player " <<m_cb->getMySerial()<< " with "
+       <<  m_cb->howManyHeroes(true) << " heroes. " << endl;
 	cout << m_cb->getResourceAmount(0) << " wood. ";
 	cout << m_cb->getResourceAmount(1) << " mercury. ";
 	cout << m_cb->getResourceAmount(2) << " ore. ";
@@ -362,112 +476,146 @@ void CGeniusAI::reportResources()
 	cout << endl;
 }
 
-void CGeniusAI::addHeroObjectives(CGeniusAI::HypotheticalGameState::HeroModel &h, CGeniusAI::HypotheticalGameState &hgs)
+
+void CGeniusAI::addHeroObjectives(
+                                  CGeniusAI::HypotheticalGameState::HeroModel& h,
+                                  CGeniusAI::HypotheticalGameState& hgs)
 {
-	int3 hpos, destination;
-	CPath path;
-	hpos = h.pos;
+	int3 hpos = h.pos;
+  int3 destination;
+  int3 interestingPos;
+  CPath path;
 	int movement = h.remainingMovement;
-	int3 interestingPos;
-	int maxInteresting=0;
+	int maxInteresting = 0;
 	AIObjective::Type tp = AIObjective::visit;
-	if(h.finished) return;
-	for(std::set<AIObjectContainer>::const_iterator i = hgs.knownVisitableObjects.begin(); i != hgs.knownVisitableObjects.end();i++)
-	{
+
+	if (h.finished)
+    return;
+
+	for (std::set<AIObjectContainer>::const_iterator i =
+      hgs.knownVisitableObjects.begin();
+      i != hgs.knownVisitableObjects.end();
+      i++) {
 		tp = AIObjective::visit;
 		if(	h.previouslyVisited_pos==i->o->getSightCenter())
 			continue;
+
 		//TODO: what would the hero actually visit if he went to that spot
-		//      maybe the hero wants to visit a seemingly unguarded enemy town, but there is a hero on top of it.
-		//if(i->o->)
-		if(i->o->ID!=HEROI_TYPE)			//unless you are trying to visit a hero
-		{
+		// maybe the hero wants to visit a seemingly unguarded enemy town,
+    // but there is a hero on top of it.
+		// if(i->o->)
+    if (i->o->ID != HEROI_TYPE) {// Unless you are trying to visit a hero.
 			bool heroThere = false;
-			for(int ii = 0; ii < hgs.heroModels.size();ii++)
-				if(hgs.heroModels[ii].pos==i->o->getSightCenter())
-					heroThere = true;
-			if(heroThere)			//it won't work if there is already someone visiting that spot.
+      for(int j = 0; j < hgs.heroModels.size(); j++) {
+				if (hgs.heroModels[j].pos == i->o->getSightCenter())
+          heroThere = true;
+      }
+			if (heroThere) // It won't work if there is already someone visiting that spot.
 				continue;
 		}
-		if(i->o->ID==HEROI_TYPE&&i->o->getOwner()==m_cb->getMyColor())//visiting friendly heroes not yet supported
+		if (i->o->ID == HEROI_TYPE && // Visiting friendly heroes not yet supported.
+        i->o->getOwner() == m_cb->getMyColor())
 			continue;
-		if(i->o->id==h.h->id)	//don't visit yourself (should be caught by above)
+		if (i->o->id == h.h->id)	// Don't visit yourself (should be caught by above).
 			continue;
-		
-		if(i->o->ID==53&&i->o->getOwner()==m_cb->getMyColor())//don't visit a mine if you own, there's almost no point(maybe to leave guards or because the hero's trapped).
+    // Don't visit a mine if you own, there's almost no
+    // point(maybe to leave guards or because the hero's trapped).
+		if (i->o->ID == 53
+        && i->o->getOwner() == m_cb->getMyColor())
 			continue;
 
-		if(i->o->getOwner()!=m_cb->getMyColor())	
-		{
-			int enemyStrength = 0;							//TODO: I feel like the AI shouldn't have access to this information.
-															//      We must get an approximation based on few, many, ... zounds etc.
-			if(dynamic_cast<const CArmedInstance *> (i->o))
-				enemyStrength = (dynamic_cast<const CArmedInstance *> (i->o))->getArmyStrength();//TODO: should be virtual maybe, Army strength should be comparable across objects
-			if(dynamic_cast<const CGHeroInstance *> (i->o))
-				enemyStrength = (dynamic_cast<const CGHeroInstance *> (i->o))->getTotalStrength();
-			if(dynamic_cast<const CGTownInstance *> (i->o))
-				enemyStrength = (dynamic_cast<const CGTownInstance *> (i->o))->getArmyStrength()*1.2;
+		if (i->o->getOwner() != m_cb->getMyColor()) {
+      // TODO: I feel like the AI shouldn't have access to this information.
+      // We must get an approximation based on few, many, ... zounds etc.
+			int enemyStrength = 0;  
+
+      // TODO: should be virtual maybe, army strength should be
+      // comparable across objects.
+      // TODO: Rewrite all those damn i->o. For someone reading it the first
+      // time it's completely inconprehensible.
+			if (dynamic_cast<const CArmedInstance *> (i->o))
+				enemyStrength =
+          (dynamic_cast<const CArmedInstance *> (i->o))->getArmyStrength();
+			if (dynamic_cast<const CGHeroInstance *> (i->o))
+				enemyStrength =
+          (dynamic_cast<const CGHeroInstance *> (i->o))->getTotalStrength();
+      // TODO: Make constants of those 1.2 & 2.5.
+			if (dynamic_cast<const CGTownInstance *> (i->o))
+				enemyStrength =
+          (dynamic_cast<const CGTownInstance *> (i->o))->getArmyStrength()*1.2;
 			float heroStrength = h.h->getTotalStrength();
-			if(enemyStrength*2.5 > heroStrength)  //TODO: ballence these numbers using objective cost formula.
-				continue;									//      it would be nice to do a battle sim
-			if(enemyStrength>0)tp  = AIObjective::attack;
+      // TODO: ballence these numbers using objective cost formula.
+      // TODO: it would be nice to do a battle simulation.
+			if (enemyStrength*2.5 > heroStrength)  
+				continue;
+
+			if (enemyStrength > 0)
+        tp = AIObjective::attack;
 		}
 
-		
-		if(dynamic_cast<const CGVisitableOPW *> (i->o)&&dynamic_cast<const CGVisitableOPW *> (i->o)->visited)//don't visit things that have already been visited this week.
-			continue;
-		if(dynamic_cast<const CGVisitableOPH *> (i->o)&&vstd::contains(dynamic_cast<const CGVisitableOPH *> (i->o)->visitors,h.h->id))//don't visit things that you have already visited OPH
+    //don't visit things that have already been visited this week.
+		if (dynamic_cast<const CGVisitableOPW*> (i->o)
+        && dynamic_cast<const CGVisitableOPW*> (i->o)->visited)
 			continue;
 
+    //don't visit things that you have already visited OPH
+		if (dynamic_cast<const CGVisitableOPH *> (i->o)
+        && vstd::contains(
+                          dynamic_cast<const CGVisitableOPH*> (i->o)->visitors,
+                          h.h->id))
+			continue;
 
-		
-		if(i->o->ID==88||i->o->ID==89||i->o->ID==90)
-		{
+    // TODO: Some descriptions of those included so someone can undestand them.
+		if (i->o->ID == 88 || i->o->ID == 89 || i->o->ID == 90) {
 			//TODO: if no spell book continue
 			//TODO: if the shrine's spell is identified, and the hero already has it, continue
-
 		}
 
 		destination = i->o->getSightCenter();
 
-		if(hpos.z==destination.z)							//don't try to take a path from the underworld to the top or vice versa
-		{	//TODO: fix get path so that it doesn't return a path unless z's are the same, or path goes through sub gate
-			if(m_cb->getPath(hpos,destination,h.h,path))
-			{
+    // Don't try to take a path from the underworld to the top or vice versa.
+    // TODO: Will have to make some calculations so that the AI can enter the
+    // underground.
+    if (hpos.z == destination.z) {
+      //TODO: fix get path so that it doesn't return a path unless z's are \
+      // the same, or path goes through sub gate.
+			if (m_cb->getPath(hpos, destination, h.h, path)) {
 				path.convert(0);
-				if(path.nodes[0].dist<movement)
-				{
-					
-					HeroObjective ho(hgs,tp,i->o,&h,this);
+				if (path.nodes[0].dist < movement) {
+          // TODO: So easy to understand...
+					HeroObjective ho(hgs, tp, i->o, &h, this);
 					std::set<HeroObjective>::iterator found = currentHeroObjectives.find(ho);
-					if(found==currentHeroObjectives.end())
+					if (found == currentHeroObjectives.end())
 						currentHeroObjectives.insert(ho);
 					else {
-						HeroObjective *objective = (HeroObjective *)&(*found);
+						HeroObjective *objective = (HeroObjective*)&(*found);
 						objective->whoCanAchieve.push_back(&h);
 					}
 				}
 
-				// find the most interesting object that is eventually reachable, and set that position to the ultimate goal position
-				int hi = rand(); //TODO: replace random numbers with some sort of ranking system
-
-				if(hi>maxInteresting)
-				{
+				// Find the most interesting object that is eventually reachable,
+        // and set that position to the ultimate goal position.
+        // TODO: replace random numbers with some sort of ranking system.
+				int hi = rand();
+				if (hi > maxInteresting) {
 					maxInteresting = hi;
 					interestingPos = destination;
 				}
-			}		
+      } // if (m_cb->getPath(hpos, destination, h.h, path))
+    } // if (hpos.z == destination.z)
+	} // for (std::set<AIObjectContainer>::const_iterator i = knownVisitableObjects.begin();
 
-		}
-	}
-	
 	h.interestingPos = interestingPos;
-//	if(h.remainingMovement>0&&m_cb->getPath(hpos,interestingPos,h.h,path)) // there ought to be a path   
-		currentHeroObjectives.insert(HeroObjective(hgs,HeroObjective::finishTurn,h.h,&h,this));
-		
-
+  // there ought to be a path
+  // if(h.remainingMovement>0&&m_cb->getPath(hpos,interestingPos,h.h,path))
+	currentHeroObjectives.insert(HeroObjective(hgs,
+                                             HeroObjective::finishTurn,
+                                             h.h,
+                                             &h,
+                                             this));
 }
 
+
 void CGeniusAI::HeroObjective::fulfill(CGeniusAI & cg,HypotheticalGameState & hgs)
 {
 	
@@ -623,6 +771,7 @@ void CGeniusAI::HeroObjective::fulfill(CGeniusAI & cg,HypotheticalGameState & hg
 	
 }
 
+
 void CGeniusAI::addTownObjectives(HypotheticalGameState::TownModel &t, HypotheticalGameState & hgs)
 {
 	//recruitHero
@@ -940,12 +1089,12 @@ void CGeniusAI::heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector
 	callback(rand() % skills.size());
 }
 
-void GeniusAI::CGeniusAI::showGarrisonDialog( const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits, boost::function<void()> &onEnd )
+void geniusai::CGeniusAI::showGarrisonDialog( const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits, boost::function<void()> &onEnd )
 {
 	onEnd();
 }
 
-void GeniusAI::CGeniusAI::playerBlocked( int reason )
+void geniusai::CGeniusAI::playerBlocked( int reason )
 {
 	if(reason == 0) //battle is coming...
 	{
@@ -953,7 +1102,7 @@ void GeniusAI::CGeniusAI::playerBlocked( int reason )
 	}
 }
 
-void GeniusAI::CGeniusAI::battleResultsApplied()
+void geniusai::CGeniusAI::battleResultsApplied()
 {
 	assert(m_state.get() == ENDING_BATTLE);
 	m_state.setn(NO_BATTLE);

+ 4 - 4
AI/GeniusAI/CGeniusAI.h

@@ -11,7 +11,7 @@
 
 class CBuilding;
 
-namespace GeniusAI {
+namespace geniusai {
 
 enum BattleState
 {
@@ -28,9 +28,9 @@ class CGeniusAI : public CGlobalAI
 {
 private:
 	ICallback*							m_cb;
-	GeniusAI::BattleAI::CBattleLogic*	m_battleLogic;
-	GeniusAI::GeneralAI::CGeneralAI		m_generalAI;
-	GeniusAI::Priorities *				m_priorities;
+	geniusai::BattleAI::CBattleLogic*	m_battleLogic;
+	geniusai::GeneralAI::CGeneralAI		m_generalAI;
+	geniusai::Priorities *				m_priorities;
 
 	
 	CondSh<BattleState> m_state; //are we engaged into battle?

+ 1 - 1
AI/GeniusAI/DLLMain.cpp

@@ -4,7 +4,7 @@
 
 #include "CGeniusAI.h"
 
-using namespace GeniusAI;
+using namespace geniusai;
 
 const char *g_cszAiName = "Genius 1.0";
 

+ 1 - 1
AI/GeniusAI/GeneralAI.cpp

@@ -1,7 +1,7 @@
 #include "GeneralAI.h"
 #include "../../CCallback.h"
 
-using namespace GeniusAI::GeneralAI;
+using namespace geniusai::GeneralAI;
 
 CGeneralAI::CGeneralAI()
 	: m_cb(NULL)

+ 1 - 1
AI/GeniusAI/GeneralAI.h

@@ -3,7 +3,7 @@
 
 #include "Common.h"
 
-namespace GeniusAI { namespace GeneralAI {
+namespace geniusai { namespace GeneralAI {
 
 	class CGeneralAI
 	{