2018-12-01 10:30:37 +02:00
|
|
|
/*
|
|
|
|
* BuildThis.cpp, part of VCMI engine
|
|
|
|
*
|
|
|
|
* Authors: listed in file AUTHORS in main folder
|
|
|
|
*
|
|
|
|
* License: GNU General Public License v2.0 or later
|
|
|
|
* Full text of license available in license.txt file, in main folder
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
#include "StdInc.h"
|
|
|
|
#include "BuildThis.h"
|
|
|
|
#include "../VCAI.h"
|
|
|
|
#include "../AIUtility.h"
|
|
|
|
#include "../AIhelper.h"
|
|
|
|
#include "../FuzzyHelper.h"
|
|
|
|
#include "../ResourceManager.h"
|
|
|
|
#include "../BuildingManager.h"
|
2023-05-24 01:05:59 +02:00
|
|
|
#include "../../../lib/mapObjects/CGTownInstance.h"
|
2023-08-19 23:22:31 +02:00
|
|
|
#include "../../../lib/constants/StringConstants.h"
|
2018-12-01 10:30:37 +02:00
|
|
|
|
|
|
|
using namespace Goals;
|
|
|
|
|
|
|
|
bool BuildThis::operator==(const BuildThis & other) const
|
|
|
|
{
|
|
|
|
return town == other.town && bid == other.bid;
|
|
|
|
}
|
|
|
|
|
|
|
|
TSubgoal BuildThis::whatToDoToAchieve()
|
|
|
|
{
|
|
|
|
auto b = BuildingID(bid);
|
|
|
|
|
|
|
|
// find town if not set
|
|
|
|
if(!town && hero)
|
|
|
|
town = hero->visitedTown;
|
|
|
|
|
|
|
|
if(!town)
|
|
|
|
{
|
2024-04-28 11:53:10 +02:00
|
|
|
for(const CGTownInstance * candidateTown : cb->getTownsInfo())
|
2018-12-01 10:30:37 +02:00
|
|
|
{
|
2024-04-28 11:53:10 +02:00
|
|
|
switch(cb->canBuildStructure(candidateTown, b))
|
2018-12-01 10:30:37 +02:00
|
|
|
{
|
|
|
|
case EBuildingState::ALLOWED:
|
2024-04-28 11:53:10 +02:00
|
|
|
town = candidateTown;
|
2024-06-24 03:23:26 +02:00
|
|
|
break; //TODO: look for prerequisites? this is not our responsibility
|
2018-12-01 10:30:37 +02:00
|
|
|
default:
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(town) //we have specific town to build this
|
|
|
|
{
|
|
|
|
switch(cb->canBuildStructure(town, b))
|
|
|
|
{
|
|
|
|
case EBuildingState::ALLOWED:
|
|
|
|
case EBuildingState::NO_RESOURCES:
|
|
|
|
{
|
|
|
|
auto res = town->town->buildings.at(BuildingID(bid))->resources;
|
|
|
|
return ai->ah->whatToDo(res, iAmElementar()); //realize immediately or gather resources
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
throw cannotFulfillGoalException("Not possible to build");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
throw cannotFulfillGoalException("Cannot find town to build this");
|
|
|
|
}
|