1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Next batch of code clearing.

This commit is contained in:
red1939 2009-11-01 20:13:12 +00:00
parent 6b5feb63e6
commit f7a1b74092
3 changed files with 199 additions and 175 deletions

View File

@ -1,19 +1,24 @@
#ifndef AI_PRIORITIES
#define AI_PRIORITIES
#include "AIPriorities.h"
#include <sstream>
// TODO: No using namespace!!
using namespace geniusai;
Network::Network()
{}
Network::Network(vector<unsigned int> whichFeatures)// random network
:net(whichFeatures.size(), whichFeatures.size()*.601+2, whichFeatures.size()*.251+2, 1),whichFeatures(whichFeatures)
: net(whichFeatures.size(),
whichFeatures.size() * 0.601 + 2,
whichFeatures.size() * 0.251 + 2,
1),
whichFeatures(whichFeatures)
{
}
Network::Network(istream & input)
{
//vector<int> whichFeatures;
// vector<int> whichFeatures;
int feature;
string line;
getline(input,line);
@ -21,17 +26,21 @@ Network::Network(istream & input)
while(lineIn>>feature)
whichFeatures.push_back(feature);
getline(input,line);//get R
net = neuralNetwork(whichFeatures.size(), whichFeatures.size()*.601+2, whichFeatures.size()*.251+2, 1);
getline(input, line);//get R
net = neuralNetwork(whichFeatures.size(),
whichFeatures.size() * 0.601 + 2,
whichFeatures.size() * 0.251 + 2,
1);
}
float Network::feedForward(const vector<float> & stateFeatures)
{
return (rand()%1000)/800.0;
// TODO: Should comment/rewrite it...
return (rand() % 1000) / 800.0f;
double * input = new double[whichFeatures.size()];
for(int i = 0; i < whichFeatures.size();i++)
input[i]=stateFeatures[whichFeatures[i]];
for (int i = 0; i < whichFeatures.size(); i++)
input[i] = stateFeatures[whichFeatures[i]];
float ans = net.feedForwardPattern(input)[0];
@ -74,7 +83,7 @@ void Priorities::fillFeatures(const CGeniusAI::HypotheticalGameState & hgs)
{
stateFeatures.clear();
stateFeatures.resize(50);
for(int i = 0; i < stateFeatures.size();i++)
for(int i = 0; i < stateFeatures.size(); i++)
stateFeatures[i]=0;
for(int i = 0; i < hgs.resourceAmounts.size();i++) //features 0-7 are resources
stateFeatures[i]=hgs.resourceAmounts[i];

View File

@ -36,6 +36,7 @@ void DbgBox(const char* msg, bool messageBox)
#endif
}
// TODO: Rewrite those i-s, o-s to something meaningful.
bool CGeniusAI::AIObjectContainer::operator<(
const AIObjectContainer& b) const
@ -46,7 +47,6 @@ bool CGeniusAI::AIObjectContainer::operator<(
return o->id < b.o->id;
}
CGeniusAI::HypotheticalGameState::HeroModel::HeroModel(
const CGHeroInstance* h)
: h(h), finished(false)
@ -55,20 +55,17 @@ CGeniusAI::HypotheticalGameState::HeroModel::HeroModel(
remainingMovement = h->movement;
}
CGeniusAI::HypotheticalGameState::TownModel::TownModel(
const CGTownInstance *t)
const CGTownInstance* t)
: t(t)
{
hasBuilt = t->builded;
hasBuilt = static_cast<bool>(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();
@ -99,7 +96,6 @@ void CGeniusAI::HypotheticalGameState::update(CGeniusAI& ai)
{
AI = &ai;
knownVisitableObjects = ai.knownVisitableObjects;
std::vector<HeroModel> oldModels = heroModels;
heroModels.clear();
@ -137,14 +133,12 @@ void CGeniusAI::HypotheticalGameState::update(CGeniusAI& ai)
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;
@ -168,7 +162,8 @@ float CGeniusAI::HeroObjective::getValue() const
if (object->ID == 47) // School of magic
resourceCosts[6] += 1000;
float bestCost = 9e9;
// TODO: Add some meaningful (and not exploitable) number here.
float bestCost = 9e9f;
HypotheticalGameState::HeroModel* bestHero = NULL;
if (type != AIObjective::finishTurn)
{
@ -229,10 +224,10 @@ bool CGeniusAI::HeroObjective::operator<(
return pos < other.pos;
else if (object->id != other.object->id)
return object->id < other.object->id;
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
else if ((dynamic_cast<const CGVisitableOPH*>(object) != NULL) &&
(whoCanAchieve.front()->h->id != other.whoCanAchieve.front()->h->id))
return whoCanAchieve.front()->h->id < other.whoCanAchieve.front()->h->id;
else
return false;
}
@ -274,15 +269,15 @@ float CGeniusAI::TownObjective::getValue() const
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;
int newID;
int howMany;
ui32 creatures_max = 0;
CBuilding* b = NULL;
CCreature* creature = NULL;
float cost = 0; // TODO: Needed?
int ID = 0;
int newID = 0;
int howMany = 0;
ui32 creatures_max = 0;
switch (type) {
case recruitHero:
@ -360,79 +355,80 @@ void CGeniusAI::TownObjective::print() const
const CCreature* creature = NULL;
int ID = 0;
int howMany = 0;
int newID = 0;
int hSlot = 0;
int newID = 0; // TODO: Needed?
int hSlot = 0; // TODO: Needed?
ui32 creatures_max;
switch (type) {
case recruitHero:
cout << "recruit hero.";
break;
case recruitHero:
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[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] << " crystal. ";
if (b->resources[5] != 0)
cout << b->resources[5] << " gems. ";
if (b->resources[6] != 0)
cout << b->resources[6] << " gold. ";
}
break;
case buildBuilding:
b = VLC->buildh->buildings[whichTown->t->subID][which];
cout << "build " << b->Name() << " cost = ";
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] << " crystal. ";
if (b->resources[5] != 0)
cout << b->resources[5] << " gems. ";
if (b->resources[6] != 0)
cout << b->resources[6] << " gold. ";
}
break;
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;
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;
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[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;
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[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 recruitCreatures.
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
break;
} // case buildBuilding
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
break;
} // switch(type)
}
@ -493,8 +489,8 @@ void CGeniusAI::addHeroObjectives(CGeniusAI::HypotheticalGameState::HeroModel& h
if (h.finished)
return;
for (std::set<AIObjectContainer>::const_iterator i =
hgs.knownVisitableObjects.begin();
for (std::set<AIObjectContainer>::const_iterator
i = hgs.knownVisitableObjects.begin();
i != hgs.knownVisitableObjects.end();
i++) {
tp = AIObjective::visit;
@ -534,20 +530,21 @@ void CGeniusAI::addHeroObjectives(CGeniusAI::HypotheticalGameState::HeroModel& h
// 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))
// TODO: NO MAGIC NUMBERS !!!
if (dynamic_cast<const CArmedInstance*> (i->o))
enemyStrength =
(dynamic_cast<const CArmedInstance *> (i->o))->getArmyStrength();
if (dynamic_cast<const CGHeroInstance *> (i->o))
(dynamic_cast<const CArmedInstance*> (i->o))->getArmyStrength();
if (dynamic_cast<const CGHeroInstance*> (i->o))
enemyStrength =
(dynamic_cast<const CGHeroInstance *> (i->o))->getTotalStrength();
(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;
if (dynamic_cast<const CGTownInstance*> (i->o))
enemyStrength = static_cast<int>(
(dynamic_cast<const CGTownInstance*> (i->o))->getArmyStrength() * 1.2);
float heroStrength = h.h->getTotalStrength();
// TODO: ballence these numbers using objective cost formula.
// TODO: it would be nice to do a battle simulation.
if (enemyStrength*2.5 > heroStrength)
if (enemyStrength * 2.5 > heroStrength)
continue;
if (enemyStrength > 0)
@ -555,15 +552,14 @@ void CGeniusAI::addHeroObjectives(CGeniusAI::HypotheticalGameState::HeroModel& h
}
//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)
if ((dynamic_cast<const CGVisitableOPW*> (i->o) != NULL) &&
(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))
if ((dynamic_cast<const CGVisitableOPH*> (i->o) != NULL) &&
vstd::contains(dynamic_cast<const CGVisitableOPH*> (i->o)->visitors,
h.h->id))
continue;
// TODO: Some descriptions of those included so someone can undestand them.
@ -589,7 +585,10 @@ void CGeniusAI::addHeroObjectives(CGeniusAI::HypotheticalGameState::HeroModel& h
if (found == currentHeroObjectives.end())
currentHeroObjectives.insert(ho);
else {
HeroObjective *objective = (HeroObjective*)&(*found);
// TODO: Try to rewrite if possible...
// A cast to a pointer, from a reference, to a pointer
// of an iterator.
HeroObjective* objective = (HeroObjective*)&(*found);
objective->whoCanAchieve.push_back(&h);
}
}
@ -639,7 +638,7 @@ void CGeniusAI::HeroObjective::fulfill(CGeniusAI& cg,
hpos = h->pos;
destination = h->interestingPos;
if ( !cg.m_cb->getPath(hpos, destination, h->h, path) ) {
if (!cg.m_cb->getPath(hpos, destination, h->h, path)) {
cout << "AI error: invalid destination" << endl;
return;
}
@ -647,8 +646,8 @@ void CGeniusAI::HeroObjective::fulfill(CGeniusAI& cg,
// Find closest coord that we can get to.
for (int i = path.nodes.size() - 2; i >= 0; i--) {
// TODO: getPath what??
if ((cg.m_cb->getPath(hpos, path.nodes[i].coord, h->h, path2))
&& (path2.nodes[0].dist <= h->remainingMovement))
if ((cg.m_cb->getPath(hpos, path.nodes[i].coord, h->h, path2)) &&
(path2.nodes[0].dist <= h->remainingMovement))
destination = path.nodes[i].coord;
}
@ -667,10 +666,10 @@ void CGeniusAI::HeroObjective::fulfill(CGeniusAI& cg,
// There better not be anything there.
if (cg.m_cb->getVisitableObjs(currentPos).size() != 0)
continue;
if ((cg.m_cb->getPath(hpos, currentPos, h->h, path) == false)
if ((cg.m_cb->getPath(hpos, currentPos, h->h, path) == false) ||
// It better be reachable from the hero
// TODO: remainingMovement > 0...
|| (path.nodes[0].dist>h->remainingMovement))
(path.nodes[0].dist>h->remainingMovement))
continue;
int count = 0;
@ -703,9 +702,9 @@ void CGeniusAI::HeroObjective::fulfill(CGeniusAI& cg,
break;
} // switch(type)
if ( (type == visit || type == finishTurn || type == attack)
&& (cg.m_cb->getPath(hpos, destination, h->h, path) != false) )
path.convert(0);
if ((type == visit || type == finishTurn || type == attack) &&
(cg.m_cb->getPath(hpos, destination, h->h, path) != false))
path.convert(0);
if (cg.m_state.get() != NO_BATTLE)
cg.m_state.waitUntil(NO_BATTLE); // Wait for battle end
@ -718,37 +717,38 @@ void CGeniusAI::HeroObjective::fulfill(CGeniusAI& cg,
if (cg.m_state.get() != NO_BATTLE)
cg.m_state.waitUntil(NO_BATTLE); // Wait for battle end
}
}
h->remainingMovement -= path.nodes[0].dist;
if (object->blockVisit)
h->pos = path.nodes[1].coord;
else
h->pos=destination;
h->pos = destination;
std::set<AIObjectContainer>::iterator i =
hgs.knownVisitableObjects.find(AIObjectContainer(object));
std::set<AIObjectContainer>::iterator
i = hgs.knownVisitableObjects.find(AIObjectContainer(object));
if (i != hgs.knownVisitableObjects.end())
hgs.knownVisitableObjects.erase(i);
const CGTownInstance * town = dynamic_cast<const CGTownInstance *> (object);
const CGTownInstance* town = dynamic_cast<const CGTownInstance*> (object);
if (town && object->getOwner() == cg.m_cb->getMyColor()) {
//upgrade hero's units
cout << "visiting town" << endl;
CCreatureSet hcreatures = h->h->army;
for (std::map< si32, std::pair<ui32,si32> >::const_iterator i =
hcreatures.slots.begin();
i != hcreatures.slots.end();
i++) { // For each hero slot.
for (std::map< si32, std::pair<ui32,si32> >::const_iterator
i = hcreatures.slots.begin();
i != hcreatures.slots.end();
i++) { // For each hero slot.
UpgradeInfo ui = cg.m_cb->getUpgradeInfo(h->h,i->first);
bool canUpgrade = false;
if (ui.newID.size() != 0) { // Does this stack need upgrading?
canUpgrade = true;
for (int ii = 0; ii < ui.cost.size(); ii++) // Can afford the upgrade?
for (std::set<std::pair<int,int> >::iterator j = ui.cost[ii].begin();
j != ui.cost[ii].end();
j++)
for (std::set<std::pair<int,int> >::iterator
j = ui.cost[ii].begin();
j != ui.cost[ii].end();
j++)
if (hgs.resourceAmounts[j->first] < j->second * i->second.second)
canUpgrade = false;
}
@ -768,13 +768,13 @@ void CGeniusAI::HeroObjective::fulfill(CGeniusAI& cg,
int weakestCreatureAIValue = 99999; // TODO: Wtf??
for (std::map< si32, std::pair<ui32,si32> >::const_iterator
i = tcreatures.slots.begin();
i != tcreatures.slots.end();
i++) {
i = tcreatures.slots.begin();
i != tcreatures.slots.end();
i++) {
if (VLC->creh->creatures[i->second.first].AIValue <
weakestCreatureAIValue) {
weakestCreatureAIValue = VLC->creh->creatures[i->second.first].AIValue;
weakestCreatureStack = i->first;
weakestCreatureAIValue = VLC->creh->creatures[i->second.first].AIValue;
weakestCreatureStack = i->first;
}
}
for (std::map< si32, std::pair<ui32, si32> >::const_iterator
@ -1079,9 +1079,10 @@ void CGeniusAI::startFirstTurn()
int ID = hgs.townModels.front().creaturesToRecruit[i].second.back();
const CCreature *creature = &VLC->creh->creatures[ID];
bool canAfford = true;
for (int ii = 0; ii < creature->cost.size(); ii++)
for (int ii = 0; ii < creature->cost.size(); ii++) {
if (creature->cost[ii] > hgs.resourceAmounts[ii])
canAfford = false; // can we afford at least one creature?
canAfford = false; // Can we afford at least one creature?
}
if (!canAfford)
continue;
TownObjective(hgs,AIObjective::recruitCreatures,&hgs.townModels.front(),i,this).fulfill(*this,hgs);
@ -1094,8 +1095,7 @@ void CGeniusAI::startFirstTurn()
HeroObjective(hgs, AIObjective::visit, town, hero = &hgs.heroModels[i], this).fulfill(*this,hgs);
}
hgs.update(*this);
// m_cb->swapGarrisonHero(town);
// m_cb->swapGarrisonHero(town);
//TODO: choose the strongest hero.
}
@ -1148,23 +1148,23 @@ void CGeniusAI::tileHidden(int3 pos)
}
void CGeniusAI::heroMoved(const TryMoveHero &TMH)
void CGeniusAI::heroMoved(const TryMoveHero& TMH)
{
//DbgBox("** CGeniusAI::heroMoved **");
// DbgBox("** CGeniusAI::heroMoved **");
}
void CGeniusAI::heroGotLevel(const CGHeroInstance *hero,
int pskill,
std::vector<ui16>& skills,
boost::function<void(ui32)> &callback)
boost::function<void(ui32)>& callback)
{
callback(rand() % skills.size());
}
void geniusai::CGeniusAI::showGarrisonDialog(const CArmedInstance *up,
const CGHeroInstance *down,
void geniusai::CGeniusAI::showGarrisonDialog(const CArmedInstance* up,
const CGHeroInstance* down,
bool removableUnits,
boost::function<void()>& onEnd)
{
@ -1172,7 +1172,7 @@ void geniusai::CGeniusAI::showGarrisonDialog(const CArmedInstance *up,
}
void geniusai::CGeniusAI::playerBlocked( int reason )
void geniusai::CGeniusAI::playerBlocked(int reason)
{
if (reason == 0) // Battle is coming...
m_state.setn(UPCOMING_BATTLE);
@ -1185,7 +1185,7 @@ void geniusai::CGeniusAI::battleResultsApplied()
m_state.setn(NO_BATTLE);
}
// TODO: Shouldn't the parameters be made const (apart from cancel)?
void CGeniusAI::showBlockingDialog(const std::string& text,
const std::vector<Component> &components,
ui32 askID,
@ -1193,7 +1193,7 @@ void CGeniusAI::showBlockingDialog(const std::string& text,
bool selection,
bool cancel)
{
m_cb->selectionMade(cancel ? 0 : 1, askID);
m_cb->selectionMade(cancel ? false : true, askID);
}
@ -1232,6 +1232,8 @@ void CGeniusAI::battleAttack(BattleAttack* ba)
{
DbgBox("\t\t\tCGeniusAI::battleAttack");
}
/**
* called when stack receives damage (after battleAttack())
*/
@ -1264,14 +1266,15 @@ void CGeniusAI::battleStart(CCreatureSet *army1, CCreatureSet *army2, int3 tile,
*/
void CGeniusAI::battleEnd(BattleResult* br)
{
switch (br->winner)
{
switch (br->winner) {
case 0: std::cout << "The winner is the attacker." << std::endl;break;
case 1: std::cout << "The winner is the defender." << std::endl;break;
case 2: std::cout << "It's a draw." << std::endl;break;
};
cout << "lost ";
for(std::map<ui32,si32>::iterator i = br->casualties[0].begin(); i !=br->casualties[0].end();i++)
for (std::map<ui32,si32>::iterator i = br->casualties[0].begin();\
i != br->casualties[0].end();
i++)
cout << i->second << " " << VLC->creh->creatures[i->first].namePl << endl;
delete m_battleLogic;
@ -1283,9 +1286,9 @@ void CGeniusAI::battleEnd(BattleResult* br)
DbgBox("** CGeniusAI::battleEnd **");
}
/**
* called at the beggining of each turn, round=-1 is the tactic phase, round=0 is the first "normal" turn
/*
* Called at the beggining of each turn, round = -1 is the tactic phase,
* round = 0 is the first "normal" turn.
*/
void CGeniusAI::battleNewRound(int round)
{
@ -1296,7 +1299,6 @@ void CGeniusAI::battleNewRound(int round)
m_battleLogic->SetCurrentTurn(round);
}
/**
*
*/
@ -1323,7 +1325,8 @@ void CGeniusAI::battleSpellCast(SpellCast *sc)
/**
* called when battlefield is prepared, prior the battle beginning
*/
void CGeniusAI::battlefieldPrepared(int battlefieldType, std::vector<CObstacle*> obstacles)
void CGeniusAI::battlefieldPrepared(int battlefieldType,
std::vector<CObstacle*> obstacles)
{
DbgBox("CGeniusAI::battlefieldPrepared");
}
@ -1332,7 +1335,10 @@ void CGeniusAI::battlefieldPrepared(int battlefieldType, std::vector<CObstacle*>
/**
*
*/
void CGeniusAI::battleStackMoved(int ID, int dest, bool startMoving, bool endMoving)
void CGeniusAI::battleStackMoved(int ID,
int dest,
bool startMoving,
bool endMoving)
{
DbgBox("\t\t\tCGeniusAI::battleStackMoved");
}
@ -1350,7 +1356,11 @@ void CGeniusAI::battleStackAttacking(int ID, int dest)
/**
*
*/
void CGeniusAI::battleStackIsAttacked(int ID, int dmg, int killed, int IDby, bool byShooting)
void CGeniusAI::battleStackIsAttacked(int ID,
int dmg,
int killed,
int IDby,
bool byShooting)
{
DbgBox("\t\t\tCGeniusAI::battleStackIsAttacked");
}

View File

@ -27,10 +27,11 @@ class Priorities;
class CGeniusAI : public CGlobalAI
{
private:
ICallback* m_cb;
// TODO: cb... come back, croach busters!?
ICallback* m_cb;
geniusai::BattleAI::CBattleLogic* m_battleLogic;
geniusai::GeneralAI::CGeneralAI m_generalAI;
geniusai::Priorities * m_priorities;
geniusai::Priorities* m_priorities;
CondSh<BattleState> m_state; //are we engaged into battle?
@ -99,7 +100,7 @@ private:
CGeniusAI * AI;
Type type;
virtual void fulfill(CGeniusAI &,HypotheticalGameState & hgs)=0;
virtual HypotheticalGameState pretend(const HypotheticalGameState &) =0;
virtual HypotheticalGameState pretend(const HypotheticalGameState&) =0;
virtual void print() const=0;
virtual float getValue() const=0; //how much is it worth to the AI to achieve
};
@ -110,12 +111,16 @@ private:
HypotheticalGameState hgs;
int3 pos;
const CGObjectInstance * object;
mutable std::vector<HypotheticalGameState::HeroModel *> whoCanAchieve;
mutable std::vector<HypotheticalGameState::HeroModel*> whoCanAchieve;
//HeroObjective(){}
//HeroObjective(Type t):object(NULL){type = t;}
HeroObjective(const HypotheticalGameState &hgs,Type t,const CGObjectInstance * object,HypotheticalGameState::HeroModel *h,CGeniusAI * AI);
bool operator < (const HeroObjective &other)const;
HeroObjective(const HypotheticalGameState &hgs,
Type t,
const CGObjectInstance* object,
HypotheticalGameState::HeroModel* h,
CGeniusAI* AI);
bool operator< (const HeroObjective &other) const;
void fulfill(CGeniusAI &,HypotheticalGameState & hgs);
HypotheticalGameState pretend(const HypotheticalGameState &hgs){return hgs;};
float getValue() const;