|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * CAdvMapInt.cpp, part of VCMI engine
|
|
|
+ * CAdventureMapInterface.cpp, part of VCMI engine
|
|
|
*
|
|
|
* Authors: listed in file AUTHORS in main folder
|
|
|
*
|
|
@@ -10,14 +10,13 @@
|
|
|
#include "StdInc.h"
|
|
|
#include "CAdventureMapInterface.h"
|
|
|
|
|
|
-#include "CAdvMapPanel.h"
|
|
|
#include "CAdventureOptions.h"
|
|
|
#include "CInGameConsole.h"
|
|
|
#include "CMinimap.h"
|
|
|
-#include "CResDataBar.h"
|
|
|
#include "CList.h"
|
|
|
#include "CInfoBar.h"
|
|
|
#include "MapAudioPlayer.h"
|
|
|
+#include "CAdventureMapWidget.h"
|
|
|
|
|
|
#include "../mapView/mapHandler.h"
|
|
|
#include "../mapView/MapView.h"
|
|
@@ -32,6 +31,7 @@
|
|
|
#include "../render/CAnimation.h"
|
|
|
#include "../gui/CursorHandler.h"
|
|
|
#include "../render/IImage.h"
|
|
|
+#include "../renderSDL/SDL_Extensions.h"
|
|
|
#include "../gui/CGuiHandler.h"
|
|
|
#include "../gui/Shortcut.h"
|
|
|
#include "../widgets/TextControls.h"
|
|
@@ -49,171 +49,24 @@
|
|
|
#include "../../lib/CPathfinder.h"
|
|
|
#include "../../lib/mapping/CMap.h"
|
|
|
|
|
|
-#define ADVOPT (conf.go()->ac)
|
|
|
-
|
|
|
std::shared_ptr<CAdventureMapInterface> adventureInt;
|
|
|
|
|
|
CAdventureMapInterface::CAdventureMapInterface():
|
|
|
- minimap(new CMinimap(Rect(ADVOPT.minimapX, ADVOPT.minimapY, ADVOPT.minimapW, ADVOPT.minimapH))),
|
|
|
- statusbar(CGStatusBar::create(ADVOPT.statusbarX,ADVOPT.statusbarY,ADVOPT.statusbarG)),
|
|
|
- heroList(new CHeroList(ADVOPT.hlistSize, Point(ADVOPT.hlistX, ADVOPT.hlistY), ADVOPT.hlistAU, ADVOPT.hlistAD)),
|
|
|
- townList(new CTownList(ADVOPT.tlistSize, Point(ADVOPT.tlistX, ADVOPT.tlistY), ADVOPT.tlistAU, ADVOPT.tlistAD)),
|
|
|
- infoBar(new CInfoBar(Point(ADVOPT.infoboxX, ADVOPT.infoboxY))),
|
|
|
- resdatabar(new CResDataBar),
|
|
|
mapAudio(new MapAudioPlayer()),
|
|
|
- terrain(new MapView(Point(ADVOPT.advmapX, ADVOPT.advmapY), Point(ADVOPT.advmapW, ADVOPT.advmapH))),
|
|
|
- state(EGameState::NOT_INITIALIZED),
|
|
|
spellBeingCasted(nullptr),
|
|
|
- activeMapPanel(nullptr),
|
|
|
scrollingCursorSet(false)
|
|
|
{
|
|
|
+ OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
|
|
|
pos.x = pos.y = 0;
|
|
|
pos.w = GH.screenDimensions().x;
|
|
|
pos.h = GH.screenDimensions().y;
|
|
|
strongInterest = true; // handle all mouse move events to prevent dead mouse move space in fullscreen mode
|
|
|
|
|
|
- bg = IImage::createFromFile(ADVOPT.mainGraphic);
|
|
|
- if(!ADVOPT.worldViewGraphic.empty())
|
|
|
- {
|
|
|
- bgWorldView = IImage::createFromFile(ADVOPT.worldViewGraphic);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- bgWorldView = nullptr;
|
|
|
- logGlobal->warn("ADVOPT.worldViewGraphic is empty => bitmap not loaded");
|
|
|
- }
|
|
|
- if (!bgWorldView)
|
|
|
- {
|
|
|
- logGlobal->warn("bgWorldView not defined in resolution config; fallback to VWorld.bmp");
|
|
|
- bgWorldView = IImage::createFromFile("VWorld.bmp");
|
|
|
- }
|
|
|
-
|
|
|
- worldViewIcons = std::make_shared<CAnimation>("VwSymbol");//todo: customize with ADVOPT
|
|
|
- worldViewIcons->preload();
|
|
|
-
|
|
|
- for(int g = 0; g < ADVOPT.gemG.size(); ++g)
|
|
|
- {
|
|
|
- gems.push_back(std::make_shared<CAnimImage>(ADVOPT.gemG[g], 0, 0, ADVOPT.gemX[g], ADVOPT.gemY[g]));
|
|
|
- }
|
|
|
-
|
|
|
- auto makeButton = [&](int textID, std::function<void()> callback, config::ButtonInfo info, EShortcut key) -> std::shared_ptr<CButton>
|
|
|
- {
|
|
|
- auto button = std::make_shared<CButton>(Point(info.x, info.y), info.defName, CGI->generaltexth->zelp[textID], callback, key, info.playerColoured);
|
|
|
- for(auto image : info.additionalDefs)
|
|
|
- button->addImage(image);
|
|
|
- return button;
|
|
|
- };
|
|
|
-
|
|
|
- kingOverview = makeButton(293, std::bind(&CAdventureMapInterface::fshowOverview,this), ADVOPT.kingOverview, EShortcut::ADVENTURE_KINGDOM_OVERVIEW);
|
|
|
- underground = makeButton(294, std::bind(&CAdventureMapInterface::fswitchLevel,this), ADVOPT.underground, EShortcut::ADVENTURE_TOGGLE_MAP_LEVEL);
|
|
|
- questlog = makeButton(295, std::bind(&CAdventureMapInterface::fshowQuestlog,this), ADVOPT.questlog, EShortcut::ADVENTURE_QUEST_LOG);
|
|
|
- sleepWake = makeButton(296, std::bind(&CAdventureMapInterface::fsleepWake,this), ADVOPT.sleepWake, EShortcut::ADVENTURE_TOGGLE_SLEEP);
|
|
|
- moveHero = makeButton(297, std::bind(&CAdventureMapInterface::fmoveHero,this), ADVOPT.moveHero, EShortcut::ADVENTURE_MOVE_HERO);
|
|
|
- spellbook = makeButton(298, std::bind(&CAdventureMapInterface::fshowSpellbok,this), ADVOPT.spellbook, EShortcut::ADVENTURE_CAST_SPELL);
|
|
|
- advOptions = makeButton(299, std::bind(&CAdventureMapInterface::fadventureOPtions,this), ADVOPT.advOptions, EShortcut::ADVENTURE_GAME_OPTIONS);
|
|
|
- sysOptions = makeButton(300, std::bind(&CAdventureMapInterface::fsystemOptions,this), ADVOPT.sysOptions, EShortcut::GLOBAL_OPTIONS);
|
|
|
- nextHero = makeButton(301, std::bind(&CAdventureMapInterface::fnextHero,this), ADVOPT.nextHero, EShortcut::ADVENTURE_NEXT_HERO);
|
|
|
- endTurn = makeButton(302, std::bind(&CAdventureMapInterface::fendTurn,this), ADVOPT.endTurn, EShortcut::ADVENTURE_END_TURN);
|
|
|
-
|
|
|
- int panelSpaceBottom = GH.screenDimensions().y - resdatabar->pos.h - 4;
|
|
|
-
|
|
|
- panelMain = std::make_shared<CAdvMapPanel>(nullptr, Point(0, 0));
|
|
|
- // TODO correct drawing position
|
|
|
- panelWorldView = std::make_shared<CAdvMapWorldViewPanel>(worldViewIcons, bgWorldView, Point(heroList->pos.x - 2, 195), panelSpaceBottom, LOCPLINT->playerID);
|
|
|
-
|
|
|
- panelMain->addChildColorableButton(kingOverview);
|
|
|
- panelMain->addChildColorableButton(underground);
|
|
|
- panelMain->addChildColorableButton(questlog);
|
|
|
- panelMain->addChildColorableButton(sleepWake);
|
|
|
- panelMain->addChildColorableButton(moveHero);
|
|
|
- panelMain->addChildColorableButton(spellbook);
|
|
|
- panelMain->addChildColorableButton(advOptions);
|
|
|
- panelMain->addChildColorableButton(sysOptions);
|
|
|
- panelMain->addChildColorableButton(nextHero);
|
|
|
- panelMain->addChildColorableButton(endTurn);
|
|
|
-
|
|
|
-
|
|
|
- // TODO move configs to resolutions.json, similarly to previous buttons
|
|
|
- config::ButtonInfo worldViewBackConfig = config::ButtonInfo();
|
|
|
- worldViewBackConfig.defName = "IOK6432.DEF";
|
|
|
- worldViewBackConfig.x = GH.screenDimensions().x - 73;
|
|
|
- worldViewBackConfig.y = 343 + 195;
|
|
|
- worldViewBackConfig.playerColoured = false;
|
|
|
- panelWorldView->addChildToPanel(
|
|
|
- makeButton(288, std::bind(&CAdventureMapInterface::fworldViewBack,this), worldViewBackConfig, EShortcut::GLOBAL_CANCEL), ACTIVATE | DEACTIVATE);
|
|
|
-
|
|
|
- config::ButtonInfo worldViewPuzzleConfig = config::ButtonInfo();
|
|
|
- worldViewPuzzleConfig.defName = "VWPUZ.DEF";
|
|
|
- worldViewPuzzleConfig.x = GH.screenDimensions().x - 188;
|
|
|
- worldViewPuzzleConfig.y = 343 + 195;
|
|
|
- worldViewPuzzleConfig.playerColoured = false;
|
|
|
- panelWorldView->addChildToPanel( // no help text for this one
|
|
|
- std::make_shared<CButton>(Point(worldViewPuzzleConfig.x, worldViewPuzzleConfig.y), worldViewPuzzleConfig.defName, std::pair<std::string, std::string>(),
|
|
|
- std::bind(&CPlayerInterface::showPuzzleMap,LOCPLINT), EShortcut::ADVENTURE_VIEW_PUZZLE, worldViewPuzzleConfig.playerColoured), ACTIVATE | DEACTIVATE);
|
|
|
-
|
|
|
- config::ButtonInfo worldViewScale1xConfig = config::ButtonInfo();
|
|
|
- worldViewScale1xConfig.defName = "VWMAG1.DEF";
|
|
|
- worldViewScale1xConfig.x = GH.screenDimensions().x - 191;
|
|
|
- worldViewScale1xConfig.y = 23 + 195;
|
|
|
- worldViewScale1xConfig.playerColoured = false;
|
|
|
- panelWorldView->addChildToPanel( // help text is wrong for this button
|
|
|
- makeButton(291, std::bind(&CAdventureMapInterface::fworldViewScale1x,this), worldViewScale1xConfig, EShortcut::SELECT_INDEX_1), ACTIVATE | DEACTIVATE);
|
|
|
-
|
|
|
- config::ButtonInfo worldViewScale2xConfig = config::ButtonInfo();
|
|
|
- worldViewScale2xConfig.defName = "VWMAG2.DEF";
|
|
|
- worldViewScale2xConfig.x = GH.screenDimensions().x- 191 + 63;
|
|
|
- worldViewScale2xConfig.y = 23 + 195;
|
|
|
- worldViewScale2xConfig.playerColoured = false;
|
|
|
- panelWorldView->addChildToPanel( // help text is wrong for this button
|
|
|
- makeButton(291, std::bind(&CAdventureMapInterface::fworldViewScale2x,this), worldViewScale2xConfig, EShortcut::SELECT_INDEX_2), ACTIVATE | DEACTIVATE);
|
|
|
-
|
|
|
- config::ButtonInfo worldViewScale4xConfig = config::ButtonInfo();
|
|
|
- worldViewScale4xConfig.defName = "VWMAG4.DEF";
|
|
|
- worldViewScale4xConfig.x = GH.screenDimensions().x- 191 + 126;
|
|
|
- worldViewScale4xConfig.y = 23 + 195;
|
|
|
- worldViewScale4xConfig.playerColoured = false;
|
|
|
- panelWorldView->addChildToPanel( // help text is wrong for this button
|
|
|
- makeButton(291, std::bind(&CAdventureMapInterface::fworldViewScale4x,this), worldViewScale4xConfig, EShortcut::SELECT_INDEX_4), ACTIVATE | DEACTIVATE);
|
|
|
-
|
|
|
- config::ButtonInfo worldViewUndergroundConfig = config::ButtonInfo();
|
|
|
- worldViewUndergroundConfig.defName = "IAM010.DEF";
|
|
|
- worldViewUndergroundConfig.additionalDefs.push_back("IAM003.DEF");
|
|
|
- worldViewUndergroundConfig.x = GH.screenDimensions().x - 115;
|
|
|
- worldViewUndergroundConfig.y = 343 + 195;
|
|
|
- worldViewUndergroundConfig.playerColoured = true;
|
|
|
- worldViewUnderground = makeButton(294, std::bind(&CAdventureMapInterface::fswitchLevel,this), worldViewUndergroundConfig, EShortcut::ADVENTURE_TOGGLE_MAP_LEVEL);
|
|
|
- panelWorldView->addChildColorableButton(worldViewUnderground);
|
|
|
-
|
|
|
- onCurrentPlayerChanged(LOCPLINT->playerID);
|
|
|
-
|
|
|
- int iconColorMultiplier = currentPlayerID.getNum() * 19;
|
|
|
- int wvLeft = heroList->pos.x - 2; // TODO correct drawing position
|
|
|
- //int wvTop = 195;
|
|
|
- for (int i = 0; i < 5; ++i)
|
|
|
- {
|
|
|
- panelWorldView->addChildIcon(std::pair<int, Point>(i, Point(5, 58 + i * 20)), iconColorMultiplier);
|
|
|
- panelWorldView->addChildToPanel(std::make_shared<CLabel>(wvLeft + 45, 263 + i * 20, EFonts::FONT_SMALL, ETextAlignment::TOPLEFT,
|
|
|
- Colors::WHITE, CGI->generaltexth->allTexts[612 + i]));
|
|
|
- }
|
|
|
- for (int i = 0; i < 7; ++i)
|
|
|
- {
|
|
|
- panelWorldView->addChildIcon(std::pair<int, Point>(i + 5, Point(5, 182 + i * 20)), iconColorMultiplier);
|
|
|
- panelWorldView->addChildIcon(std::pair<int, Point>(i + 12, Point(160, 182 + i * 20)), iconColorMultiplier);
|
|
|
- panelWorldView->addChildToPanel(std::make_shared<CLabel>(wvLeft + 45, 387 + i * 20, EFonts::FONT_SMALL, ETextAlignment::TOPLEFT,
|
|
|
- Colors::WHITE, CGI->generaltexth->allTexts[619 + i]));
|
|
|
- }
|
|
|
- panelWorldView->addChildToPanel(std::make_shared<CLabel>(wvLeft + 5, 367, EFonts::FONT_SMALL, ETextAlignment::TOPLEFT,
|
|
|
- Colors::WHITE, CGI->generaltexth->allTexts[617]));
|
|
|
- panelWorldView->addChildToPanel(std::make_shared<CLabel>(wvLeft + 45, 367, EFonts::FONT_SMALL, ETextAlignment::TOPLEFT,
|
|
|
- Colors::WHITE, CGI->generaltexth->allTexts[618]));
|
|
|
-
|
|
|
- activeMapPanel = panelMain;
|
|
|
-
|
|
|
+ widget = std::make_shared<CAdventureMapWidget>();
|
|
|
exitWorldView();
|
|
|
|
|
|
- underground->block(!CGI->mh->getMap()->twoLevel);
|
|
|
- questlog->block(!CGI->mh->getMap()->quests.size());
|
|
|
- worldViewUnderground->block(!CGI->mh->getMap()->twoLevel);
|
|
|
+ widget->setOptionHasQuests(!CGI->mh->getMap()->quests.empty());
|
|
|
+ widget->setOptionHasUnderground(CGI->mh->getMap()->twoLevel);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::fshowOverview()
|
|
@@ -253,18 +106,13 @@ void CAdventureMapInterface::fswitchLevel()
|
|
|
if (maxLevels < 2)
|
|
|
return;
|
|
|
|
|
|
- terrain->onMapLevelSwitched();
|
|
|
+ widget->getMapView()->onMapLevelSwitched();
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::onMapViewMoved(const Rect & visibleArea, int mapLevel)
|
|
|
{
|
|
|
- underground->setIndex(mapLevel, true);
|
|
|
- underground->redraw();
|
|
|
-
|
|
|
- worldViewUnderground->setIndex(mapLevel, true);
|
|
|
- worldViewUnderground->redraw();
|
|
|
-
|
|
|
- minimap->onMapViewMoved(visibleArea, mapLevel);
|
|
|
+ widget->setOptionUndergroundLevel(mapLevel > 0);
|
|
|
+ widget->getMinimap()->onMapViewMoved(visibleArea, mapLevel);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::onAudioResumed()
|
|
@@ -298,9 +146,6 @@ void CAdventureMapInterface::fsleepWake()
|
|
|
|
|
|
if (newSleep)
|
|
|
fnextHero();
|
|
|
-
|
|
|
- // redraw to update the image of sleep/wake button
|
|
|
- panelMain->redraw();
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::fmoveHero()
|
|
@@ -381,59 +226,48 @@ void CAdventureMapInterface::fendTurn()
|
|
|
void CAdventureMapInterface::updateButtons()
|
|
|
{
|
|
|
const auto * hero = LOCPLINT->localState->getCurrentHero();
|
|
|
-
|
|
|
- sleepWake->block(!hero);
|
|
|
- spellbook->block(!hero);
|
|
|
- moveHero->block(!hero || !LOCPLINT->localState->hasPath(hero) || hero->movement == 0);
|
|
|
-
|
|
|
const auto * nextSuitableHero = LOCPLINT->localState->getNextWanderingHero(hero);
|
|
|
- nextHero->block(nextSuitableHero == nullptr);
|
|
|
|
|
|
- if(hero)
|
|
|
- {
|
|
|
- bool state = LOCPLINT->localState->isHeroSleeping(hero);
|
|
|
- sleepWake->setIndex(state ? 1 : 0, true);
|
|
|
- sleepWake->redraw();
|
|
|
- }
|
|
|
+ widget->setOptionHeroSelected(hero != nullptr);
|
|
|
+ widget->setOptionHeroCanMove(hero && LOCPLINT->localState->hasPath(hero) && hero->movement != 0);
|
|
|
+ widget->setOptionHasNextHero(nextSuitableHero != nullptr);
|
|
|
+ widget->setOptionHeroSleeping(hero && LOCPLINT->localState->isHeroSleeping(hero));
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::onHeroMovementStarted(const CGHeroInstance * hero)
|
|
|
{
|
|
|
- infoBar->popAll();
|
|
|
- infoBar->showSelection();
|
|
|
+ widget->getInfoBar()->popAll();
|
|
|
+ widget->getInfoBar()->showSelection();
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::onHeroChanged(const CGHeroInstance *h)
|
|
|
{
|
|
|
- heroList->update(h);
|
|
|
+ widget->getHeroList()->update(h);
|
|
|
|
|
|
- if (h && h == LOCPLINT->localState->getCurrentHero() && !infoBar->showingComponents())
|
|
|
- infoBar->showSelection();
|
|
|
+ if (h && h == LOCPLINT->localState->getCurrentHero() && !widget->getInfoBar()->showingComponents())
|
|
|
+ widget->getInfoBar()->showSelection();
|
|
|
|
|
|
updateButtons();
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::onTownChanged(const CGTownInstance * town)
|
|
|
{
|
|
|
- townList->update(town);
|
|
|
+ widget->getTownList()->update(town);
|
|
|
|
|
|
- if (town && town == LOCPLINT->localState->getCurrentTown() && !infoBar->showingComponents())
|
|
|
- infoBar->showSelection();
|
|
|
+ if (town && town == LOCPLINT->localState->getCurrentTown() && !widget->getInfoBar()->showingComponents())
|
|
|
+ widget->getInfoBar()->showSelection();
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::showInfoBoxMessage(const std::vector<Component> & components, std::string message, int timer)
|
|
|
{
|
|
|
- infoBar->pushComponents(components, message, timer);
|
|
|
+ widget->getInfoBar()->pushComponents(components, message, timer);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::activate()
|
|
|
{
|
|
|
CIntObject::activate();
|
|
|
- if (!(active & KEYBOARD))
|
|
|
- CIntObject::activate(KEYBOARD);
|
|
|
|
|
|
screenBuf = screen;
|
|
|
- GH.statusbar = statusbar;
|
|
|
|
|
|
if(LOCPLINT)
|
|
|
{
|
|
@@ -441,94 +275,28 @@ void CAdventureMapInterface::activate()
|
|
|
LOCPLINT->cingconsole->pos = this->pos;
|
|
|
}
|
|
|
|
|
|
- if(state != EGameState::ENEMY_TURN && state != EGameState::HOTSEAT_WAIT)
|
|
|
- {
|
|
|
- assert(state == EGameState::MAKING_TURN);
|
|
|
-
|
|
|
- activeMapPanel->activate();
|
|
|
- if (state == EGameState::MAKING_TURN)
|
|
|
- {
|
|
|
- heroList->activate();
|
|
|
- townList->activate();
|
|
|
- infoBar->activate();
|
|
|
- }
|
|
|
- minimap->activate();
|
|
|
- terrain->activate();
|
|
|
- statusbar->activate();
|
|
|
-
|
|
|
- GH.fakeMouseMove(); //to restore the cursor
|
|
|
- }
|
|
|
+ GH.fakeMouseMove(); //to restore the cursor
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::deactivate()
|
|
|
{
|
|
|
CIntObject::deactivate();
|
|
|
-
|
|
|
- if(state != EGameState::ENEMY_TURN && state != EGameState::HOTSEAT_WAIT)
|
|
|
- {
|
|
|
- assert(state == EGameState::MAKING_TURN);
|
|
|
-
|
|
|
- CCS->curh->set(Cursor::Map::POINTER);
|
|
|
- activeMapPanel->deactivate();
|
|
|
- if (state == EGameState::MAKING_TURN)
|
|
|
- {
|
|
|
- heroList->deactivate();
|
|
|
- townList->deactivate();
|
|
|
- infoBar->deactivate();
|
|
|
- }
|
|
|
- minimap->deactivate();
|
|
|
- terrain->deactivate();
|
|
|
- statusbar->deactivate();
|
|
|
- }
|
|
|
+ CCS->curh->set(Cursor::Map::POINTER);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::showAll(SDL_Surface * to)
|
|
|
{
|
|
|
- bg->draw(to, 0, 0);
|
|
|
-
|
|
|
-// if(state != EGameState::MAKING_TURN)
|
|
|
-// return;
|
|
|
-
|
|
|
- heroList->showAll(to);
|
|
|
- townList->showAll(to);
|
|
|
- infoBar->showAll(to);
|
|
|
-
|
|
|
- activeMapPanel->showAll(to);
|
|
|
-
|
|
|
- minimap->showAll(to);
|
|
|
- terrain->showAll(to);
|
|
|
- show(to);
|
|
|
-
|
|
|
- resdatabar->showAll(to);
|
|
|
- statusbar->show(to);
|
|
|
+ CSDL_Ext::fillSurface(to, CSDL_Ext::toSDL(ColorRGBA(255, 0,255,255)));// FIXME: CONFIGURABLE ADVMAP - debug fill to detect any empty areas
|
|
|
+ CIntObject::showAll(to);
|
|
|
LOCPLINT->cingconsole->show(to);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::show(SDL_Surface * to)
|
|
|
{
|
|
|
-// if(state != EGameState::MAKING_TURN)
|
|
|
-// return;
|
|
|
-
|
|
|
handleMapScrollingUpdate();
|
|
|
|
|
|
- for(int i = 0; i < 4; i++)
|
|
|
- {
|
|
|
- if(settings["session"]["spectate"].Bool())
|
|
|
- gems[i]->setFrame(PlayerColor(1).getNum());
|
|
|
- else
|
|
|
- gems[i]->setFrame(LOCPLINT->playerID.getNum());
|
|
|
- }
|
|
|
-
|
|
|
- minimap->show(to);
|
|
|
- terrain->show(to);
|
|
|
-
|
|
|
- for(int i = 0; i < 4; i++)
|
|
|
- gems[i]->showAll(to);
|
|
|
-
|
|
|
+ CIntObject::show(to);
|
|
|
LOCPLINT->cingconsole->show(to);
|
|
|
-
|
|
|
- infoBar->show(to);
|
|
|
- statusbar->showAll(to);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::handleMapScrollingUpdate()
|
|
@@ -540,7 +308,7 @@ void CAdventureMapInterface::handleMapScrollingUpdate()
|
|
|
uint32_t scrollSpeedPixels = settings["adventure"]["scrollSpeedPixels"].Float();
|
|
|
uint32_t scrollDistance = scrollSpeedPixels * timePassed / 1000;
|
|
|
|
|
|
- bool scrollingActive = !GH.isKeyboardCtrlDown() && isActive() && state == EGameState::MAKING_TURN;
|
|
|
+ bool scrollingActive = !GH.isKeyboardCtrlDown() && isActive() && widget->getState() == EGameState::MAKING_TURN;
|
|
|
|
|
|
Point cursorPosition = GH.getCursorPosition();
|
|
|
Point scrollDirection;
|
|
@@ -560,7 +328,7 @@ void CAdventureMapInterface::handleMapScrollingUpdate()
|
|
|
Point scrollDelta = scrollDirection * scrollDistance;
|
|
|
|
|
|
if (scrollingActive && scrollDelta != Point(0,0))
|
|
|
- terrain->onMapScrolled(scrollDelta);
|
|
|
+ widget->getMapView()->onMapScrolled(scrollDelta);
|
|
|
|
|
|
if (scrollDelta == Point(0,0) && !scrollingCursorSet)
|
|
|
return;
|
|
@@ -599,17 +367,17 @@ void CAdventureMapInterface::handleMapScrollingUpdate()
|
|
|
|
|
|
void CAdventureMapInterface::centerOnTile(int3 on)
|
|
|
{
|
|
|
- terrain->onCenteredTile(on);
|
|
|
+ widget->getMapView()->onCenteredTile(on);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::centerOnObject(const CGObjectInstance * obj)
|
|
|
{
|
|
|
- terrain->onCenteredObject(obj);
|
|
|
+ widget->getMapView()->onCenteredObject(obj);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::keyPressed(EShortcut key)
|
|
|
{
|
|
|
- if (state != EGameState::MAKING_TURN)
|
|
|
+ if (widget->getState() != EGameState::MAKING_TURN)
|
|
|
return;
|
|
|
|
|
|
//fake mouse use to trigger onTileHovered()
|
|
@@ -726,7 +494,7 @@ void CAdventureMapInterface::keyPressed(EShortcut key)
|
|
|
case EShortcut::ADVENTURE_NEXT_TOWN:
|
|
|
if(isActive() && !GH.isKeyboardCtrlDown()) //no ctrl, advmapint is on the top => switch to town
|
|
|
{
|
|
|
- townList->selectNext();
|
|
|
+ widget->getTownList()->selectNext();
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
@@ -778,7 +546,7 @@ void CAdventureMapInterface::onSelectionChanged(const CArmedInstance *sel)
|
|
|
{
|
|
|
assert(sel);
|
|
|
|
|
|
- infoBar->popAll();
|
|
|
+ widget->getInfoBar()->popAll();
|
|
|
mapAudio->onSelectionChanged(sel);
|
|
|
bool centerView = !settings["session"]["autoSkip"].Bool();
|
|
|
|
|
@@ -789,25 +557,25 @@ void CAdventureMapInterface::onSelectionChanged(const CArmedInstance *sel)
|
|
|
{
|
|
|
auto town = dynamic_cast<const CGTownInstance*>(sel);
|
|
|
|
|
|
- infoBar->showTownSelection(town);
|
|
|
- townList->select(town);
|
|
|
- heroList->select(nullptr);
|
|
|
+ widget->getInfoBar()->showTownSelection(town);
|
|
|
+ widget->getTownList()->select(town);
|
|
|
+ widget->getHeroList()->select(nullptr);
|
|
|
onHeroChanged(nullptr);
|
|
|
}
|
|
|
else //hero selected
|
|
|
{
|
|
|
auto hero = dynamic_cast<const CGHeroInstance*>(sel);
|
|
|
|
|
|
- infoBar->showHeroSelection(hero);
|
|
|
- heroList->select(hero);
|
|
|
- townList->select(nullptr);
|
|
|
+ widget->getInfoBar()->showHeroSelection(hero);
|
|
|
+ widget->getHeroList()->select(hero);
|
|
|
+ widget->getTownList()->select(nullptr);
|
|
|
|
|
|
LOCPLINT->localState->verifyPath(hero);
|
|
|
onHeroChanged(hero);
|
|
|
}
|
|
|
updateButtons();
|
|
|
- townList->redraw();
|
|
|
- heroList->redraw();
|
|
|
+ widget->getHeroList()->redraw();
|
|
|
+ widget->getTownList()->redraw();
|
|
|
}
|
|
|
|
|
|
bool CAdventureMapInterface::isActive()
|
|
@@ -818,15 +586,15 @@ bool CAdventureMapInterface::isActive()
|
|
|
void CAdventureMapInterface::onMapTilesChanged(boost::optional<std::unordered_set<int3>> positions)
|
|
|
{
|
|
|
if (positions)
|
|
|
- minimap->updateTiles(*positions);
|
|
|
+ widget->getMinimap()->updateTiles(*positions);
|
|
|
else
|
|
|
- minimap->update();
|
|
|
+ widget->getMinimap()->update();
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::onHotseatWaitStarted(PlayerColor playerID)
|
|
|
{
|
|
|
onCurrentPlayerChanged(playerID);
|
|
|
- state = EGameState::HOTSEAT_WAIT;
|
|
|
+ widget->setState(EGameState::HOTSEAT_WAIT);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::onEnemyTurnStarted(PlayerColor playerID)
|
|
@@ -836,10 +604,10 @@ void CAdventureMapInterface::onEnemyTurnStarted(PlayerColor playerID)
|
|
|
|
|
|
adjustActiveness(true);
|
|
|
mapAudio->onEnemyTurnStarted();
|
|
|
- minimap->setAIRadar(true);
|
|
|
- infoBar->startEnemyTurn(LOCPLINT->cb->getCurrentPlayer());
|
|
|
- minimap->showAll(screen);//force refresh on inactive object
|
|
|
- infoBar->showAll(screen);//force refresh on inactive object
|
|
|
+ widget->getMinimap()->setAIRadar(true);
|
|
|
+ widget->getInfoBar()->startEnemyTurn(LOCPLINT->cb->getCurrentPlayer());
|
|
|
+ widget->getMinimap()->showAll(screen);//force refresh on inactive object
|
|
|
+ widget->getInfoBar()->showAll(screen);//force refresh on inactive object
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::adjustActiveness(bool aiTurnStart)
|
|
@@ -850,9 +618,9 @@ void CAdventureMapInterface::adjustActiveness(bool aiTurnStart)
|
|
|
deactivate();
|
|
|
|
|
|
if (aiTurnStart)
|
|
|
- state = EGameState::ENEMY_TURN;
|
|
|
+ widget->setState(EGameState::ENEMY_TURN);
|
|
|
else
|
|
|
- state = EGameState::MAKING_TURN;
|
|
|
+ widget->setState(EGameState::MAKING_TURN);
|
|
|
|
|
|
if(wasActive)
|
|
|
activate();
|
|
@@ -866,29 +634,24 @@ void CAdventureMapInterface::onCurrentPlayerChanged(PlayerColor playerID)
|
|
|
return;
|
|
|
|
|
|
currentPlayerID = playerID;
|
|
|
- bg->playerColored(currentPlayerID);
|
|
|
-
|
|
|
- panelMain->setPlayerColor(currentPlayerID);
|
|
|
- panelWorldView->setPlayerColor(currentPlayerID);
|
|
|
- panelWorldView->recolorIcons(currentPlayerID, currentPlayerID.getNum() * 19);
|
|
|
- resdatabar->colorize(currentPlayerID);
|
|
|
+ widget->setPlayer(playerID);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::onPlayerTurnStarted(PlayerColor playerID)
|
|
|
{
|
|
|
onCurrentPlayerChanged(playerID);
|
|
|
|
|
|
- state = EGameState::MAKING_TURN;
|
|
|
+ widget->setState(EGameState::MAKING_TURN);
|
|
|
if(LOCPLINT->cb->getCurrentPlayer() == LOCPLINT->playerID
|
|
|
|| settings["session"]["spectate"].Bool())
|
|
|
{
|
|
|
adjustActiveness(false);
|
|
|
- minimap->setAIRadar(false);
|
|
|
- infoBar->showSelection();
|
|
|
+ widget->getMinimap()->setAIRadar(false);
|
|
|
+ widget->getInfoBar()->showSelection();
|
|
|
}
|
|
|
|
|
|
- heroList->update();
|
|
|
- townList->update();
|
|
|
+ widget->getHeroList()->update();
|
|
|
+ widget->getTownList()->update();
|
|
|
|
|
|
const CGHeroInstance * heroToSelect = nullptr;
|
|
|
|
|
@@ -917,7 +680,7 @@ void CAdventureMapInterface::onPlayerTurnStarted(PlayerColor playerID)
|
|
|
}
|
|
|
|
|
|
//show new day animation and sound on infobar
|
|
|
- infoBar->showDate();
|
|
|
+ widget->getInfoBar()->showDate();
|
|
|
|
|
|
onHeroChanged(nullptr);
|
|
|
showAll(screen);
|
|
@@ -959,7 +722,7 @@ const CGObjectInstance* CAdventureMapInterface::getActiveObject(const int3 &mapP
|
|
|
|
|
|
void CAdventureMapInterface::onTileLeftClicked(const int3 &mapPos)
|
|
|
{
|
|
|
- if(state != EGameState::MAKING_TURN)
|
|
|
+ if(widget->getState() == EGameState::MAKING_TURN)
|
|
|
return;
|
|
|
|
|
|
//FIXME: this line breaks H3 behavior for Dimension Door
|
|
@@ -1050,7 +813,7 @@ void CAdventureMapInterface::onTileLeftClicked(const int3 &mapPos)
|
|
|
|
|
|
void CAdventureMapInterface::onTileHovered(const int3 &mapPos)
|
|
|
{
|
|
|
- if(state != EGameState::MAKING_TURN)
|
|
|
+ if(widget->getState() != EGameState::MAKING_TURN)
|
|
|
return;
|
|
|
|
|
|
//may occur just at the start of game (fake move before full intiialization)
|
|
@@ -1060,7 +823,7 @@ void CAdventureMapInterface::onTileHovered(const int3 &mapPos)
|
|
|
if(!LOCPLINT->cb->isVisible(mapPos))
|
|
|
{
|
|
|
CCS->curh->set(Cursor::Map::POINTER);
|
|
|
- statusbar->clear();
|
|
|
+ GH.statusbar->clear();
|
|
|
return;
|
|
|
}
|
|
|
auto objRelations = PlayerRelations::ALLIES;
|
|
@@ -1070,12 +833,12 @@ void CAdventureMapInterface::onTileHovered(const int3 &mapPos)
|
|
|
objRelations = LOCPLINT->cb->getPlayerRelations(LOCPLINT->playerID, objAtTile->tempOwner);
|
|
|
std::string text = LOCPLINT->localState->getCurrentHero() ? objAtTile->getHoverText(LOCPLINT->localState->getCurrentHero()) : objAtTile->getHoverText(LOCPLINT->playerID);
|
|
|
boost::replace_all(text,"\n"," ");
|
|
|
- statusbar->write(text);
|
|
|
+ GH.statusbar->write(text);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
std::string hlp = CGI->mh->getTerrainDescr(mapPos, false);
|
|
|
- statusbar->write(hlp);
|
|
|
+ GH.statusbar->write(hlp);
|
|
|
}
|
|
|
|
|
|
if(spellBeingCasted)
|
|
@@ -1212,12 +975,12 @@ void CAdventureMapInterface::showMoveDetailsInStatusbar(const CGHeroInstance & h
|
|
|
boost::replace_first(result, "%POINTS", std::to_string(movementPointsLastTurnCost));
|
|
|
boost::replace_first(result, "%REMAINING", std::to_string(remainingPointsAfterMove));
|
|
|
|
|
|
- statusbar->write(result);
|
|
|
+ GH.statusbar->write(result);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::onTileRightClicked(const int3 &mapPos)
|
|
|
{
|
|
|
- if(state != EGameState::MAKING_TURN)
|
|
|
+ if(widget->getState() != EGameState::MAKING_TURN)
|
|
|
return;
|
|
|
|
|
|
if(spellBeingCasted)
|
|
@@ -1255,17 +1018,14 @@ void CAdventureMapInterface::enterCastingMode(const CSpell * sp)
|
|
|
Settings config = settings.write["session"]["showSpellRange"];
|
|
|
config->Bool() = true;
|
|
|
|
|
|
- deactivate();
|
|
|
- terrain->activate();
|
|
|
- GH.fakeMouseMove();
|
|
|
+ widget->setState(EGameState::CASTING_SPELL);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::exitCastingMode()
|
|
|
{
|
|
|
assert(spellBeingCasted);
|
|
|
spellBeingCasted = nullptr;
|
|
|
- terrain->deactivate();
|
|
|
- activate();
|
|
|
+ widget->setState(EGameState::MAKING_TURN);
|
|
|
|
|
|
Settings config = settings.write["session"]["showSpellRange"];
|
|
|
config->Bool() = false;
|
|
@@ -1286,7 +1046,7 @@ void CAdventureMapInterface::leaveCastingMode(const int3 & dest)
|
|
|
|
|
|
Rect CAdventureMapInterface::terrainAreaPixels() const
|
|
|
{
|
|
|
- return terrain->pos;
|
|
|
+ return widget->getMapView()->pos;
|
|
|
}
|
|
|
|
|
|
const IShipyard * CAdventureMapInterface::ourInaccessibleShipyard(const CGObjectInstance *obj) const
|
|
@@ -1303,35 +1063,14 @@ const IShipyard * CAdventureMapInterface::ourInaccessibleShipyard(const CGObject
|
|
|
|
|
|
void CAdventureMapInterface::exitWorldView()
|
|
|
{
|
|
|
- state = EGameState::MAKING_TURN;
|
|
|
-
|
|
|
- panelMain->activate();
|
|
|
- panelWorldView->deactivate();
|
|
|
- activeMapPanel = panelMain;
|
|
|
-
|
|
|
- townList->activate();
|
|
|
- heroList->activate();
|
|
|
- infoBar->activate();
|
|
|
-
|
|
|
- redraw();
|
|
|
- terrain->onViewMapActivated();
|
|
|
+ widget->setState(EGameState::MAKING_TURN);
|
|
|
+ widget->getMapView()->onViewMapActivated();
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::openWorldView(int tileSize)
|
|
|
{
|
|
|
- state = EGameState::WORLD_VIEW;
|
|
|
- panelMain->deactivate();
|
|
|
- panelWorldView->activate();
|
|
|
-
|
|
|
- activeMapPanel = panelWorldView;
|
|
|
-
|
|
|
- townList->deactivate();
|
|
|
- heroList->deactivate();
|
|
|
- infoBar->showSelection(); // to prevent new day animation interfering world view mode
|
|
|
- infoBar->deactivate();
|
|
|
-
|
|
|
- redraw();
|
|
|
- terrain->onViewWorldActivated(tileSize);
|
|
|
+ widget->setState(EGameState::WORLD_VIEW);
|
|
|
+ widget->getMapView()->onViewWorldActivated(tileSize);
|
|
|
}
|
|
|
|
|
|
void CAdventureMapInterface::openWorldView()
|
|
@@ -1342,5 +1081,5 @@ void CAdventureMapInterface::openWorldView()
|
|
|
void CAdventureMapInterface::openWorldView(const std::vector<ObjectPosInfo>& objectPositions, bool showTerrain)
|
|
|
{
|
|
|
openWorldView(11);
|
|
|
- terrain->onViewSpellActivated(11, objectPositions, showTerrain);
|
|
|
+ widget->getMapView()->onViewSpellActivated(11, objectPositions, showTerrain);
|
|
|
}
|