Sprite SpriteFlag(const Heroes & hero, int index, bool reflect, bool rotate) { int icn_flag = ICN::UNKNOWN; int index_sprite = 0; switch(hero.GetColor()) { case Color::BLUE: icn_flag = hero.isShipMaster() ? ICN::B_BFLG32 : ICN::B_FLAG32; break; case Color::GREEN: icn_flag = hero.isShipMaster() ? ICN::G_BFLG32 : ICN::G_FLAG32; break; case Color::RED: icn_flag = hero.isShipMaster() ? ICN::R_BFLG32 : ICN::R_FLAG32; break; case Color::YELLOW: icn_flag = hero.isShipMaster() ? ICN::Y_BFLG32 : ICN::Y_FLAG32; break; case Color::ORANGE: icn_flag = hero.isShipMaster() ? ICN::O_BFLG32 : ICN::O_FLAG32; break; case Color::PURPLE: icn_flag = hero.isShipMaster() ? ICN::P_BFLG32 : ICN::P_FLAG32; break; default: DEBUG(DBG_GAME, DBG_WARN, "unknown color"); break; } if(rotate) index_sprite = 45; else switch(hero.GetDirection()) { case Direction::TOP: index_sprite = 0; break; case Direction::TOP_RIGHT: index_sprite = 9; break; case Direction::RIGHT: index_sprite = 18; break; case Direction::BOTTOM_RIGHT: index_sprite = 27; break; case Direction::BOTTOM: index_sprite = 36; break; case Direction::BOTTOM_LEFT: index_sprite = 27; break; case Direction::LEFT: index_sprite = 18; break; case Direction::TOP_LEFT: index_sprite = 9; break; default: DEBUG(DBG_GAME, DBG_WARN, "unknown direction"); break; } return AGG::GetICN(icn_flag, index_sprite + (index % 9), reflect); }
void AI::HeroesTurn(Heroes & hero) { Interface::StatusWindow *status = Interface::NoGUI() ? NULL : &Interface::StatusWindow::Get(); hero.ResetModes(HEROES_MOVED); while(AI::HeroesCanMove(hero)) { // turn indicator if(status) status->RedrawTurnProgress(3); if(status) status->RedrawTurnProgress(4); // get task for heroes AI::HeroesGetTask(hero); // turn indicator if(status) status->RedrawTurnProgress(5); if(status) status->RedrawTurnProgress(6); // heroes AI turn AI::HeroesMove(hero); hero.SetModes(HEROES_MOVED); // turn indicator if(status) status->RedrawTurnProgress(7); if(status) status->RedrawTurnProgress(8); } DEBUG(DBG_AI, DBG_TRACE, hero.GetName() << ", end"); }
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()); } }
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; }
void Interface::Basic::EventContinueMovement(void) { Heroes* hero = GetFocusHeroes(); if(hero && hero->GetPath().isValid()) hero->SetMove(! hero->isEnableMove()); }
void AI::HeroesTurn(Heroes & hero) { DEBUG(DBG_AI, DBG_TRACE, hero.GetName() << ", start: " << (hero.Modes(Heroes::SHIPMASTER) ? "SHIPMASTER," : "") << (hero.Modes(AI::HEROES_SCOUTER) ? "SCOUTER," : "") << (hero.Modes(AI::HEROES_HUNTER) ? "HUNTER," : "") << (hero.Modes(Heroes::PATROL) ? "PATROL," : "") << (hero.Modes(AI::HEROES_WAITING) ? "WAITING," : "") << (hero.Modes(AI::HEROES_STUPID) ? "STUPID" : "")); Interface::StatusWindow & status = Interface::Basic::Get().GetStatusWindow(); while(hero.MayStillMove() && !hero.Modes(AI::HEROES_WAITING|AI::HEROES_STUPID)) { // turn indicator status.RedrawTurnProgress(3); // get task for heroes AI::HeroesGetTask(hero); // turn indicator status.RedrawTurnProgress(5); // heroes AI turn AI::HeroesMove(hero); // turn indicator status.RedrawTurnProgress(7); } DEBUG(DBG_AI, DBG_TRACE, hero.GetName() << ", end"); }
bool ActionSpellSetGuardian(Heroes & hero, const Spell & spell, u8 id) { Maps::Tiles & tile = world.GetTiles(hero.GetIndex()); if(MP2::OBJ_MINES != tile.GetObject(false)) { Dialog::Message("", _("You must be standing on the entrance to a mine (sawmills and alchemists don't count) to cast this spell."), Font::BIG, Dialog::OK); return false; } const u16 count = hero.GetPower() * spell.ExtraValue(); if(count) { Maps::TilesAddon* addon = tile.FindObject(MP2::OBJ_MINES); if(addon) addon->tmp = spell(); if(spell == Spell::HAUNT) { world.CaptureObject(tile.GetIndex(), Color::UNUSED); tile.SetObject(MP2::OBJ_ABANDONEDMINE); } Army::Troop troop = world.GetCapturedObject(tile.GetIndex()).GetTroop(); troop.Set(Monster(spell), count); } return false; }
void Init(Heroes* ptr) { hero = ptr; Clear(); armyBar = new ArmyBar(&hero->GetArmy(), true, false); armyBar->SetBackground(41, 53, 0x82); armyBar->SetColRows(5, 1); armyBar->SetHSpace(-1); artifactsBar = new ArtifactsBar(hero, true, false); artifactsBar->SetColRows(7, 2); artifactsBar->SetHSpace(1); artifactsBar->SetVSpace(8); artifactsBar->SetContent(hero->GetBagArtifacts()); secskillsBar = new SecondarySkillsBar(); secskillsBar->SetColRows(4, 2); secskillsBar->SetHSpace(-1); secskillsBar->SetVSpace(8); secskillsBar->SetContent(hero->GetSecondarySkills()); primskillsBar = new PrimarySkillsBar(ptr, true); primskillsBar->SetColRows(4, 1); primskillsBar->SetHSpace(2); primskillsBar->SetTextOff(20, -13); }
bool ActionSpellSummonBoat(Heroes & hero) { u8 chance = 0; switch(hero.GetLevelSkill(Skill::Secondary::WISDOM)) { case Skill::Level::BASIC: chance = 50; break; case Skill::Level::ADVANCED: chance = 75; break; case Skill::Level::EXPERT: chance = 100; break; default: chance = 30; break; } const s32 center = hero.GetIndex(); // find water s32 dst_water = -1; const MapsIndexes & v = Maps::ScanAroundObject(center, MP2::OBJ_ZERO); for(MapsIndexes::const_iterator it = v.begin(); it != v.end(); ++it) { if(world.GetTiles(*it).isWater()) { dst_water = *it; break; } } const MapsIndexes & boats = Maps::GetObjectPositions(center, MP2::OBJ_BOAT, false); if(boats.empty()) { DEBUG(DBG_GAME, DBG_WARN, "free boat: " << "not found"); } else { const s32 & src = boats.front(); if(Rand::Get(1, 100) <= chance && Maps::isValidAbsIndex(src) && Maps::isValidAbsIndex(dst_water)) { world.GetTiles(src).SetObject(MP2::OBJ_ZERO); world.GetTiles(dst_water).SetObject(MP2::OBJ_BOAT); } else DialogSpellFailed(Spell::SUMMONBOAT); } return true; }
void Kingdom::ApplyPlayWithStartingHero(void) { if(isPlay() && castles.size()) { // get first castle Castle* first = castles.GetFirstCastle(); if(NULL == first) first = castles.front(); // check manual set hero (castle position + point(0, 1))? const Point & cp = (first)->GetCenter(); Heroes* hero = world.GetTiles(cp.x, cp.y + 1).GetHeroes(); // and move manual set hero to castle if(hero && hero->GetColor() == GetColor()) { bool patrol = hero->Modes(Heroes::PATROL); hero->SetFreeman(0); hero->Recruit(*first); if(patrol) { hero->SetModes(Heroes::PATROL); hero->SetCenterPatrol(cp); } } else if(Settings::Get().GameStartWithHeroes()) { Heroes* hero = world.GetFreemanHeroes(first->GetRace()); if(hero && AllowRecruitHero(false, 0)) hero->Recruit(*first); } } }
int Interface::Basic::EventExit(void) { Heroes* hero = GetFocusHeroes(); // stop hero if(hero && hero->isEnableMove()) hero->SetMove(false); else if(Dialog::YES & Dialog::Message("", _("Are you sure you want to quit?"), Font::BIG, Dialog::YES|Dialog::NO)) return Game::QUITGAME; return Game::CANCEL; }
// get priority object for AI independent of distance (1 day) bool AIHeroesPriorityObject(const Heroes & hero, s32 index) { Maps::Tiles & tile = world.GetTiles(index); if(MP2::OBJ_CASTLE == tile.GetObject()) { const Castle* castle = world.GetCastle(Maps::GetPoint(index)); if(castle) { if(hero.GetColor() == castle->GetColor()) { // maybe need join army return hero.Modes(AI::HEROES_HUNTER) && castle->GetArmy().isValid() && ! hero.isVisited(world.GetTiles(castle->GetIndex())); } else if(! hero.isFriends(castle->GetColor())) return AI::HeroesValidObject(hero, index); } } else if(MP2::OBJ_HEROES == tile.GetObject()) { // kill enemy hero const Heroes* hero2 = tile.GetHeroes(); return hero2 && ! hero.isFriends(hero2->GetColor()) && AI::HeroesValidObject(hero, index); } switch(tile.GetObject()) { case MP2::OBJ_MONSTER: case MP2::OBJ_SAWMILL: case MP2::OBJ_MINES: case MP2::OBJ_ALCHEMYLAB: case MP2::OBJ_ARTIFACT: case MP2::OBJ_RESOURCE: case MP2::OBJ_CAMPFIRE: case MP2::OBJ_TREASURECHEST: return AI::HeroesValidObject(hero, index); default: break; } return false; }
void Interface::Basic::EventCastSpell(void) { Heroes* hero = GetFocusHeroes(); if(hero) { const Spell spell = hero->OpenSpellBook(SpellBook::ADVN, true); // apply cast spell if(spell.isValid()) { hero->ActionSpellCast(spell); iconsPanel.SetRedraw(); } } }
bool ActionSpellIdentifyHero(Heroes & hero) { world.GetKingdom(hero.GetColor()).SetModes(Kingdom::IDENTIFYHERO); Message("", _("Enemy heroes are now fully identifiable."), Font::BIG, Dialog::OK); return true; }
void Interface::Basic::EventSwitchHeroSleeping(void) { Heroes* hero = GetFocusHeroes(); if(hero) { if(hero->Modes(Heroes::SLEEPER)) hero->ResetModes(Heroes::SLEEPER); else { hero->SetModes(Heroes::SLEEPER); hero->GetPath().Reset(); } SetRedraw(REDRAW_HEROES); } }
bool isNeedStayFrontObject(const Heroes & hero, const Maps::Tiles & next) { if(next.GetObject() == MP2::OBJ_CASTLE) { const Castle* castle = world.GetCastle(next.GetCenter()); return (castle && ! hero.isFriends(castle->GetColor())); } else // to coast action if(hero.isShipMaster() && next.GetObject() == MP2::OBJ_COAST) return true; return MP2::isNeedStayFront(next.GetObject()); }
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; }
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); }
bool PassableToTile(const Heroes & hero, const Maps::Tiles & toTile, int direct, s32 dst) { // check end point if(toTile.GetIndex() == dst) { // fix toTilePassable with action object if(MP2::isPickupObject(toTile.GetObject())) return true; // check direct to object if(MP2::isActionObject(toTile.GetObject(false), hero.isShipMaster())) return Direction::Reflect(direct) & toTile.GetPassable(); if(MP2::OBJ_HEROES == toTile.GetObject()) return toTile.isPassable(NULL, Direction::Reflect(direct), (hero.isControlAI() ? AI::HeroesSkipFog() : false)); } // check to tile direct if(! toTile.isPassable(&hero, Direction::Reflect(direct), (hero.isControlAI() ? AI::HeroesSkipFog() : false))) return false; if(toTile.GetIndex() != dst) { if(MP2::isPickupObject(toTile.GetObject()) || MP2::isActionObject(toTile.GetObject(false), hero.isShipMaster())) return false; // check hero/monster on route switch(toTile.GetObject()) { case MP2::OBJ_HEROES: case MP2::OBJ_MONSTER: return false; default: break; } // check monster protection if(CheckMonsterProtectionAndNotDst(toTile.GetIndex(), dst)) return false; } return true; }
Sprite SpriteShad(const Heroes & hero, int index) { int icn_shad = hero.isShipMaster() ? ICN::BOATSHAD : ICN::SHADOW32; int index_sprite = 0; switch(hero.GetDirection()) { case Direction::TOP: index_sprite = 0; break; case Direction::TOP_RIGHT: index_sprite = 9; break; case Direction::RIGHT: index_sprite = 18; break; case Direction::BOTTOM_RIGHT: index_sprite = 27; break; case Direction::BOTTOM: index_sprite = 36; break; case Direction::BOTTOM_LEFT: index_sprite = 45; break; case Direction::LEFT: index_sprite = 54; break; case Direction::TOP_LEFT: index_sprite = 63; break; default: DEBUG(DBG_GAME, DBG_WARN, "unknown direction"); break; } return AGG::GetICN(icn_shad, index_sprite + (index % 9)); }
std::string AI::HeroesString(const Heroes & hero) { std::ostringstream os; AIHero & ai_hero = AIHeroes::Get(hero); Queue & task = ai_hero.sheduled_visit; os << "flags : " << (hero.Modes(AI::HEROES_SCOUTER) ? "SCOUTER," : "") << (hero.Modes(AI::HEROES_HUNTER) ? "HUNTER," : "") << (hero.Modes(AI::HEROES_WAITING) ? "WAITING," : "") << (hero.Modes(AI::HEROES_STUPID) ? "STUPID" : "") << std::endl; os << "ai primary target: " << ai_hero.primary_target << std::endl << "ai sheduled visit: "; for(Queue::const_iterator it = task.begin(); it != task.end(); ++it) os << *it << "(" << MP2::StringObject(world.GetTiles(*it).GetObject()) << "), "; os << std::endl; return os.str(); }
void AIHeroesAddedRescueTask(Heroes & hero) { AIHero & ai_hero = AIHeroes::Get(hero); Queue & task = ai_hero.sheduled_visit; DEBUG(DBG_AI, DBG_TRACE, hero.GetName()); u32 scoute = hero.GetScoute(); switch(Settings::Get().GameDifficulty()) { case Difficulty::NORMAL: scoute += 2; break; case Difficulty::HARD: scoute += 3; break; case Difficulty::EXPERT: scoute += 4; break; case Difficulty::IMPOSSIBLE:scoute += 6; break; default: break; } // find unchartered territory s32 index = FindUncharteredTerritory(hero, scoute); const Maps::Tiles & tile = world.GetTiles(hero.GetIndex()); if(index < 0) { // check teleports if(MP2::OBJ_STONELIGHTS == tile.GetObject(false) || MP2::OBJ_WHIRLPOOL == tile.GetObject(false)) { AI::HeroesAction(hero, hero.GetIndex()); } else { // random index = GetRandomHeroesPosition(hero, scoute); } } if(0 <= index) task.push_back(index); }
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); }
bool ActionSpellTownGate(Heroes & hero) { const Kingdom & kingdom = world.GetKingdom(hero.GetColor()); const KingdomCastles & castles = kingdom.GetCastles(); KingdomCastles::const_iterator it; const Castle* castle = NULL; const s32 center = hero.GetIndex(); s32 min = -1; // find the nearest castle for(it = castles.begin(); it != castles.end(); ++it) if(*it && !(*it)->GetHeroes().Guest()) { const u16 min2 = Maps::GetApproximateDistance(center, (*it)->GetIndex()); if(0 > min || min2 < min) { min = min2; castle = *it; } } Interface::Basic & I = Interface::Basic::Get(); Cursor & cursor = Cursor::Get(); // center hero cursor.Hide(); I.gameArea.SetCenter(hero.GetCenter()); GameFocus::SetRedraw(); I.Redraw(); if(!castle) { Dialog::Message("", _("No avaialble town. Spell Failed!!!"), Font::BIG, Dialog::OK); return false; } return HeroesTownGate(hero, castle); }
void Interface::Basic::MoveHeroFromArrowKeys(Heroes & hero, int direct) { if(Maps::isValidDirection(hero.GetIndex(), direct)) { s32 dst = Maps::GetDirectionIndex(hero.GetIndex(), direct); const Maps::Tiles & tile = world.GetTiles(dst); bool allow = false; switch(tile.GetObject()) { case MP2::OBJN_CASTLE: { const Castle* to_castle = world.GetCastle(hero.GetCenter()); if(to_castle) { dst = to_castle->GetIndex(); allow = true; } break; } case MP2::OBJ_BOAT: case MP2::OBJ_CASTLE: case MP2::OBJ_HEROES: case MP2::OBJ_MONSTER: allow = true; break; default: allow = (tile.isPassable(&hero, Direction::CENTER, false) || MP2::isActionObject(tile.GetObject(), hero.isShipMaster())); break; } if(allow) ShowPathOrStartMoveHero(&hero, dst); } }
Sprite SpriteHero(const Heroes & hero, int index, bool reflect, bool rotate) { int icn_hero = ICN::UNKNOWN; int index_sprite = 0; if(hero.isShipMaster()) icn_hero = ICN::BOAT32; else switch(hero.GetRace()) { case Race::KNGT: icn_hero = ICN::KNGT32; break; case Race::BARB: icn_hero = ICN::BARB32; break; case Race::SORC: icn_hero = ICN::SORC32; break; case Race::WRLK: icn_hero = ICN::WRLK32; break; case Race::WZRD: icn_hero = ICN::WZRD32; break; case Race::NECR: icn_hero = ICN::NECR32; break; default: DEBUG(DBG_GAME, DBG_WARN, "unknown race"); break; } if(rotate) index_sprite = 45; else switch(hero.GetDirection()) { case Direction::TOP: index_sprite = 0; break; case Direction::TOP_RIGHT: index_sprite = 9; break; case Direction::RIGHT: index_sprite = 18; break; case Direction::BOTTOM_RIGHT: index_sprite = 27; break; case Direction::BOTTOM: index_sprite = 36; break; case Direction::BOTTOM_LEFT: index_sprite = 27; break; case Direction::LEFT: index_sprite = 18; break; case Direction::TOP_LEFT: index_sprite = 9; break; default: DEBUG(DBG_GAME, DBG_WARN, "unknown direction"); break; } return AGG::GetICN(icn_hero, index_sprite + (index % 9), reflect); }
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; }
Sprite SpriteFroth(const Heroes & hero, int index, bool reflect) { int index_sprite = 0; switch(hero.GetDirection()) { case Direction::TOP: index_sprite = 0; break; case Direction::TOP_RIGHT: index_sprite = 9; break; case Direction::RIGHT: index_sprite = 18; break; case Direction::BOTTOM_RIGHT: index_sprite = 27; break; case Direction::BOTTOM: index_sprite = 36; break; case Direction::BOTTOM_LEFT: index_sprite = 27; break; case Direction::LEFT: index_sprite = 18; break; case Direction::TOP_LEFT: index_sprite = 9; break; default: DEBUG(DBG_GAME, DBG_WARN, "unknown direction"); break; } return AGG::GetICN(ICN::FROTH, index_sprite + (index % 9), reflect); }
void Kingdom::SetLastLostHero(Heroes & hero) { lost_hero.first = hero.GetID(); lost_hero.second = world.CountDay(); }
Dialog::answer_t PocketPC::HeroesOpenDialog(Heroes & hero, bool readonly) { Cursor & cursor = Cursor::Get(); Display & display = Display::Get(); LocalEvent & le = LocalEvent::Get(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); const u16 window_w = 320; const u16 window_h = 224; Dialog::FrameBorder frameborder; frameborder.SetPosition((display.w() - window_w) / 2 - BORDERWIDTH, (display.h() - window_h) / 2 - BORDERWIDTH, window_w, window_h); frameborder.Redraw(); const Rect & dst_rt = frameborder.GetArea(); const Sprite & background = AGG::GetICN(ICN::STONEBAK, 0); const Sprite & backSprite = AGG::GetICN(ICN::SWAPWIN, 0); background.Blit(Rect(0, 0, window_w, window_h), dst_rt); // portrait AGG::GetICN(ICN::BRCREST, 6).Blit(dst_rt.x + 8, dst_rt.y, display); hero.GetPortrait50x46().Blit(dst_rt.x + 12, dst_rt.y + 4, display); // name std::string message = _("%{name} the %{race} ( Level %{level} )"); String::Replace(message, "%{name}", hero.GetName()); String::Replace(message, "%{race}", Race::String(hero.GetRace())); String::Replace(message, "%{level}", hero.GetLevel()); Text text(message, Font::SMALL); text.Blit(dst_rt.x + 73, dst_rt.y + 1); // experience ExperienceIndicator experienceInfo(hero); experienceInfo.SetPos(Point(dst_rt.x + 205, dst_rt.y + 14)); experienceInfo.Redraw(); // spell points SpellPointsIndicator spellPointsInfo(hero); spellPointsInfo.SetPos(Point(dst_rt.x + 238, dst_rt.y + 16)); spellPointsInfo.Redraw(); // morale MoraleIndicator moraleIndicator(hero); moraleIndicator.SetPos(Point(dst_rt.x + 280, dst_rt.y + 20)); moraleIndicator.Redraw(); // luck LuckIndicator luckIndicator(hero); luckIndicator.SetPos(Point(dst_rt.x + 280, dst_rt.y + 60)); luckIndicator.Redraw(); // prim skill const Rect ras(dst_rt.x + 74, dst_rt.y + 14, 34, 34); backSprite.Blit(Rect(216, 51, ras.w, ras.h), ras); text.Set(GetString(hero.GetAttack())); text.Blit(dst_rt.x + 74 + (34 - text.w()) / 2, dst_rt.y + 47); const Rect rds(dst_rt.x + 107, dst_rt.y + 14, 34, 34); backSprite.Blit(Rect(216, 84, rds.w, rds.h), rds); text.Set(GetString(hero.GetDefense())); text.Blit(dst_rt.x + 107 + (34 - text.w()) / 2, dst_rt.y + 47); const Rect rps(dst_rt.x + 140, dst_rt.y + 14, 34, 34); backSprite.Blit(Rect(216, 117, rps.w, rps.h), rps); text.Set(GetString(hero.GetPower())); text.Blit(dst_rt.x + 140 + (34 - text.w()) / 2, dst_rt.y + 47); const Rect rks(dst_rt.x + 173, dst_rt.y + 14, 34, 34); backSprite.Blit(Rect(216, 150, rks.w, rks.h), rks); text.Set(GetString(hero.GetKnowledge())); text.Blit(dst_rt.x + 173 + (34 - text.w()) / 2, dst_rt.y + 47); // sec skill backSprite.Blit(Rect(21, 198, 267, 36), dst_rt.x + 7, dst_rt.y + 57); // secondary skill SecondarySkillBar secskill_bar; secskill_bar.SetPos(dst_rt.x + 9, dst_rt.y + 59); secskill_bar.SetUseMiniSprite(); secskill_bar.SetInterval(1); secskill_bar.SetSkills(hero.GetSecondarySkills()); secskill_bar.Redraw(); // army bar const Rect rt1(36, 267, 43, 53); Surface sfb1(rt1.w, rt1.h); backSprite.Blit(rt1, 0, 0, sfb1); Surface sfc1(rt1.w, rt1.h - 10); Cursor::DrawCursor(sfc1, 0xd6, true); SelectArmyBar selectArmy; selectArmy.SetArmy(hero.GetArmy()); selectArmy.SetPos(dst_rt.x + 50, dst_rt.y + 170); selectArmy.SetInterval(2); selectArmy.SetBackgroundSprite(sfb1); selectArmy.SetCursorSprite(sfc1); selectArmy.SetUseMons32Sprite(); selectArmy.SetSaveLastTroop(); if(readonly) selectArmy.SetReadOnly(); const Castle* castle = hero.inCastle(); if(castle) selectArmy.SetCastle(*castle); selectArmy.Redraw(); // art bar const Rect rt2(23, 347, 34, 34); Surface sfb2(rt2.w, rt2.h); backSprite.Blit(rt2, 0, 0, sfb2); Surface sfc2(rt2.w, rt2.h); Cursor::DrawCursor(sfc2, 0xd6, true); SelectArtifactsBar selectArtifacts(hero); selectArtifacts.SetPos(dst_rt.x + 37, dst_rt.y + 95); selectArtifacts.SetInterval(2); selectArtifacts.SetBackgroundSprite(sfb2); selectArtifacts.SetCursorSprite(sfc2); selectArtifacts.SetUseArts32Sprite(); if(readonly) selectArtifacts.SetReadOnly(); selectArtifacts.Redraw(); Button buttonDismiss(dst_rt.x + dst_rt.w / 2 - 160, dst_rt.y + dst_rt.h - 125, ICN::HSBTNS, 0, 1); Button buttonExit(dst_rt.x + dst_rt.w / 2 + 130, dst_rt.y + dst_rt.h - 125, ICN::HSBTNS, 2, 3); Button buttonPrev(dst_rt.x + 34, dst_rt.y + 200, ICN::TRADPOST, 3, 4); Button buttonNext(dst_rt.x + 275, dst_rt.y + 200, ICN::TRADPOST, 5, 6); if(castle || readonly) { buttonDismiss.Press(); buttonDismiss.SetDisable(true); } if(readonly || 2 > world.GetKingdom(hero.GetColor()).GetHeroes().size()) { buttonNext.Press(); buttonPrev.Press(); buttonNext.SetDisable(true); buttonPrev.SetDisable(true); } buttonDismiss.Draw(); buttonExit.Draw(); buttonNext.Draw(); buttonPrev.Draw(); cursor.Show(); display.Flip(); while(le.HandleEvents()) { le.MousePressLeft(buttonNext) ? buttonNext.PressDraw() : buttonNext.ReleaseDraw(); le.MousePressLeft(buttonPrev) ? buttonPrev.PressDraw() : buttonPrev.ReleaseDraw(); le.MousePressLeft(buttonExit) ? buttonExit.PressDraw() : buttonExit.ReleaseDraw(); if(buttonDismiss.isEnable()) le.MousePressLeft(buttonDismiss) ? buttonDismiss.PressDraw() : buttonDismiss.ReleaseDraw(); if(buttonNext.isEnable() && le.MouseClickLeft(buttonNext)) return Dialog::NEXT; else if(buttonPrev.isEnable() && le.MouseClickLeft(buttonPrev)) return Dialog::PREV; else // exit if(le.MouseClickLeft(buttonExit) || Game::HotKeyPress(Game::EVENT_DEFAULT_EXIT)) return Dialog::CANCEL; else // dismiss if(buttonDismiss.isEnable() && le.MouseClickLeft(buttonDismiss) && Dialog::YES == Dialog::Message(hero.GetName(), _("Are you sure you want to dismiss this Hero?"), Font::BIG, Dialog::YES | Dialog::NO)) { return Dialog::DISMISS; } // primary click info if(le.MouseClickLeft(ras)) Dialog::Message(_("Attack Skill"), _("Your attack skill is a bonus added to each creature's attack skill."), Font::BIG, Dialog::OK); else if(le.MouseClickLeft(rds)) Dialog::Message(_("Defense Skill"), _("Your defense skill is a bonus added to each creature's defense skill."), Font::BIG, Dialog::OK); else if(le.MouseClickLeft(rps)) Dialog::Message(_("Spell Power"), _("Your spell power determines the length or power of a spell."), Font::BIG, Dialog::OK); else if(le.MouseClickLeft(rks)) Dialog::Message(_("Knowledge"), _("Your knowledge determines how many spell points your hero may have. Under normal cirumstances, a hero is limited to 10 spell points per level of knowledge."), Font::BIG, Dialog::OK); if(le.MouseCursor(secskill_bar.GetArea())) secskill_bar.QueueEventProcessing(); // selector troops event if(le.MouseCursor(selectArmy.GetArea())) { if(selectArtifacts.isSelected()) selectArtifacts.Reset(); if(SelectArmyBar::QueueEventProcessing(selectArmy)) { cursor.Hide(); moraleIndicator.Redraw(); luckIndicator.Redraw(); cursor.Show(); display.Flip(); } } // selector artifacts event if(le.MouseCursor(selectArtifacts.GetArea())) { if(selectArmy.isSelected()) selectArmy.Reset(); SelectArtifactsBar::QueueEventProcessing(selectArtifacts); } if(le.MouseCursor(moraleIndicator.GetArea())) MoraleIndicator::QueueEventProcessing(moraleIndicator); else if(le.MouseCursor(luckIndicator.GetArea())) LuckIndicator::QueueEventProcessing(luckIndicator); else if(le.MouseCursor(experienceInfo.GetArea())) experienceInfo.QueueEventProcessing(); else if(le.MouseCursor(spellPointsInfo.GetArea())) spellPointsInfo.QueueEventProcessing(); } return Dialog::ZERO; }