1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-29 23:07:48 +02:00

Initial part of dynamically-sized adventure map:

- removed no longer used CConfigHandler
- remove no longer use resolutions.json
- moved widget management from adventure map to a separate class
- adventure map layout is now loaded from config
This commit is contained in:
Ivan Savenko
2023-04-26 15:44:10 +03:00
parent cb8201876b
commit a015bf6507
28 changed files with 1335 additions and 884 deletions

View File

@@ -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);
}