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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user