-
t800
- Ветеран
-
- Сообщения: 982
- Зарегистрирован: 22 июл 2015, 11:36
- Пол:
- Награды: 4
-
- Поблагодарили: 191 раз.
-
|
t800 » 17 сен 2016, 05:42
Я сейчас посмотрел как AI делает обмен войсками. Он делает его вот так: - Код: Выделить всё
void AIMeeting(Heroes & hero1, Heroes & hero2) { if(Settings::Get().ExtWorldEyeEagleAsScholar()) Heroes::ScholarAction(hero1, hero2);
if(hero1.Modes(AI::HEROES_HUNTER)) hero1.GetArmy().JoinStrongestFromArmy(hero2.GetArmy()); else if(hero2.Modes(AI::HEROES_HUNTER)) hero2.GetArmy().JoinStrongestFromArmy(hero1.GetArmy()); else if(hero1.Modes(AI::HEROES_SCOUTER)) hero1.GetArmy().KeepOnlyWeakestTroops(hero2.GetArmy()); else if(hero2.Modes(AI::HEROES_SCOUTER)) hero2.GetArmy().KeepOnlyWeakestTroops(hero1.GetArmy());
// artifacts change }
Т.е. полный обмен войсками между T-800 и Zom это нормально. А статус кто HUNTER а кто SCOUTER AI назначает вот так - Код: Выделить всё
void AI::HeroesLevelUp(Heroes & hero) { if(4 < hero.GetLevel() && !hero.Modes(AI::HEROES_HUNTER)) hero.SetModes(AI::HEROES_HUNTER);
if(9 < hero.GetLevel() && hero.Modes(AI::HEROES_SCOUTER)) hero.ResetModes(AI::HEROES_SCOUTER); }
Оценка идет по уровню героев ( стартовый опыт у T-800 (10 000 ), т.е. восьмой уровень (артифакты и знания при оценке не учитываются) Еще AI может присваивать значение HUNTER или SCOUTER героям вот здесь - Код: Выделить всё
void AI::KingdomTurn(Kingdom & kingdom) { KingdomHeroes & heroes = kingdom.GetHeroes(); KingdomCastles & castles = kingdom.GetCastles();
const int color = kingdom.GetColor();
if(kingdom.isLoss() || color == Color::NONE) { kingdom.LossPostActions(); return; }
DEBUG(DBG_AI, DBG_INFO, Color::String(kingdom.GetColor()) << " funds: " << kingdom.GetFunds().String());
if(! Settings::Get().MusicMIDI()) AGG::PlayMusic(MUS::COMPUTER);
Interface::StatusWindow & status = Interface::Basic::Get().GetStatusWindow(); AIKingdom & ai = AIKingdoms::Get(color);
// turn indicator status.RedrawTurnProgress(0);
// scan map ai.scans.clear(); WorldStoreObjects(color, ai.scans); DEBUG(DBG_AI, DBG_INFO, Color::String(color) << ", size cache objects: " << ai.scans.size());
// set capital if(NULL == ai.capital && castles.size()) { KingdomCastles::iterator it = std::find_if(castles.begin(), castles.end(), Castle::PredicateIsCastle);
if(castles.end() != it) { if(*it) { ai.capital = *it; ai.capital->SetModes(Castle::CAPITAL); } } else // first town { ai.capital = castles.front(); ai.capital->SetModes(Castle::CAPITAL); } }
// turn indicator status.RedrawTurnProgress(1);
// castles AI turn std::for_each(castles.begin(), castles.end(), AICastleTurn);
// need capture town? if(castles.empty()) std::for_each(heroes.begin(), heroes.end(), AIHeroesCaptureNearestTown);
// buy hero in capital if(ai.capital && ai.capital->isCastle()) { u32 modes = 0; const u32 maxhero = Maps::XLARGE > world.w() ? (Maps::LARGE > world.w() ? 3 : 2) : 4;
if(heroes.empty()) modes = AI::HEROES_HUNTER|AI::HEROES_SCOUTER; else if(heroes.size() < maxhero || 0 == std::count_if(heroes.begin(), heroes.end(), std::bind2nd(std::mem_fun(&Heroes::Modes), AI::HEROES_SCOUTER))) modes = AI::HEROES_SCOUTER;
if(modes && heroes.size() < Kingdom::GetMaxHeroes()) { Recruits & rec = kingdom.GetRecruits(); Heroes* hero = ai.capital->GetHeroes().Guest();
if(!hero) { if(rec.GetHero1() && rec.GetHero2()) hero = ai.capital->RecruitHero(rec.GetHero1()->GetLevel() >= rec.GetHero2()->GetLevel() ? rec.GetHero1() : rec.GetHero2()); else if(rec.GetHero1()) hero = ai.capital->RecruitHero(rec.GetHero1()); else if(rec.GetHero2()) hero = ai.capital->RecruitHero(rec.GetHero2());
if(hero) hero->SetModes(modes); } } }
// set hunters if(ai.capital) { const size_t hunters = std::count_if(heroes.begin(), heroes.end(), std::bind2nd(std::mem_fun(&Heroes::Modes), AI::HEROES_HUNTER));
// every time if(0 == hunters && heroes.size()) { KingdomHeroes::iterator it = std::find_if(heroes.begin(), heroes.end(), std::not1(std::bind2nd(std::mem_fun(&Heroes::Modes), Heroes::PATROL)));
if(it != heroes.end() && ! ai.capital->GetHeroes().Guest()) AIHeroesSetHunterWithTarget((*it), ai.capital->GetIndex()); } else // each month if(world.BeginMonth() && 1 < world.CountDay()) { KingdomHeroes::iterator it = std::find_if(heroes.begin(), heroes.end(), std::bind2nd(std::mem_fun(&Heroes::Modes), AI::HEROES_HUNTER));
if(it != heroes.end() && ! ai.capital->GetHeroes().Guest()) AIHeroesSetHunterWithTarget(*it, ai.capital->GetIndex()); } }
// update roles { std::for_each(heroes.begin(), heroes.end(), std::bind2nd(std::mem_fun(&Heroes::ResetModes), AI::HEROES_STUPID|AI::HEROES_WAITING));
// init roles if(heroes.end() != std::find_if(heroes.begin(), heroes.end(), std::not1(std::bind2nd(std::mem_fun(&Heroes::Modes), AI::HEROES_SCOUTER|AI::HEROES_HUNTER)))) { KingdomHeroes::iterator ith, first = heroes.end();
while(heroes.end() != (ith = std::find_if(heroes.begin(), heroes.end(), std::not1(std::bind2nd(std::mem_fun(&Heroes::Modes), // also skip patrol AI::HEROES_HUNTER|AI::HEROES_SCOUTER|Heroes::PATROL))))) { if(first == heroes.end()) { first = ith; if(*ith) (*ith)->SetModes(AI::HEROES_HUNTER|AI::HEROES_SCOUTER); } else if(*ith) (*ith)->SetModes(AI::HEROES_SCOUTER); } } }
// turn indicator status.RedrawTurnProgress(2);
// heroes turns std::for_each(heroes.begin(), heroes.end(), std::ptr_fun(&AIHeroesTurn)); //std::for_each(heroes.begin(), heroes.end(), std::bind2nd(std::mem_fun(&Heroes::ResetModes), AI::HEROES_STUPID|AI::HEROES_WAITING)); std::for_each(heroes.begin(), heroes.end(), std::ptr_fun(&AIHeroesTurn)); std::for_each(heroes.begin(), heroes.end(), std::ptr_fun(&AIHeroesEnd));
// turn indicator status.RedrawTurnProgress(9);
DEBUG(DBG_AI, DBG_INFO, Color::String(color) << " moved"); }
|