本文整理汇总了C++中Heroes::GetPath方法的典型用法代码示例。如果您正苦于以下问题:C++ Heroes::GetPath方法的具体用法?C++ Heroes::GetPath怎么用?C++ Heroes::GetPath使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Heroes
的用法示例。
在下文中一共展示了Heroes::GetPath方法的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: HeroesTownGate
bool HeroesTownGate(Heroes & hero, const Castle* castle)
{
if(castle)
{
Interface::Basic & I = Interface::Basic::Get();
const s32 src = hero.GetIndex();
const s32 dst = castle->GetIndex();
if(!Maps::isValidAbsIndex(src) || !Maps::isValidAbsIndex(dst))
return false;
AGG::PlaySound(M82::KILLFADE);
hero.GetPath().Hide();
hero.FadeOut();
Cursor::Get().Hide();
hero.Move2Dest(dst);
I.gameArea.SetCenter(hero.GetCenter());
GameFocus::SetRedraw();
I.Redraw();
AGG::PlaySound(M82::KILLFADE);
hero.GetPath().Hide();
hero.FadeIn();
// educate spells
if(! Settings::Get().ExtHeroLearnSpellsWithDay()) castle->MageGuildEducateHero(hero);
return true;
}
return false;
}
示例2: GetRandomHeroesPosition
s32 GetRandomHeroesPosition(Heroes & hero, u32 scoute)
{
Maps::Indexes v = Maps::GetAroundIndexes(hero.GetIndex(), scoute, true);
Maps::Indexes res;
v.resize(std::distance(v.begin(),
std::remove_if(v.begin(), v.end(), std::ptr_fun(&Maps::TileIsUnderProtection))));
#if defined(ANDROID)
const MapsIndexes::const_reverse_iterator crend = v.rend();
for(MapsIndexes::const_reverse_iterator
it = v.rbegin(); it != crend && res.size() < 4; ++it)
#else
for(MapsIndexes::const_reverse_iterator
it = v.rbegin(); it != v.rend() && res.size() < 4; ++it)
#endif
{
if(world.GetTiles(*it).isPassable(&hero, Direction::CENTER, true) &&
hero.GetPath().Calculate(*it))
res.push_back(*it);
}
const s32 result = res.size() ? *Rand::Get(res) : -1;
if(0 <= result)
{
DEBUG(DBG_AI, DBG_INFO, Color::String(hero.GetColor()) <<
", hero: " << hero.GetName() << ", added task: " << result);
}
return result;
}
示例3: GetFocusHeroes
void Interface::Basic::EventDefaultAction(void)
{
Heroes* hero = GetFocusHeroes();
if(hero)
{
const Maps::Tiles & tile = world.GetTiles(hero->GetIndex());
// 1. action object
if(MP2::isActionObject(hero->GetMapsObject(), hero->isShipMaster()) &&
(! MP2::isMoveObject(hero->GetMapsObject()) || hero->CanMove()))
{
hero->Action(hero->GetIndex());
if(MP2::OBJ_STONELIGHTS == tile.GetObject(false) || MP2::OBJ_WHIRLPOOL == tile.GetObject(false))
SetRedraw(REDRAW_HEROES);
SetRedraw(REDRAW_GAMEAREA);
}
else
// 2. continue
if(hero->GetPath().isValid())
hero->SetMove(true);
else
// 3. hero dialog
Game::OpenHeroesDialog(*hero);
}
else
// 4. town dialog
if(GetFocusCastle())
{
Game::OpenCastleDialog(*GetFocusCastle());
}
}
示例4: HeroesActionNewPosition
void AI::HeroesActionNewPosition(Heroes & hero)
{
AIHero & ai_hero = AIHeroes::Get(hero);
//AIKingdom & ai_kingdom = AIKingdoms::Get(hero.GetColor());
Queue & task = ai_hero.sheduled_visit;
const u8 objs[] = { MP2::OBJ_ARTIFACT, MP2::OBJ_RESOURCE, MP2::OBJ_CAMPFIRE, MP2::OBJ_TREASURECHEST, 0 };
Maps::Indexes pickups = Maps::ScanAroundObjects(hero.GetIndex(), objs);
if(pickups.size() && hero.GetPath().isValid() &&
pickups.end() == std::find(pickups.begin(), pickups.end(), hero.GetPath().GetDestinationIndex()))
hero.GetPath().Reset();
for(MapsIndexes::const_iterator
it = pickups.begin(); it != pickups.end(); ++it)
if(*it != hero.GetPath().GetDestinationIndex())
task.push_front(*it);
}
示例5: MoveStep
void Heroes::MoveStep(Heroes & hero, s32 index_from, s32 index_to, bool newpos)
{
if(newpos)
{
hero.Move2Dest(index_to);
hero.GetPath().PopFront();
// possible hero is die
if(!hero.isFreeman() &&
index_to == hero.GetPath().GetDestinationIndex())
{
hero.GetPath().Reset();
hero.Action(index_to);
hero.SetMove(false);
}
}
else
{
hero.ApplyPenaltyMovement();
hero.GetPath().Reset();
hero.Action(index_to);
hero.SetMove(false);
}
}
示例6: ActionSpellDimensionDoor
bool ActionSpellDimensionDoor(Heroes & hero)
{
const u8 distance = Spell::CalculateDimensionDoorDistance(hero.GetPower(), hero.GetArmy().GetHitPoints());
Interface::Basic & I = Interface::Basic::Get();
Cursor & cursor = Cursor::Get();
// center hero
cursor.Hide();
I.gameArea.SetCenter(hero.GetCenter());
GameFocus::SetRedraw();
I.Redraw();
const s32 src = hero.GetIndex();
// get destination
const s32 dst = I.GetDimensionDoorDestination(src, distance, hero.isShipMaster());
if(Maps::isValidAbsIndex(src) && Maps::isValidAbsIndex(dst))
{
AGG::PlaySound(M82::KILLFADE);
hero.GetPath().Reset();
hero.FadeOut();
hero.SpellCasted(Spell::DIMENSIONDOOR);
cursor.Hide();
hero.Move2Dest(dst, true);
I.gameArea.SetCenter(hero.GetCenter());
GameFocus::SetRedraw();
I.Redraw();
AGG::PlaySound(M82::KILLFADE);
hero.FadeIn();
hero.ActionNewPosition();
return false; /* SpellCasted apply */
}
return false;
}
示例7: FindUncharteredTerritory
s32 FindUncharteredTerritory(Heroes & hero, const u8 & scoute)
{
Maps::Indexes v = Maps::GetAroundIndexes(hero.GetIndex(), scoute, true);
Maps::Indexes res;
v.resize(std::distance(v.begin(),
std::remove_if(v.begin(), v.end(), std::ptr_fun(&Maps::TileIsUnderProtection))));
#if (__GNUC__ == 3 && __GNUC_MINOR__ == 4)
const MapsIndexes::const_reverse_iterator crend = v.rend();
for(MapsIndexes::const_reverse_iterator
it = v.rbegin(); it != crend && res.size() < 4; ++it)
#else
MapsIndexes::reverse_iterator it = v.rbegin();
for(; it != v.rend() && (res.size() < 4); ++it)
#endif
{
// find fogs
if(world.GetTiles(*it).isFog(hero.GetColor()) &&
world.GetTiles(*it).isPassable(&hero, Direction::CENTER, true) &&
hero.GetPath().Calculate(*it))
res.push_back(*it);
}
const s32 result = res.size() ? *Rand::Get(res) : -1;
if(0 <= result)
{
DEBUG(DBG_AI, DBG_INFO, Color::String(hero.GetColor()) <<
", hero: " << hero.GetName() << ", added task: " << result);
}
return result;
}
示例8: HeroesGetTask
bool AI::HeroesGetTask(Heroes & hero)
{
std::vector<s32> results;
results.reserve(5);
const Settings & conf = Settings::Get();
AIHero & ai_hero = AIHeroes::Get(hero);
AIKingdom & ai_kingdom = AIKingdoms::Get(hero.GetColor());
Queue & task = ai_hero.sheduled_visit;
IndexObjectMap & ai_objects = ai_kingdom.scans;
const u8 objs1[] = { MP2::OBJ_ARTIFACT, MP2::OBJ_RESOURCE, MP2::OBJ_CAMPFIRE, MP2::OBJ_TREASURECHEST, 0 };
const u8 objs2[] = { MP2::OBJ_SAWMILL, MP2::OBJ_MINES, MP2::OBJ_ALCHEMYLAB, 0 };
const u8 objs3[] = { MP2::OBJ_CASTLE, MP2::OBJ_HEROES, MP2::OBJ_MONSTER, 0 };
// rescan path
hero.RescanPath();
Castle* castle = hero.inCastle();
// if hero in castle
if(castle)
{
DEBUG(DBG_AI, DBG_TRACE, hero.GetName() << ", in castle");
castle->RecruitAllMonster();
hero.GetArmy().UpgradeTroops(*castle);
// recruit army
if(hero.Modes(AI::HEROES_HUNTER))
hero.GetArmy().JoinStrongestFromArmy(castle->GetArmy());
else
if(hero.Modes(AI::HEROES_SCOUTER))
hero.GetArmy().KeepOnlyWeakestTroops(castle->GetArmy());
DEBUG(DBG_AI, DBG_TRACE, hero.GetName() << ", " << hero.GetArmy().String());
}
// patrol task
if(hero.Modes(Heroes::PATROL))
{
DEBUG(DBG_AI, DBG_TRACE, hero.GetName() << ", is patrol mode");
// goto patrol center
if(hero.GetCenterPatrol() != hero.GetCenter() &&
hero.GetPath().Calculate(Maps::GetIndexFromAbsPoint(hero.GetCenterPatrol())))
return true;
// scan enemy hero
if(hero.GetSquarePatrol())
{
const Maps::Indexes & results = Maps::ScanAroundObject(Maps::GetIndexFromAbsPoint(hero.GetCenterPatrol()),
hero.GetSquarePatrol(), MP2::OBJ_HEROES);
for(MapsIndexes::const_iterator
it = results.begin(); it != results.end(); ++it)
{
const Heroes* enemy = world.GetTiles(*it).GetHeroes();
if(enemy && ! enemy->isFriends(hero.GetColor()))
{
if(hero.GetPath().Calculate(enemy->GetIndex()))
{
DEBUG(DBG_AI, DBG_TRACE, hero.GetName() << ", find enemy");
return true;
}
}
}
}
// can pickup objects
if(conf.ExtHeroPatrolAllowPickup())
{
const Maps::Indexes & results = Maps::ScanAroundObjects(hero.GetIndex(),
hero.GetSquarePatrol(), objs1);
for(MapsIndexes::const_iterator
it = results.begin(); it != results.end(); ++it)
if(AI::HeroesValidObject(hero, *it) &&
hero.GetPath().Calculate(*it))
{
ai_objects.erase(*it);
DEBUG(DBG_AI, DBG_TRACE, hero.GetName() << ": find object: " <<
MP2::StringObject(world.GetTiles(*it).GetObject()) << "(" << *it << ")");
return true;
}
}
// random move
/*
// disable move: https://sourceforge.net/tracker/?func=detail&aid=3157397&group_id=96859&atid=616180
{
Maps::ScanAroundObject(hero.GetIndex(), hero.GetSquarePatrol(), MP2::OBJ_ZERO);
if(results.size())
{
std::random_shuffle(results.begin(), results.end());
std::vector<s32>::const_iterator it = results.begin();
for(; it != results.end(); ++it)
if(world.GetTiles(*it).isPassable(&hero, Direction::CENTER, true) &&
hero.GetPath().Calculate(*it))
{
DEBUG(DBG_AI, Color::String(hero.GetColor()) <<
//.........这里部分代码省略.........
示例9: AIHeroesAddedTask
void AIHeroesAddedTask(Heroes & hero)
{
AIHero & ai_hero = AIHeroes::Get(hero);
AIKingdom & ai_kingdom = AIKingdoms::Get(hero.GetColor());
Queue & task = ai_hero.sheduled_visit;
IndexObjectMap & ai_objects = ai_kingdom.scans;
// load minimal distance tasks
std::vector<IndexDistance> objs;
objs.reserve(ai_objects.size());
for(std::map<s32, int>::const_iterator
it = ai_objects.begin(); it != ai_objects.end(); ++it)
{
const Maps::Tiles & tile = world.GetTiles((*it).first);
if(hero.isShipMaster())
{
if(MP2::OBJ_COAST != tile.GetObject() &&
! tile.isWater()) continue;
// check previous positions
if(MP2::OBJ_COAST == (*it).second &&
hero.isVisited(world.GetTiles((*it).first))) continue;
}
else
{
if(tile.isWater() && MP2::OBJ_BOAT != tile.GetObject()) continue;
}
objs.push_back(IndexDistance((*it).first,
Maps::GetApproximateDistance(hero.GetIndex(), (*it).first)));
}
DEBUG(DBG_AI, DBG_INFO, Color::String(hero.GetColor()) <<
", hero: " << hero.GetName() << ", task prepare: " << objs.size());
std::sort(objs.begin(), objs.end(), IndexDistance::Shortest);
for(std::vector<IndexDistance>::const_iterator
it = objs.begin(); it != objs.end(); ++it)
{
if(task.size() >= HERO_MAX_SHEDULED_TASK) break;
const bool validobj = AI::HeroesValidObject(hero, (*it).first);
if(validobj &&
hero.GetPath().Calculate((*it).first))
{
DEBUG(DBG_AI, DBG_INFO, Color::String(hero.GetColor()) <<
", hero: " << hero.GetName() << ", added tasks: " <<
MP2::StringObject(ai_objects[(*it).first]) << ", index: " << (*it).first <<
", distance: " << (*it).second);
task.push_back((*it).first);
ai_objects.erase((*it).first);
}
else
{
DEBUG(DBG_AI, DBG_TRACE, Color::String(hero.GetColor()) <<
", hero: " << hero.GetName() << (!validobj ? ", invalid: " : ", impossible: ") <<
MP2::StringObject(ai_objects[(*it).first]) << ", index: " << (*it).first <<
", distance: " << (*it).second);
}
}
if(task.empty())
AIHeroesAddedRescueTask(hero);
}
示例10: HeroesGetTask
bool AI::HeroesGetTask(Heroes & hero)
{
// stop hero
hero.GetPath().Reset();
return false;
}