void RedrawCurrentInfo(const Point & pos, u16 available, u32 result, const payment_t & paymentMonster, const payment_t & paymentCosts) { Text text; std::string str = _("Available: %{count}"); String::Replace(str, "%{count}", available); text.Set(str, Font::SMALL); text.Blit(pos.x + 70 - text.w() / 2, pos.y + 130); text.Set(GetString(result), Font::BIG); text.Blit(pos.x + 167 - text.w() / 2, pos.y + 160); if(2 == paymentMonster.GetValidItems()) { text.Set(GetString(paymentCosts.gold), Font::SMALL); text.Blit(pos.x + 133 - text.w() / 2, pos.y + 228); text.Set(GetString(paymentMonster.GetFirstValidItems(Resource::ALL & ~Resource::GOLD)), Font::SMALL); text.Blit(pos.x + 195 - text.w() / 2, pos.y + 228); } else { text.Set(GetString(paymentCosts.gold), Font::SMALL); text.Blit(pos.x + 160 - text.w() / 2, pos.y + 228); } }
Game::menu_t PocketPC::NewMulti(void) { Game::SetFixVideoMode(); Cursor & cursor = Cursor::Get(); Display & display = Display::Get(); Settings & conf = Settings::Get(); LocalEvent & le = LocalEvent::Get(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); const Sprite &sprite = AGG::GetICN(ICN::HEROES, 0); Rect src_rt((sprite.w() - display.w()) / 2, 0, display.w(), display.h()); display.Blit(sprite, src_rt, 0, 0); const Sprite &board = AGG::GetICN(ICN::QWIKTOWN, 0); src_rt = Rect(13, 0, board.w() - 13, board.h() - 13); Point dst_pt((display.w() - src_rt.w) / 2, (display.h() - src_rt.h) / 2); display.Blit(board, src_rt, dst_pt.x , dst_pt.y); Text text; text.Set("Free Heroes II", Font::YELLOW_BIG); text.Blit(dst_pt.x + (src_rt.w - text.w()) / 2, dst_pt.y + 12); text.Set(conf.BuildVersion(), Font::YELLOW_SMALL); text.Blit(dst_pt.x + (src_rt.w - text.w()) / 2, dst_pt.y + 148); text.Set(_("Hot Seat"), Font::BIG); const Rect rectHotSeat(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 40 + 5, text.w() + 10, text.h() + 10); text.Blit(rectHotSeat); text.Set(_("Network")); const Rect rectNetwork(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 65 + 5, text.w() + 10, text.h() + 10); text.Blit(rectNetwork); text.Set(_("Cancel")); const Rect rectCancel(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 115 + 5, text.w() + 10, text.h() + 10); text.Blit(rectCancel); cursor.Show(); display.Flip(); // mainmenu loop while(le.HandleEvents()) { if(le.KeyPress(KEY_h) || le.MouseClickLeft(rectHotSeat)) return Game::NEWHOTSEAT; else if(le.KeyPress(KEY_n) || le.MouseClickLeft(rectNetwork)) { Dialog::Message(_("Error"), _("This release is compiled without network support."), Font::BIG, Dialog::OK); return Game::MAINMENU; } else if(le.MouseClickLeft(rectCancel) || le.KeyPress(KEY_ESCAPE)) return Game::MAINMENU; } return Game::QUITGAME; }
void ScenarioListBox::RedrawBackground(const Point & dst) { if(Settings::Get().QVGA()) { AGG::GetICN(ICN::STONEBAK, 0).Blit(Rect(17, 37, 266, 156), dst.x + 15, dst.y + 35); AGG::GetICN(ICN::REQSBKG, 0).Blit(Rect(325, 70, 16, 100), dst.x + 283, dst.y + 55); AGG::GetICN(ICN::REQSBKG, 0).Blit(Rect(325, 167, 16, 50), dst.x + 283, dst.y + 125); } else { AGG::GetICN(ICN::REQSBKG, 0).Blit(dst); if(content && cur != content->end()) { Text text; const Maps::FileInfo & info = *cur; u8 index = 19 + Color::Count(info.kingdom_colors); const Sprite & spriteCount = AGG::GetICN(ICN::REQUESTS, index); spriteCount.Blit(dst.x + 65, dst.y + 265); switch(info.size_w) { case Maps::SMALL: index = 26; break; case Maps::MEDIUM: index = 27; break; case Maps::LARGE: index = 28; break; case Maps::XLARGE: index = 29; break; default: index = 30; break; } const Sprite & spriteSize = AGG::GetICN(ICN::REQUESTS, index); spriteSize.Blit(dst.x + 65 + spriteCount.w() + 2, dst.y + 265); text.Set(info.name, Font::BIG); text.Blit(dst.x + 190 - text.w() / 2, dst.y + 265); index = 30 + info.conditions_wins; const Sprite & spriteWins = AGG::GetICN(ICN::REQUESTS, index); spriteWins.Blit(dst.x + 275, dst.y + 265); index = 36 + info.conditions_loss; const Sprite & spriteLoss = AGG::GetICN(ICN::REQUESTS, index); spriteLoss.Blit(dst.x + 275 + spriteWins.w() + 2, dst.y + 265); text.Set(_("Maps Difficulty:"), Font::BIG); text.Blit(dst.x + 70, dst.y + 290); text.Set(Difficulty::String(info.difficulty)); text.Blit(dst.x + 275 - text.w() / 2, dst.y + 290); TextBox box(info.description, Font::BIG, 290); box.Blit(dst.x + 45, dst.y + 320); } } }
void SecondarySkillBar::Redraw(void) { Point dst_pt(pos); Text text; text.Set(Font::SMALL); for(u8 ii = 0; ii < HEROESMAXSKILL; ++ii) { const Skill::Secondary & skill = ii < skills->size() ? skills->at(ii) : Skill::Secondary(); if(skill.isValid()) { const Sprite & sprite_skill = AGG::GetICN((use_mini_sprite ? ICN::MINISS : ICN::SECSKILL), (use_mini_sprite ? skill.GetIndexSprite2() : skill.GetIndexSprite1())); sprite_skill.Blit(dst_pt); if(use_mini_sprite) { text.Set(GetString(skill.Level())); text.Blit(dst_pt.x + (sprite_skill.w() - text.w()) - 3, dst_pt.y + sprite_skill.h() - 12); } else { text.Set(Skill::Secondary::String(skill.Skill())); text.Blit(dst_pt.x + (sprite_skill.w() - text.w()) / 2, dst_pt.y + 3); text.Set(Skill::Level::String(skill.Level())); text.Blit(dst_pt.x + (sprite_skill.w() - text.w()) / 2, dst_pt.y + 50); } dst_pt.x += (use_mini_sprite ? 32 : sprite_skill.w()) + interval; } else { const Sprite & sprite_skill = AGG::GetICN((use_mini_sprite ? ICN::HSICONS : ICN::SECSKILL), 0); if(use_mini_sprite) sprite_skill.Blit(Rect((sprite_skill.w() - 32) / 2, 20, 32, 32), dst_pt); else sprite_skill.Blit(dst_pt); dst_pt.x += (use_mini_sprite ? 32 : sprite_skill.w()) + interval; } } }
Game::menu_t PocketPC::NewGame(void) { Game::SetFixVideoMode(); Cursor & cursor = Cursor::Get(); Display & display = Display::Get(); Settings & conf = Settings::Get(); LocalEvent & le = LocalEvent::Get(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); const Sprite &sprite = AGG::GetICN(ICN::HEROES, 0); Rect src_rt((sprite.w() - display.w()) / 2, 0, display.w(), display.h()); display.Blit(sprite, src_rt, 0, 0); const Sprite &board = AGG::GetICN(ICN::QWIKTOWN, 0); src_rt = Rect(13, 0, board.w() - 13, board.h() - 13); Point dst_pt((display.w() - src_rt.w) / 2, (display.h() - src_rt.h) / 2); display.Blit(board, src_rt, dst_pt.x , dst_pt.y); Text text; text.Set("Free Heroes II", Font::YELLOW_BIG); text.Blit(dst_pt.x + (src_rt.w - text.w()) / 2, dst_pt.y + 12); text.Set(conf.BuildVersion(), Font::YELLOW_SMALL); text.Blit(dst_pt.x + (src_rt.w - text.w()) / 2, dst_pt.y + 148); text.Set(_("Standard Game"), Font::BIG); const Rect rectStandardGame(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 40 + 5, text.w() + 10, text.h() + 10); text.Blit(rectStandardGame); text.Set(_("Campaign Game")); const Rect rectCampaignGame(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 65 + 5, text.w() + 10, text.h() + 10); text.Blit(rectCampaignGame); text.Set(_("Multi-Player Game")); const Rect rectMultiGame(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 90 + 5, text.w() + 10, text.h() + 10); text.Blit(rectMultiGame); text.Set(_("Cancel")); const Rect rectCancel(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 115 + 5, text.w() + 10, text.h() + 10); text.Blit(rectCancel); cursor.Show(); display.Flip(); // mainmenu loop while(le.HandleEvents()) { if(le.KeyPress(KEY_s) || le.MouseClickLeft(rectStandardGame)) return Game::NEWSTANDARD; else if(le.KeyPress(KEY_c) || le.MouseClickLeft(rectCampaignGame)) return Game::MAINMENU; else if(le.KeyPress(KEY_m) || le.MouseClickLeft(rectMultiGame)) return Game::NEWMULTI; else if(le.MouseClickLeft(rectCancel) || le.KeyPress(KEY_ESCAPE)) return Game::MAINMENU; } return Game::QUITGAME; }
void DrawBattleStats(const Point & dst, const Troop & b) { const u32 modes[] = { Battle::SP_BLOODLUST, Battle::SP_BLESS, Battle::SP_HASTE, Battle::SP_SHIELD, Battle::SP_STONESKIN, Battle::SP_DRAGONSLAYER, Battle::SP_STEELSKIN, Battle::SP_ANTIMAGIC, Battle::SP_CURSE, Battle::SP_SLOW, Battle::SP_BERSERKER, Battle::SP_HYPNOTIZE, Battle::SP_BLIND, Battle::SP_PARALYZE, Battle::SP_STONE }; // accumulate width u32 ow = 0; for(u32 ii = 0; ii < ARRAY_COUNT(modes); ++ii) if(b.isModes(modes[ii])) { const Sprite & sprite = GetModesSprite(modes[ii]); if(sprite.isValid()) ow += sprite.w() + 4; } ow -= 4; ow = dst.x - ow / 2; Text text; // blit centered for(u32 ii = 0; ii < ARRAY_COUNT(modes); ++ii) if(b.isModes(modes[ii])) { const Sprite & sprite = GetModesSprite(modes[ii]); if(sprite.isValid()) { sprite.Blit(ow, dst.y); const u32 duration = b.GetAffectedDuration(modes[ii]); if(duration) { text.Set(GetString(duration), Font::SMALL); text.Blit(ow + (sprite.w() - text.w()) / 2, dst.y + sprite.h() + 1); } ow += sprite.w() + 4; } } }
void RedrawScenarioStaticInfo(const Rect & rt) { Settings & conf = Settings::Get(); if(conf.QVGA()) { const Sprite & background = AGG::GetICN(ICN::STONEBAK, 0); background.Blit(Rect(0, 0, rt.w, rt.h), rt); Text text; text.Set(conf.CurrentFileInfo().name, Font::BIG); text.Blit(rt.x + (rt.w - text.w()) / 2, rt.y + 5); } else { // image panel const Sprite &panel = AGG::GetICN(ICN::NGHSBKG, 0); panel.Blit(rt); // text scenario Text text(_("Scenario:"), Font::BIG); text.Blit(rt.x + (rt.w - text.w()) / 2, rt.y + 20); // maps name text.Set(conf.MapsName()); text.Blit(rt.x + (rt.w - text.w()) / 2, rt.y + 46); // text game difficulty text.Set(_("Game Difficulty:")); text.Blit(rt.x + (rt.w - text.w()) / 2, rt.y + 75); // text opponents text.Set(_("Opponents:"), Font::BIG); text.Blit(rt.x + (rt.w - text.w()) / 2, rt.y + 181); // text class text.Set(_("Class:"), Font::BIG); text.Blit(rt.x + (rt.w - text.w()) / 2, rt.y + 262); } }
void ScenarioListBox::RedrawItem(const Maps::FileInfo & info, s16 dstx, s16 dsty, bool current) { Text text; u8 index = 19 + Color::Count(info.kingdom_colors); if(!Settings::Get().QVGA()) { dstx = dstx - 10; dsty = dsty + 2; } const Sprite & spriteCount = AGG::GetICN(ICN::REQUESTS, index); spriteCount.Blit(dstx, dsty); switch(info.size_w) { case Maps::SMALL: index = 26; break; case Maps::MEDIUM: index = 27; break; case Maps::LARGE: index = 28; break; case Maps::XLARGE: index = 29; break; default: index = 30; break; } const Sprite & spriteSize = AGG::GetICN(ICN::REQUESTS, index); spriteSize.Blit(dstx + spriteCount.w() + 2, dsty); text.Set(info.name, (current ? Font::YELLOW_BIG : Font::BIG)); text.Blit(dstx + 54, dsty + 2); index = 30 + info.conditions_wins; const Sprite & spriteWins = AGG::GetICN(ICN::REQUESTS, index); spriteWins.Blit(dstx + 224, dsty); index = 36 + info.conditions_loss; const Sprite & spriteLoss = AGG::GetICN(ICN::REQUESTS, index); spriteLoss.Blit(dstx + 224 + spriteWins.w() + 2, dsty); }
void Dialog::Marketplace(bool fromTradingPost) { Display & display = Display::Get(); const ICN::icn_t tradpost = Settings::Get().EvilInterface() ? ICN::TRADPOSE : ICN::TRADPOST; const std::string & header = _("Marketplace"); Cursor & cursor = Cursor::Get(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); Dialog::Box box(260, true); const Rect & pos_rt = box.GetArea(); Point dst_pt(pos_rt.x, pos_rt.y); Rect dst_rt(pos_rt); Text text; // header text.Set(header, Font::BIG); dst_pt.x = pos_rt.x + (pos_rt.w - text.w()) / 2; dst_pt.y = pos_rt.y; text.Blit(dst_pt); TradeWindowGUI gui(pos_rt); Kingdom & kingdom = world.GetMyKingdom(); const Sprite & spritecursor = AGG::GetICN(tradpost, 14); const std::string & header_from = _("Your Resources"); Resource::funds_t fundsFrom = kingdom.GetFundsResource(); u8 resourceFrom = 0; const Point pt1(pos_rt.x, pos_rt.y + 190); std::vector<Rect> rectsFrom(7); rectsFrom[0] = Rect(pt1.x, pt1.y, 34, 34); // wood rectsFrom[1] = Rect(pt1.x + 37, pt1.y, 34, 34); // mercury rectsFrom[2] = Rect(pt1.x + 74, pt1.y, 34, 34); // ore rectsFrom[3] = Rect(pt1.x, pt1.y + 37, 34, 34); // sulfur rectsFrom[4] = Rect(pt1.x + 37, pt1.y + 37, 34, 34);// crystal rectsFrom[5] = Rect(pt1.x + 74, pt1.y + 37, 34, 34);// gems rectsFrom[6] = Rect(pt1.x + 37, pt1.y + 74, 34, 34);// gold SpriteCursor cursorFrom(spritecursor); text.Set(header_from, Font::SMALL); dst_pt.x = pt1.x + (108 - text.w()) / 2; dst_pt.y = pt1.y - 15; text.Blit(dst_pt); RedrawFromResource(pt1, fundsFrom); const std::string & header_to = _("Available Trades"); Resource::funds_t fundsTo; u8 resourceTo = 0; const Point pt2(138 + pos_rt.x, pos_rt.y + 190); std::vector<Rect> rectsTo(7); rectsTo[0] = Rect(pt2.x, pt2.y, 34, 34); // wood rectsTo[1] = Rect(pt2.x + 37, pt2.y, 34, 34); // mercury rectsTo[2] = Rect(pt2.x + 74, pt2.y, 34, 34); // ore rectsTo[3] = Rect(pt2.x, pt2.y + 37, 34, 34); // sulfur rectsTo[4] = Rect(pt2.x + 37, pt2.y + 37, 34, 34); // crystal rectsTo[5] = Rect(pt2.x + 74, pt2.y + 37, 34, 34); // gems rectsTo[6] = Rect(pt2.x + 37, pt2.y + 74, 34, 34); // gold SpriteCursor cursorTo(spritecursor); text.Set(header_to, Font::SMALL); dst_pt.x = pt2.x + (108 - text.w()) / 2; dst_pt.y = pt2.y - 15; text.Blit(dst_pt); RedrawToResource(pt2, false, fromTradingPost); u32 count_sell = 0; u32 count_buy = 0; u32 max_sell = 0; u32 max_buy = 0; Button & buttonTrade = gui.buttonTrade; Button & buttonLeft = gui.buttonLeft; Button & buttonRight = gui.buttonRight; Splitter & splitter = gui.splitter; // button exit const Sprite & sprite_exit = AGG::GetICN(tradpost, 17); dst_pt.x = pos_rt.x + (pos_rt.w - sprite_exit.w()) / 2; dst_pt.y = pos_rt.y + pos_rt.h - sprite_exit.h(); Button buttonExit(dst_pt, tradpost, 17, 18); buttonExit.Draw(); cursor.Show(); display.Flip(); LocalEvent & le = LocalEvent::Get(); // message loop while(le.HandleEvents()) { if(buttonTrade.isEnable()) le.MousePressLeft(buttonTrade) ? buttonTrade.PressDraw() : buttonTrade.ReleaseDraw(); if(buttonLeft.isEnable()) le.MousePressLeft(buttonLeft) ? buttonLeft.PressDraw() : buttonLeft.ReleaseDraw(); if(buttonRight.isEnable()) le.MousePressLeft(buttonRight) ? buttonRight.PressDraw() : buttonRight.ReleaseDraw(); le.MousePressLeft(buttonExit) ? buttonExit.PressDraw() : buttonExit.ReleaseDraw(); if(le.MouseClickLeft(buttonExit) || le.KeyPress(KEY_RETURN) || le.KeyPress(KEY_ESCAPE)) break; // click from for(u8 ii = 0; ii < rectsFrom.size(); ++ii) { const Rect & rect_from = rectsFrom[ii]; if(le.MouseClickLeft(rect_from)) { switch(ii) { case 0: resourceFrom = Resource::WOOD; max_sell = fundsFrom.wood; break; case 1: resourceFrom = Resource::MERCURY; max_sell = fundsFrom.mercury; break; case 2: resourceFrom = Resource::ORE; max_sell = fundsFrom.ore; break; case 3: resourceFrom = Resource::SULFUR; max_sell = fundsFrom.sulfur; break; case 4: resourceFrom = Resource::CRYSTAL; max_sell = fundsFrom.crystal; break; case 5: resourceFrom = Resource::GEMS; max_sell = fundsFrom.gems; break; case 6: resourceFrom = Resource::GOLD; max_sell = fundsFrom.gold; break; default: break; } if(GetTradeCosts(resourceFrom, resourceTo, fromTradingPost)) { max_buy = Resource::GOLD == resourceTo ? max_sell * GetTradeCosts(resourceFrom, resourceTo, fromTradingPost) : max_sell / GetTradeCosts(resourceFrom, resourceTo, fromTradingPost); } count_sell = 0; count_buy = 0; cursor.Hide(); cursorFrom.Move(rect_from.x - 2, rect_from.y - 2); cursorFrom.Show(); if(resourceTo) cursorTo.Hide(); RedrawToResource(pt2, true, fromTradingPost, resourceFrom); if(resourceTo) cursorTo.Show(); if(resourceTo) gui.ShowTradeArea(resourceFrom, resourceTo, max_buy, max_sell, count_buy, count_sell, fromTradingPost); cursor.Show(); display.Flip(); } } // click to for(u8 ii = 0; ii < rectsTo.size(); ++ii) { const Rect & rect_to = rectsTo[ii]; if(le.MouseClickLeft(rect_to)) { switch(ii) { case 0: resourceTo = Resource::WOOD; break; case 1: resourceTo = Resource::MERCURY; break; case 2: resourceTo = Resource::ORE; break; case 3: resourceTo = Resource::SULFUR; break; case 4: resourceTo = Resource::CRYSTAL; break; case 5: resourceTo = Resource::GEMS; break; case 6: resourceTo = Resource::GOLD; break; default: break; } if(GetTradeCosts(resourceFrom, resourceTo, fromTradingPost)) { max_buy = Resource::GOLD == resourceTo ? max_sell * GetTradeCosts(resourceFrom, resourceTo, fromTradingPost) : max_sell / GetTradeCosts(resourceFrom, resourceTo, fromTradingPost); } count_sell = 0; count_buy = 0; cursor.Hide(); cursorTo.Move(rect_to.x - 2, rect_to.y - 2); if(resourceFrom) { cursorTo.Hide(); RedrawToResource(pt2, true, fromTradingPost, resourceFrom); cursorTo.Show(); gui.ShowTradeArea(resourceFrom, resourceTo, max_buy, max_sell, count_buy, count_sell, fromTradingPost); } cursor.Show(); display.Flip(); } } // move splitter if(buttonLeft.isEnable() && buttonRight.isEnable() && max_buy && le.MousePressLeft(splitter.GetRect())) { u32 seek = (le.GetMouseCursor().x - splitter.GetRect().x) * 100 / splitter.GetStep(); if(seek < splitter.Min()) seek = splitter.Min(); else if(seek > splitter.Max()) seek = splitter.Max(); count_buy = seek * (Resource::GOLD == resourceTo ? GetTradeCosts(resourceFrom, resourceTo, fromTradingPost) : 1); count_sell = seek * (Resource::GOLD == resourceTo ? 1: GetTradeCosts(resourceFrom, resourceTo, fromTradingPost)); cursor.Hide(); splitter.Move(seek); gui.RedrawInfoBuySell(count_sell, count_buy); cursor.Show(); display.Flip(); } // trade if(buttonTrade.isEnable() && le.MouseClickLeft(buttonTrade) && count_sell && count_buy) { kingdom.OddFundsResource(Resource::funds_t(static_cast<Resource::resource_t>(resourceFrom), count_sell)); kingdom.AddFundsResource(Resource::funds_t(static_cast<Resource::resource_t>(resourceTo), count_buy)); #ifdef WITH_NET FH2LocalClient::SendMarketSellResource(kingdom, resourceFrom, count_sell, fromTradingPost); FH2LocalClient::SendMarketBuyResource(kingdom, resourceTo, count_buy, fromTradingPost); #endif resourceTo = resourceFrom = Resource::UNKNOWN; gui.ShowTradeArea(resourceFrom, resourceTo, 0, 0, 0, 0, fromTradingPost); fundsFrom = kingdom.GetFundsResource(); cursorTo.Hide(); cursorFrom.Hide(); RedrawFromResource(pt1, fundsFrom); RedrawToResource(pt2, false, fromTradingPost, resourceFrom); display.Flip(); } // decrease trade resource if(count_buy && ((buttonLeft.isEnable() && le.MouseClickLeft(gui.buttonLeft)) || le.MouseWheelDn(splitter.GetRect()))) { count_buy -= Resource::GOLD == resourceTo ? GetTradeCosts(resourceFrom, resourceTo, fromTradingPost) : 1; count_sell -= Resource::GOLD == resourceTo ? 1: GetTradeCosts(resourceFrom, resourceTo, fromTradingPost); cursor.Hide(); splitter.Backward(); gui.RedrawInfoBuySell(count_sell, count_buy); cursor.Show(); display.Flip(); } // increase trade resource if( count_buy < max_buy && ((buttonRight.isEnable() && le.MouseClickLeft(buttonRight)) || le.MouseWheelUp(splitter.GetRect()))) { count_buy += Resource::GOLD == resourceTo ? GetTradeCosts(resourceFrom, resourceTo, fromTradingPost) : 1; count_sell += Resource::GOLD == resourceTo ? 1: GetTradeCosts(resourceFrom, resourceTo, fromTradingPost); cursor.Hide(); splitter.Forward(); gui.RedrawInfoBuySell(count_sell, count_buy); cursor.Show(); display.Flip(); } } }
void Dialog::MakeGiftResource(void) { Cursor & cursor = Cursor::Get(); Display & display = Display::Get(); LocalEvent & le = LocalEvent::Get(); const Settings & conf = Settings::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 & box = frameborder.GetArea(); const Sprite & background = AGG::GetICN(ICN::STONEBAK, 0); background.Blit(Rect(0, 0, window_w, window_h), box); Kingdom & myKingdom = world.GetKingdom(conf.CurrentColor()); Funds funds1(myKingdom.GetFunds()); Funds funds2; Text text; text.Set("Select Recipients"); text.Blit(box.x + (box.w - text.w()) / 2, box.y + 5); SelectRecipientsColors selector(Point(box.x + 65, box.y + 28)); selector.Redraw(); text.Set("Your Funds"); text.Blit(box.x + (box.w - text.w()) / 2, box.y + 55); ResourceBar info1(funds1, box.x + 25, box.y + 80); info1.Redraw(); text.Set("Planned Gift"); text.Blit(box.x + (box.w - text.w()) / 2, box.y + 125); ResourceBar info2(funds2, box.x + 25, box.y + 150); info2.Redraw(); ButtonGroups btnGroups(box, Dialog::OK|Dialog::CANCEL); btnGroups.DisableButton1(true); btnGroups.Draw(); cursor.Show(); display.Flip(); u8 count = Color::Count(selector.recipients); // message loop u16 result = Dialog::ZERO; while(result == Dialog::ZERO && le.HandleEvents()) { if(selector.QueueEventProcessing()) { u8 new_count = Color::Count(selector.recipients); cursor.Hide(); btnGroups.DisableButton1(0 == new_count || 0 == funds2.GetValidItems()); if(count != new_count) { funds1 = myKingdom.GetFunds(); funds2.Reset(); info1.Redraw(); info2.Redraw(); count = new_count; } btnGroups.Draw(); selector.Redraw(); cursor.Show(); display.Flip(); } else if(info2.QueueEventProcessing(funds1, count)) { cursor.Hide(); btnGroups.DisableButton1(0 == Color::Count(selector.recipients) || 0 == funds2.GetValidItems()); info1.Redraw(); info2.Redraw(); btnGroups.Draw(); cursor.Show(); display.Flip(); } result = btnGroups.QueueEventProcessing(); } if(Dialog::OK == result) { EventDate event; event.resource = funds2; event.computer = true; event.first = world.CountDay() + 1; event.subsequent = 0; event.colors = selector.recipients; event.message = "Gift from %{name}"; const Player* player = Settings::Get().GetPlayers().GetCurrent(); if(player) String::Replace(event.message, "%{name}", player->name); world.AddEventDate(event); if(1 < count) funds2 *= count; myKingdom.OddFundsResource(funds2); } }
void PocketPC::ThievesGuild(bool oracle) { 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); background.Blit(Rect(0, 0, window_w, window_h), dst_rt); const Point & cur_pt = dst_rt; Point dst_pt(cur_pt); const u8 count = oracle ? 0xFF : world.GetKingdom(Settings::Get().CurrentColor()).GetCountBuilding(BUILD_THIEVESGUILD); std::vector<ValueColors> v; v.reserve(KINGDOMMAX); const Colors colors(Game::GetActualKingdomColors()); u16 textx = 115; u16 startx = 120; u16 maxw = 200; Text text; text.Set(Font::SMALL); // head 1 u8 ii = 0; for(ii = 0; ii < colors.size(); ++ii) { switch(ii+1) { case 1: text.Set(_("1st")); break; case 2: text.Set(_("2nd")); break; case 3: text.Set(_("3rd")); break; case 4: text.Set(_("4th")); break; case 5: text.Set(_("5th")); break; case 6: text.Set(_("6th")); break; default: break; } dst_pt.x = cur_pt.x + startx + maxw / (colors.size() * 2) + ii * maxw / colors.size() - text.w() / 2; dst_pt.y = cur_pt.y + 25; text.Blit(dst_pt); } // button exit const Rect rectExit(dst_rt.x + dst_rt.w - 26, dst_rt.y + 7, 25, 25); AGG::GetICN(ICN::TOWNWIND, 12).Blit(rectExit.x, rectExit.y); text.Set(_("Number of Towns:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 35; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; GetTownsInfo(v, colors); DrawFlags(v, dst_pt, maxw, colors.size()); text.Set(_("Number of Castles:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 47; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; GetCastlesInfo(v, colors); DrawFlags(v, dst_pt, maxw, colors.size()); text.Set(_("Number of Heroes:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 59; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; GetHeroesInfo(v, colors); DrawFlags(v, dst_pt, maxw, colors.size()); text.Set(_("Gold in Treasury:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 71; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; GetGoldsInfo(v, colors); if(1 < count) DrawFlags(v, dst_pt, maxw, colors.size()); text.Set(_("Wood & Ore:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 83; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; GetWoodOreInfo(v, colors); if(1 < count) DrawFlags(v, dst_pt, maxw, colors.size()); text.Set(_("Gems, Cr, Slf & Mer:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 95; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; GetGemsCrSlfMerInfo(v, colors); if(1 < count) DrawFlags(v, dst_pt, maxw, colors.size()); text.Set(_("Obelisks Found:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 107; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; GetObelisksInfo(v, colors); if(2 < count) DrawFlags(v, dst_pt, maxw, colors.size()); text.Set(_("Total Army Strength:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 119; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; GetArmyInfo(v, colors); if(3 < count) DrawFlags(v, dst_pt, maxw, colors.size()); text.Set(_("Income:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 131; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; GetIncomesInfo(v, colors); if(4 < count) DrawFlags(v, dst_pt, maxw, colors.size()); textx = 75; startx = 80; maxw = 240; // head 2 ii = 0; for(Colors::const_iterator color = colors.begin(); color != colors.end(); ++color) { text.Set(Color::String(*color), Font::SMALL); dst_pt.x = cur_pt.x + startx + maxw / (colors.size() * 2) + ii * maxw / colors.size() - text.w() / 2; dst_pt.y = cur_pt.y + 145; text.Blit(dst_pt); ++ii; } text.Set(_("Best Hero:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 160; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; GetBestHeroArmyInfo(v, colors); DrawHeroIcons(v, dst_pt, maxw); text.Set(_("Best Hero Stats:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 200; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; //GetBestHeroStatsInfo(v); //if(1 < count) DrawHeroIcons(v, dst_pt, maxw); /* text.Set(_("Personality:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 388; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; //GetPersonalityInfo(v); //if(2 < count) DrawHeroIcons(v, dst_pt, maxw); text.Set(_("Best Monster:")); dst_pt.x = cur_pt.x + textx - text.w(); dst_pt.y = cur_pt.y + 429; text.Blit(dst_pt); dst_pt.x = cur_pt.x + startx; //GetBestMonsterInfo(v); //if(3 < count) DrawHeroIcons(v, dst_pt, maxw); //buttonExit.Draw(); */ cursor.Show(); display.Flip(); // message loop while(le.HandleEvents()) { if(le.MouseClickLeft(rectExit) || HotKeyCloseWindow) break; } }
int Dialog::ArmyInfo(const Troop & troop, int flags) { if(Settings::Get().QVGA()) return PocketPC::DialogArmyInfo(troop, flags); Display & display = Display::Get(); const int viewarmy = Settings::Get().ExtGameEvilInterface() ? ICN::VIEWARME : ICN::VIEWARMY; const Surface & sprite_dialog = AGG::GetICN(viewarmy, 0); Cursor & cursor = Cursor::Get(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); SpriteBack back(Rect((display.w() - sprite_dialog.w()) / 2, (display.h() - sprite_dialog.h()) / 2, sprite_dialog.w(), sprite_dialog.h())); const Rect & pos_rt = back.GetArea(); sprite_dialog.Blit(pos_rt.x, pos_rt.y, display); Point dst_pt; Text text; dst_pt.x = pos_rt.x + 400; dst_pt.y = pos_rt.y + 40; DrawMonsterStats(dst_pt, troop); if(troop.isBattle()) { dst_pt.x = pos_rt.x + 400; dst_pt.y = pos_rt.y + 205; DrawBattleStats(dst_pt, troop); } // name text.Set(troop.GetName(), Font::BIG); dst_pt.x = pos_rt.x + 140 - text.w() / 2; dst_pt.y = pos_rt.y + 40; text.Blit(dst_pt); // count text.Set(GetString(troop.GetCount())); dst_pt.x = pos_rt.x + 140 - text.w() / 2; dst_pt.y = pos_rt.y + 225; text.Blit(dst_pt); const Sprite & frame = AGG::GetICN(troop.ICNMonh(), 0); frame.Blit(pos_rt.x + (pos_rt.w / 2 - frame.w()) / 2, pos_rt.y + 180 - frame.h()); // button upgrade dst_pt.x = pos_rt.x + 284; dst_pt.y = pos_rt.y + 190; Button buttonUpgrade(dst_pt.x, dst_pt.y, viewarmy, 5, 6); // button dismiss dst_pt.x = pos_rt.x + 284; dst_pt.y = pos_rt.y + 222; Button buttonDismiss(dst_pt.x, dst_pt.y, viewarmy, 1, 2); // button exit dst_pt.x = pos_rt.x + 415; dst_pt.y = pos_rt.y + 225; Button buttonExit(dst_pt.x, dst_pt.y, viewarmy, 3, 4); if(READONLY & flags) { buttonDismiss.Press(); buttonDismiss.SetDisable(true); } if(!troop.isBattle() && troop.isAllowUpgrade()) { if(UPGRADE & flags) { if(UPGRADE_DISABLE & flags) { buttonUpgrade.Press(); buttonUpgrade.SetDisable(true); } else buttonUpgrade.SetDisable(false); buttonUpgrade.Draw(); } else buttonUpgrade.SetDisable(true); } else buttonUpgrade.SetDisable(true); if(BUTTONS & flags) { if(!troop.isBattle()) buttonDismiss.Draw(); buttonExit.Draw(); } LocalEvent & le = LocalEvent::Get(); int result = Dialog::ZERO; cursor.Show(); display.Flip(); // dialog menu loop while(le.HandleEvents()) { if(flags & BUTTONS) { if(buttonUpgrade.isEnable()) le.MousePressLeft(buttonUpgrade) ? (buttonUpgrade).PressDraw() : (buttonUpgrade).ReleaseDraw(); if(buttonDismiss.isEnable()) le.MousePressLeft(buttonDismiss) ? (buttonDismiss).PressDraw() : (buttonDismiss).ReleaseDraw(); le.MousePressLeft(buttonExit) ? (buttonExit).PressDraw() : (buttonExit).ReleaseDraw(); // upgrade if(buttonUpgrade.isEnable() && le.MouseClickLeft(buttonUpgrade)) { std::string msg = 1.0f != Monster::GetUpgradeRatio() ? _("Your troops can be upgraded, but it will cost you %{ratio} times the difference in cost for each troop, rounded up to next highest number. Do you wish to upgrade them?") : _("Your troops can be upgraded, but it will cost you dearly. Do you wish to upgrade them?"); StringReplace(msg, "%{ratio}", GetString(Monster::GetUpgradeRatio(), 2)); if(Dialog::YES == Dialog::ResourceInfo("", msg, troop.GetUpgradeCost(), Dialog::YES|Dialog::NO)) { result = Dialog::UPGRADE; break; } } else // dismiss if(buttonDismiss.isEnable() && le.MouseClickLeft(buttonDismiss) && Dialog::YES == Dialog::Message("", _("Are you sure you want to dismiss this army?"), Font::BIG, Dialog::YES | Dialog::NO)) { result = Dialog::DISMISS; break; } else // exit if(le.MouseClickLeft(buttonExit) || Game::HotKeyPressEvent(Game::EVENT_DEFAULT_EXIT)){ result = Dialog::CANCEL; break; } } else { if(!le.MousePressRight()) break; } } cursor.Hide(); back.Restore(); return result; }
int Dialog::ArmyJoinWithCost(const Troop & troop, u32 join, u32 gold, Heroes & hero) { Display & display = Display::Get(); const Settings & conf = Settings::Get(); // cursor Cursor & cursor = Cursor::Get(); int oldthemes = cursor.Themes(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); std::string message; if(troop.GetCount() == 1) message = _("The creature is swayed by your diplomatic tongue, and offers to join your army for the sum of %{gold} gold.\nDo you accept?"); else { message = _("The creatures are swayed by your diplomatic\ntongue, and make you an offer:\n \n"); if(join != troop.GetCount()) message += _("%{offer} of the %{total} %{monster} will join your army, and the rest will leave you alone, for the sum of %{gold} gold.\nDo you accept?"); else message += _("All %{offer} of the %{monster} will join your army for the sum of %{gold} gold.\nDo you accept?"); } StringReplace(message, "%{offer}", join); StringReplace(message, "%{total}", troop.GetCount()); StringReplace(message, "%{monster}", StringLower(troop.GetPluralName(join))); StringReplace(message, "%{gold}", gold); TextBox textbox(message, Font::BIG, BOXAREA_WIDTH); const int buttons = Dialog::YES | Dialog::NO; const Sprite & sprite = AGG::GetICN(ICN::RESOURCE, 6); int posy = 0; Text text; message = _("(Rate: %{percent})"); StringReplace(message, "%{percent}", troop.GetMonster().GetCost().gold * join * 100 / gold); text.Set(message, Font::BIG); FrameBox box(10 + textbox.h() + 10 + text.h() + 40 + sprite.h() + 10, buttons); const Rect & pos = box.GetArea(); posy = pos.y + 10; textbox.Blit(pos.x, posy); posy += textbox.h() + 10; text.Blit(pos.x + (pos.w - text.w()) / 2, posy); posy += text.h() + 40; sprite.Blit(pos.x + (pos.w - sprite.w()) / 2, posy); TextSprite tsTotal(GetString(gold) + " " + "(" + "total: " + GetString(world.GetKingdom(hero.GetColor()).GetFunds().Get(Resource::GOLD)) + ")", Font::SMALL, pos.x + (pos.w - text.w()) / 2, posy + sprite.h() + 5); tsTotal.Show(); ButtonGroups btnGroups(pos, buttons); Button btnMarket(pos.x + pos.w / 2 - 60 - 36, posy, (conf.ExtGameEvilInterface() ? ICN::ADVEBTNS : ICN::ADVBTNS), 4, 5); Button btnHeroes(pos.x + pos.w / 2 + 60, posy, (conf.ExtGameEvilInterface() ? ICN::ADVEBTNS : ICN::ADVBTNS), 0, 1); const Kingdom & kingdom = hero.GetKingdom(); if(! kingdom.AllowPayment(payment_t(Resource::GOLD, gold))) btnGroups.DisableButton1(true); TextSprite tsEnough; if(kingdom.GetCountMarketplace()) { if(kingdom.AllowPayment(payment_t(Resource::GOLD, gold))) btnMarket.SetDisable(true); else { std::string msg = _("Not enough gold (%{gold})"); StringReplace(msg, "%{gold}", gold - kingdom.GetFunds().Get(Resource::GOLD)); tsEnough.SetText(msg, Font::YELLOW_SMALL); tsEnough.SetPos(btnMarket.x - 25, btnMarket.y - 17); tsEnough.Show(); btnMarket.Draw(); } } if(hero.GetArmy().GetCount() < hero.GetArmy().Size() || hero.GetArmy().HasMonster(troop)) btnHeroes.SetDisable(true); else { TextBox textbox2(_("Not room in\nthe garrison"), Font::SMALL, 100); textbox2.Blit(btnHeroes.x - 35, btnHeroes.y - 30); btnHeroes.Draw(); btnGroups.DisableButton1(true); } btnGroups.Draw(); cursor.Show(); display.Flip(); LocalEvent & le = LocalEvent::Get(); // message loop int result = Dialog::ZERO; while(result == Dialog::ZERO && le.HandleEvents()) { if(btnMarket.isEnable()) le.MousePressLeft(btnMarket) ? btnMarket.PressDraw() : btnMarket.ReleaseDraw(); if(btnHeroes.isEnable()) le.MousePressLeft(btnHeroes) ? btnHeroes.PressDraw() : btnHeroes.ReleaseDraw(); if(!buttons && !le.MousePressRight()) break; result = btnGroups.QueueEventProcessing(); if(btnMarket.isEnable() && le.MouseClickLeft(btnMarket)) { Marketplace(false); cursor.Hide(); tsTotal.Hide(); tsTotal.SetText(GetString(gold) + " " + "(" + "total: " + GetString(world.GetKingdom(hero.GetColor()).GetFunds().Get(Resource::GOLD)) + ")"); tsTotal.Show(); if(kingdom.AllowPayment(payment_t(Resource::GOLD, gold))) { tsEnough.Hide(); btnGroups.DisableButton1(false); btnGroups.Draw(); } else { tsEnough.Hide(); std::string msg = _("Not enough gold (%{gold})"); StringReplace(msg, "%{gold}", gold - kingdom.GetFunds().Get(Resource::GOLD)); tsEnough.SetText(msg, Font::SMALL); tsEnough.Show(); } cursor.Show(); display.Flip(); } else if(btnHeroes.isEnable() && le.MouseClickLeft(btnHeroes)) { hero.OpenDialog(false, false); if(hero.GetArmy().GetCount() < hero.GetArmy().Size()) { btnGroups.DisableButton1(false); btnGroups.Draw(); } cursor.Show(); display.Flip(); } } cursor.Hide(); cursor.SetThemes(oldthemes); cursor.Show(); return result; }
void Dialog::DwellingInfo(const Monster & monster, u16 available) { Display & display = Display::Get(); // cursor Cursor & cursor = Cursor::Get(); const Cursor::themes_t oldcursor = cursor.Themes(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); const payment_t paymentMonster = monster.GetCost(); const Sprite & box = AGG::GetICN(ICN::RECR2BKG, 0); const Rect pos((display.w() - box.w()) / 2, (display.h() - box.h()) / 2, box.w(), box.h()); Background back(pos); back.Save(); box.Blit(pos.x, pos.y); LocalEvent & le = LocalEvent::Get(); Point dst_pt; Text text; std::string str; // text recruit monster str = _("Recruit %{name}"); String::Replace(str, "%{name}", monster.GetMultiName()); text.Set(str, Font::BIG); text.Blit(pos.x + (pos.w - text.w()) / 2, pos.y + 25); // sprite monster const Sprite & smon = AGG::GetICN(monster.ICNMonh(), 0); dst_pt.x = pos.x + 70 - smon.w() / 2; dst_pt.y = pos.y + 120 - smon.h(); smon.Blit(dst_pt); bool extres = 2 == paymentMonster.GetValidItems(); // info resource // gold const Sprite & sgold = AGG::GetICN(ICN::RESOURCE, 6); dst_pt.x = pos.x + (extres ? 150 : 175); dst_pt.y = pos.y + 75; sgold.Blit(dst_pt); text.Set(GetString(paymentMonster.gold), Font::SMALL); dst_pt.x = pos.x + (extres ? 183 : 205) - text.w() / 2; dst_pt.y = pos.y + 103; text.Blit(dst_pt); // crystal if(paymentMonster.crystal) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 4); RedrawResourceInfo(sres, pos, paymentMonster.crystal, 225, 75, 240, 103); } else // mercury if(paymentMonster.mercury) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 1); RedrawResourceInfo(sres, pos, paymentMonster.mercury, 225, 72, 240, 103); } else // wood if(paymentMonster.wood) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 0); RedrawResourceInfo(sres, pos, paymentMonster.wood, 225, 72, 240, 103); } else // ore if(paymentMonster.ore) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 2); RedrawResourceInfo(sres, pos, paymentMonster.ore, 225, 72, 240, 103); } else // sulfur if(paymentMonster.sulfur) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 3); RedrawResourceInfo(sres, pos, paymentMonster.sulfur, 225, 75, 240, 103); } else // gems if(paymentMonster.gems) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 5); RedrawResourceInfo(sres, pos, paymentMonster.gems, 225, 75, 240, 103); } // text available str = _("Available: %{count}"); String::Replace(str, "%{count}", available); text.Set(str); text.Blit(pos.x + 70 - text.w() / 2, pos.y + 130); cursor.Show(); display.Flip(); // while(le.HandleEvents() && le.MousePressRight()); cursor.Hide(); back.Restore(); cursor.SetThemes(oldcursor); cursor.Show(); display.Flip(); }
void DrawMonsterStats(const Point & dst, const Troop & troop) { Point dst_pt; Text text; bool pda = Settings::Get().QVGA(); // attack text.Set(std::string(_("Attack")) + ":"); dst_pt.x = dst.x - text.w(); dst_pt.y = dst.y; text.Blit(dst_pt); const int ox = 10; text.Set(troop.GetAttackString()); dst_pt.x = dst.x + ox; text.Blit(dst_pt); // defense text.Set(std::string(_("Defense")) + ":"); dst_pt.x = dst.x - text.w(); dst_pt.y += (pda ? 14 : 18); text.Blit(dst_pt); text.Set(troop.GetDefenseString()); dst_pt.x = dst.x + ox; text.Blit(dst_pt); // shot if(troop.isArchers()) { std::string message = troop.isBattle() ? _("Shots Left") : _("Shots"); message.append(":"); text.Set(message); dst_pt.x = dst.x - text.w(); dst_pt.y += (pda ? 14 : 18); text.Blit(dst_pt); text.Set(troop.GetShotString()); dst_pt.x = dst.x + ox; text.Blit(dst_pt); } // damage text.Set(std::string(_("Damage")) + ":"); dst_pt.x = dst.x - text.w(); dst_pt.y += (pda ? 14 : 18); text.Blit(dst_pt); if(troop().GetDamageMin() != troop().GetDamageMax()) text.Set(GetString(troop().GetDamageMin()) + " - " + GetString(troop().GetDamageMax())); else text.Set(GetString(troop().GetDamageMin())); dst_pt.x = dst.x + ox; text.Blit(dst_pt); // hp text.Set(std::string(_("Hit Points")) + ":"); dst_pt.x = dst.x - text.w(); dst_pt.y += (pda ? 14 : 18); text.Blit(dst_pt); text.Set(GetString(troop().GetHitPoints())); dst_pt.x = dst.x + ox; text.Blit(dst_pt); if(troop.isBattle()) { text.Set(std::string(_("Hit Points Left")) + ":"); dst_pt.x = dst.x - text.w(); dst_pt.y += (pda ? 14 : 18); text.Blit(dst_pt); text.Set(GetString(troop.GetHitPointsLeft())); dst_pt.x = dst.x + ox; text.Blit(dst_pt); } // speed text.Set(std::string(_("Speed")) + ":"); dst_pt.x = dst.x - text.w(); dst_pt.y += (pda ? 14 : 18); text.Blit(dst_pt); text.Set(troop.GetSpeedString()); dst_pt.x = dst.x + ox; text.Blit(dst_pt); // morale text.Set(std::string(_("Morale")) + ":"); dst_pt.x = dst.x - text.w(); dst_pt.y += (pda ? 14 : 18); text.Blit(dst_pt); text.Set(Morale::String(troop.GetMorale())); dst_pt.x = dst.x + ox; text.Blit(dst_pt); // luck text.Set(std::string(_("Luck")) + ":"); dst_pt.x = dst.x - text.w(); dst_pt.y += (pda ? 14 : 18); text.Blit(dst_pt); text.Set(Luck::String(troop.GetLuck())); dst_pt.x = dst.x + ox; text.Blit(dst_pt); }
u16 Dialog::RecruitMonster(const Monster & monster, u16 available) { Display & display = Display::Get(); LocalEvent & le = LocalEvent::Get(); // cursor Cursor & cursor = Cursor::Get(); const Cursor::themes_t oldcursor = cursor.Themes(); cursor.Hide(); cursor.SetThemes(Cursor::POINTER); // calculate max count u32 max = 0; const payment_t paymentMonster = monster.GetCost(); const Kingdom & kingdom = world.GetKingdom(Settings::Get().CurrentColor()); while(kingdom.AllowPayment(paymentMonster * max) && max < available) ++max; u32 result = max; payment_t paymentCosts(paymentMonster * result); const Sprite & box = AGG::GetICN(ICN::RECRBKG, 0); const Rect pos((display.w() - box.w()) / 2, Settings::Get().QVGA() ? (display.h() - box.h()) / 2 - 15 : (display.h() - box.h()) / 2, box.w(), box.h()); Background back(pos); back.Save(); box.Blit(pos.x, pos.y); Point dst_pt; std::string str; Text text; // smear hardcore text "Cost per troop:" const Sprite & smear = AGG::GetICN(ICN::TOWNNAME, 0); dst_pt.x = pos.x + 144; dst_pt.y = pos.y + 55; smear.Blit(Rect(8, 1, 120, 12), dst_pt); text.Set(_("Cost per troop:"), Font::SMALL); dst_pt.x = pos.x + 206 - text.w() / 2; dst_pt.y = pos.y + 55; text.Blit(dst_pt); // text recruit monster str = _("Recruit %{name}"); String::Replace(str, "%{name}", monster.GetMultiName()); text.Set(str, Font::BIG); dst_pt.x = pos.x + (pos.w - text.w()) / 2; dst_pt.y = pos.y + 25; text.Blit(dst_pt); // sprite monster const Sprite & smon = AGG::GetICN(monster.ICNMonh(), 0); dst_pt.x = pos.x + 70 - smon.w() / 2; dst_pt.y = pos.y + 130 - smon.h(); smon.Blit(dst_pt); bool extres = 2 == paymentMonster.GetValidItems(); // info resource // gold const Sprite & sgold = AGG::GetICN(ICN::RESOURCE, 6); dst_pt.x = pos.x + (extres ? 150 : 175); dst_pt.y = pos.y + 75; sgold.Blit(dst_pt); dst_pt.x = pos.x + (extres ? 105 : 130); dst_pt.y = pos.y + 200; sgold.Blit(dst_pt); text.Set(GetString(paymentMonster.gold), Font::SMALL); dst_pt.x = pos.x + (extres ? 183 : 205) - text.w() / 2; dst_pt.y = pos.y + 103; text.Blit(dst_pt); // crystal if(paymentMonster.crystal) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 4); RedrawResourceInfo(sres, pos, paymentMonster.crystal, 225, 75, 240, 103); dst_pt.x = pos.x + 180; dst_pt.y = pos.y + 200; sres.Blit(dst_pt); } else // mercury if(paymentMonster.mercury) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 1); RedrawResourceInfo(sres, pos, paymentMonster.mercury, 225, 72, 240, 103); dst_pt.x = pos.x + 180; dst_pt.y = pos.y + 197; sres.Blit(dst_pt); } else // wood if(paymentMonster.wood) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 0); RedrawResourceInfo(sres, pos, paymentMonster.wood, 225, 72, 240, 103); dst_pt.x = pos.x + 180; dst_pt.y = pos.y + 197; sres.Blit(dst_pt); } else // ore if(paymentMonster.ore) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 2); RedrawResourceInfo(sres, pos, paymentMonster.ore, 225, 72, 240, 103); dst_pt.x = pos.x + 180; dst_pt.y = pos.y + 197; sres.Blit(dst_pt); } else // sulfur if(paymentMonster.sulfur) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 3); RedrawResourceInfo(sres, pos, paymentMonster.sulfur, 225, 75, 240, 103); dst_pt.x = pos.x + 180; dst_pt.y = pos.y + 200; sres.Blit(dst_pt); } else // gems if(paymentMonster.gems) { const Sprite & sres = AGG::GetICN(ICN::RESOURCE, 5); RedrawResourceInfo(sres, pos, paymentMonster.gems, 225, 75, 240, 103); dst_pt.x = pos.x + 180; dst_pt.y = pos.y + 200; sres.Blit(dst_pt); } // text number buy text.Set(_("Number to buy:")); dst_pt.x = pos.x + 30; dst_pt.y = pos.y + 163; text.Blit(dst_pt); Background static_info(Rect(pos.x + 16, pos.y + 125, pos.w - 32, 122)); static_info.Save(); RedrawCurrentInfo(pos, available, result, paymentMonster, paymentCosts); // buttons dst_pt.x = pos.x + 34; dst_pt.y = pos.y + 249; Button buttonOk(dst_pt, ICN::RECRUIT, 8, 9); dst_pt.x = pos.x + 187; dst_pt.y = pos.y + 249; Button buttonCancel(dst_pt, ICN::RECRUIT, 6, 7); dst_pt.x = pos.x + 230; dst_pt.y = pos.y + 155; Button buttonMax(dst_pt, ICN::RECRUIT, 4, 5); dst_pt.x = pos.x + 208; dst_pt.y = pos.y + 156; Button buttonUp(dst_pt, ICN::RECRUIT, 0, 1); dst_pt.x = pos.x + 208; dst_pt.y = pos.y + 171; Button buttonDn(dst_pt, ICN::RECRUIT, 2, 3); buttonOk.Draw(); buttonCancel.Draw(); buttonMax.Draw(); buttonUp.Draw(); buttonDn.Draw(); cursor.Show(); display.Flip(); bool redraw = false; // str loop while(le.HandleEvents()) { le.MousePressLeft(buttonOk) ? buttonOk.PressDraw() : buttonOk.ReleaseDraw(); le.MousePressLeft(buttonCancel) ? buttonCancel.PressDraw() : buttonCancel.ReleaseDraw(); le.MousePressLeft(buttonMax) ? buttonMax.PressDraw() : buttonMax.ReleaseDraw(); le.MousePressLeft(buttonUp) ? buttonUp.PressDraw() : buttonUp.ReleaseDraw(); le.MousePressLeft(buttonDn) ? buttonDn.PressDraw() : buttonDn.ReleaseDraw(); if(PressIntKey(0, max, result)) { paymentCosts = paymentMonster * result; redraw = true; } if(le.MouseClickLeft(buttonUp) && result < max) { ++result; paymentCosts += paymentMonster; redraw = true; } else if(le.MouseClickLeft(buttonDn) && result) { --result; paymentCosts -= paymentMonster; redraw = true; } else if(le.MouseClickLeft(buttonMax) && result != max) { result = max; paymentCosts = paymentMonster * max; redraw = true; } if(redraw) { cursor.Hide(); static_info.Restore(); RedrawCurrentInfo(pos, available, result, paymentMonster, paymentCosts); cursor.Show(); display.Flip(); redraw = false; } if(le.MouseClickLeft(buttonOk) || Game::HotKeyPress(Game::EVENT_DEFAULT_READY)) break; if(le.MouseClickLeft(buttonCancel) || Game::HotKeyPress(Game::EVENT_DEFAULT_EXIT)){ result = 0; break; } } cursor.Hide(); back.Restore(); cursor.SetThemes(oldcursor); cursor.Show(); display.Flip(); return result; }
void Dialog::PrimarySkillInfo(const std::string &header, const std::string &message, const Skill::Primary::skill_t skill) { Display & display = Display::Get(); const ICN::icn_t system = Settings::Get().EvilInterface() ? ICN::SYSTEME : ICN::SYSTEM; // preload AGG::PreloadObject(system); // cursor Cursor & cursor = Cursor::Get(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); u8 index = 0; std::string skill_name; switch(skill) { case Skill::Primary::ATTACK: index = 0; skill_name = _("Attack Skill"); break; case Skill::Primary::DEFENCE: index = 1; skill_name = _("Defense Skill"); break; case Skill::Primary::POWER: index = 2; skill_name = _("Spell Power"); break; case Skill::Primary::KNOWLEDGE: index = 3; skill_name = _("Knowledge"); break; default: break; } TextBox box1(header, Font::BIG, BOXAREA_WIDTH); TextBox box2(message, Font::BIG, BOXAREA_WIDTH); const Sprite & border = AGG::GetICN(ICN::PRIMSKIL, 4); const u8 spacer = Settings::Get().QVGA() ? 5 : 10; Box box(box1.h() + spacer + box2.h() + spacer + border.h(), Dialog::OK); Rect pos = box.GetArea(); if(header.size()) box1.Blit(pos); pos.y += box1.h() + spacer; if(message.size()) box2.Blit(pos); pos.y += box2.h() + spacer; // blit sprite pos.x = box.GetArea().x + (pos.w - border.w()) / 2; display.Blit(border, pos.x, pos.y); const Sprite & sprite = AGG::GetICN(ICN::PRIMSKIL, index); pos.x = box.GetArea().x + (pos.w - sprite.w()) / 2; display.Blit(sprite, pos.x, pos.y + 6); Text text; text.Set(skill_name, Font::SMALL); pos.x = box.GetArea().x + (pos.w - text.w()) / 2; text.Blit(pos.x, pos.y + 8); text.Set("+1", Font::BIG); pos.x = box.GetArea().x + (pos.w - text.w()) / 2; text.Blit(pos.x, pos.y + 80); LocalEvent & le = LocalEvent::Get(); Point pt; pt.x = box.GetArea().x + (box.GetArea().w - AGG::GetICN(system, 1).w()) / 2; pt.y = box.GetArea().y + box.GetArea().h - AGG::GetICN(system, 1).h(); Button button(pt, system, 1, 2); button.Draw(); cursor.Show(); display.Flip(); // message loop while(le.HandleEvents()) { le.MousePressLeft(button) ? button.PressDraw() : button.ReleaseDraw(); if(le.MouseClickLeft(button)) { break; } if(le.KeyPress(KEY_RETURN) || le.KeyPress(KEY_ESCAPE)) { break; } } cursor.Hide(); }
bool Dialog::SelectGoldOrExp(const std::string & header, const std::string & message, u32 gold, u32 expr, const Heroes & hero) { Display & display = Display::Get(); const int system = Settings::Get().ExtGameEvilInterface() ? ICN::SYSTEME : ICN::SYSTEM; // cursor Cursor & cursor = Cursor::Get(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); const Sprite & sprite_gold = AGG::GetICN(ICN::RESOURCE, 6); const Sprite & sprite_expr = AGG::GetICN(ICN::EXPMRL, 4); Point pt; TextBox box1(header, Font::YELLOW_BIG, BOXAREA_WIDTH); TextBox box2(message, Font::BIG, BOXAREA_WIDTH); Text text; text.Set(GetString(gold) + " " + "(" + "total: " + GetString(world.GetKingdom(hero.GetColor()).GetFunds().Get(Resource::GOLD)) + ")", Font::SMALL); const int spacer = Settings::Get().QVGA() ? 5 : 10; FrameBox box(box1.h() + spacer + box2.h() + spacer + sprite_expr.h() + 2 + text.h(), true); pt.x = box.GetArea().x + box.GetArea().w / 2 - AGG::GetICN(system, 9).w() - 20; pt.y = box.GetArea().y + box.GetArea().h - AGG::GetICN(system, 5).h(); Button button_yes(pt.x, pt.y, system, 5, 6); pt.x = box.GetArea().x + box.GetArea().w / 2 + 20; pt.y = box.GetArea().y + box.GetArea().h - AGG::GetICN(system, 7).h(); Button button_no(pt.x, pt.y, system, 7, 8); Rect pos = box.GetArea(); if(header.size()) box1.Blit(pos); pos.y += box1.h() + spacer; if(message.size()) box2.Blit(pos); pos.y += box2.h() + spacer; pos.y += sprite_expr.h(); // sprite1 pos.x = box.GetArea().x + box.GetArea().w / 2 - sprite_gold.w() - 30; sprite_gold.Blit(pos.x, pos.y - sprite_gold.h()); // text text.Blit(pos.x + (sprite_gold.w() - text.w()) / 2, pos.y + 2); // sprite2 pos.x = box.GetArea().x + box.GetArea().w / 2 + 30; sprite_expr.Blit(pos.x, pos.y - sprite_expr.h()); // text text.Set(GetString(expr) + " " + "(" + "need: " + GetString(Heroes::GetExperienceFromLevel(hero.GetLevel()) - hero.GetExperience()) + ")", Font::SMALL); text.Blit(pos.x + (sprite_expr.w() - text.w()) / 2, pos.y + 2); button_yes.Draw(); button_no.Draw(); cursor.Show(); display.Flip(); LocalEvent & le = LocalEvent::Get(); bool result = false; // message loop while(le.HandleEvents()) { le.MousePressLeft(button_yes) ? button_yes.PressDraw() : button_yes.ReleaseDraw(); le.MousePressLeft(button_no) ? button_no.PressDraw() : button_no.ReleaseDraw(); if(Game::HotKeyPressEvent(Game::EVENT_DEFAULT_READY) || le.MouseClickLeft(button_yes)){ result = true; break; } if(Game::HotKeyPressEvent(Game::EVENT_DEFAULT_EXIT) || le.MouseClickLeft(button_no)){ result = false; break; } } cursor.Hide(); return result; }
int Game::ScenarioInfo(void) { Settings & conf = Settings::Get(); AGG::PlayMusic(MUS::MAINMENU); MapsFileInfoList lists; if(!PrepareMapsFileInfoList(lists, (conf.GameType(Game::TYPE_MULTI)))) { Dialog::Message(_("Warning"), _("No maps available!"), Font::BIG, Dialog::OK); return MAINMENU; } int result = QUITGAME; LocalEvent & le = LocalEvent::Get(); // cursor Cursor & cursor = Cursor::Get(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); Display & display = Display::Get(); Point top, pointDifficultyInfo, pointOpponentInfo, pointClassInfo; Rect rectPanel; Button* buttonSelectMaps = NULL; Button* buttonOk = NULL; Button* buttonCancel = NULL; // vector coord difficulty Rects coordDifficulty; coordDifficulty.reserve(5); const Sprite & ngextra = AGG::GetICN(ICN::NGEXTRA, 62); Dialog::FrameBorder* frameborder = NULL; // image background if(conf.QVGA()) { frameborder = new Dialog::FrameBorder(Size(380, 224)); rectPanel = frameborder->GetArea(); pointDifficultyInfo = Point(rectPanel.x + 4, rectPanel.y + 24); pointOpponentInfo = Point(rectPanel.x + 4, rectPanel.y + 94); pointClassInfo = Point(rectPanel.x + 4, rectPanel.y + 148); coordDifficulty.push_back(Rect(rectPanel.x + 1, rectPanel.y + 21, ngextra.w(), ngextra.h())); coordDifficulty.push_back(Rect(rectPanel.x + 78, rectPanel.y + 21, ngextra.w(), ngextra.h())); coordDifficulty.push_back(Rect(rectPanel.x + 154, rectPanel.y + 21, ngextra.w(), ngextra.h())); coordDifficulty.push_back(Rect(rectPanel.x + 231, rectPanel.y + 21, ngextra.w(), ngextra.h())); coordDifficulty.push_back(Rect(rectPanel.x + 308, rectPanel.y + 21, ngextra.w(), ngextra.h())); buttonOk = new Button(rectPanel.x + rectPanel.w / 2 - 160, rectPanel.y + rectPanel.h - 30, ICN::NGEXTRA, 66, 67); buttonCancel = new Button(rectPanel.x + rectPanel.w / 2 + 60, rectPanel.y + rectPanel.h - 30, ICN::NGEXTRA, 68, 69); Text text; text.Set(conf.CurrentFileInfo().name, Font::BIG); text.Blit(rectPanel.x + (rectPanel.w - text.w()) / 2, rectPanel.y + 5); } else { const Sprite &panel = AGG::GetICN(ICN::NGHSBKG, 0); const Sprite &back = AGG::GetICN(ICN::HEROES, 0); const Point top((display.w() - back.w()) / 2, (display.h() - back.h()) / 2); rectPanel = Rect(top.x + 204, top.y + 32, panel.w(), panel.h()); pointDifficultyInfo = Point(rectPanel.x + 24, rectPanel.y + 93); pointOpponentInfo = Point(rectPanel.x + 24, rectPanel.y + 202); pointClassInfo = Point(rectPanel.x + 24, rectPanel.y + 282); coordDifficulty.push_back(Rect(rectPanel.x + 21, rectPanel.y + 91, ngextra.w(), ngextra.h())); coordDifficulty.push_back(Rect(rectPanel.x + 98, rectPanel.y + 91, ngextra.w(), ngextra.h())); coordDifficulty.push_back(Rect(rectPanel.x + 174, rectPanel.y + 91, ngextra.w(), ngextra.h())); coordDifficulty.push_back(Rect(rectPanel.x + 251, rectPanel.y + 91, ngextra.w(), ngextra.h())); coordDifficulty.push_back(Rect(rectPanel.x + 328, rectPanel.y + 91, ngextra.w(), ngextra.h())); buttonSelectMaps = new Button(rectPanel.x + 309, rectPanel.y + 45, ICN::NGEXTRA, 64, 65); buttonOk = new Button(rectPanel.x + 31, rectPanel.y + 380, ICN::NGEXTRA, 66, 67); buttonCancel = new Button(rectPanel.x + 287, rectPanel.y + 380, ICN::NGEXTRA, 68, 69); back.Blit(top); } const bool reset_starting_settings = conf.MapsFile().empty() || ! System::IsFile(conf.MapsFile()); Players & players = conf.GetPlayers(); Interface::PlayersInfo playersInfo(true, !conf.QVGA(), !conf.QVGA()); // set first maps settings if(reset_starting_settings) conf.SetCurrentFileInfo(lists.front()); playersInfo.UpdateInfo(players, pointOpponentInfo, pointClassInfo); RedrawScenarioStaticInfo(rectPanel); RedrawDifficultyInfo(pointDifficultyInfo, !conf.QVGA()); playersInfo.RedrawInfo(); TextSprite* rating = conf.QVGA() ? NULL : new TextSprite(); if(rating) { rating->SetFont(Font::BIG); rating->SetPos(rectPanel.x + 166, rectPanel.y + 383); RedrawRatingInfo(*rating); } SpriteMove levelCursor(ngextra); switch(conf.GameDifficulty()) { case Difficulty::EASY: levelCursor.Move(coordDifficulty[0]); break; case Difficulty::NORMAL: levelCursor.Move(coordDifficulty[1]); break; case Difficulty::HARD: levelCursor.Move(coordDifficulty[2]); break; case Difficulty::EXPERT: levelCursor.Move(coordDifficulty[3]); break; case Difficulty::IMPOSSIBLE: levelCursor.Move(coordDifficulty[4]); break; } if(buttonSelectMaps) buttonSelectMaps->Draw(); buttonOk->Draw(); buttonCancel->Draw(); cursor.Show(); display.Flip(); while(le.HandleEvents()) { // press button if(buttonSelectMaps) le.MousePressLeft(*buttonSelectMaps) ? buttonSelectMaps->PressDraw() : buttonSelectMaps->ReleaseDraw(); le.MousePressLeft(*buttonOk) ? buttonOk->PressDraw() : buttonOk->ReleaseDraw(); le.MousePressLeft(*buttonCancel) ? buttonCancel->PressDraw() : buttonCancel->ReleaseDraw(); // click select if(buttonSelectMaps && (HotKeyPressEvent(Game::EVENT_BUTTON_SELECT) || le.MouseClickLeft(*buttonSelectMaps))) { levelCursor.Hide(); const Maps::FileInfo* fi = Dialog::SelectScenario(lists); if(fi) { conf.SetCurrentFileInfo(*fi); playersInfo.UpdateInfo(players, pointOpponentInfo, pointClassInfo); cursor.Hide(); RedrawScenarioStaticInfo(rectPanel); RedrawDifficultyInfo(pointDifficultyInfo, !conf.QVGA()); playersInfo.RedrawInfo(); if(rating) RedrawRatingInfo(*rating); // default difficulty normal levelCursor.Move(coordDifficulty[1]); conf.SetGameDifficulty(Difficulty::NORMAL); buttonOk->Draw(); buttonCancel->Draw(); } cursor.Show(); display.Flip(); } else // click cancel if(HotKeyPressEvent(EVENT_DEFAULT_EXIT) || le.MouseClickLeft(*buttonCancel)) { result = MAINMENU; break; } else // click ok if(HotKeyPressEvent(EVENT_DEFAULT_READY) || le.MouseClickLeft(*buttonOk)) { DEBUG(DBG_GAME, DBG_INFO, "select maps: " << conf.MapsFile() << \ ", difficulty: " << Difficulty::String(conf.GameDifficulty())); result = STARTGAME; break; } else if(le.MouseClickLeft(rectPanel)) { const s32 index = coordDifficulty.GetIndex(le.GetMouseCursor()); // select difficulty if(0 <= index) { cursor.Hide(); levelCursor.Move(coordDifficulty[index]); conf.SetGameDifficulty(index); if(rating) RedrawRatingInfo(*rating); cursor.Show(); display.Flip(); } else // playersInfo if(playersInfo.QueueEventProcessing()) { cursor.Hide(); RedrawScenarioStaticInfo(rectPanel); levelCursor.Redraw(); RedrawDifficultyInfo(pointDifficultyInfo, !conf.QVGA()); playersInfo.RedrawInfo(); if(rating) RedrawRatingInfo(*rating); buttonOk->Draw(); buttonCancel->Draw(); cursor.Show(); display.Flip(); } } if(le.MousePressRight(rectPanel)) { if(buttonSelectMaps && le.MousePressRight(*buttonSelectMaps)) Dialog::Message(_("Scenario"), _("Click here to select which scenario to play."), Font::BIG); else if(0 <= coordDifficulty.GetIndex(le.GetMouseCursor())) Dialog::Message(_("Game Difficulty"), _("This lets you change the starting difficulty at which you will play. Higher difficulty levels start you of with fewer resources, and at the higher settings, give extra resources to the computer."), Font::BIG); else if(rating && le.MousePressRight(rating->GetRect())) Dialog::Message(_("Difficulty Rating"), _("The difficulty rating reflects a combination of various settings for your game. This number will be applied to your final score."), Font::BIG); else if(le.MousePressRight(*buttonOk)) Dialog::Message(_("OK"), _("Click to accept these settings and start a new game."), Font::BIG); else if(le.MousePressRight(*buttonCancel)) Dialog::Message(_("Cancel"), _("Click to return to the main menu."), Font::BIG); else playersInfo.QueueEventProcessing(); } } cursor.Hide(); if(result == STARTGAME) { players.SetStartGame(); if(conf.ExtGameUseFade()) display.Fade(); Game::ShowLoadMapsText(); // Load maps std::string lower = StringLower(conf.MapsFile()); if(lower.size() > 3) { std::string ext = lower.substr(lower.size() - 3); if(ext == "mp2" || ext == "mx2") result = world.LoadMapMP2(conf.MapsFile()) ? STARTGAME : MAINMENU; else if(ext == "map") result = world.LoadMapMAP(conf.MapsFile()) ? STARTGAME : MAINMENU; } else { result = MAINMENU; DEBUG(DBG_GAME, DBG_WARN, conf.MapsFile() << ", " << "unknown map format"); } } if(frameborder) delete frameborder; if(rating) delete rating; if(buttonSelectMaps) delete buttonSelectMaps; delete buttonOk; delete buttonCancel; return result; }
void Castle::OpenMageGuild(void) { Display & display = Display::Get(); // cursor Cursor & cursor = Cursor::Get(); cursor.Hide(); Dialog::FrameBorder frameborder; frameborder.SetPosition((display.w() - 640 - BORDERWIDTH * 2) / 2, (display.h() - 480 - BORDERWIDTH * 2) / 2, 640, 480); frameborder.Redraw(); const Point cur_pt(frameborder.GetArea().x, frameborder.GetArea().y); Point dst_pt(cur_pt); AGG::GetICN(ICN::STONEBAK, 0).Blit(dst_pt); std::string message; Text text; // bar dst_pt.x = cur_pt.x; dst_pt.y = cur_pt.y + 461; AGG::GetICN(ICN::WELLXTRA, 2).Blit(dst_pt); // text bar text.Set(_("The above spells have been added to your book."), Font::BIG); dst_pt.x = cur_pt.x + 280 - text.w() / 2; dst_pt.y = cur_pt.y + 461; text.Blit(dst_pt); const u8 level = GetLevelMageGuild(); // sprite ICN::icn_t icn = ICN::UNKNOWN; switch(race) { case Race::KNGT: icn = ICN::MAGEGLDK; break; case Race::BARB: icn = ICN::MAGEGLDB; break; case Race::SORC: icn = ICN::MAGEGLDS; break; case Race::WRLK: icn = ICN::MAGEGLDW; break; case Race::WZRD: icn = ICN::MAGEGLDZ; break; case Race::NECR: icn = ICN::MAGEGLDN; break; default: break; } const Sprite & sprite = AGG::GetICN(icn, level - 1); dst_pt.x = cur_pt.x + 90 - sprite.w() / 2; dst_pt.y = cur_pt.y + 290 - sprite.h(); sprite.Blit(dst_pt); RowSpells spells5(Point(cur_pt.x + 250, cur_pt.y + 5), *this, 5); RowSpells spells4(Point(cur_pt.x + 250, cur_pt.y + 95), *this, 4); RowSpells spells3(Point(cur_pt.x + 250, cur_pt.y + 185), *this, 3); RowSpells spells2(Point(cur_pt.x + 250, cur_pt.y + 275), *this, 2); RowSpells spells1(Point(cur_pt.x + 250, cur_pt.y + 365), *this, 1); spells1.Redraw(); spells2.Redraw(); spells3.Redraw(); spells4.Redraw(); spells5.Redraw(); // button exit dst_pt.x = cur_pt.x + 578; dst_pt.y = cur_pt.y + 461; Button buttonExit(dst_pt, ICN::WELLXTRA, 0, 1); buttonExit.Draw(); cursor.Show(); display.Flip(); LocalEvent & le = LocalEvent::Get(); // message loop while(le.HandleEvents()) { le.MousePressLeft(buttonExit) ? buttonExit.PressDraw() : buttonExit.ReleaseDraw(); if(le.MouseClickLeft(buttonExit) || HotKeyCloseWindow) break; if(spells1.QueueEventProcessing() || spells2.QueueEventProcessing() || spells3.QueueEventProcessing() || spells4.QueueEventProcessing() || spells5.QueueEventProcessing()); } }
void Dialog::QuickInfo(const Castle & castle) { Display & display = Display::Get(); Cursor & cursor = Cursor::Get(); cursor.Hide(); const ICN::icn_t qwiktown = ICN::QWIKTOWN; AGG::PreloadObject(qwiktown); // image box const Sprite &box = AGG::GetICN(qwiktown, 0); const Interface::GameArea & gamearea = Interface::GameArea::Get(); const Rect ar(BORDERWIDTH, BORDERWIDTH, gamearea.GetArea().w, gamearea.GetArea().h); LocalEvent & le = LocalEvent::Get(); const Point & mp = le.GetMouseCursor(); Rect cur_rt; u16 mx = (mp.x - BORDERWIDTH) / TILEWIDTH; mx *= TILEWIDTH; u16 my = (mp.y - BORDERWIDTH) / TILEWIDTH; my *= TILEWIDTH; // top left if(mx <= ar.x + ar.w / 2 && my <= ar.y + ar.h / 2) cur_rt = Rect(mx + TILEWIDTH, my + TILEWIDTH, box.w(), box.h()); else // top right if(mx > ar.x + ar.w / 2 && my <= ar.y + ar.h / 2) cur_rt = Rect(mx - box.w(), my + TILEWIDTH, box.w(), box.h()); else // bottom left if(mx <= ar.x + ar.w / 2 && my > ar.y + ar.h / 2) cur_rt = Rect(mx + TILEWIDTH, my - box.h(), box.w(), box.h()); else // bottom right cur_rt = Rect(mx - box.w(), my - box.h(), box.w(), box.h()); if(Settings::Get().QVGA()) { cur_rt = Rect((display.w() - box.w()) / 2, (display.h() - box.h()) / 2, box.w(), box.h()); } Background back(cur_rt); back.Save(); display.Blit(box, cur_rt.x, cur_rt.y); cur_rt = Rect(back.GetRect().x + 28 , back.GetRect().y + 12, 178, 140); Point dst_pt; Text text; // castle name text.Set(castle.GetName(), Font::SMALL); dst_pt.x = cur_rt.x + (cur_rt.w - text.w()) / 2; dst_pt.y = cur_rt.y + 5; text.Blit(dst_pt); u8 index = 0; switch(castle.GetRace()) { case Race::KNGT: index = (castle.isCastle() ? 9 : 15); break; case Race::BARB: index = (castle.isCastle() ? 10 : 16); break; case Race::SORC: index = (castle.isCastle() ? 11 : 17); break; case Race::WRLK: index = (castle.isCastle() ? 12 : 18); break; case Race::WZRD: index = (castle.isCastle() ? 13 : 19); break; case Race::NECR: index = (castle.isCastle() ? 14 : 20); break; default: DEBUG(DBG_GAME , DBG_WARN, "Dialog::QuickInfo: unknown race."); return; } // castle icon const Sprite & sprite = AGG::GetICN(ICN::LOCATORS, index); dst_pt.x = cur_rt.x + (cur_rt.w - sprite.w()) / 2; dst_pt.y += 18; display.Blit(sprite, dst_pt); // color flags switch(castle.GetColor()) { case Color::BLUE: index = 0; break; case Color::GREEN: index = 2; break; case Color::RED: index = 4; break; case Color::YELLOW: index = 6; break; case Color::ORANGE: index = 8; break; case Color::PURPLE: index = 10; break; case Color::GRAY: index = 12; break; } const Sprite & l_flag = AGG::GetICN(ICN::FLAG32, index); dst_pt.x = cur_rt.x + (cur_rt.w - 60) / 2 - l_flag.w(); display.Blit(l_flag, dst_pt); const Sprite & r_flag = AGG::GetICN(ICN::FLAG32, index + 1); dst_pt.x = cur_rt.x + (cur_rt.w + 60) / 2; display.Blit(r_flag, dst_pt); // info text.Set(_("Defenders:")); dst_pt.x = cur_rt.x + (cur_rt.w - text.w()) / 2; dst_pt.y += sprite.h() + 5; text.Blit(dst_pt); u8 count = castle.GetArmy().GetCount(); if(! count) { text.Set(_("None")); dst_pt.x = cur_rt.x + (cur_rt.w - text.w()) / 2; dst_pt.y += 45; text.Blit(dst_pt); } else castle.GetArmy().DrawMons32Line(cur_rt.x - 5, cur_rt.y + 100, 192, 0, 0, (Settings::Get().MyColor() != castle.GetColor())); cursor.Show(); display.Flip(); // quick info loop while(le.HandleEvents() && le.MousePressRight()); // restore background cursor.Hide(); back.Restore(); cursor.Show(); display.Flip(); }
void Dialog::QuickInfo(const Heroes & hero) { Display & display = Display::Get(); Cursor & cursor = Cursor::Get(); cursor.Hide(); const ICN::icn_t qwikhero = ICN::QWIKHERO; AGG::PreloadObject(qwikhero); // image box const Sprite &box = AGG::GetICN(qwikhero, 0); const Interface::GameArea & gamearea = Interface::GameArea::Get(); const Rect ar(BORDERWIDTH, BORDERWIDTH, gamearea.GetArea().w, gamearea.GetArea().h); LocalEvent & le = LocalEvent::Get(); const Point & mp = le.GetMouseCursor(); Rect cur_rt; u16 mx = (mp.x - BORDERWIDTH) / TILEWIDTH; mx *= TILEWIDTH; u16 my = (mp.y - BORDERWIDTH) / TILEWIDTH; my *= TILEWIDTH; // top left if(mx <= ar.x + ar.w / 2 && my <= ar.y + ar.h / 2) cur_rt = Rect(mx + TILEWIDTH, my + TILEWIDTH, box.w(), box.h()); else // top right if(mx > ar.x + ar.w / 2 && my <= ar.y + ar.h / 2) cur_rt = Rect(mx - box.w(), my + TILEWIDTH, box.w(), box.h()); else // bottom left if(mx <= ar.x + ar.w / 2 && my > ar.y + ar.h / 2) cur_rt = Rect(mx + TILEWIDTH, my - box.h(), box.w(), box.h()); else // bottom right cur_rt = Rect(mx - box.w(), my - box.h(), box.w(), box.h()); if(Settings::Get().QVGA()) { cur_rt = Rect((display.w() - box.w()) / 2, (display.h() - box.h()) / 2, box.w(), box.h()); } Background back(cur_rt); back.Save(); display.Blit(box, cur_rt.x, cur_rt.y); cur_rt = Rect(back.GetRect().x + 28 , back.GetRect().y + 10, 146, 144); Point dst_pt; Text text; // heroes name text.Set(hero.GetName(), Font::SMALL); dst_pt.x = cur_rt.x + (cur_rt.w - text.w()) / 2; dst_pt.y = cur_rt.y + 2; text.Blit(dst_pt); // mini port heroes const Surface & port = hero.GetPortrait30x22(); dst_pt.x = cur_rt.x + (cur_rt.w - port.w()) / 2; dst_pt.y += 15; display.Blit(port, dst_pt); // color flags u8 index = 0; switch(hero.GetColor()) { case Color::BLUE: index = 0; break; case Color::GREEN: index = 2; break; case Color::RED: index = 4; break; case Color::YELLOW: index = 6; break; case Color::ORANGE: index = 8; break; case Color::PURPLE: index = 10; break; case Color::GRAY: index = 12; break; } const Sprite & l_flag = AGG::GetICN(ICN::FLAG32, index); dst_pt.x = cur_rt.x + (cur_rt.w - 40) / 2 - l_flag.w(); display.Blit(l_flag, dst_pt); const Sprite & r_flag = AGG::GetICN(ICN::FLAG32, index + 1); dst_pt.x = cur_rt.x + (cur_rt.w + 40) / 2; display.Blit(r_flag, dst_pt); std::string message; // attack message = _("Attack"); message += ":"; text.Set(message); dst_pt.x = cur_rt.x + 35; dst_pt.y += port.h() + 4; text.Blit(dst_pt); message.clear(); String::AddInt(message, hero.GetAttack()); text.Set(message); dst_pt.x += 75; text.Blit(dst_pt); // defense message = _("Defense"); message += ":"; text.Set(message); dst_pt.x = cur_rt.x + 35; dst_pt.y += 12; text.Blit(dst_pt); message.clear(); String::AddInt(message, hero.GetDefense()); text.Set(message); dst_pt.x += 75; text.Blit(dst_pt); // power message = _("Spell Power"); message += ":"; text.Set(message); dst_pt.x = cur_rt.x + 35; dst_pt.y += 12; text.Blit(dst_pt); message.clear(); String::AddInt(message, hero.GetPower()); text.Set(message); dst_pt.x += 75; text.Blit(dst_pt); // knowledge message = _("Knowledge"); message += ":"; text.Set(message); dst_pt.x = cur_rt.x + 35; dst_pt.y += 12; text.Blit(dst_pt); message.clear(); String::AddInt(message, hero.GetKnowledge()); text.Set(message); dst_pt.x += 75; text.Blit(dst_pt); // spell point message = _("Spell Points"); message += ":"; text.Set(message); dst_pt.x = cur_rt.x + 35; dst_pt.y += 12; text.Blit(dst_pt); message.clear(); String::AddInt(message, hero.GetSpellPoints()); message += "/"; String::AddInt(message, hero.GetMaxSpellPoints()); text.Set(message); dst_pt.x += 75; text.Blit(dst_pt); // draw monster sprite in one string const u8 mycolor = Settings::Get().MyColor(); const bool hide = mycolor != hero.GetColor() && !world.GetKingdom(mycolor).Modes(Kingdom::IDENTIFYHERO); hero.GetArmy().DrawMons32Line(cur_rt.x - 5, cur_rt.y + 114, 160, 0, 0, hide); cursor.Show(); display.Flip(); // quick info loop while(le.HandleEvents() && le.MousePressRight()); // restore background cursor.Hide(); back.Restore(); cursor.Show(); display.Flip(); }
Game::menu_t PocketPC::MainMenu(void) { Cursor & cursor = Cursor::Get(); Display & display = Display::Get(); LocalEvent & le = LocalEvent::Get(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); const Sprite &sprite = AGG::GetICN(ICN::HEROES, 0); Rect src_rt((sprite.w() - display.w()) / 2, 0, display.w(), display.h()); sprite.Blit(src_rt, 0, 0); const Sprite &board = AGG::GetICN(ICN::QWIKTOWN, 0); src_rt = Rect(13, 0, board.w() - 13, board.h() - 13); Point dst_pt((display.w() - src_rt.w) / 2, (display.h() - src_rt.h) / 2); board.Blit(src_rt, dst_pt.x , dst_pt.y); Text text; text.Set("Free Heroes II", Font::YELLOW_BIG); text.Blit(dst_pt.x + (src_rt.w - text.w()) / 2, dst_pt.y + 12); text.Set(_("New Game"), Font::BIG); const Rect rectNewGame(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 35, text.w() + 10, text.h() + 10); text.Blit(rectNewGame); text.Set(_("Load Game")); const Rect rectLoadGame(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 55, text.w() + 10, text.h() + 10); text.Blit(rectLoadGame); text.Set(_("Settings")); const Rect rectSettings(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 75, text.w() + 10, text.h() + 10); text.Blit(rectSettings); text.Set(_("High Scores")); const Rect rectHighScores(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 95, text.w() + 10, text.h() + 10); text.Blit(rectHighScores); text.Set(_("Credits")); const Rect rectCredits(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 115, text.w() + 10, text.h() + 10); text.Blit(rectCredits); text.Set(_("Quit")); const Rect rectQuitGame(dst_pt.x + (src_rt.w - text.w()) / 2 - 5, dst_pt.y + 135, text.w() + 10, text.h() + 10); text.Blit(rectQuitGame); cursor.Show(); display.Flip(); // mainmenu loop while(le.HandleEvents()) { if(Game::HotKeyPress(Game::EVENT_BUTTON_NEWGAME) || le.MouseClickLeft(rectNewGame)) return Game::NEWSTANDARD; //NEWGAME; else if(Game::HotKeyPress(Game::EVENT_BUTTON_LOADGAME) || le.MouseClickLeft(rectLoadGame)) return Game::LOADGAME; else if(Game::HotKeyPress(Game::EVENT_BUTTON_SETTINGS) || le.MouseClickLeft(rectSettings)){ Dialog::ExtSettings(false); cursor.Show(); display.Flip(); } else if(Game::HotKeyPress(Game::EVENT_BUTTON_CREDITS) || le.MouseClickLeft(rectCredits)) return Game::CREDITS; else if(Game::HotKeyPress(Game::EVENT_BUTTON_HIGHSCORES) || le.MouseClickLeft(rectHighScores)) return Game::HIGHSCORES; else if(Game::HotKeyPress(Game::EVENT_DEFAULT_EXIT) || le.MouseClickLeft(rectQuitGame)) return Game::QUITGAME; } return Game::QUITGAME; }
void RedrawFromResource(const Point & pt, const Resource::funds_t & rs) { Display & display = Display::Get(); const ICN::icn_t tradpost = Settings::Get().EvilInterface() ? ICN::TRADPOSE : ICN::TRADPOST; std::string str; Point dst_pt; Text text; // wood dst_pt.x = pt.x; dst_pt.y = pt.y; display.Blit(AGG::GetICN(tradpost, 7), dst_pt); str.clear(); String::AddInt(str, rs.wood); text.Set(str, Font::SMALL); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); // mercury dst_pt.x = pt.x + 37; dst_pt.y = pt.y; display.Blit(AGG::GetICN(tradpost, 8), dst_pt); str.clear(); String::AddInt(str, rs.mercury); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); // ore dst_pt.x = pt.x + 74; dst_pt.y = pt.y; display.Blit(AGG::GetICN(tradpost, 9), dst_pt); str.clear(); String::AddInt(str, rs.ore); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); // sulfur dst_pt.x = pt.x; dst_pt.y = pt.y + 37; display.Blit(AGG::GetICN(tradpost, 10), dst_pt); str.clear(); String::AddInt(str, rs.sulfur); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); // crystal dst_pt.x = pt.x + 37; dst_pt.y = pt.y + 37; display.Blit(AGG::GetICN(tradpost, 11), dst_pt); str.clear(); String::AddInt(str, rs.crystal); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); // gems dst_pt.x = pt.x + 74; dst_pt.y = pt.y + 37; display.Blit(AGG::GetICN(tradpost, 12), dst_pt); str.clear(); String::AddInt(str, rs.gems); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); // gold dst_pt.x = pt.x + 37; dst_pt.y = pt.y + 74; display.Blit(AGG::GetICN(tradpost, 13), dst_pt); str.clear(); String::AddInt(str, rs.gold); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); }
void Castle::WellRedrawInfoArea(const Point & cur_pt) { AGG::GetICN(ICN::WELLBKG, 0).Blit(cur_pt); Text text; Point dst_pt, pt; if(Settings::Get().ExtCastleAllowBuyFromWell()) { const Sprite & button = AGG::GetICN(ICN::BUYMAX, 0); Rect src_rt(0, 461, button.w(), 19); AGG::GetICN(ICN::WELLBKG, 0).Blit(src_rt, cur_pt.x + button.w(), cur_pt.y + 461); } text.Set(_("Town Population Information and Statistics"), Font::BIG); dst_pt.x = cur_pt.x + 280 - text.w() / 2; dst_pt.y = cur_pt.y + 462; text.Blit(dst_pt); u32 dw = DWELLING_MONSTER1; while(dw <= DWELLING_MONSTER6) { bool present = false; u32 dw_orig = DWELLING_MONSTER1; u8 icnindex = 0; u16 available = 0; switch(dw) { case DWELLING_MONSTER1: pt.x = cur_pt.x; pt.y = cur_pt.y; present = DWELLING_MONSTER1 & building; icnindex = 19; available = dwelling[0]; break; case DWELLING_MONSTER2: pt.x = cur_pt.x; pt.y = cur_pt.y + 150; present = DWELLING_MONSTER2 & building; dw_orig = GetActualDwelling(DWELLING_MONSTER2); icnindex = DWELLING_UPGRADE2 & building ? 25 : 20; available = dwelling[1]; break; case DWELLING_MONSTER3: pt.x = cur_pt.x; pt.y = cur_pt.y + 300; present = DWELLING_MONSTER3 & building; dw_orig = GetActualDwelling(DWELLING_MONSTER3); icnindex = DWELLING_UPGRADE3 & building ? 26 : 21; available = dwelling[2]; break; case DWELLING_MONSTER4: pt.x = cur_pt.x + 314; pt.y = cur_pt.y + 1; present = DWELLING_MONSTER4 & building; dw_orig = GetActualDwelling(DWELLING_MONSTER4); icnindex = DWELLING_UPGRADE4 & building ? 27 : 22; available = dwelling[3]; break; case DWELLING_MONSTER5: pt.x = cur_pt.x + 314; pt.y = cur_pt.y + 151; present = DWELLING_MONSTER5 & building; dw_orig = GetActualDwelling(DWELLING_MONSTER5); icnindex = DWELLING_UPGRADE5 & building ? 28 : 23; available = dwelling[4]; break; case DWELLING_MONSTER6: pt.x = cur_pt.x + 314; pt.y = cur_pt.y + 301; present = DWELLING_MONSTER6 & building; dw_orig = GetActualDwelling(DWELLING_MONSTER6); icnindex = DWELLING_UPGRADE7 & building ? 30 : (DWELLING_UPGRADE6 & building ? 29 : 24); available = dwelling[5]; break; default: break; } const Monster monster(race, dw_orig); // sprite dst_pt.x = pt.x + 21; dst_pt.y = pt.y + 35; AGG::GetICN(ICN::Get4Building(race), icnindex).Blit(dst_pt); // text text.Set(GetStringBuilding(dw_orig, race), Font::SMALL); dst_pt.x = pt.x + 86 - text.w() / 2; dst_pt.y = pt.y + 103; text.Blit(dst_pt); // monster const Sprite & smonster = AGG::GetICN(monster.ICNMonh(), 0); dst_pt.x = pt.x + 193 - smonster.w() / 2; dst_pt.y = pt.y + 124 - smonster.h(); smonster.Blit(dst_pt); // name text.Set(monster.GetMultiName()); dst_pt.x = pt.x + 122 - text.w() / 2; dst_pt.y = pt.y + 16; text.Blit(dst_pt); // attack std::string str; str = std::string(_("Attack")) + ": " + GetString(monster.GetAttack()); text.Set(str); dst_pt.x = pt.x + 268 - text.w() / 2; dst_pt.y = pt.y + 22; text.Blit(dst_pt); // defense str = std::string(_("Defense")) + ": " + GetString(monster.GetDefense()); text.Set(str); dst_pt.x = pt.x + 268 - text.w() / 2; dst_pt.y = pt.y + 34; text.Blit(dst_pt); // damage str = std::string(_("Damage")) + ": " + GetString(monster.GetDamageMin()) + "-" + GetString(monster.GetDamageMax()); text.Set(str); dst_pt.x = pt.x + 268 - text.w() / 2; dst_pt.y = pt.y + 46; text.Blit(dst_pt); // hp str = std::string(_("HP")) + ": " + GetString(monster.GetHitPoints()); text.Set(str); dst_pt.x = pt.x + 268 - text.w() / 2; dst_pt.y = pt.y + 58; text.Blit(dst_pt); // speed str = std::string(_("Speed")) + ": "; text.Set(str); dst_pt.x = pt.x + 268 - text.w() / 2; dst_pt.y = pt.y + 78; text.Blit(dst_pt); text.Set(Speed::String(monster.GetSpeed())); dst_pt.x = pt.x + 268 - text.w() / 2; dst_pt.y = pt.y + 90; text.Blit(dst_pt); if(present) { u8 grown = monster.GetGrown(); grown += building & BUILD_WELL ? GetGrownWell() : 0; if(DWELLING_MONSTER1 & dw) grown += building & BUILD_WEL2 ? GetGrownWel2() : 0; text.Set(_("Growth")); dst_pt.x = pt.x + 268 - text.w() / 2; dst_pt.y = pt.y + 110; text.Blit(dst_pt); str = std::string("+ ") + GetString(grown) + " / " + _("week"); text.Set(str); dst_pt.x = pt.x + 268 - text.w() / 2; dst_pt.y = pt.y + 122; text.Blit(dst_pt); str = std::string(_("Available")) + ": "; text.Set(str); dst_pt.x = pt.x + 44; dst_pt.y = pt.y + 122; text.Blit(dst_pt); text.Set(GetString(available), Font::BIG); dst_pt.x = pt.x + 129 - text.w() / 2; dst_pt.y = pt.y + 119; text.Blit(dst_pt); } dw <<= 1; } }
void RedrawToResource(const Point & pt, bool showcost, bool tradingPost, u8 from_resource) { Display & display = Display::Get(); const ICN::icn_t tradpost = Settings::Get().EvilInterface() ? ICN::TRADPOSE : ICN::TRADPOST; std::string str; Point dst_pt; Text text; text.Set(Font::SMALL); // wood dst_pt.x = pt.x; dst_pt.y = pt.y; display.Blit(AGG::GetICN(tradpost, 7), dst_pt); if(showcost) { GetStringTradeCosts(str, from_resource, Resource::WOOD, tradingPost); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); } // mercury dst_pt.x = pt.x + 37; dst_pt.y = pt.y; display.Blit(AGG::GetICN(tradpost, 8), dst_pt); if(showcost) { GetStringTradeCosts(str, from_resource, Resource::MERCURY, tradingPost); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); } // ore dst_pt.x = pt.x + 74; dst_pt.y = pt.y; display.Blit(AGG::GetICN(tradpost, 9), dst_pt); if(showcost) { GetStringTradeCosts(str, from_resource, Resource::ORE, tradingPost); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); } // sulfur dst_pt.x = pt.x; dst_pt.y = pt.y + 37; display.Blit(AGG::GetICN(tradpost, 10), dst_pt); if(showcost) { GetStringTradeCosts(str, from_resource, Resource::SULFUR, tradingPost); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); } // crystal dst_pt.x = pt.x + 37; dst_pt.y = pt.y + 37; display.Blit(AGG::GetICN(tradpost, 11), dst_pt); if(showcost) { GetStringTradeCosts(str, from_resource, Resource::CRYSTAL, tradingPost); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); } // gems dst_pt.x = pt.x + 74; dst_pt.y = pt.y + 37; display.Blit(AGG::GetICN(tradpost, 12), dst_pt); if(showcost) { GetStringTradeCosts(str, from_resource, Resource::GEMS, tradingPost); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); } // gold dst_pt.x = pt.x + 37; dst_pt.y = pt.y + 74; display.Blit(AGG::GetICN(tradpost, 13), dst_pt); if(showcost) { GetStringTradeCosts(str, from_resource, Resource::GOLD, tradingPost); text.Set(str); dst_pt.x += (34 - text.w()) / 2; dst_pt.y += 21; text.Blit(dst_pt); } }
void Dialog::SecondarySkillInfo(const std::string &header, const std::string &message, const Skill::Secondary::skill_t skill, const Skill::Level::type_t level, const bool ok_button) { Display & display = Display::Get(); const ICN::icn_t system = Settings::Get().EvilInterface() ? ICN::SYSTEME : ICN::SYSTEM; // preload AGG::PreloadObject(system); // cursor Cursor & cursor = Cursor::Get(); cursor.Hide(); cursor.SetThemes(cursor.POINTER); TextBox box1(header, Font::YELLOW_BIG, BOXAREA_WIDTH); TextBox box2(message, Font::BIG, BOXAREA_WIDTH); const Sprite & border = AGG::GetICN(ICN::SECSKILL, 15); const u8 spacer = Settings::Get().QVGA() ? 5 : 10; Box box(box1.h() + spacer + box2.h() + spacer + border.h(), ok_button); Rect pos = box.GetArea(); if(header.size()) box1.Blit(pos); pos.y += box1.h() + spacer; if(message.size()) box2.Blit(pos); pos.y += box2.h() + spacer; // blit sprite pos.x = box.GetArea().x + (pos.w - border.w()) / 2; display.Blit(border, pos.x, pos.y); const Sprite & sprite = AGG::GetICN(ICN::SECSKILL, Skill::Secondary::GetIndexSprite1(skill)); pos.x = box.GetArea().x + (pos.w - sprite.w()) / 2; display.Blit(sprite, pos.x, pos.y + 3); Text text; // small text text.Set(Skill::Secondary::String(skill), Font::SMALL); pos.x = box.GetArea().x + (pos.w - text.w()) / 2; text.Blit(pos.x, pos.y + 3); text.Set(Skill::Level::String(level)); pos.x = box.GetArea().x + (pos.w - text.w()) / 2; text.Blit(pos.x, pos.y + 55); LocalEvent & le = LocalEvent::Get(); Button *button = NULL; Point pt; if(ok_button) { pt.x = box.GetArea().x + (box.GetArea().w - AGG::GetICN(system, 1).w()) / 2; pt.y = box.GetArea().y + box.GetArea().h - AGG::GetICN(system, 1).h(); button = new Button(pt, system, 1, 2); } if(button) (*button).Draw(); cursor.Show(); display.Flip(); // message loop while(le.HandleEvents()) { if(!ok_button && !le.MousePressRight()) break; if(button) le.MousePressLeft(*button) ? button->PressDraw() : button->ReleaseDraw(); if(button && le.MouseClickLeft(*button)) { break; } if(le.KeyPress(KEY_RETURN) || le.KeyPress(KEY_ESCAPE)) { break; } } cursor.Hide(); if(button) delete button; }
u8 Battle2::Arena::DialogBattleHero(const HeroBase & hero) const { Display & display = Display::Get(); Cursor & cursor = Cursor::Get(); LocalEvent & le = LocalEvent::Get(); Settings & conf = Settings::Get(); cursor.Hide(); cursor.SetThemes(Cursor::POINTER); const bool readonly = conf.MyColor() != hero.GetColor(); const Sprite & dialog = AGG::GetICN((conf.EvilInterface() ? ICN::VGENBKGE : ICN::VGENBKG), 0); Rect pos_rt; pos_rt.x = (display.w() - dialog.w()) / 2; pos_rt.y = (display.h() - dialog.h()) / 2; pos_rt.w = dialog.w(); pos_rt.h = dialog.h(); Background back(pos_rt); back.Save(); display.Blit(dialog, pos_rt.x, pos_rt.y); display.Blit(Portrait::Get(hero, Portrait::BIG), pos_rt.x + 27, pos_rt.y + 42); u8 col = (Color::GRAY == hero.GetColor() ? 1 : Color::GetIndex(hero.GetColor()) + 1); display.Blit(AGG::GetICN(ICN::VIEWGEN, col), pos_rt.x + 148, pos_rt.y + 36); Point tp(pos_rt); std::string str; Text text; text.Set(Font::SMALL); str = _("%{name} the %{race}"); String::Replace(str, "%{name}", hero.GetName()); String::Replace(str, "%{race}", Race::String(hero.GetRace())); text.Set(str); tp.x = pos_rt.x + (pos_rt.w - text.w()) / 2; tp.y += 10; text.Blit(tp); str = _("Attack") + std::string(": "); String::AddInt(str, hero.GetAttack()); text.Set(str); tp.x = pos_rt.x + 205 - text.w() / 2; tp.y = pos_rt.y + 40; text.Blit(tp); str = _("Defense") + std::string(": "); String::AddInt(str, hero.GetDefense()); text.Set(str); tp.x = pos_rt.x + 205 - text.w() / 2; tp.y = pos_rt.y + 51; text.Blit(tp); str = _("Spell Power") + std::string(": "); String::AddInt(str, hero.GetPower()); text.Set(str); tp.x = pos_rt.x + 205 - text.w() / 2; tp.y = pos_rt.y + 62; text.Blit(tp); str = _("Knowledge") + std::string(": "); String::AddInt(str, hero.GetKnowledge()); text.Set(str); tp.x = pos_rt.x + 205 - text.w() / 2; tp.y = pos_rt.y + 73; text.Blit(tp); str = _("Morale") + std::string(": ") + Morale::String(hero.GetMorale()); text.Set(str); tp.x = pos_rt.x + 205 - text.w() / 2; tp.y = pos_rt.y + 84; text.Blit(tp); str = _("Luck") + std::string(": ") + Luck::String(hero.GetLuck()); text.Set(str); tp.x = pos_rt.x + 205 - text.w() / 2; tp.y = pos_rt.y + 95; text.Blit(tp); str = _("Spell Points") + std::string(": "); String::AddInt(str, hero.GetSpellPoints()); str += "/"; String::AddInt(str, hero.GetMaxSpellPoints()); text.Set(str); tp.x = pos_rt.x + 205 - text.w() / 2; tp.y = pos_rt.y + 117; text.Blit(tp); Button btnCast(pos_rt.x + 30, pos_rt.y + 148, ICN::VIEWGEN, 9, 10); Button btnRetreat(pos_rt.x + 89, pos_rt.y + 148, ICN::VIEWGEN, 11, 12); Button btnSurrender(pos_rt.x + 148, pos_rt.y + 148, ICN::VIEWGEN, 13, 14); Button btnClose(pos_rt.x + 207, pos_rt.y + 148, ICN::VIEWGEN, 15, 16); btnCast.SetDisable(readonly || !hero.HaveSpellBook() || hero.Modes(Heroes::SPELLCASTED)); btnRetreat.SetDisable(readonly || !CanRetreatOpponent(hero.GetColor())); btnSurrender.SetDisable(readonly || !CanSurrenderOpponent(hero.GetColor())); btnCast.Draw(); btnRetreat.Draw(); btnSurrender.Draw(); btnClose.Draw(); if(!conf.QVGA()) { Surface shadow(btnCast.w, btnCast.h); shadow.Fill(0, 0, 0); shadow.SetAlpha(80); if(btnCast.isDisable()) display.Blit(shadow, btnCast); if(btnRetreat.isDisable()) display.Blit(shadow, btnRetreat); if(btnSurrender.isDisable()) display.Blit(shadow, btnSurrender); } u8 result = 0; cursor.Show(); display.Flip(); while(le.HandleEvents() && !result) { btnCast.isEnable() && le.MousePressLeft(btnCast) ? btnCast.PressDraw() : btnCast.ReleaseDraw(); btnRetreat.isEnable() && le.MousePressLeft(btnRetreat) ? btnRetreat.PressDraw() : btnRetreat.ReleaseDraw(); btnSurrender.isEnable() && le.MousePressLeft(btnSurrender) ? btnSurrender.PressDraw() : btnSurrender.ReleaseDraw(); le.MousePressLeft(btnClose) ? btnClose.PressDraw() : btnClose.ReleaseDraw(); if(le.KeyPress(KEY_c) || (btnCast.isEnable() && le.MouseClickLeft(btnCast))) result = 1; if(le.KeyPress(KEY_r) || (btnRetreat.isEnable() && le.MouseClickLeft(btnRetreat))) result = 2; if(le.KeyPress(KEY_s) || (btnSurrender.isEnable() && le.MouseClickLeft(btnSurrender))) result = 3; if(le.MousePressRight(btnCast)) Dialog::Message(_("Cast Spell"), _("Cast a magical spell. You may only cast one spell per combat round. The round is reset when every creature has had a turn"), Font::BIG); else if(le.MousePressRight(btnRetreat)) Dialog::Message(_("Retreat"), _("Retreat your hero, abandoning your creatures. Your hero will be available for you to recruit again, however, the hero will have only a novice hero's forces."), Font::BIG); else if(le.MousePressRight(btnSurrender)) Dialog::Message(_("Surrender"), _("Surrendering costs gold. However if you pay the ransom, the hero and all of his or her surviving creatures will be available to recruit again."), Font::BIG); else if(le.MousePressRight(btnClose)) Dialog::Message(_("Cancel"), _("Return to the battle."), Font::BIG); // exit if(le.KeyPress(KEY_ESCAPE) || le.KeyPress(KEY_RETURN) || le.MouseClickLeft(btnClose)) break; } cursor.Hide(); back.Restore(); cursor.Show(); display.Flip(); return result; }